逻辑设计中关于延时n拍的设计方法

来源:互联网 发布:淘宝夏季新款女装 编辑:程序博客网 时间:2024/05/11 03:40

引言:在像素领域处理hsync,vsync,active,以及rgb888并行数据。因为Display Monitor Timing标准,控制信号(hsync/vsync/active)以及数据rgb888之间存在着某种特定的关系,其关系大体如下图所示:

图1 : Hsync Vsync Active 与像素之间的关系


在实际使用的过程中,像素数据需要经过buffer来缓存,逻辑设计经常使用FIFO做数据缓存,而FIFO对像素数据是有延迟的。为了达到hsync vsync与像素数据的同步,并不适合将控制信号也通过FIFO,合适的方法是将控制信号延时固定的时钟节拍,就需要有控制延时N(N>=1)个时钟节拍的逻辑控制。


下面就介绍一些关于固定时钟节拍的延时RTL实现。


方法一:触发器

当N<=2的,适合用D触发器做时钟节拍延时,这样最简便,也节省相应的逻辑资源。

input         d,output        q,input         clk,input         rst_nreg           q_t;always @ (posedge clk or negedge rst_n)beginif(!rst_n)q_t  <=  1'b0;elseq_t  <=  d;endassign q  =  q_t;

其所对应的RTL Schematic为:



每一个D触发器,就在相应的时钟沿延时相应的时钟节拍。


方法二:移位寄存器

此方法本质上也是使用触发器来实现的,下面的HDL代码实现N=3的时钟节拍延时

input         d;output        q;input         clk;input         rst_n;parameter n   = 3;reg [n-1:0]   q_t;always @ (posedge clk or negedge rst_n)beginif(!rst_n)q_t  <=  0;elseq_t  <=  {q_t[n-2:0],d};endassign q  =  q_t[n-1];


其所对应的RTL Schematic为:


根据建立的testbench,得到的延迟波形图:



方法三:for循环

下面的HDL代码是实现N=8的时钟延迟,请注意代码中的n为8

input         d,output        q,input         clk,input         rst_nparameter n   = 8;reg [n-1:0]   d_t;reg           q_t;integer i;always @ (posedge clk or negedge rst_n)begin  if(!rst_n)  begin    d_t  <=  0;    q_t  <=  1'b0;  end  else  begin    d_t[0]  <=  d;    for(i=1;i<=n-1;i=i+1)      d_t[i]  <=  d_t[i-1];    q_t  <=  d_t[n-1];  endendassign q  =  q_t;



其所对应的RTL Schematic为:


仿真时序图:



这种方法可以明显地看出,所使用的寄存器相比前两种方法要少。


方法四:双端口RAM

方法五:FIFO

当所需要的延时时钟节拍比较多的时候,推荐使用这里两种方法。