引言:在像素領域處理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
當所需要的延時時鐘節拍比較多的時候,推薦使用這裏兩種方法。