FIFO跨时钟域读写
生活随笔
收集整理的這篇文章主要介紹了
FIFO跨时钟域读写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? 今天面試,要走時問了我一個問題:如果兩個時鐘一個時鐘慢一個時鐘快,來讀寫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 )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?
??
轉載于:https://www.cnblogs.com/zhongguo135/p/6012467.html
總結
以上是生活随笔為你收集整理的FIFO跨时钟域读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: new,delete和malloc,fr
- 下一篇: 读后感:你的灯亮着吗