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

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

逻辑设计中关于延时n拍的设计方法_第1张图片

图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_n
	
reg           q_t;
always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)
		q_t  <=  1'b0;
	else
		q_t  <=  d;
end

assign q  =  q_t;

其所对应的RTL Schematic为:

逻辑设计中关于延时n拍的设计方法_第2张图片


每一个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)
begin
	if(!rst_n)
		q_t  <=  0;
	else
		q_t  <=  {q_t[n-2:0],d};
end

assign q  =  q_t[n-1];


其所对应的RTL Schematic为:

逻辑设计中关于延时n拍的设计方法_第3张图片


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

逻辑设计中关于延时n拍的设计方法_第4张图片


方法三:for循环

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

input         d,
output        q,
input         clk,
input         rst_n
	
parameter 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];
  end
end

assign q  =  q_t;



其所对应的RTL Schematic为:

逻辑设计中关于延时n拍的设计方法_第5张图片


仿真时序图:

逻辑设计中关于延时n拍的设计方法_第6张图片

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


方法四:双端口RAM

方法五:FIFO

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



你可能感兴趣的:(FPGA逻辑设计之设计方法)