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 前言 对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样 ...
随机推荐
- JavaScript 中的window.event代表的是事件的状态,jquery事件对象属性,jquery中如何使用event.target
http://wenda.haosou.com/q/1373868839069215 http://kylines.iteye.com/blog/1660236 http://www.cnblogs. ...
- 怎样用JS获取ASP.NET服务器控件的客户端ID
虽然简单,不过曾经困扰多时,还是记录一下吧. 来源:http://mou518.blog.163.com/blog/static/1756052222010111434428828/ 因为经常服务器控 ...
- CentOS 7 httpd服务的安装、配置
关于linux httpd的搭建和配置都需要基于yum源 1:安装httpd yum linstall httpd -y 2:进入html文件 cd /var/www/html 讲已经编辑的htm ...
- for xml path(''),root('')
,,'') SELECT top 10 ROW_NUMBER()OVER(ORDER BY OperationID) as 'Message/MessageId', OperationID as 'I ...
- [转]理解android.intent.category.LAUNCHER 具体作用
转自:http://blog.csdn.net/jackrex/article/details/9189657 android.intent.category.LAUNCHER 具体有什么作用?我做一 ...
- OAF_文件系列4_实现OAF上传显示数据库动态图片Image(案例)
20150805 Created By BaoXinjian
- zero ice 如何获取本地以及对端IP 地址及端口号
// 在客户端显示端点连接IP及端口号信息 static void show_endpoint(const Ice::ObjectPrx &proxy) { Ice::ConnectionPt ...
- C++使用VARIANT实现二维数组的操作
C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...
- zmap使用笔记
zmap使用笔记 zmap, 一个网络端口开放性的快速扫描工具.至于这个工具的特色,配置参数,和比的工具的对比,不做介绍.只记录一下近期使用过程中,遇到的问题.软件版本:2.1.1 传言与现实 传言: ...
- 记一个PowerShell的方法调用 --ResolveWindowsPrincipal
没时间系统的学习PowerShell, 只能现学现用. 这段函数调用花了我半个多小时才搞定. 呵呵. 您别笑我, 呵呵. 在这里个例子里, 包括了PowerShell里如下的一些要点: 静态函数的调用 ...