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 = '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跨时钟域读写的更多相关文章
- 异步FIFO跨时钟域亚稳态如何解决?
跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...
- 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】
欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...
- FPGA跨时钟域处理方法
文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...
- FPGA基础学习(3) -- 跨时钟域处理方法
文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...
- FPGA中亚稳态相关问题及跨时钟域处理
前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...
- 跨时钟域设计【一】——Slow to fast clock domain
跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...
- 跨时钟域设计【二】——Fast to slow clock domain
跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下: // Trigger signal sync, Fast clock dom ...
- 基于FPGA的跨时钟域信号处理——专用握手信号
在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信.异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同 ...
- cdc跨时钟域处理-结绳握手法
参考文档 https://blog.csdn.net/u011412586/article/details/10009761 前言 对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样 ...
随机推荐
- C#常见控件命名规则举例
控件 缩写 举例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calendar ca ...
- Python中reactor,factory,protocol
最为简单的情况下,除了了解清reactor的简单使用,你还要了解Protocol和Factory.它们最终都会由reactor的侦听建立和run来统一调度起来. 建立服务器的第一个要解决的问题就是服务 ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...
- SocketTcpServer
自定义SocketTcpServer,虽然现在有很多这样的组件,但是有时候还是需要把它集成在你的框架或者产品中,不需要特别强大的功能,根据需求定制.最基本的一个问题是判断数据包的结束,没有像super ...
- SSIS 目录
微软 BI 系列随笔 - SSIS 2012 基础 - SSIS 目录 上一篇讲解了使用SSIS参数与环境,由于涉及到了SSIS目录的相关知识和概念,本篇将对其进行讲解. 注:在之前的版本中,是使用整 ...
- WeX5之xid相关API
WeX5针对xid提供了以下js api: 1.根据xid获取id:this.getIDByXID(xid): 2.根据xid获取HTML节点:this.getElementByXid(xid),此a ...
- Java中Enum类型的序列化(转)
在Java中,对Enum类型的序列化与其他对象类型的序列化有所不同,今天就来看看到底有什么不同.下面先来看下在Java中,我们定义的Enum在被编译之后是长成什么样子的. Java代码: Java代码 ...
- Selenium
Selenium可以抓取完整的页面的html但是request 和java的url不能抓的很完整. selenium的方法是dirver.page_source
- CentOS的安装与克隆
CentOS的安装与克隆 环境说明 win7 x64位:VMware12:CentOS-6.5-x86_64-minimal 安装与初始配置 安装 在WM主页--“创建新的虚拟机”--自定义--... ...
- SQL SERVER安装序列号
MICROSOFT SQL SERVER 2012 DEVELOPER 版 序列号:YQWTX-G8T4R-QW4XX-BVH62-GP68Y MICROSOFT SQL SERVER 2012 EN ...