LVDS数据处理_第1页
LVDS数据处理_第2页
LVDS数据处理_第3页
LVDS数据处理_第4页
LVDS数据处理_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LVDS数据采集表1 版本内容版本修改人修改内容2015.8.26劳子俊初稿完成2015.8.29新增gen_frame 模块2015.9.1新增sdram_ctrl 模块2015.9.4新增sdram_refresh等模块2015.9.9新增sdram_read模块一、功能简述:如图1所示,外部以LVDS形式把数据采集传入FPGA,采集的数据经过LVDS_buf串行转并行把数据变成16bit,然后把数据储存到SDRAM_Ctrl 模块,再经Gen_frame模块对数据执行“组贞”处理后,最后经USB通信方式把数据传送给PC机。48mhz133mhzPCLVDSlvds_clk24mhzLVD

2、SbufSDRAMCtrlGenframeUSBCtrlsdram_clk133mhzusb_clk48mhz图1 模块分布连接图二、模块详细描述:1、 表2 管脚定义序号管脚名PD位宽状态备注1s_clkin1/系统时钟,50Mhz2s_rst_nin1/系统复位,低有效3lvds_clkin1/lvds时钟,24Mhz4usb_clkin1/usb时钟,48Mhz5lvds_datain3/lvds数据输入,其中8位有效6flag_cin1写FIFO的empty信号,低有效7flag_bin1读FIFO的full信号,低有效8wr_nout1写当flag_c为低时,wr_n为低,低有效9o

3、e_nout1读当flag_b为低时,oe_n为低,低有效10rd_nout1读当flag_b为低时,oe_n为低,低有效11pkg_endout1写当pkg_end一个时钟低脉冲,wr_n置高12addrout2/2b10为W_FIFO ; 2b00为R_FIFO13usb_datainout16/usb数据输入输出,包含r_data,w_data2、 关键信号的时序说明1】 usb_ctrl模块图2 USB内部 两FIFO结构型号:CY7C68013A如图3所示,当操作W_FIFO时 usb_data【15:0】为输入,当操作 F_FIFO时 usb_data【15:0】 为输出。图3 三

4、态门图4 写时序FPGA向USB内部FIFO写时序 见 图4: 第一步,先选择w_fifo (EP6) 即 把 addr 赋值为 2b10 。 第二步,检测w_fifo内部数据是否为空, 即检测 flag_c 是否为 低电平。 第三步,若flag_c为低,则wr_n拉低,把数据写入 w_fifo (EP6) 。 第四步,写入w_fifo数据共有512个。写完后wr_n拉高,等待PC机读取w_fifo数据。若PC机已经读取完数据,flag_c会拉低(即空),进入状态,如此循环。注:【1】 本实验板 所用USB中FIFO字深为 1024 byte ,位宽为 8 bit,因数据一次传送16 bit,

5、因此要接收 1024 / 2 = 512 (次)【2】 pkg_end为知识拓展,若pkg_end保持一个时钟周期低脉冲,则w_fifo认为已满,手动将wr_n置高,不再写数据。因实验板未连线,本次实验并未用到。图5 FPGA向USB内部FIFO读 时序FPGA向USB内部FIFO读 时序 见 图5: 第一步,先选择r_fifo (EP2) 即 把 addr 赋值为 2b00 。 第二步,检测r_fifo内部数据是否为满, 即检测 flag_b 是否为 低电平 第三步,若flag_b为低,则re_n , oe_n同时拉低,把数据从 r_fifo (EP2) 读出 。 第四步,从r_fifo读出

6、数据共有512个。读完后re_n , oe_n同时拉高,等待PC机写入r_fifo数据。若PC机已经写入完数据,flag_b会拉低(即写满),进入状态,如此循环。注:由图6所示,只有oe_n与rd_n 同时拉低,才能保证R_FIFO数据有 效输出且不丢数据。图6 oe_n与rd_n关系图 如图7所示,是usb_ctrl模块端口:对usb_addr执行2b10赋值,wr_n是w_flag的取反,usb_data的值为w_data,usb_clk为USB提供。图7 usb_ctrl模块端口2】 gen_frame 模块图8 gen_frame 模块端口模块工作过程: 图像第一行数据控制: 接收到

7、read_start 以 133 mhz发送的高脉冲,。对read_start 进行跨时钟域处理,从133mhz48 mhz 的高脉冲。根据该信号同时执行 工作1 和 工作2。图9 read_buf的产生工作1:如图9,在read_start(时钟处理133 à 48)产生上升沿后,拉高start_buf,然后检测flag_c是否为低,若为低,则拉低start_buf,以其下降沿作为输出帧头起始信号。输出帧头数据给 usb_ctrl 模块,帧头数值为 8'h55 , 8'h55 , col_cnt_h , col_cnt_l , 1020个8'h00 。工作2

8、:由133 mhz 的read_start将read_req信号使能,让上级模块输出图像第一行sd_data 数据写入该模块的FIFO中。 图像第二行到最终行数据控制:当PC机读取完USB中EP6中的数据后,flag_c由高变低。利用133mhz采集48mhz的flag_c下降沿信号(此处要flag_c进行毛刺处理,否则出现不稳定状态)1 产生133mhz read_req信号传回上级模块,由上级模块传送图像剩余行数据(即fifo写入数据) 。2 fifo 数据读出。其中,fifo 写入时钟133mhz,读出时钟为48mhz。图10 gen_frame里的FIFO图像一行为1000个像素,每个

9、像素8位,如今传输数据为16位,共传输1000 / 2 =500个数据,要预留2行数据个数,即 1000 个。因此 ,FIFO定义 位宽:16bit , 深度 : 1024 。(为什么要预留2行数据呢?那是因为读写是同时执行的,但是写的时钟比读的时钟快,写进1行同时读出1行。fifo在读写同时执行时,内部数据总个数大于一行), 图11 gen_frame里的FIFO 写时序 图12 gen_frame里的FIFO 读时序如何做跨时钟域处理:1. 如图13所示,由133mhz à 48 mhz read_start经过4级寄存器后相或得到133/4 33mhz < 48mhz的脉

10、冲信号,经过2级寄存器消除毛刺,更为稳定。图13 read_reg 跨时钟域2. read_req为低往高时钟跨越,像按键消抖处理 48 à 133mhz 。消除毛刺,更为稳定。注:此模块因为有时钟域跨越问题,对于毛刺的消除尤为重要,毛刺严重影响了系统的稳定性。如跨时钟信号:read_start, read_req ,flag_c 都要进行消毛刺处理。3】 sdram_ctrl 模块(型号:HY57V281620A)图14 SDRAM内部bank如何确定本工程驱动SDRAM的时钟频率:例1:若图像为 640 * 480 60hz,一个像素点为24bit则总数据量为 640 * 480

11、 * 60 * 24 = 442368000 bit , 但SDRAM一个存储单位最大只有16bit,所以要2个存储单位(32bit)存储一个像素点(浪费8bit), 每秒总数据量:640 * 480 * 60 * 16 * 2 = 589824000 bit 时钟存储量 : 16 bit驱动SDRAM时钟频率:589824000 / 16 = 36864000 37Mhz 例2:若图像为 1080 * 1920 30hz ,一个像素点为24bit,则总数据量为 1080 * 1920 * 30 * 16 * 2 = 1990656000 bit 驱动SDRAM时钟频率: 1990656000

12、 / 16 = 124416000 124.4MhzPRECHARGE (去激活): 1. precharge是使处在激活状态的bank 回到 未激活状态,简称去激活2.若 A10为1选择 all bank,则BA1:0无效。若 A10为0选择one bank,则BA1:0选择4个bank中的一个。 3.在 READ or WRITE 完毕后,要执行 precharge. 以便下次读写。4.bank执行了precharge(去激活)后,则进入IDLE状态,如要执行 READ or WRITE 命令,必需先执行 activated (激活) 命令。AUTO PRECHAREG(自动去激活)在 写

13、 和 读 的时候,A10决定了是否选定 AUTO PRECHAREG1. A10为1,则执行读(写)时,系统自动执行PRECHAREG 2. A10为0,读(写)为单纯读(写)命令,需要人为执行PRECHAREGLOAD MODE REGISTER(模式设置):1. A0A12为 MODE REGISTER(模式设置) 的模式寄存器。2. 要加载 MODE REGISTER ,必须 所有bank 处于 IDLE状态。AUTO REFRESH(自动刷新): 如图15 initial,在初始化的时候使用两次。Initialization(初始化):在制作SDRAM芯片时已经预定义:芯片上电且电源、

14、CLK稳定且CKE为高后,必须对SDRAM进行初始化,如图15初始化步骤下:1. 上电 200us之内, 执行cmd = NOP 。2. 200us延时完成时,执行 cmd = precharge_all (PALL) 。3. 执行 cmd = Auto Refresh (REF) * 2 次 4. 执行 cmd = Mode Register Set (MRS) 图16 initial 步骤波形图注: cycle 为 驱动SDRAM的时钟周期 7.5ns【1】sd_clk_180° 通过pin脚连接SDRAM,sd_clk_0°与模块程序连接。【2】Trp =15ns 3

15、 * cycle ; Trc = 60ns 9 * cycle; 【3】除了 NOP 和 INHIBIT 命令可占多个cycle,其他命令均必须为1个cycle。否则会认为多次执行该命令,因此命令间应以 NOP 作为穿插。图18 sdram_initial 模块端口Mode Register Set(初始化寄存器):1. Burst Length (突发长度模式):共有4种:分别为 1 2 4 8;选择突发长度为4个数据的模式 ,A2,A1,A0 = 3b010;2. Burst Type(突发类型):共有2种:Sequential (连续) Interleaved(交错) type 选择 S

16、equential, A3 = 1b0;方法:给一个地址,将其转成二进制,低两位的值对应表,得出地址顺序。例如:地址为 35 ,二进制表示为 100011 ,低两位为11,则对应最后一种模式,最后得出地址顺序为 35 32 33 34图17 Burst Length 4突发类型3. Latency Mode(读潜伏期) :共有2种模式,潜伏期分别为2和3个时钟周期。选择3个时钟周期的潜伏期,A6,A5,A4 = 3b011;读的数据个数取决于之前设置的 Burst Length (突发长度)图18 潜伏期为3,突发长度为4的读模式与Burst Length选择为2相比:选择3的话,SDRAM的

17、输出端多加1级寄存器延时2拍,缩短寄存器与寄存器间连线距离,可以接受更高时钟频率要求。寄存器与寄存器间路径的延时,决定了可以接受的最高时钟频率。 4. Operating Mode A8,A7 = 2b00;5. Write Burst Mode A9 = 1b0;图19 Command 真值表配置寄存器的V值为: A9:0 = 10b00_0011_0010; Auto - REFRESH(自动刷新):SDRAM 的存储单元可以理解为一个电容,总是倾向于放电,因此必须有定时的刷新周期以避免数据丢失。刷新周期可由datasheet中的 “ 4 0 9 6 r e f r e s h c y c

18、 l e s / 6 4 m s“刷新周期 : 64 * 1000 us / 4096 = 15.625 us 本次项目采用 12us 进行自我刷新,以避免数据丢失。如图20,图21所示,sdram_refresh 模块 设计思路:1. 当接收到 initial_en = 1 时, 启动 time_12us 计数器 , 每 12us 产生一个 sdram_clk 的 flag_12us 高脉冲 。2. 当接收到 flag_12us = 1 时,拉高 refresh_req 发送给sdram_ctrl, 等待送回 refresh_en = 1 。3. 接收到 refresh_en = 1 后,

19、将 refresh_req 拉低,同时发送命令 cmd = CBR Auto-Refresh (REF)4. cmd = NOP 占 9 cycle 之后发送一个 sdram_clk 的 refresh_end 高脉冲 ,给 sdram_ctrl 。图20 sdram_refresh 模块图21 sdram_refresh 波形图图22 sdram_write 模块端口如图22 - 25,所示,sdram_wirte 模块 设计思路:1. 当接收到 lvds_buff 模块发送的 lvds_w_req = 1 时 ,本模块直接由 state:IDLE 跳到 state:w_req 2.将wri

20、te_req 拉高输出到 state:CEO ,等state:CEO送 write_en= 1。3. 接收到 write_en = 1 后,将 write_req 拉低,由 state:w_req 跳到 state:ACT 执行 ban & row 激活 cmd = Bank activate (ACT)4. cmd = NOP 占 3个 cycle 之后发送一个sdram_clk的 ACT_end = 1,由 state:ACT 跳到 state:wirte 分支:1】 12us还没到,没有产生 refresh_req 中断:执行cmd = Write 进行突发长度为4的写命令,cm

21、d = NOP 占 3个 cycle 。之后可以在执行写命令,通过 col_addr 计数,直到一行写完。产生一个 sdram_clk 的 w_row_end 的高脉冲,状态由state:wirte 跳到 state:break 。由w_row_end的高脉冲将 w_end 拉高,然后执行cmd = precharge,之后产生一个sdram_clk的 break_end,将w_end拉低,当 break_end && w_end 时,由state:break 跳到 state:IDLE 。图23 写完所有行 波形图2】 12us到了,产生了 refresh_req 中断:执行

22、cmd = Write 进行突发长度为4的写命令,cmd = NOP 占 3个 cycle 。在写完第四个数据后,响应refresh_req中断。产生一个sdram_clk的burst_break高脉冲状态由state:wirte 跳到 state:break 。由 burst_break 的高脉冲将 burst_break_flag 拉高,然后执行 cmd = precharge ,之后产生一个sdram_clk的 break_end ,将burst_break_flag 拉低,当 break_end && burst_break_flag 时,状态由state:break跳

23、到state:w_req 。图24 写状态刷新中断产生 波形图图25 SDRAM 写时序如图26-27所示,sdram_ctrl 模块 设计思路:1. 当接收到 work_en = 1,由state:IDLE跳到state:INIT。2. 当初始化完毕,接收到initial_end=1, 由state:INIT跳到state:CEO。3. 当接收到refresh模块的 refresh_req = 1,由state:CEO跳到state:refresh,发送 refresh_en = 1 给 sdram_refresh 模块。4. 当接收到sdram_refresh模块的 refresh_end

24、 = 1,由state:refresh跳到state:CEO,等到下一个信号。5. 当接收到sdram_write模块的 write_req = 1,由state:CEO跳到state:write,并发送 write_en = 1 给sdram_write 模块。6. 当接收到sdram_write模块的,由 state:write 跳到state:CEO,等到下一个信号。7. 当 sdram_ctrl模块写完一帧数据 时,拉高frame_end,直到sdram_read模块读完一帧数据才将fram_end拉低。采集frame_end上升沿作为输出信号read_start = 1发送给gen_

25、farme模块,等待送 gen_read_req 图26 sdram_write与主状态机联系图图27 sdram_read与主状态机联系图8. 当接收到sdram_write模块的 read_req = 1,由state:CEO跳到state:read,并发送 read_en = 1 给sdram_write 模块。9. 当接收到sdram_read模块的,由 state:read 跳到state:CEO,等到下一个信号。如图28 - 31,所示,sdram_read 模块 设计思路:0. 当 sdram_ctrl模块写完一帧数据 时,拉高frame_end,直到sdram_read模块读完

26、一帧数据才将fram_end拉低。采集frame_end上升沿作为输出信号read_start = 1发送给gen_farme模块,等待送 gen_read_req 1.(sdram_read模块)当接收到gen_farme模块发送gen_read_req = 1,对其延拍相或后得到信号gen_req_high,若gen_req_high = 1则本模块直接由 state:IDLE 跳到 state:r_req 。2. 将 read_req拉高输出到state:CEO ,等state:CEO送 read_en= 1。3. 接收到 read_en = 1 后,将 read_req 拉低,由 state:r_req 跳到 state:ACT 执行 ban & row 激活 cmd = Bank activate (ACT)4. cmd = NOP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论