今天面試,要走時問了我乙個問題:如果兩個時鐘乙個時鐘慢乙個時鐘快,來讀寫fifo,其中讀出的資料是
連續的一段一段的。
圖1 圖1為寫時序控制,可以看出資料是兩個時鐘週期的長度,當然實際中可以是任意週期的長度。
圖2
圖2為讀時序,ren使能的長度也可以是任意,但是我以為一點是必須保證的,那就是讀寫資料的速率依然是相等的。
在讀寫資料相等,讀寫資料都是週期性的前提下,我認為只要對fifo直接進行讀寫就可以,不要求對資料進行任何快取,
但是為防止讀寫衝突,可以快取幾個資料。那麼重點就在於產生讀寫使能就行了。
`timescale 1ns /1ps//module
fifo_trans(
wr_clk,
rd_clk,
cfg_rf_iq,//乙個幀中有效使能的長度
cfg_start_wn,//乙個幀中有效使能的位置
din_iq,
nd,wn_rx,
dout_iq
);parameter cpri_cfg_bits = 4
'd6;
parameter cpri_data_bits = 6
'd18;
parameter cpri_wn_bits = 4
'd6;
parameter cpri_frame_len = 6
'd40;
parameter cpri_bfn_bits = 4
'd12;
parameter cpri_hyper_len = 12
'd1024;
parameter fifo_wr_num =6
'd6;
input
wr_clk;
input
rd_clk;
input [cpri_cfg_bits-1:0
]cfg_rf_iq;
input [cpri_cfg_bits-1:0
]cfg_start_wn;
input [cpri_data_bits-1:0
]din_iq;
input
nd;
input [cpri_wn_bits-1:0
]wn_rx;
output [cpri_data_bits-1:0
] dout_iq ;
reg [cpri_data_bits-1:0] dout_iq=0
;
reg [cpri_cfg_bits-1:0]fifo_wr_start=0
;
reg [cpri_cfg_bits-1:0] fifo_rd_start=0
;
reg [cpri_cfg_bits-1:0] fifo_rd_end=0
;
reg rd_valid=0
;
reg rd_en=0
;
reg rd_en_reg1=0
;
wire
empty;
wire [cpri_data_bits-1:0
] fifo_dout ;
wire [5:0
] wr_data_count ;
wire [5:0
] rd_data_count ;
always @ ( posedge
rd_clk )
begin
fifo_rd_start
<= cfg_start_wn -8
'd1;
endalways @ ( posedge
rd_clk )
begin
fifo_rd_end
<= fifo_rd_start+cfg_rf_iq;
endalways @( posedge
rd_clk )
begin
if(rd_data_count >=fifo_wr_num )
rd_valid
<= 1
'b1;
endalways @(posedge
rd_clk)
begin
if(empty|(!rd_valid))
begin
rd_en
<= 0
;
endelse
if(wn_rx==fifo_rd_start)
begin
rd_en
<= 1
;
endelse
if(wn_rx==fifo_rd_end)
begin
rd_en
<= 0
;
endend
dp_fifo_ip u_dp_fifo (
//.rst (1'b0),
//~sys_rst_n ),
.wr_clk (wr_clk ),
.rd_clk (rd_clk ),
.din (din_iq ),
.wr_en (nd ),
.rd_en (rd_en ),
.dout (fifo_dout ),
//.wr_data_count (wr_data_count ),
.rd_data_count (rd_data_count ), //
output wire [7 : 0] rd_data_count
.full ( ),
.empty (empty )
);always@(posedge
rd_clk)
begin
rd_en_reg1
<=rd_en ;
endalways@(posedge
rd_clk)
begin
if(rd_en_reg1)
dout_iq
<=fifo_dout;
else
dout_iq
<= 0
;
endendmodule
非同步fifo 跨時鐘域同步(非同步FIFO)
本文使用 zhihu on vscode 創作並發布 之前學習了跨時鐘域下的單bit訊號同步的方法,這些單bit訊號多是作為控制訊號或者標誌訊號來使用,再實際的專案中,處理多bit資料也是十分常見的,即資料的同步。非同步fifo的實現其實本質上和雙口ram是一樣的,其實現思路就是將資料在src cl...
FPGA跨時鐘域處理方法FIFO
1 本節目錄 2 本節引言 3 fpga簡介 4 fpga跨時鐘域處理方法fifo 5 結束語。不積跬步,無以至千里 不積小流,無以成江海。就是說 不積累一步半步的行程,就沒有辦法達到千里之遠 不積累細小的流水,就沒有辦法匯成江河大海。fpga field programmable gate arr...
跨時鐘域處理
需要做的事情 使能訊號txe to eth由時鐘122.88m時鐘輸出 另一使能訊號vde dv由25m時鐘輸出,計算兩個使能訊號之間的時間間隔,即兩個訊號上公升沿之間的時鐘計數。由於兩個訊號屬於不同的時鐘域,因此要先進行跨時鐘域處理,這裡對vde dv進行處理 在122.88m時鐘下將vde dv...