同步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数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...
随机推荐
- 查看Xcode所使用Swift的版本
查看Swift版本 $ xcrun swift -version 查看Xcode位置 $ xcrun --find swift 参考链接:http://stackoverflow.com/questi ...
- 关于DLL搜索路径顺序的一个问题
DLL的动态链接有两种方法.一种是加载时动态链接(Load_time dynamic linking).Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SY ...
- Color the ball(树状数组+线段树+二分)
Color the ball Time Limit : 9000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Tota ...
- Shortest Prefixes(trie树唯一标识)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15948 Accepted: 688 ...
- PHP中用到的一些字符串函数
/*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() ...
- Spring MVC遭遇checkbox的问题解决方式
Spring MVC遭遇checkbox的问题是:当checkbox全不选时候,则该checkbox域的变量为null,不能动态绑定到spring的controller方法的入參上,并抛出异常. 解决 ...
- STM32关于优先级设定的理解 NVIC_SetPriority()
Systick模块初始化配置函数(Systick_config)中设定模块中断优先级的函数为: NVIC_SetPriority((SysTick_IRQn, (1<<__NVIC_PRI ...
- 伪静态 apache重写
mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面 下面我详细说说它的使用方法 A.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查 ...
- [C#参考]委托机制
1. 委托概述 这是一个新的概念,但是其本质并不是什么新鲜的事物,委托本质上就是一个类.只不过一般的类是数据的集合,委托保存的是一个或者多个方法.委托是引用类型,因此委托有引用和对象,同时委托对象中包 ...
- hadoop序列化机制与java序列化机制对比
1.采用的方法: java序列化机制采用的ObjectOutputStream 对象上调用writeObject() 方法: Hadoop 序列化机制调用对象的write() 方法,带一个DataOu ...