FIFO跨时钟域读写
? ? 今天面試,要走時(shí)問了我一個(gè)問題:如果兩個(gè)時(shí)鐘一個(gè)時(shí)鐘慢一個(gè)時(shí)鐘快,來讀寫FIFO,其中讀出的數(shù)據(jù)是
? ?連續(xù)的一段一段的。
? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1?
? ? 圖1為寫時(shí)序控制,可以看出數(shù)據(jù)是兩個(gè)時(shí)鐘周期的長(zhǎng)度,當(dāng)然實(shí)際中可以是任意周期的長(zhǎng)度。
? ? ?
?
? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2 ?
? ? 圖2為讀時(shí)序,ren使能的長(zhǎng)度也可以是任意,但是我以為一點(diǎn)是必須保證的,那就是讀寫數(shù)據(jù)的速率依然是相等的。
?
? ? 在讀寫數(shù)據(jù)相等,讀寫數(shù)據(jù)都是周期性的前提下,我認(rèn)為只要對(duì)FIFO直接進(jìn)行讀寫就可以,不要求對(duì)數(shù)據(jù)進(jìn)行任何緩存,
但是為防止讀寫沖突,可以緩存幾個(gè)數(shù)據(jù)。那么重點(diǎn)就在于產(chǎn)生讀寫使能就行了。
?
? ??
`timescale 1ns / 1ps //module fifo_trans(wr_clk,rd_clk,cfg_rf_iq,//一個(gè)幀中有效使能的長(zhǎng)度cfg_start_wn,//一個(gè)幀中有效使能的位置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 )beginfifo_rd_start <= cfg_start_wn -8'd1;endalways @ ( posedge rd_clk )beginfifo_rd_end <= fifo_rd_start+cfg_rf_iq;endalways @( posedge rd_clk )beginif(rd_data_count >= FIFO_WR_NUM )rd_valid <= 1'b1;end always @(posedge rd_clk)beginif(empty|(!rd_valid))beginrd_en <= 0;endelse if(wn_rx==fifo_rd_start)beginrd_en <= 1; endelse if(wn_rx==fifo_rd_end)beginrd_en <= 0;endenddp_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)beginrd_en_reg1 <= rd_en ;endalways@(posedge rd_clk)beginif(rd_en_reg1)dout_iq <= fifo_dout;elsedout_iq <= 0;endendmodule?
??
轉(zhuǎn)載于:https://www.cnblogs.com/zhongguo135/p/6012467.html
總結(jié)
以上是生活随笔為你收集整理的FIFO跨时钟域读写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new,delete和malloc,fr
- 下一篇: 读后感:你的灯亮着吗