同步fifo的verilogHDL设计实例
原创
设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志。
top 层如下所示:
/*
date : 2014/10/14
version : modelsim 10.1e-altera
design : pengxiaoen
function : 同步fifo设计
*/
module test2 (
clock ,
reset,
in_data , ou_data ,
wr_full ,
rd_empty ,
wr_en ,
rd_en
); input clock ,reset ;
input [:] in_data ; // 写入的数据
input wr_en ; //写使能
input rd_en ; //读使能 output [:] ou_data ; // 读出的数据
output wr_full ; //写满标志
output rd_empty ; //读空标志 wire [:] add_head; //ram地址头,当读使能有效+1
wire [:] add_end ; //ram地址尾,当写使能有效+1 //---------ram 模块,用来存储数据和输出数据--------------------------
data_memory U1_mem(
.clock (clock),
.reset (reset),
.wr_en (wr_en),
.rd_en (rd_en),
.add_head (add_head) ,
.add_end (add_end),
.in_data (in_data),
.ou_data (ou_data)
); //------------地址产生器 + 标志产生器---------------------------------
fifo_control U2_cont(
.clock (clock),
.reset (reset),
.wr_en (wr_en),
.rd_en (rd_en),
.wr_full (wr_full),
.rd_empty (rd_empty),
.add_head (add_head),
.add_end (add_end)
); endmodule
module data_memory (
clock ,reset ,
wr_en , rd_en ,
add_head ,add_end ,
in_data ,ou_data
);
input clock ,reset ; // system clock and system reset
input wr_en ; // write enable
input rd_en ; // read enable
input [:] add_head ; // memory address head
input [:] add_end ; // memory address end
input [:]in_data ; // data input to memory
output reg[:]ou_data ; // data output reg [:] mem [:] ; //define the memory
always @ (posedge clock )
if(!reset)
begin
ou_data <= 'dx ;
end
else
begin
case ({wr_en, rd_en})
'b00 : ou_data <= 16'dx ;
'b01 : ou_data <= mem[add_head] ;
'b10 : mem[add_end] <= in_data ;
'b11 : begin
ou_data <= mem[add_end] ;
mem[add_head] <= in_data ;
end
endcase
end endmodule
module fifo_control (
clock ,reset ,
wr_en ,rd_en ,
wr_full ,rd_empty,
add_head,add_end
);
input clock ,reset ; // system clock and system reset
input wr_en ; // write enable
input rd_en ; // read enable
output reg wr_full ; // fifo full flag
output reg rd_empty ; // fifo empty
output reg [:] add_head ,add_end ; reg [:] head_temp , end_temp ;
//------地址产生块,依据读写使能进行相应地址递增,并保存原始的位置信息-----------------------
always @ (posedge clock)
if(!reset)
begin
head_temp <= 'd0 ;
end_temp <= 'd0 ;
add_head <= 'd0 ;
add_end <= 'd0 ;
end else
begin
case ({wr_en, rd_en})
'b00 : begin
head_temp <= add_head ;
end_temp <= add_end ;
end
'b01 : begin
end_temp <= add_end ;
add_head <= add_head + 'd1 ;
end
'b10 : begin
head_temp <= add_head ;
add_end <= add_end + 'd1 ;
end
'b11 : begin
add_head <= add_head + 'd1 ;
add_end <= add_end + 'd1 ;
end
endcase
end //--------标志产生块-------------------
always @ (posedge clock)
if(!reset)
begin
wr_full <= 'd0 ;
rd_empty <= 'd0 ;
end
else
begin
case ({wr_en , rd_en})
'b00 : begin
rd_empty <= 'd0 ;
wr_full <= 'd0 ;
end
'b01 : begin
wr_full <= 'd0 ; //写标志复位
if ((add_head + 'd1) == head_temp)
rd_empty <= 'd1 ; //只有切换到写使能才复位
end
'b10 : begin
rd_empty <= 'd0 ; //读标志复位
if ((add_end + 'd1) == end_temp)
wr_full <= 'd1 ; //只有切换到读使能才复位
end
'b11 : begin
rd_empty <= 'd0 ;
wr_full <= 'd0 ;
end
endcase
end endmodule
下面附上测试代码
`timescale 1ns/1ps module test2_tb ;
reg clock ,reset ;
reg [:] in_data ;
reg wr_en ;
reg rd_en ; wire [:] ou_data ;
wire wr_full ;
wire rd_empty ; test2 U_top (
.clock (clock),
.reset (reset),
.in_data (in_data), .ou_data (ou_data),
.wr_full (wr_full),
.rd_empty (rd_empty),
.wr_en (wr_en),
.rd_en (rd_en)
); integer i ; always # clock = ~clock ; initial
begin
clock ='d0 ; reset = 1'd0 ; wr_en <= 'd0 ; rd_en <= 1'd0 ;
in_data = 'd0 ;
# reset = 'd1 ; wr_en <= 1'd1 ;
for (i=;i<;i=i+) // 故意溢出
# in_data <= in_data + 'd1 ; rd_en <= 'd1 ; wr_en <= 1'd0 ;
#(* ) // 让读空标志位触发
$stop ; end endmodule
同步fifo的verilogHDL设计实例的更多相关文章
- 同步FIFO学习
在网上找的一个经典同步FIFO例子. 一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为: ...
- Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...
- 怎么用Verilog语言描述同步FIFO和异步FIFO
感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...
- 同步fifo的Verilog实现
FIFO是一种先进先出的数据缓存器,他与普通存储器相比: 优点:没有外部读写地址线,这样使用起来非常简单: 缺点:只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存 ...
- 同步FIFO design and IP level verification
一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基 ...
- 同步fifo与异步fifo
参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...
- 推荐35个新鲜出炉的响应式 Web 设计实例
响应式设计的准则在于根据用户使用的屏幕的分辨率来改变网站的的布局.因此,视频或图像的大小和文本的数量,可以被视为是一个明显的变化.让你即使从智能手机浏览一个网站的时候能轻松地看到网站上的重要内容.今天 ...
- 最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!
Dashboard设计,尽管设计师们叫法各不相同(例如:“数据面板设计”, “控制面板设计”, “仪表盘设计”或“后台界面设计”等等).但,此类设计的最终目都是力求以最直观.最简洁的方式呈现各种信息和 ...
- App启动页设计实例与技巧
App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...
随机推荐
- python函数cmp()
cmp(x, y) 中文说明:比较两个对象x和y,如果x < y ,返回负数:x == y, 返回0:x > y,返回正数. 版本:该函数只有在python2中可用,而且在python2所 ...
- Nexus 5 电信破解问题 CDMA_HDR重启会变回LTE
解决方法是Nexus 5 Field Test Mode -Advanced LTE Settings 关掉LTE 重启就好了 在Android 5.0 下实测成功 如果不行就换一张卡 重新写 重启再 ...
- 批量 GBK 转 UTF8 java
package encoding; import java.io.File; import java.io.IOException; import java.util.Collection; impo ...
- IMP-00008: unrecognized statement in the export file: string的问题分析
分类: Linux 上周需要将oracle10g中的某一个用户下的对象导入到oracle11g中去.用exp在10g的数据库服务器上导出的dump文件,再用imp在11g的数据库服务器上将dump文件 ...
- Android studio如何使用SVN进行版本控制?
通过这两天对Android Studio的研究,终于搞通了Android Studio的基本操作及与SVN的相关关联操作(这样才能在公司的开发工作中使用):Google年底将会停止ADT插件的更新和支 ...
- zookeeper leader作用
一个zookeeper 集群 只有一个leader: 类似master/slave模式 客户端提交请求之后,先发送到leader,leader作为接收者,广播到每个server 在folloer上创建 ...
- Windows Azure 网站 (WAWS) 中的服务器端包含 (SSI)
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Erez Benari 撰写. Windows Azure 网站客户普遍关心的一个问题是关于我们对服务器端包含(Server ...
- VS2010/MFC设置对话框控件的Tab顺序
设置对话框控件的Tab顺序 前面几节为大家演示了加法计算器程序完整的编写过程,本节主要讲对话框上控件的Tab顺序如何调整. 上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法 ...
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...
- java异常回顾
String getMessage():返回此Throwable的详细消息字符串 void PrintStackTrace():将throw及其追踪输出至标准错误流 void printStackTr ...