Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义:
用16*8 RAM实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。写入和读出的操作(高电平有效)由时钟的上升沿触发。当FIFO的数据满和空的时候分别设置相应的高电平加以指示。FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
所谓同步FIFO是指读时钟和写时钟采用同一个时钟。同时,异步FIFO就是指读写时钟不一致。
Part 2.顶层信号定义:
|
信号名称 |
I/O |
功能描述 |
源/目标 |
备注 |
|
Rst |
In |
全局复位(低有效) |
管脚 |
|
|
Clk |
In |
全局时钟 |
管脚 |
频率10Mhz;占空比:50% |
|
W_en |
In |
高有效写使能 |
管脚 |
|
|
R_en |
In |
高有效读使能 |
管脚 |
|
|
Data_in[7:0] |
In |
数据输入端 |
管脚 |
|
|
Data_out[7:0] |
Out |
数据输出端 |
管脚 |
|
|
Empty |
Out |
空指示信号 |
管脚 |
为高时表示fifo空 |
|
Full |
Out |
满指示信号 |
管脚 |
为高时表示fifo满 |
Part 3.顶层模块即划分:
该同步fifo可划分为如下四个模块,如图所示:
①存储器模块(RAM) ——用于存放及输出数据;
②读地址模块(r_addr) ——用于读地址的产生;
③写地址模块(w_addr)——用于写地址的产生
④标志模块(flag_gen) ---- 用于产生FIFO当前空满状态。

Part 4.RAM块:
RAM块的源码
本设计中采用16*8的双扣RAM,以循环读写的方式实现。
根据r_addr模块产生的读地址在,读使能(ren==1)时,将r_addr[4:0]地址中的对应单元的数据在时钟上升沿到来时,读出到data_out[7:0]中;
根据w_addr模块产生的写地址,在写实能(wen==1)时,在时钟沿的上升沿到来时,将data_in[7:0]中的数据写入到w_addr[4:0]地址对应的单元。
//16*8 RAM define (七个端口)
module RAM(clk,ren,wen,r_addr,w_addr,data_in,data_out);
input clk,ren,wen;
input [:]r_addr,w_addr;
input [:]data_in;
output [:]data_out;
reg [:]data_out;
reg [:]fifo[:];
always @(posedge clk)
begin
if(ren==)
begin data_out<=fifo[r_addr]; end
end
always @(posedge clk)
begin
if(wen==)
begin fifo[w_addr]<=data_in; end
end
endmodule
Part 5.r_addr产生块:
该模块用于产生FIFO读数据时所用的地址。由于16个RAM单元可以用4位地址线寻址。本模块用5位计数器(rd_addr[4:0])实现读地址的产生。
在复位时(rst=0),读地址值为0。
如果FIFO未空(~empty)且有读使能(r_en)有效,则r_addr[4:0]加1;否则不变。
//read address genaration
module r_addr_gen(clk,rst,ren,r_addr,empty);
input clk,rst,ren,empty;
output [:]r_addr;
reg [:]r_addr;
always @(posedge clk) //negedge rst can be here to make it asynchronous
begin
if (!rst) begin r_addr<='b00000; end
else if(ren==&&empty==) begin r_addr<=r_addr+;end
else begin r_addr<='b00000; end
end
endmodule
Part 6.w_addr产生块:
该模块用于产生FIFO写数据时所用的地址。由于16个RAM单元可以用4位地址线寻址。
在复位时(rst=0),写地址值为0。
如果FIFO未满(~full)且有写使能(w_en)有效,则w_addr[4:0]加1;否则不变。
//write address genaration
module w_addr_gen(clk,rst,wen,w_addr,full);
input clk,rst,wen,full;
output [:]w_addr;
reg [:]w_addr;
always @(posedge clk) //negedge rst can be here to make it asynchronous
begin
if (!rst) begin w_addr<='b00000; end
else if(wen==&&full==) begin w_addr<=w_addr+;end
else begin w_addr<='b00000; end
end
endmodule
Part 7.空满标志产生块:
flag_gen模块产生FIFO空满标志。本模块设计并不用读写地址判定FIFO是否空满。设计一个计数器,该计数器(pt_cnt)用于指示当前周期中FIFO中数据的个数。由于FIFO中最多只有16个数据,因此采用5位计数器来指示FIFO中数据个数。具体计算如下:
1)复位的时候,count=0;
2)如果w_en和r_en同时有效的时候,count不加也不减;表示同时对FIFO进行读写操作的时候,FIFO中的数据个数不变。
3)如果w_en有效且full=0,则count+1;表示写操作且FIFO未满时候,FIFO中的数据个数增加了1;
4)如果r_en有效且empty=0,则count-1; 表示读操作且FIFO未满时候,FIFO中的数据个数减少了1;
5)如果count=0的时候,表示FIFO空,需要设置empty=1;如果count=16的时候,表示FIFO现在已经满,需要设置full=1。
//empty and full flag gennaration
module flag_gen(clk,rst,ren,wen,empty,full);
input clk,ren,wen,rst;
output empty,full;
reg empty,full;
reg [:]count;
parameter max='b01111; always @(posedge clk)
begin
if(!rst) begin count<=;end
else case({ren,wen})
'b00: count<=count;
'b01: if(count!=max) count<=count+1;
'b10: if(count!=5'b0)count<=count-;
'b11: count<=count;
default:count<=count;
endcase
end always @(count)
begin
if (count==max) full<=;
else full<=;
end always @(count)
begin
if (count=='b0) empty<=1;
else empty<=;
end
endmodule
Verilog学习笔记简单功能实现(八)...............同步FIFO的更多相关文章
- Verilog学习笔记简单功能实现(三)...............同步有限状态机
在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...
- Verilog学习笔记简单功能实现(八)...............异步FIFO
基本原理: 1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...
- Verilog学习笔记简单功能实现(二)...............全加器
先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有: Xi Yi Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...
- Verilog学习笔记简单功能实现(六)...............计数分频电路
在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...
- Verilog学习笔记简单功能实现(五)...............序列检测设计
这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...
- Verilog学习笔记简单功能实现(一)...............D触发器
module D_flop(data,clk,clr,q,qb); input data,clk,clr; output q,qb; wire a,b,c,d,e,f,ndata,nclk; nand ...
- Verilog学习笔记简单功能实现(四)...............译码器和编码器
这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...
- Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)
利用状态机实现比较复杂的接口设计: 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出.这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integra ...
- IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试
IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...
随机推荐
- atitit.事件驱动的总结attilax
atitit.事件驱动的总结attilax Keyboard 基于的的ed 与 mouse 基础的ed Kb base on focus .... Mouse base on mouse mo ...
- 修改WebBrowser控件的内核解决方案
方法一 加入你想让WebBrowser控件的渲染模式编程IE8的标准模式, 你可以通过设置注册表FEATURE_BROWSER_EMULATION 来实现. 示例: 注册表中注明当前本机装的IE版本H ...
- hibernate(七) hibernate中查询方式详解
序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...
- struts2简单数据验证
当表单数据提交到后台后通常要对数据进行校验,以登录为例,后台拿到用户名密码后会判断是否正确,正确的话会跳转到网站用户登录成功的页面,如果不正确的话会提示用户输入不正确. 首先在struts.xml配置 ...
- javascript严格模式下的8点规则
[作用] [1]消除js语法的一些不合理.不严谨.不安全问题,减少怪异行为并保证代码运行安全 [2]提高编译器效率,增加运行速度 [使用] [1]整个脚本启用严格模式,在顶部执行:"use ...
- Supplemental Logging
Supplemental Logging分为两种:Database-Level Supplemental Logging和Table-Level Supplemental Logging,即数据库级别 ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
- 基于TFS实践敏捷-可视化管理
TFS是基于微软平台一套不错的系统,支持源码管理+运行调试+持续集成+自动化测试+Bug管理+代码评审+任务项管理+文档管理+沟通管理.基于TFS 2015实践看板管理,让团队的数据可视化,让大家更多 ...
- iOS_UIImage_Gif的分解
/** Gif的步骤 1. 拿到Gifd的数据 2. 将Gif分解为一帧帧 3. 将单帧数据转为UIImage 4. 单帧图片保存 */ github地址: https://github.com/ma ...
- 大话PHP缓存头
304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...