今天面试,要走时问了我一个问题:如果两个时钟一个时钟慢一个时钟快,来读写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 = 'd6;
parameter CPRI_DATA_BITS = 'd18;
parameter CPRI_WN_BITS = 'd6;
parameter CPRI_FRAME_LEN = 'd40;
parameter CPRI_BFN_BITS = 'd12;
parameter CPRI_HYPER_LEN = 'd1024;
parameter FIFO_WR_NUM ='d6; input wr_clk;
input rd_clk;
input [CPRI_CFG_BITS-:]cfg_rf_iq;
input [CPRI_CFG_BITS-:]cfg_start_wn;
input [CPRI_DATA_BITS-:]din_iq;
input nd;
input [CPRI_WN_BITS-:]wn_rx;
output [CPRI_DATA_BITS-:] dout_iq ; reg [CPRI_DATA_BITS-:] dout_iq= ;
reg [CPRI_CFG_BITS-:]fifo_wr_start=;
reg [CPRI_CFG_BITS-:] fifo_rd_start=;
reg [CPRI_CFG_BITS-:] fifo_rd_end=;
reg rd_valid=;
reg rd_en=;
reg rd_en_reg1=; wire empty;
wire [CPRI_DATA_BITS-:] fifo_dout ;
wire [:] wr_data_count ;
wire [:] rd_data_count ; always @ ( posedge rd_clk )
begin
fifo_rd_start <= cfg_start_wn -'d1;
end always @ ( posedge rd_clk )
begin
fifo_rd_end <= fifo_rd_start+cfg_rf_iq;
end always @( posedge rd_clk )
begin
if(rd_data_count >= FIFO_WR_NUM )
rd_valid <= 'b1;
end always @(posedge rd_clk)
begin
if(empty|(!rd_valid))
begin
rd_en <= ;
end
else if(wn_rx==fifo_rd_start)
begin
rd_en <= ;
end
else if(wn_rx==fifo_rd_end)
begin
rd_en <= ;
end
end 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 ;
end always@(posedge rd_clk)
begin
if(rd_en_reg1)
dout_iq <= fifo_dout;
else
dout_iq <= ;
end endmodule

FIFO跨时钟域读写的更多相关文章

  1. 异步FIFO跨时钟域亚稳态如何解决?

    跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...

  2. 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】

    欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...

  3. FPGA跨时钟域处理方法

    文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...

  4. FPGA基础学习(3) -- 跨时钟域处理方法

    文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...

  5. FPGA中亚稳态相关问题及跨时钟域处理

    前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...

  6. 跨时钟域设计【一】——Slow to fast clock domain

    跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...

  7. 跨时钟域设计【二】——Fast to slow clock domain

    跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock dom ...

  8. 基于FPGA的跨时钟域信号处理——专用握手信号

    在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信.异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同 ...

  9. cdc跨时钟域处理-结绳握手法

    参考文档 https://blog.csdn.net/u011412586/article/details/10009761 前言 对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样 ...

随机推荐

  1. 在Linux系统中如何设置APACHE服务器里的后台页面只允许某个IP地址访问

    补充资料 本网络中使用LINUX服务器,web服务器是由APACHE搭建,IP地址为192.168.1.5,后台页面为/admin/login.jsp . 如何设置后台页面LOGIN.JSP只允许19 ...

  2. 一个链式调用 setTimeout的例子

    <div> 现在时间是:<input type="text" id="name1" size="16" value=&qu ...

  3. PHP、JAVA、C#、Object-C 通用的DES加密

    PHP.JAVA.C#.Object-C 通用的DES加密 PHP: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  4. javascript_data

    var now = new Date(); // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now; // 2015, 年份 now.getFullYear(); ...

  5. 安全快速修改Mysql数据库名的5种方法

    1. RENAME DATABASE db_name TO new_db_name这个..这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了.据说有可能丢失数据.还是不要用的好.详 ...

  6. HackerRank "Larry's Array"

    I caught the sparkle in my mind and got AC1 ! It is a great great experience ! So the basic idea: pe ...

  7. Oracle存储过程 输出参数赋值异常:“Oracle.DataAccess.Types.OracleString”的类型初始值设定项引发异常。

    场景: 写了一个有返回参数的存储过程,在个另开发人员机器上都正常.其它机器报如题错误.让人郁闷的是,所有调用方都是客户端,根本不存在网上众贴所说的版本不一致问题. 分析: 虽然网上的帖子没有根本解决问 ...

  8. php_sapi_name详解

    php_sapi_name : — 返回 web 服务器和 PHP 之间的接口类型. 返回描述 PHP 所使用的接口类型(the Server API, SAPI)的小写字符串. 例如,CLI 的 P ...

  9. 外联css及js的使用

    结构图如下: html如下: <!DOCTYPE html> <html> <head> <title>button test</title> ...

  10. Bellman算法

    Bellman算法 当图有负圈的时候可以用这个判断最短路! [时间复杂度]O(\(nm\)) &代码: #include <bits/stdc++.h> using namespa ...