原创

设计一个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设计实例的更多相关文章

  1. 同步FIFO学习

    在网上找的一个经典同步FIFO例子. 一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为: ...

  2. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...

  3. 怎么用Verilog语言描述同步FIFO和异步FIFO

    感谢 知乎龚大佬 打杂大佬 网上几个nice的博客(忘了是哪个了....) 前言 虽然FIFO都有IP可以使用,但理解原理还是自己写一个来得透彻. 什么是FIFO? Fist in first out ...

  4. 同步fifo的Verilog实现

    FIFO是一种先进先出的数据缓存器,他与普通存储器相比: 优点:没有外部读写地址线,这样使用起来非常简单: 缺点:只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存 ...

  5. 同步FIFO design and IP level verification

    一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基 ...

  6. 同步fifo与异步fifo

    参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...

  7. 推荐35个新鲜出炉的响应式 Web 设计实例

    响应式设计的准则在于根据用户使用的屏幕的分辨率来改变网站的的布局.因此,视频或图像的大小和文本的数量,可以被视为是一个明显的变化.让你即使从智能手机浏览一个网站的时候能轻松地看到网站上的重要内容.今天 ...

  8. 最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!

    Dashboard设计,尽管设计师们叫法各不相同(例如:“数据面板设计”, “控制面板设计”, “仪表盘设计”或“后台界面设计”等等).但,此类设计的最终目都是力求以最直观.最简洁的方式呈现各种信息和 ...

  9. App启动页设计实例与技巧

    App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...

随机推荐

  1. Java使用freemarker导出word和excel

    www.linxiaosheng.com/post/2013-12-05/40060346181 https://github.com/upyun/java-sdk

  2. PROTEL 99SE的打印设置

    现在市面上关于PTROTEL99SE的书很多,但都没有具体叙述有关电路图的打印设置方法.PROTEL99SE的打印设置较之以前的版本有了很多不同之处.特别是在实际做电路板时有些细节须注意. 原理图的打 ...

  3. CSF 中的应用程序请求路由

    编辑人员注释:本文章由 AzureCAT 团队的 Christain Maritnez 撰写. 应用程序请求路由(简称为 ARR)可能是 Microsoft 使用的技术中讨论得最少但极为重要的技术之一 ...

  4. Visual Studio warning MSB3270:There was a mismatch between the processor architecture of the project being built "MSIL"

    Problem: There was a mismatch between the processor architecture of the project being built "MS ...

  5. MySQL 存储过程创建表

    创建 CREATE PROCEDURE  Pro_IsExistTable(ableName varchar(100),out outputParam int)BEGINset @csql=conca ...

  6. 异常:cvc-complex-type.2.4.a: Invalid content was found starting with element

    web.xml 出现cvc-complex-type.2.4.a: Invalid content was found starting with element <web-app xmlns= ...

  7. Hibernate之工具类HibernateUtil

    原创文章,转载请注明:Hibernate之工具类HibernateUtil  By Lucio.Yang 1.最简单的工具类,实现SessionFactory的单例共享,session的管理 pack ...

  8. win7 VMware Workstation Centos6.5虚机桥接上网设置 详解(靠谱)

    1.VMware Workstation 设置 2. vim /etc/sysconfig/network-scripts/ifcfg-eth0 NAME="System eth0" ...

  9. seajs + easyui [转]

    * *content seajs+easyui使用 */ /** * 首先来看看在seajs中jquery和jquery插件如何使用 */ 1.jquery.js define(function(re ...

  10. linux shell awk 流程控制语句(if,for,while,do)详细介绍

    在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...