tag 标签: SDRAM

相关帖子
相关博文
  • 热度 16
    2016-1-13 10:02
    1053 次阅读|
    0 个评论
    SDRAM(Synchronous Dynamic Random Access Memory) :为同步动态随机存取内存,前缀的Synchronous告诉了大家这种内存的特性,也就是同步。1996年底,SDRAM开始在系统中出现,不同于早期的技术,SDRAM是为了与中央处理器的计时同步化所设计,这使得内存控制器能够掌握准备所要求的数据所需的准确时钟周期,因此中央处理器从此不需要延后下一次的数据存取。举例而言,PC66 SDRAM以66 MT/s的传输速率运作;PC100 SDRAM以100 MT/s的传输速率运作;PC133 SDRAM以133 MT/s的传输速率运作,以此类推。 SDRAM亦可称为SDR SDRAM(Single Data Rate SDRAM) ,Single Data Rate为单倍数据传输率,SDR SDRAM的核心、I/O、等效频率皆相同,举例而言,PC133规格的内存,其核心、I/O、等效频率都是133MHz。而Single Data Rate意指SDR SDRAM在1个周期内只能读写1次,若需要同时写入与读取,必须等到先前的指令执行完毕,才能接着存取。 DDR SDRAM(Double Data Rate SDRAM) :为双信道同步动态随机存取内存,是新一代的SDRAM技术。别于SDR(Single Data Rate)单一周期内只能读写1次,DDR的双倍数据传输率指的就是单一周期内可读取或写入2次。在核心频率不变的情况下,传输效率为SDR SDRAM的2倍。第一代DDR内存Prefetch为2bit,是SDR的2倍,运作时I/O会预取2bit的资料。举例而言,此时DDR内存的传输速率约为266~400 MT/s不等,像是DDR 266、DDR 400都是这个时期的产品。 DDR2 SDRAM(Double Data Rate Two SDRAM) :为双信道两次同步动态随机存取内存。DDR2内存Prefetch又再度提升至4 bit(DDR的两倍),DDR2的I/O频率是DDR的2倍,也就是266、333、400MHz。举例:核心频率同样有133~200MHz的颗粒,I/O频率提升的影响下,此时的DDR2传输速率约为533~800 MT/s不等,也就是常见的DDR2 533、DDR2 800等内存规格。 DDR3 SDRAM(Double Data Rate Three SDRAM) :为双信道三次同步动态随机存取内存。DDR3内存Prefetch提升至8 bit,即每次会存取8 bits为一组的数据。DDR3传输速率介于 800~1600 MT/s之间。此外,DDR3 的规格要求将电压控制在1.5V,较DDR2的1.8V更为省电。DDR3也新增ASR(Automatic Self-Refresh)、SRT(Self-Refresh Temperature)等两种功能,让内存在休眠时也能够随着温度变化去控制对内存颗粒的充电频率,以确保系统数据的完整性。 DDR4 SDRAM(Double Data Rate Fourth SDRAM) :DDR4提供比DDR3/ DDR2更低的供电电压1.2V以及更高的带宽,DDR4的传输速率目前可达2133~3200 MT/s。DDR4 新增了4 个Bank Group 数据组的设计,各个Bank Group具备独立启动操作读、写等动作特性,Bank Group 数据组可套用多任务的观念来想象,亦可解释为DDR4 在同一频率工作周期内,至多可以处理4 笔数据,效率明显好过于DDR3。 另外DDR4增加了DBI(Data Bus Inversion)、CRC(Cyclic Redundancy Check)、CA parity等功能,让DDR4内存在更快速与更省电的同时亦能够增强信号的完整性、改善数据传输及储存的可靠性。
  • 热度 17
    2015-10-12 16:45
    1630 次阅读|
    0 个评论
    一.关于SDRAM 1.SDRAM Synchronous Dynamic Random Access Memory,同步动态随机存储器。同步是指它的工作(包括指令或数据的传输)需要同步时钟。动态指要保持数据的稳定,需要不断的刷新操作。随机是指数据的存取不是线性存取,而是按照地址进行读写。 2.SDRAM包括 SDR SDRAM、DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM四代。SDR SDRAM是单沿采样,第二、三、四代是双沿采样,工作频率更快,所以使用可以降低干扰的差分信号作为时钟信号。 SDR 不等于 SDRAM 3.SDRAM芯片规格,拿笔者使用的SDRAM举例,笔者使用的是HY57V281620A 4Banks×2M×16bits Synchronous DRAM。       ①  SDRAM 容量 SDRAM 芯片内部包含 4 个 BANK ,每个 BANK 的大小为 32M ,所以 SDRAM 的容量 32 × 4=128M  ②  32M 含义 每一个 BANK 实际上是由 ROW × COL 个 16bit 的数据格(比喻)组成,根据手册, ROW 的位宽分别为 12 位,即 4k ; COL 的位宽为 9 位,即 0.5k 。所以格子数 =4k × 0.5K 。每个 BANK 容量: 4k × 0.5k × 16bit=32M 。  ③  ROW 的含义 这里面的 ROW 对应手册里面的 A , MRS( 模式寄存器配置时 ) , A 代表模式寄存器指令;在读写模式时, A 代表地址( A :行地址; A :列地址)。     4.突发长度 SDRAM在进行读写时的一种模式叫做突发模式。在这种模式下,以写操作为例,突发长度为3,给出写命令和写地址后,连续写入3个数据,不必再给出后两个数据的地址,它会连续的写入。突发长度包括1、2、4、8。     5.潜伏期 在读取数据时,数据的读出时间会比读命令的时间晚相应的潜伏期的长度。潜伏期越长,时序就越得到提升。      举例 :以 Latency Mode=3  Burst Length=4   Burst Type=Sequential 的模式下取读数据   在给出读指令跟地址时,如果 Latency=3 ,数据以上面的形式延后三拍给出, Latency=2 ,数据则延后两拍给出。     6.刷新     为什么要刷新 SDRAM 的基本结构是电容,单位是 F (法拉), C=Q/U 。 Q- 电荷量; U- 平行板电势差。容量 C 跟 Q 有关。电容容易漏电,所以为保证数据的稳定,要定期对其充电,即 SDRAM 的刷新。 刷新频率的计算 对手册描述 4096 refresh cycles / 64ms 的解读:即每 64ms 对一个 bank 刷新一次。 一个 bank 有 2^12=4096 row 。每一个刷新操作的对象是一个 row , 1 refresh cycles=15.625us 。值得一提的是计算出的 15.625us 是平均刷新时间,而这 4096 次刷新只要在 64ms 内完成,刷新间隔可以不必是均匀的。这里我们取 1 refresh cycles = 12us 。 对SDRAM的介绍就到这里,下面我们来看看SDRAM是如何与其他模块对接的。 二. SDRAM 模块描述 由于篇幅有限,只给出SDRAM的整体框图,与各个子模块的状态机。整体框图--表示SDRAM控制模块与外部模块与芯片(SDRAM)的关系;子模块状态机--表示各个操作的过程与跳转条件。 (一)整体框图     FPGA 通过 SDRAM 控制器来控制 SDRAM 芯片, SDRAM_CTRL 对 SDRAM 芯片的操作包括 INIT (初始化)、 WRITE (写操作)、 READ (读操作)。对 SDRAM_CTRL 的整体模块描述如下: 1. LVDS 模块通过信号 work_en 、 w_req_lvds ,在数据有效( w_data_v==1 )时,将数据 w_data 缓存入 sdram 中 。 2. SDRAM_CTRL 的内部变量 3. SDRAM_CTRL 通过 cke 、 cs_n 、 cas_n 、 ras_n 、 we_n 、 ba 、 a 信号跟 SDRAM 芯片绑定,完成 INIT 、 REFRESH 、 WRITE 、 READ 等操作。 4. GEN 模块来取数据是会发送 read_req 信号给 SDRAM_CTRL 模块, SDRAM_CTRL 模块将读出的数据 SD_data ,在 SD_data_v( 数据有效 ) 有效时写入 GEN FIFO 中。 (二)主状态机     1.  在 IDLE 状态下 检测到 work_en==1 ,进入 INIT 状态。 2.在 INIT 状态下 检测到 init_end==1, 进入 SWITCH 状态。 3.在 SWITCH 状态下 ?  检测到 ref_req==1, 进入 REFRESH 状态。 ?  检测到 ref_req==0,w_req==1, 进入 WRITE 状态。 ?  检测到 ref_req==0,w_req==0,r_req==1, 进入 WRITE 状态。 4.在 REFRESH 状态下 刷新结束后,发送 ref_end 信号,返回 switch 。 5.在 WRITE 状态下 写一行结束或者写突发被刷新打断,返回 SWITCH 状态。 ?  写一行结束:发送 w_row_end_flag 和 w_break_end ?  突发写被打断:发送 w_burst_end_flag 和 w_break_end 6.在 READ 状态下 读一行结束或者读突发被刷新打断,返回 SWITCH 状态。 ?  读一行结束:发送 r_row_end_flag 和 r_break_end ?  突发读被打断:发送 r_burst_end_flag 和 r_break_end
  • 热度 18
    2015-3-24 13:58
    1558 次阅读|
    0 个评论
           引言        在基于FPGA的图象采集显示系统中,常常需要用到大容量、高速度的存储器。而在各种随机存储器件中,SDRAM的价格低、体积小、速度快、容量大,是比较理想的器件。但SDRAM的控制逻辑比较复杂,对时序要求也十分严格,使用很不方便,这就要求有一个专门的控制器,使系统用户能很方便地操作SDRAM。为此,本文提出了一种基于FPGA的SDRAM控制器的设计方法,并用Verilog给于实现,仿真结果表明通过该方法设计实现的控制器可以在FPGA芯片内组成如图1所示的SDRAM接口,从而使得系统用户对SDRAM的操作非常方便。         SDRAM简介        SDRAM器件的管脚分为控制信号、地址和数据三类。通常一个SDRAM中包含几个BANK,每个BANK的存储单元是按行和列寻址的。由于这种特殊的存储结 构,SDRAM有以下几个工作特性。        ● SDRAM的初始化        SDRAM在上电100~200μs后,必须由一个初始化进程来配置SDRAM的模式寄存器,模式寄存器的值决定着SDRAM的工作模式。        ● 访问存储单元        为减少I/O引脚数量,SDRAM复用地址线,所以在读写SDRAM时,先由ACTIVE命令激活要读写的BANK,并锁存行地址,然后在读写指令有效时锁存列地址。一旦BANK被激活后只有执行一次预充命令后才能再次激活同一BANK。        ● 刷新和预充        SDRAM的存储单元可以理解为一个电容,总是倾向于放电,因此必须有定时的刷新周期以避免数据丢失。刷新周期可由(最小刷新周期÷时钟周期)计算获得。对BANK预充电或者关闭已激活的BANK,可预充特定BANK也可同时作用于所有BANK,A10、BA0和BA1用于选择BANK。        ● 操作控制        SDRAM的具体控制命令由一些专用控制引脚和地址线辅助完成。CS、RAS、CAS和WR在时钟上升沿的状态决定具体操作动作,地址线和BANK选择控制线在部分操作动作中作为辅助参数输入。由于特殊的存储结构,SDRAM操作指令比较多,不像SRAM一样只有简单的读写。        SDRAM控制器的设计实现         ● 总体设计框图和外部接口信号        SDRAM控制器与外部的接口示意图由图1给出,控制器右端接口信号均为直接与SDRAM对应管脚相连的信号,此处不做介绍。控制器左端的接口信号为与FPGA相连的系统控制接口信号,其中,CLK133为系统时钟信号,RESET_N为复位信号,ADDR为系统给出的SDRAM地址信号,DAIN是系统用于写入SDRAM的数据信号,FPGA_RD和FPGA_WR为系统读、写请求信号(1为有效,0为无效),SDRAM_FREE是SDRAM的空闲状态标示信号(0为空闲,1为忙碌),FDATA_ENABLE是控制器给系统的数据收发指示信号(为0时,无法对SDRAM进行数据收发;为1时,若是系统读操作,则系统此时可从DAOUT接收SDRAM的数据,若是写操作,则系统此时可以通过DAIN发送数据给SDRAM)。        SDRAM控制器的结构组成如图2所示,包括系统控制接口模块、CMD命令解析模块、命令响应模块、数据通路模块共四个模块。系统控制接口模块用于接收系统的控制信号,进而产生不同的CMD命令组合;CMD命令解析模块用于接收CMD命令并解码成操作指令;命令响应模块用于接收操作指令并产生SDRAM的操作动作;数据通路模块则用于控制数据的有效输入输出。        SDRAM控制器设计的状态机实现原理如图3所示,包含了9个状态,其中从Precharge到Mode set为SDRAM上电后的初始化过程,其余状态为SDRAM的正常读写及刷新操作过程。         ● 各模块的设计        (1) 系统控制接口模块        该模块内含了初始化机制和系统指令分析机制。初始化机制不仅要完成对SDRAM的初始化配置,还要完成对控制器的初始化配置,使控制器与外部SDRAM的工作模式一致。其过程如下:由计数器控制在系统上电200μs左右后,先进行SDRAM的初始化配置工作,由一个Precharge all bank指令完成对所有BANK的预充,接着是多个Refresh指令,然后是模式配 置指令LOAD_MODE,完成SDRAM的工作模式设置。之后进行控制器的初始化配置工作,先发出指令LOAD_REG1给控制器载入模式字,再发出LOAD_REG2指令载入控制器的刷新计数器值,完成控制器初始化配置。        上述初始化过程结束后,系统指令分析机制才可接收并分析系统的读写信号和地址信息,以及从下个模块反馈回来的CMDACK信号,并产生对应的CMD命令和SADDR地址信息给CMD命令解析模块。通过程序设置,实现了根据初始化配置的参数来确定在读写到特定时刻发出Precharge或者Refresh的CMD指令,从而简化了系统的控制。而每当收到CMDACK为1时,表示CMD指令已经发出并有效,此时就要发出NOP命令(CMD=000)。要说明的是,SADDR是分时复用的,在初始化载入模式时,SADDR用以传输用户自己定义的模式字内容;而在正常的读写期间,SADDR作为地址线传输SDRAM所需的行、列和块地址。此外,系统指令分析机制会根据控制器对SDRAM的操作处于什么样的状态,而反馈SDRAM_FREE和FDATA_ENABLE信号给系统用户。        (2) CMD命令解析模块         该模块对CMD指令进行判断,其结果就是输出相应的操作指令信号给命令响应模块。例如,CMD为001时,则会输出do_read信号为1,CMD为010时,则会输出do_write信号为1,在同一时刻,只会输出一种有效的的操作指令。        此外,该模块内含用以预设某些模式参数的模式寄存器,主要包括三类:第一类是SDRAM模式控制寄存器,在LOAD_MODE指令时,将该寄存器的值送入SDRAM的模式寄存器中,以控制SDRAM的工作模式。第二类是SDRAM控制器的参数寄存器(LOAD_REG1),使得SDRAM控制器的工作方式与外部的SDRAM器件的工作方式匹配。第三类是SDRAM的刷新周期控制寄存器,该寄存器预设用户定义的自动刷新计数值,用于SDRAM的刷新周期预设。上述三类寄存器的预设值都是系统控制接口模块在初始化时通过SADDR传送给来的。        (3) 命令响应模块        该模块的作用是根据从CMD命令解析模块得到的操作指令,做出符合SDRAM读写规范的操作动作,来进行用户期望的操作;给出数据选通信号OE,来控制数据通路模块(写操作时OE为1,读操作时OE为0)。此外,该模块把系统非复用的地址ADDR处理为SDRAM复用的地址,分时送给SA、BA。程序中地址复用方法为:        assign raddr = ADDR //raddr为行地址        assign caddr = ADDR //caddr为列地址        assign baddr= ADDR //baddr为BANK地址        (ROWSTART、COLSTART、BANKSTART分别为行、列、块在ADDR中的起始位)        在程序中,WRITEA和READA的CMD指令实际隐含了ACTIVE命令,所以该模块在收到do_write或do_read指令后,会先进行激活动作,经过初始化配置规定的CAS延迟时间之后再进行读写动作。例如初始化时,模式字规定CAS=2,BURST LENGTH="PAGE",则从命令接口模块收到do_write=1后,会先做出激活动作并给出行地址(发出RAS_N=0,CAS_N=1,WE_N=1,SA=raddr),过2个时钟延迟后,再做出写动作并给出列地址(发出RAS_N=1,CAS_N=0,WE_N=0,SA=caddr)。        此 外,收到各类操作指令后,该模块会反馈给CMD命令解析模块cmdack信号为1,并最终反馈到系统控制接口模块的CMDACK信号为1,如果没有收到任何操作指令,则cmdack=0,CMDACK信号为0。        (4) 数据通路模块        该模块受OE信号的控制,使数据的进出和相应的操作指令在时序上同步。OE为1时,数据可由DQ脚写入SDRAM,OE为0时,数据可从SDRAM的DQ脚读出。        控制器的使用及仿真时序---根据系统设计对SDRAM读写要求的不同,对控制器进行简单的参数修改(主要是初始化时模式内容字的设置),即可使对SDRAM的控制符合自己的要求。该控制器使得系统对SDRAM的操作非常简单。以写操作为例,初始化结束后,只要SDRAM空闲,系统就会收到SDRAM_FREE有效信号,此时可以发出FPGA_WR指令,同时给出ADDR地址信息,在收到反馈的FDATA_ENABLE有效后,系统将数据通过DAIN写到SDRAM中去,即完成写操作,系统无须关心SDRAM的刷新和预充。仿真时序图如图4、图5和图6所示,在写和读时序中,CAS=2,BURST LENGTH="PAGE",DC表示无关(Don’t care)。        仿真结果表明,该控制器可以使得系统对SDRAM的控制非常简单、方便。         结束语        在实际应用中,使用ALTERA公司的Cyclone FPGA器件进行设计,设计输入采用Verilog来完成,实现了上述的SDRAM控制器接口电路。此外,由于采用了参数化设计思想,对特定容量的SDRAM的特定工作模式而言,只要根据其器件参数进行设定,该控制器就可以适用特定SDRAM的特定工作模式,具有一定的通用性。
  • 热度 22
    2011-5-9 16:23
    2019 次阅读|
    3 个评论
    国产FPGA试用手记四(时序工具) 关于时序工具的一些FAE解答:   问:你们的工具是否只提供所有输入输出管脚完全一致的时序约束?如tsu,th,tco,tpd的约束?如果不同管脚可以有不 同约束值,如何设置? FAE:我们的工具提供的是时序分析功能,尚未提供时序约束功能,也就是说可以根据您输入的值作为参考,计算出当前实现的各种时序信息与参考值的差距,但并不会根据输入的值去做优化,所以也就不存在对不同管脚分别设置约束的功能了。   问:tco是指reg2pin的延时约束,tpd是指pin2pin的约束。而输入管脚约束tsu和th值,具体含义我不是很 明白?比如说我希望输入管脚的pin2reg延时为0-10ns,那么tsu和th如何设置? FAE:tsu就可以理解为pin2reg的延时,它是信号从pin到FPGA内部第一个reg相对于这个reg的clock的setup time,而th就是相对这个clock的hold time,th一般不会有问题,需要关注的是tsu。   问:我尝试用GUI做了一些时序约束,然后每次做时序分析都报错:Error: T2000: (ice_run_sta) Run sta failed.  这是什么问题? FAE:您的这个错误一般是sta设置上有什么问题,得具体分析工程。            今天终于拿到了最新3.2版本的软件,安装后,进行编译,长达近10分钟的placement让我眉头紧皱。后来从FAE处得知我拿到的是还未release出来的中间版本,有问题在所难免。不说这个,回到主题上来,其实总感觉有些遗憾。FAE在之前的回答其实已经预示着这个国产FPGA与特权同学缘分已到尽头。            WHY?他们提供的时序分析工具根本算不上真正的时序分析工具,或者这么说,这个所谓的时序分析工具只能提供分析,而无法进行时序的约束和优化。即便他们的工程设置中也提供了如图1的恐怕可以称得上是最简单的“时序约束”,但这个所谓的“时序约束”其实并没有任何“约束”的作用。安装“官方”的说法,它不能够对综合乃至布局布线起到任何影响,而不过是给报告中的路径划了一条水平线,报告中确实能够体现出水平线上或下的状态。 图1          如图2所示,很无奈的只是移植了一个SDRAM控制器外加一些其它逻辑,占去了总共1000个LE中80%的资源,然后只是约束了一个50MHz的工作时钟,结果出来了20条false路径。即便尝试去试试用提供的仅有几个对mapping或palcementrouting设置的优化,结果换来了更多的false。FAE也坦言,目前只能做些简单的逻辑,跑个SDRAM等稍复杂的逻辑也就只能跑个二三十兆的样子。 图2          几天的试用,虽然以国产FPGA的性能问题而告夭折。虽然还显稚嫩的开发工具、差强人意的器件性能多少让人有些失望,但至少从某种程度上让特权同学改变了对国产的一些偏见。其实,如果Agate Logic能够持续这种开发热情,不断的改进,假以时日,相信他们会成为“中国的Altera”、“中国的Xilinx”。   本系列博文: 试用手记:为国产FPGA正名(一) 试用手记:为国产FPGA正名(二,51硬核性能测试) 试用手记:为国产FPGA正名(三,存储器) 试用手记:为国产FPGA正名(四,时序工具) 试用手记:为国产FPGA正名(五,外扩SFR使用) 为国产FPGA正名(六,完结篇)
  • 热度 15
    2011-1-11 17:17
    1715 次阅读|
    0 个评论
    曾经有一次,一个朋友在那里感慨:做人真累,要结婚要生子、要买房……。做工程师也很累,有做不完的项目,一个接一个,所面对的问题也是一个接一个,真叫没完没了。 其实不然,做项目和做人本身没有太多牵连,只不过他们都需要当事人有所经历才会有所得,开花结果是我们所期盼的或者说经历这个过程最终的目标,但过程却更应该是我们所要专注并能够真正让我们有所收获的环节。 在经历了断断续续长达一年的找房看房经历,最终步入买房流程,忽然感觉自己长大了很多。虽然走上工作岗位也有几个年头了,有时却是很多事情需要依靠长辈们挂心,虽然有些事情经历得确有那么一些坎坷,但无论是抱着怎样的态度只要是经历过了,回头再看看,才会依稀感悟到其实我们在成长,因为每个人在不同的阶段所面对的一些人事物都是自己人生阅历的一部分。 也难怪在一些重大问题的考虑和决议上,姐夫总是劝我多和父母尤其是老爹(通常一家的男主人也许不敢说是独挡一面,但基本是这个家对外露脸的主要窗口,所以他们的经历势必会更多一些)商量一下,因为到他们那个50来岁的年龄为人处世对各种问题的思考和态度肯定要比我们年轻人稳重许多。 OK,回到技术话题来。 时序问题在FPGA设计中是比较困扰设计者的大问题,经常我们是需要一步一步去经历那些大的小的问题后,再有一些总结和分析甚至需要归纳出一些常见普遍的应对办法并应用到今后的设计中才能够逐步降低犯错的几率。其实时序问题是最让人琢磨不透,甚至有时候很难想象出现的现象本身居然和时序有关。特权同学的这个现象确有几分怪异,可以说出现了好几种比较反常的现象,甚至难以解释到只有怀疑是时序问题。其实问题本身并没有什么大不了,说白了就是时序不收敛,确切的说应该是在时序约束不到位的情况下收敛的时序导致了问题的发生,那说白了就是时序不收敛。 对于一款800*480的LCD,其数据通过一条24bit的RGB数据总线传输,配合着进行数据锁存和控制的是一条33.33MHz的时钟信号线和数据使能信号DE。通常对于一些小分辨率的LCD时钟频率都较低,有时候即便确实存在一些时序设计不合理的问题,但并不容易甚至不会暴露出来,但是对于特权同学当前提到的频率却有着较严格的时序要求。 出现的奇怪现象其实是多次了,在设计的不同阶段不同应用中都有过,而每次的现象都有些不同,这就是时序问题让人琢磨不透的原因。对于这里要说的例子,一张图一个表就足以代表LCD的时序,如截图的图1和图2所示。 图1 图2 简单的说,驱动LCD的时钟DCLK在下降沿锁存数据。也就是说,在DCLK的下降沿前的某段时间(即建立时间Tdsu)以及下降沿后的某段时间(即保持时间Tdhd)数据和DE信号(如果使用HS和VS信号,也必须满足此要求)必须保持稳定。情况不复杂,就看设计中怎么去实现这个要求。 旧有的一个项目,用一片CPLD来驱动LCD,因为没有PLL等时钟产生单元,所以33.33MHz的时钟是FPGA内部和驱动LCD共用的。因为LCD端要用下降沿锁存数据,那么FPGA内部就必须要上升沿来处理数据,因此通常这两个时钟同频同相好像就能够满足要求。而得到的效果通常必须用时序约束去保证,这种方式的不可控性比较高,通常对固定器件有着碰运气的成分在里面,当然如果约束得好并且器件也“很给力”那就是可行的。而另一种方式,通常是FPGA里有专门的时钟产生单元(如PLL、DLL之类),可以产生两个33.33MHz的时钟,通常可以设置他们同频不同相,即相位可调,那么要达到图示的时序关系也显得比较容易。不过有时候愚夫即便有米也不一定有“炊”,还要看时序约束的功力,纯粹靠调整相位来达到时序收敛是有风险的,或者说没有时序约束(没有看到时序报告)是无法定论这个设计时序是没有问题的。 插入说一句,LCD时序约束不收敛对于特权同学手头的项目手头的应用来看,会出现显示的图像扭曲、或者一个完整的图画时不时的闪烁,这两种现象不是同时出现的。并且还有一个很有意思的状况:在基本全部深色的一幅图片中,上述两种现象出现的概率非常低,甚至于不显现问题,而在色彩对比强烈的图像中,问题尤其突出。仔细想想,其实并不难解释原因,色彩丰富的图像数据电平跳变的较频繁,因为时序不收敛,所以发生误锁存的频率也就多,出现问题的概率也就大。 那么如何对其进行约束呢,特权同学不详细深入,只做个模型供大家参考消化。首先,我们明确时钟和信号之间的关系如图3所示。 在理想状态下,要在LCD信号锁存端口得到图3的时序关系,如果FPGA Clock相位为0,那么取LCD Clock相位为0°即可。而实际情况却非如此简单,因为Signal Bus的众多信号在FPGA Clock上升沿后若干时间才会到达FPGA端口,并且不可能所有信号都同一时刻到达,会存在快的和慢的,即有一个时间段,这里姑且假设最快时间为td1,最慢时间为td2。同样的,对于LCD Clock信号,虽然设置了0°的相位,但是实际上从PLL或DLL端口输出到达FPGA管脚也会有或多或少的一点时钟网络延时时间,这里假设最快为tc1,最慢为tc2。同时我们假设LCD Clock相对于FPGA Clock的相位偏移不为0°,而是tshift,这是我们后面需要计算的值,通常情况下0°不会是最理想的相移。此外,我们已经知道的时序值有:时钟信号周期tclk = 30ns,信号的建立时间tdsu = 8ns,保持时间tdhd = 8ns。 我们不考虑信号在PCB板上的走线延时,这些值相对较小,大多时候可以忽略。设计者也可以根据实际情况考虑进去。对于LCD Clock,其下降沿到达FPGA端口时间为(tc1~tc2)+tshift+(tclk/2)。对于Signal Bus,其到达FPGA端口时间为(td1~td2)。为了满足建立保持时间关系,必须满足如下不等式: 建立时间:tc1+tshift+(tclk/2)-tdsu td2 保持时间:tc2+tshift+(tclk/2)+tdhd tclk+td1 代入当前已知值可得: 建立时间:tshift td2- tc1-7ns 保持时间:tshift td1+7ns-tc2 因此,要取最理想或者说最保险的tshift值,可以是前面两个不等式右端的中间值,即: Tshift = ((td2- tc1-7ns)+( td1+7ns-tc2))/2 = (td2+td1-tc1-tc2)/2 回头看看,其实这类时序也是非常典型的源同步接口,和SDRAM接口相比,SDRAM不仅有输出而且有输入,因此在时序分析考虑中,计算相移相对比较复杂;而LCD是单向的接口,只需要考虑输出后接收端的时钟沿对齐接口,因此更简单,时序收敛也容易些。
相关资源