基于FPGA的异步FIFO验证
现在开始对上一篇博文介绍的异步FIFO进行功能验证,上一篇博文地址:http://blog.chinaaet.com/crazybird/p/5100000872 。对异步FIFO验证的平台如图1所示。

图1 异步FIFO验证平台
其中,clock为时钟生成器,asyn_fifo_if为产生异步FIFO读写命令的模块,asyn_fifo为异步FIFO设计模块。
验证顶层模块testbench的代码如下所示:
/*******************************版权申明********************************
** 电子技术应用网站, CrazyBird
** http://www.chinaaet.com, http://blog.chinaaet.com/crazybird
**
**------------------------------文件信息--------------------------------
** 文件名: clock.v
** 创建者: CrazyBird
** 创建日期: 2016-1-16
** 版本号: v1.0
** 功能描述: 时钟生成器
**
***********************************************************************/
// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_on
module testbench;
//******************************************************************
// 变量定义
//******************************************************************
wire wr_rst_n;
wire wr_clk;
wire wr_en;
wire [7:0] wr_data;
wire wr_full;
wire [4:0] wr_cnt;
wire rd_rst_n;
wire rd_clk;
wire rd_en;
wire [7:0] rd_data;
wire rd_empty;
wire [4:0] rd_cnt;
//******************************************************************
// 时钟生成器例化
//******************************************************************
clock #(
.C_CLK_FREQ(100.0)
)
u_clock_wr (
.clk ( wr_clk )
);
clock #(
.C_CLK_FREQ(70.0)
)
u_clock_rd (
.clk ( rd_clk )
);
//******************************************************************
// 异步FIFO读写指令产生模块例化
//******************************************************************
asyn_fifo_if #(
.C_DATA_WIDTH(8)
)
u_asyn_fifo_if (
.wr_rst_n ( wr_rst_n ),
.wr_clk ( wr_clk ),
.wr_en ( wr_en ),
.wr_data ( wr_data ),
.wr_full ( wr_full ),
.rd_rst_n ( rd_rst_n ),
.rd_clk ( rd_clk ),
.rd_en ( rd_en ),
.rd_empty ( rd_empty )
);
//******************************************************************
// 异步FIFO模块例化
//******************************************************************
asyn_fifo #(
.C_DATA_WIDTH(8),
.C_FIFO_DEPTH_WIDTH (4)
)
u_asyn_fifo (
.wr_rst_n ( wr_rst_n ),
.wr_clk ( wr_clk ),
.wr_en ( wr_en ),
.wr_data ( wr_data ),
.wr_full ( wr_full ),
.wr_cnt ( wr_cnt ),
.rd_rst_n ( rd_rst_n ),
.rd_clk ( rd_clk ),
.rd_en ( rd_en ),
.rd_data ( rd_data ),
.rd_empty ( rd_empty ),
.rd_cnt ( rd_cnt )
);
endmodule
时钟模块clock的代码实现如下所示(时钟的频率可设置):
/*******************************版权申明********************************
** 电子技术应用网站, CrazyBird
** http://www.chinaaet.com, http://blog.chinaaet.com/crazybird
**
**------------------------------文件信息--------------------------------
** 文件名: clock.v
** 创建者: CrazyBird
** 创建日期: 2016-1-16
** 版本号: v1.0
** 功能描述: 时钟生成器
**
***********************************************************************/
// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_on
module clock(
clk
);
//******************************************************************
// 参数定义
//******************************************************************
parameter C_CLK_FREQ = 100.0; //MHz
localparam C_CLK_CYCLE = 1000.0 / C_CLK_FREQ;
//******************************************************************
// 端口定义
//******************************************************************
output reg clk;
//******************************************************************
// 时钟生成
//******************************************************************
initial
begin
clk = 0;
forever #(C_CLK_CYCLE/2)
clk = ~clk;
end
endmodule
本次测试的步骤如下所示:
(1)只写异步FIFO
(2)只读异步FIFO
(3)同时读写异步FIFO
测试步骤的代码在asyn_fifo_if模块中,如下所示:
/*******************************版权申明********************************
** 电子技术应用网站, CrazyBird
** http://www.chinaaet.com, http://blog.chinaaet.com/crazybird
**
**------------------------------文件信息--------------------------------
** 文件名: asyn_fifo_if.v
** 创建者: CrazyBird
** 创建日期: 2016-1-16
** 版本号: v1.0
** 功能描述: 产生异步FIFO的读写命令
**
***********************************************************************/
// synopsys translate_off
`timescale 1 ns / 1 ps
// synopsys translate_on
module asyn_fifo_if(
wr_rst_n,
wr_clk,
wr_en,
wr_data,
wr_full,
rd_rst_n,
rd_clk,
rd_en,
rd_empty
);
//******************************************************************
// 参数定义
//******************************************************************
parameter C_DATA_WIDTH = 8;
//******************************************************************
// 端口定义
//******************************************************************
output reg wr_rst_n;
input wr_clk;
output reg wr_en;
output reg [C_DATA_WIDTH-1:0] wr_data;
input wr_full;
output reg rd_rst_n;
input rd_clk;
output reg rd_en;
input rd_empty;
//******************************************************************
// 内部变量定义
//******************************************************************
reg normal_wr;
reg normal_rd;
//******************************************************************
// 变量初始化
//******************************************************************
initial
begin
wr_rst_n = 1'b0;
rd_rst_n = 1'b0;
normal_wr = 1'b0;
normal_rd = 1'b0;
#492;
wr_rst_n = 1'b1;
rd_rst_n = 1'b1;
#100;
//只写FIFO
normal_wr = 1'b1;
repeat(20) @(negedge wr_clk);
normal_wr = 1'b0;
//只读FIFO
normal_rd = 1'b1;
repeat(20) @(negedge rd_clk);
normal_rd = 1'b0;
//同时读写FIFO
normal_wr = 1'b1;
normal_rd = 1'b1;
repeat(100) @(negedge wr_clk);
normal_wr = 1'b0;
normal_rd = 1'b0;
repeat(20) @(negedge rd_clk);
$stop;
end
//******************************************************************
// 写FIFO信号的产生
//******************************************************************
always @(negedge wr_clk or negedge wr_rst_n)
begin
if(wr_rst_n == 1'b0)
begin
wr_en <= 1'b0;
wr_data <= {(C_DATA_WIDTH){1'b0}};
end
else if(normal_wr == 1'b1)
begin
if(wr_full == 1'b0)
begin
wr_en <= 1'b1;
wr_data <= {$random%((1 << C_DATA_WIDTH)-1)};
end
else
begin
wr_en <= 1'b0;
wr_data <= {(C_DATA_WIDTH){1'b0}};
end
end
else
begin
wr_en <= 1'b0;
wr_data <= {(C_DATA_WIDTH){1'b0}};
end
end
//******************************************************************
// 读FIFO信号的产生
//******************************************************************
always @(negedge wr_clk or negedge wr_rst_n)
begin
if(wr_rst_n == 1'b0)
rd_en <= 1'b0;
else if(normal_rd == 1'b1)
begin
if(rd_empty == 1'b0)
rd_en <= 1'b1;
else
rd_en <= 1'b0;
end
else
rd_en <= 1'b0;
end
endmodule
modelsim仿真结果如图2~4所示(具体情况可自行分析)。

图2 只写异步FIFO

图3 只读异步FIFO

图4 同时读写异步FIFO
至此,异步FIFO的设计和验证都完成了。现在预告下一篇博文:参数化的优先级编码器设计。哈哈,不要以为很简单哦。记住,是“参数化”,即输入信号的位宽可设置。大家也可以先想想如何实现。也许,灵感一来很快就想出来了,否则,半个小时、1个小时、甚至很多。
转载:http://blog.chinaaet.com/crazybird/p/5100000874
基于FPGA的异步FIFO验证的更多相关文章
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
- 异步FIFO总结
异步FIFO总结 异步FIFO的基本概念 异步FIFO读写分别采用相互异步的不同时钟,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据 FIFO的常见参数 FIFO的宽度:即FIFO ...
- 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】
欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...
- 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)
1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...
- 异步fifo的设计(FPGA)
本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据) ...
- 异步FIFO的verilog实现与简单验证(调试成功)
最近在写一个异步FIFO的时候,从网上找了许多资料,文章都写的相当不错,只是附在后面的代码都多多少少有些小错误. 于是自己写了一个调试成功的代码,放上来供大家参考. 非原创 原理参考下面: 原文 ht ...
- 异步FIFO的FPGA实现
本文大部分内容来自Clifford E. Cummings的<Simulation and Synthesis Techniques for Asynchronous FIFO Design&g ...
- 基于FPGA的线阵CCD图像测量系统研究——笔记
本文是对基于FPGA的线阵CCD图像测量系统研究(作者:高尚)的阅读笔记 第一章绪论 1. 读读看 读了前面的摘要依然没有看懂作者要做什么.接着往下读....终于看到了一个字眼“基于机器视觉的图像测量 ...
- 基于FPGA的OLED真彩色动态图像显示的实现
源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...
随机推荐
- 安装apache+php记录
安装apache yum install httpd 修改apache配置文件,可以修改apache的默认端口号,根目录等 /etc/httpd/conf/httpd.conf 启动/重启apache ...
- Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused
修改hosts文件.文件在C:\WINDOWS\system32\drivers\etc目录下,Linux用户打开/etc/hosts文件.用记事本打开文件后添加以下内容. #Google主页203. ...
- 4667 Building Fence 解题报告
题意:给n个圆和m个三角形,且保证互不相交,用一个篱笆把他们围起来,求最短的周长是多少. 解法1:在每个圆上均匀的取2000个点,求凸包周长就可以水过. 解法2:求出所有圆之间的外公切线的切点,以及过 ...
- Nginx启用ssl以及免费证书申请
主要是这个东西,折腾了我两天,所以记录下来. 最开始是在meteor下面调用一个webservice,但是发现meteor项目的发布环境时https,所以请求的webservice也必须时webser ...
- npm之使用淘宝源
暂时使用: npm --registry https://registry.npm.taobao.org i express 永久使用: npm conf set registry https://r ...
- js立即执行函数应用--事件绑定
js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): <!DOCTYPE html> <html lang="zh"> & ...
- mac SVN 设置代理
1. 设置代理一种方法:Finder 菜单里面 -> 前往 -> 前往文件夹 -> /Users/username/.subversion -> 编辑文件 servers 在文 ...
- eclipse 将javaWeb项目转化成maven项目
eclipse 将javaWeb项目转化成maven项目 CreateTime--2018年4月18日16:04:18 Author:Marydon 1.首先,maven项目的标准目录 2.web ...
- Oracle EBS SLA(子分类账)
SLA概述 SLA(Subledger Accounting) 子帐是子分类帐会计的简称,字面上的含义就是子分类帐会计分录 SLA常用表介绍 在SLA中技术方面最常用的就是日记账来源追溯,在追溯的过程 ...
- 新浪微博api出现认证失败问题 (获取code字段值的问题)
出现该提示的原因:`` - 说: (2015-10-30 18:06:14)回调地址不一致,`` - 说: (2015-10-30 18:07:38)请在编辑开发者信息中将网站地址和应用信息--高级信 ...