邏輯設計中關於延時n拍的設計方法

引言:在像素領域處理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_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爲:



每一個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爲:


根據建立的testbench,得到的延遲波形圖:



方法三: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爲:


仿真時序圖:



這種方法可以明顯地看出,所使用的寄存器相比前兩種方法要少。


方法四:雙端口RAM

方法五:FIFO

當所需要的延時時鐘節拍比較多的時候,推薦使用這裏兩種方法。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章