异步FIFO的编程
对于异步FIFO。最基本的两个方面是地址控制和空、满标志位的产生。首先地址控制分别为读地址和写地址,每次读写时能读写地址应该加1.计数次数为ram深度的2倍。当读写地址相等时则空标志位有效,当读写地址最高位互补其余位相等时则满标志位有效。
存储部分採用双口RAM实现。
以下是详细的Verilog代码:
module afifo(r_clk,w_clk,rst_n,data_in,data_out,we,re,empty,full);
input r_clk,w_clk,rst_n,re,we;
output empty,full;
input [7:0] data_in;
output[7:0] data_out;
wire[4:0] waddr,raddr;
wire [4:0] g_waddr,g_raddr;
// empty full
assign empty=(raddr==waddr);
assign full=((raddr[3:0]==waddr[3:0])&&(raddr[4]==(~waddr[4])));
wire wenable=we&&(~full);
wire renable=re&&(~empty);
afifo_control afifo_control1(
.r_clk(r_clk),
.w_clk(w_clk),
.rst_n(rst_n),
.we(wenable),
.re(renable),
.raddr(raddr),
.waddr(waddr)
);
dualram dualram_inst (
.data ( data_in ),
.rdaddress ( raddr[3:0] ),
.rdclock ( r_clk ),
.wraddress ( waddr[3:0] ),
.wrclock ( w_clk ),
.wren ( wenable ),
.q ( data_out )
);
endmodule
module afifo_control(r_clk,w_clk,rst_n,we,re,raddr,waddr);
input r_clk,w_clk,rst_n,we,re;
output reg[4:0] raddr,waddr;
always @(posedge r_clk or negedge rst_n)
if(!rst_n) begin
raddr<=3'd0;
end
else if(re) begin
raddr<=raddr+1'b1;
end
always @(posedge w_clk or negedge rst_n)
if(!rst_n) begin
waddr<=3'd0;
end
else if(we) begin
waddr<=waddr+1'b1;
end
endmodule
testbench例如以下:
`timescale 1 ns/ 1 ps
module afifo_vlg_tst();
// constants
// general purpose registers
//reg eachvec;
// test vector input registers
reg [7:0] data_in;
reg r_clk;
reg re;
reg rst_n;
reg w_clk;
reg we;
// wires
wire [7:0] data_out;
wire empty;
wire full;
// assign statements (if any)
afifo i1 (
// port map - connection between master ports and signals/registers
.data_in(data_in),
.data_out(data_out),
.empty(empty),
.full(full),
.r_clk(r_clk),
.re(re),
.rst_n(rst_n),
.w_clk(w_clk),
.we(we)
);
initial
begin
#0; rst_n=1;data_in=100;re=0;we=0;
#50;rst_n=0;
#50;rst_n=1;
#20;re=1;
#20;re=0;
#20;we=1;
#60;data_in=180;
#2000;we=0;re=1;
#3000;re=0;
#100;$stop();
end
always
// optional sensitivity list
// @(event1 or event2 or .... eventn)
begin
// code executes for every event on sensitivity list
// insert code here --> begin
#10 r_clk=1; w_clk=0;
#10 r_clk=0; w_clk=1;
//@eachvec;
// --> end
end
endmodule
异步FIFO的编程的更多相关文章
- 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术
一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...
- 异步fifo的设计
本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据) ...
- 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】
欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...
- 异步FIFO为什么用格雷码
异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于 ...
- 异步FIFO的verilog实现与简单验证(调试成功)
最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误. 于是自己写了一个调试成功的代码,放上来供大家参考. 非原创 原理参考下面: 原文 ht ...
- 怎么用Verilog语言描述同步FIFO和异步FIFO
感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...
- Verilog设计异步FIFO
转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...
- 异步fifo的Verilog实现
一.分析 由于是异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题,如何解决? 跨时钟域的问题:由于读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO ...
- 异步FIFO空满设计延迟问题
由于设计的时候读写指针用了至少两级寄存器同步,同步会消耗至少两个时钟周期,势必会使得判断空或满有所延迟,这会不会导致设计出错呢? 异步FIFO通过比较读写指针进行满空判断,但是读写指针属于不同的时钟域 ...
随机推荐
- php+nginx 限制上传文件大小
问题:在后台上传8M大小的图片,上传不成功 nginx返回413,如下图所示: 分析:nginx配置文件或者php中,可上传的大小设置太小了 解决办法------检查nginx和php的配置文件里面的 ...
- pytorch: Variable detach 与 detach_
pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么. detach 官方文档中,对这个方法是这么介绍的. 返回 ...
- baidu让用户更快看到首页
//让用户更快看到首页 if(!location.hash.match(/[^a-zA-Z0-9]wd=/)) { document.getElementById("wrapper" ...
- Wireshark does not show SSL/TLS
why it doesn't show as "TLS/SSL"? Because it's not on the standard port for SSL/TLS. You c ...
- 一个页面从输入URL到加载显示完成,发生了什么?
面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...
- 修改Python的镜像源
Mac OS下修改Python的镜像源 步骤: 切换到家目录 创建目录 .pip 并切换到该目录 创建 pip.conf 文件并写入配置信息 [global] index-url = https:// ...
- poj2325 大数除法+贪心
将输入的大数除以9 无法整除再除以 8,7,6,..2,如果可以整除就将除数记录,将商作为除数继续除9,8,...,3,2. 最后如果商为1 证明可以除尽 将被除过的数从小到大输出即可 #includ ...
- webstrom破解-webstrom2018.2.4破解方法(xjl456852原创)
方法一: 获取注册码: http://idea.lanyus.com/ 方法二: 使用破解补丁 放在安装目录的bin目录下,并且编辑bin目录下的文件 如果使用的32位的webstrom就编辑webs ...
- centOS 7 换ssh端口
centos 最少安装时缺少semanage的,要这样装补上,因为默认是安装了SElinux的 [root@localhost ~]# sestatus SELinux status: enabled ...
- Spark 动态(统一)内存管理模型
作者编辑:王玮,胡玉林 一.回顾 在前面的一篇文章中我们介绍了spark静态内存管理模式以及相关知识https://blog.csdn.net/anitinaj/article/details/809 ...