FIFO跨時鐘域讀寫

2021-07-24 06:30:59 字數 3463 閱讀 5840

今天面試,要走時問了我乙個問題:如果兩個時鐘乙個時鐘慢乙個時鐘快,來讀寫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...