今天面试,要走时问了我一个问题:如果两个时钟一个时钟慢一个时钟快,来读写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. Sublog: 支持Markdown和语法高亮的跨平台博客客户端

    灵感来自米米饭 功能一览 为什么你应该试试用Sublog写博客 项目主页: sublog 使用方法: 本项目是一个插件,首先要安装Sublime Text 2 重命名sublog.sublime-se ...

  2. docker swarm

    1.docker pull swarm 2.docker run --rm swarm create #创建cluster id b1442105f281c7eaa31f8e5d815fe0e2 3. ...

  3. CentOS6.8 MySQL 5.6实现主从复制

    主库操作 1.将mysqldump命令添加到/usr/bin中 ln -s /application/mysql/bin/mysqldump /usr/bin/ 2.开启master上的log-bin ...

  4. C#创建datatable

    Asp.net DataTable添加列和行的方法 方法一: DataTable tblDatas = new DataTable("Datas"); DataColumn dc ...

  5. ASP.NET学习笔记1—— MVC

    MVC项目文件夹说明 1.App_Data:用来保存数据文件 2.App_Start:包含ASP.NET-MVC系统启动的相关类文件 3.Controllers:存放整个项目"控制器&quo ...

  6. linux 下 ntfs移动硬盘挂载

    fdisk -l Disk /dev/sdb: 500.0 GB, 500074283008 bytes255 heads, 63 sectors/track, 60797 cylindersUnit ...

  7. linux 下 用户与用户组

    1,增加一个test组:groupadd test 2,将test组重命名test2:groupmod -n test2 test 3,删除test2组:groupdel test2 4,查看当前登录 ...

  8. Linux中cp和scp命令的使用方法

    Linux为我们提供了两个用于文件copy的命令,一个是cp,一个是scp,但是他们略有不同. cp --- 主要是用于在同一台电脑上,在不同的目录之间来回copy文件 scp --- 主要是在不同的 ...

  9. 阿里 classloader

    http://blog.csdn.net/scythe666/article/details/51956047

  10. Oracle死锁产生的原因和解决办法

    如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁.用下面实验来说明死锁的产生原因和解决办法.SESSION1:SQL> create table t2 as select * ...