今天面试,要走时问了我一个问题:如果两个时钟一个时钟慢一个时钟快,来读写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. 源码分析:Java对象的内存分配

    Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有 ...

  2. MFC 线程使用

    CWinThread*  m_pthread; //多线程对象 struct param//参数传递结构体 { int id; TASK t[20]; }; CNB400Dlg::CNB400Dlg( ...

  3. docker 命令汇总

    命令汇总 docker history fa5fa5为镜像id或者镜像名 docker export 30b >h.tar30b为容器id或者容器名# docker export angry_b ...

  4. Durid(一): 原理架构

    Durid是在2013年底开源出来的,当前最新版本0.9.2, 主要解决的是对实时数据以及较近时间的历史数据的多维查询提供高并发(多用户),低延时,高可靠性的问题.对比Druid与其他解决方案,Kyl ...

  5. 【python】删除1~100的素数

    def delPrime(x): if x==1: return True for y in range(2,x): if x%y==0: return True return False x1=ra ...

  6. github管理代码

    1.首先去github官网申请一个账号 github官网 2.登录github,并新建一个库: 点击: 进去之后,这里填写库名,可以随便填写:  然后直接点击: 3.本地连接github 1)安装gi ...

  7. 黄聪:如何关闭phpstorm的typo拼写检查

    文件-设置-编辑器-inspections-spelling-typo

  8. JVM参数(一)JVM类型以及编译器模式

    现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不 ...

  9. Spark往Elasticsearch读写数据

    def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setAppName("DecisionTre ...

  10. day6-2面向对象

    概述: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 注:Java和C#来 ...