欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

FIFO跨时钟域读写

发布时间:2025/7/25 编程问答 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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跨时钟域读写的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。