FIFO的verilog代码

    FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
FIFO的一些重要参数
1、FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它指的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等。
2、FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据。
3、满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
4、空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
5、读指针:指向下一个读出地址。读完后自动加1。

 6、写指针:指向下一个要写入的地址的,写完自动加1。


     对于FIFO,读写指针都指向一个内存的初始位置,每进行一次读写操作,相应的指针就递增一次,指向下一个内存位置。当指针移动到了内存的最后一个位置时,它又重新跳回初始位置。在FIFO非满或非空的情况下,这个过程将随着读写控制信号的变化一直进行下去。如果FIFO处于空的状态,下一个读动作将会导致向下溢(underflow),一个无效的数据被读人;同样,对于一个满了的FIFO,进行写动作将会导致向上溢出(overflow),一个有用的数据被新写入的数据覆盖。这两种情况都属于误动作,因此需要设置满和空两个信号,对满信号置位表示FIFO处于满状态,对满信号复位表示FIFO非满,还有空间可以写入数据;对空信号置位表示FIFO处于空状态,对空信号复位表示FIFO非空,还有有效的数据可以读出。

/**************************************
* Module: fifo
* Date:2014-08-10  
* Author: hemmingway@163.com     
*
* Description: FIFO存储器设计
***************************************/
module  fifo(clk,rstp,din,writep,readp,dout,emptyp,fullp
);
input           clk;
input           rstp;      // 复位信号
input[15:0]     din;
input           readp;
input           writep;
output[15:0]    dout;
output          emptyp;
output          fullp;
parameter       DEPTH = 2,MAX_COUNT=2'b11;      //定义地址最大值reg             emptyp;
reg             fullp;
reg[15:0]       dout;
reg[(DEPTH-1):0]    tail;
reg[(DEPTH-1):0]    head;
reg[(DEPTH-1):0]    count;
reg[15:0]           fifomem[0:MAX_COUNT];       //  定义fifo存储器,4个16位的存储器// dout被赋给tail指针指向的数值
always @(posedge clk)  beginif(rstp==1) begindout <= 16'h0000;       // 复位信号有效置0endelse begindout <= fifomem[tail];   //将fifomem中第tail个单元给doutend
end// 写入数据
always @(posedge clk) beginif(rstp==1'b0 && writep == 1'b1 && fullp == 1'b0) beginfifomem[head]<=din;      // 写入end
end// head指针递增
always @(posedge clk) beginif(rstp==1'b1) beginhead<=2'b00;endelse beginif(writep==1'b1 && fullp==1'b0) beginhead<=head+1;endend
end//tail指针递增
always @(posedge clk) beginif(rstp==1'b1) begintail<=2'b00;endelse beginif(readp==1'b1 && emptyp==1'b0) begintail<=tail+1;endend
end// 计数器
always @(posedge clk) beginif (rstp == 1'b1) begincount <= 2'b00;endelse begincase ({readp, writep})2'b00: count <= count;2'b01: if (count != MAX_COUNT) count <= count + 1;     //为写状态时计数器进行加法计数2'b10: if (count != 2'b00)count <= count - 1;    //为读状态计数器进行减法计数2'b11:count <= count;endcaseend
end// empty指针
always @(count) beginif (count == 2'b00)emptyp <= 1'b1;      //count为0时emptyp赋为1elseemptyp <= 1'b0;
end// fullp指针
always @(count) beginif (count == MAX_COUNT)fullp <= 1'b1;                     //计数到最大时fullp赋为1elsefullp <= 1'b0;
endendmodule




/**************************************
* Module: test_fifo
* Date:2014-08-10  
* Author: hemmingway@163.com     
*
* Description: FIFO测试程序
***************************************/
module  test_fifo;reg         clk;
reg         rstp;
reg [15:0]  din;
reg         readp;
reg         writep;
wire [15:0] dout;
wire        emptyp;
wire        fullp;reg [15:0]  value;
fifo U1 (.clk(clk),.rstp(rstp),.din(din),.readp(readp),.writep(writep),.dout(dout),.emptyp(emptyp),.fullp(fullp));// 读任务
task read_word;
begin@(negedge clk);readp = 1;@(posedge clk) #5;readp = 0;
end
endtask// 写任务
task write_word;
input [15:0]    value;
begin@(negedge clk);din = value;writep = 1;@(posedge clk);#5;din = 16'hzzzz;writep = 0;
end
endtaskinitial beginclk = 0;forever begin#10 clk = 1;#10 clk = 0;end
endinitial begin//test1;test2;  //调用测试模块2
endtask test1;
begindin = 16'hzzzz;writep = 0;readp = 0;rstp = 1;#50 rstp = 0;#50;write_word (16'h1111);write_word (16'h2222);write_word (16‘h3333);   //写入3个数据read_word;read_word;               //读两个write_word (16‘h4444);   //在写一个数据repeat (6) beginread_word;
endwrite_word (16'h0001);write_word (16'h0002);write_word (16'h0003);write_word (16'h0004);write_word (16'h0005);write_word (16'h0006);write_word (16'h0007);write_word (16'h0008);
repeat (6) beginread_word;end
end
endtasktask test2;
reg [15:0] writer_counter;
beginwriter_counter = 16'h0001;din = 16'hzzzz;writep = 0;readp = 0;rstp = 1;#50   rstp = 0;#50;fork//写数据beginrepeat (500) begin@(negedge clk);if (fullp == 1'b0) beginwrite_word (writer_counter);#5;writer_counter = writer_counter + 1;end#50;endend//读数据beginforever begin@(negedge clk);if (emptyp == 1'b0) beginread_word;end  #50;endendjoin
end
endtaskendmodule


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用generate...for语句简化代码

使用generate…for语句简化代码 题目描述 在某个module中包含了很多相似的连续赋值语句,请使用generate…for语句编写代码,替代该语句,要求不能改变原module的功能。 module template_module( input [7:0] data_in,output [7:0] data_out );assign data_out [0] = data_in…

Android的启动过程

Passion注&#xff1a;本篇文章描述的是Android的启动过程&#xff0c;不包括Linux的启动过程 分别来自 http://dingpwen.spaces.live.com/blog/cns!4CADD02D22459860!208.entry?flcat http://www.eepw.com.cn/article/89567.htm http://blog.csdn.net/guiterb/archive…

计算节点宕机了怎么办?- 每天5分钟玩转 OpenStack(43)

Rebuild 可以恢复损坏的 instance。 那如果是宿主机坏了怎么办呢&#xff1f; 比如硬件故障或者断电造成整台计算节点无法工作&#xff0c;该节点上运行的 instance 如何恢复呢&#xff1f; 用 Shelve 或者 Migrate 可不可以&#xff1f; 很不幸&#xff0c;这两个操作都要求 i…

Eclipse最新版 Neon已发布

今天&#xff0c;Eclipse基金会宣布发布Eclipse Neon&#xff0c;这个版本的IDE支持Java、JavaScript、C/C、PHP和Fortran等多种编程语言。这一次的发布集成了779个开发者&#xff08;其中有331人提交了代码&#xff09;的工作成果&#xff0c;包含了6900万行代码&#xff0c;是…

eclipse 全屏插件

eclipse-fullscreen 插件下载链接&#xff1a; http://code.google.com/p/eclipse-fullscreen/&#xff0c; 安装方式&#xff1a;将下载下来的压缩文件解压&#xff0c;将里边的jar包放到eclipse目录下的plugin文件夹中&#xff0c;重启eclipse即可。 在Fedora & Windows …

使用子模块实现三输入数的大小比较

使用子模块实现三输入数的大小比较 题目描述 在数字芯片设计中&#xff0c;通常把完成特定功能且相对独立的代码编写成子模块。在需要的时候再在主模块中例化使用&#xff0c;以提高代码的可复用性和设计的层次性&#xff0c;方便后续的修改。 请编写一个子模块&#xff0c;将…

Android中Log信息的输出方法

共两篇文章&#xff0c;第一篇讲述了如何在程序中输出Log信息&#xff0c;第二篇详细的分析了Log信息的输出机制。 下面是第一篇&#xff08;转自&#xff1a;http://blog.163.com/binghaitao126/blog/static/3383532520099309366435/&#xff09; 1&#xff1a;在编译so文件的…

寻求神谕的词语:谈海日寒诗集《空山集》

诗人杨炼曾用两个“他者”概括了当代中国诗歌所面对的两个检验体系&#xff1a;“背后是中文古典诗歌杰作”&#xff0c;“面前是古今世界文学精品”1。他提出&#xff1a;“全球化语境中&#xff0c;我们能否找到——创造一种更深也更新的标准来判断作品&#xff1f;去建立那个…

批量给Linux服务器推送文件、执行指令的工具推荐 - wgcloud-bach-agent

wgcloud-bach-agent是wgcloud官方开发的一个工具&#xff0c;具有批量给Linux主机上传文件&#xff0c;执行指令的功能 当我们有一个文件&#xff0c;需要上传到很多主机&#xff0c;或需要在很多主机执行同一条指令的时候&#xff0c;这个工具就非常实用了&#xff0c;可以极…

verilog中assign语句

/************************************** * Module: assign * Date:2014-08-10 * Author: hemmingway163.com * * Description: verilog中的assign语句的用法 ***************************************//* 一、引入语法的概念1、只有寄存器类型的信号才可以在always和initi…

Neutron Router 工作原理 - 每天5分钟玩转 OpenStack(142)

上一节我们创建了 router 连通了 vlan100 和 vlan101&#xff0c; 今天分析router是如何工作的。 首先查看控制节点的网络结构发生了什么变化&#xff1a; br-int 上多了两个 port: 1. qr-d295b258-45&#xff0c;从命名上可以推断该 interface 对应 router_100_101 的 interf…

android linux kernel VS standard linux kernel

在kernel子目录下存放的就是Android的Linux Kernel了, 通过和标准的Linux 2.6.25 Kernel的对比,我们可以发现,其主要增加了以下的内容: 1. 基于ARM架构增加Gold-Fish平台,相应增加的目录如下: kernel/arch/arm/mach-goldfish kernel/include/asm-arm/arch-go…

访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)

前面我们学习了位于不同 Neutron subnet 的 instance 可以通过 router 通信&#xff0c;今天开始讨论 instance 如何访问外部网络。 这里的外部网络是指的租户网络以外的网络。租户网络是由 Neutron 创建和维护的网络。 外部网络不由 Neutron 创建。如果是私有云&#xff0c;外…

使用函数实现数据大小端转换

使用函数实现数据大小端转换 题目描述 在数字芯片设计中&#xff0c;经常把实现特定功能的模块编写成函数&#xff0c;在需要的时候再在主模块中调用&#xff0c;以提高代码的复用性和提高设计的层次&#xff0c;分别后续的修改。 请用函数实现一个4bit数据大小端转换的功能。…

ISE报错问题集锦(转载)

1、XST - "ERROR:Xst:902 - .v, line xx: Unexpected event in always block sensitivity list." 解决方法&#xff1a;Resolution 1 XST does not currently support logical operators in the sensitivity list. Because these logical operators are not evaluate…

创建 OVS 外部网络 ext_net - 每天5分钟玩转 OpenStack(144)

上一节完成连接外网的配置准备工作&#xff0c;今天就来创建 OVS 外部网络 ext_net。 进入 Admin -> Networks 菜单&#xff0c;点击 “Create Network” 按钮。 显示创建页面。 Provider Network Type 选择 “Flat”。 Network 填写 “external”&#xff0c;与 ml2_conf.…

Linux学习之zImage内核镜像解压过程详解

zImage内核镜像解压过程详解 收藏 zImage内核镜像解压过程详解 作者&#xff1a; 刘洪涛&#xff0c;华清远见嵌入式培训中心 讲师。 本文以linux-2.6.14内核在S3C2410平台上运行为例&#xff0c;讲解内核的解压过程。 内核编译完成后会生成zImage内核镜像文件。关于…

4位数值比较器电路

4位数值比较器电路 题目描述&#xff1a;使用门级描述方式&#xff0c;实现4位数值比较器 某4位数值比较器的功能如下表 timescale 1ns/1nsmodule comparator_4(input [3:0] A ,input [3:0] B ,output wire Y2 , //A>Boutput wire Y1 …

将 ext_net 连接到 router - 每天5分钟玩转 OpenStack(145)

上一节完我们创建了外部网络 ext_net&#xff0c;接下来需要将其连接到 Neutron 的虚拟路由器&#xff0c;这样 instance 才能访问外网。 点击菜单 Project -> Network -> Routers 进入 router 列表。 点击 router_100_101 的 “Set Gateway” 按钮。 在 “External Netw…

Xilinx_ISE和ModelSim的联合使用方法 / 从Xilinx ISE 14.7启动ModelSim时遇到的问题

解决方法&#xff1a; 前提是安装了 xilinx ise14.7 和modelsim se 10.1a 1〉从Windows的Start Menu开始&#xff0c;Xilinx ISE Design Suite 14.7 —〉EDK —〉Tools —〉Compile Simulation Libraries 按照提示编译好library&#xff0c;编译的library输出目录是&#xff…