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 paip.对象方法的实现原理与本质.txt
Atitit paip.对象方法的实现原理与本质.txt 对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译 ...
- angularjs with node service
- cordova编译报错:Execution failed for task ':processDebugResources'
cordova编译报错:Execution failed for task ':processDebugResources' 引发这个错误的最扩祸首就是一个中文命名的文件,不知道什么时候加入的,我写了 ...
- CSS3 transform 属性详解(skew, rotate, translate, scale)
写这篇文章是因为在一个前端QQ群里,网友 "小豆豆" (应他要求要出现他的网名......) ,问skew的角度怎么算,因为他看了很多文章还是不能理解skew的原理.于是,我觉得有 ...
- Python数据类型之“数字(numerics)”
上一节内容说的是"Python基本语法",本节主要讲下Python中的数据类型. 存储在内存中的数据通常有两个属性: 在内存中的存放位置:这个存放位置通过变量名可以找到: 在内存中 ...
- php代码习惯(一)
1: 利用sprintf来绑定变量,分离绑定的参数与语句 $query = sprintf("SELECT * FROM users WHERE user='%s' AND password ...
- RAC Concept
1. RAC的高可用性 RAC的高可用性主要包含以下几点: 1> 实现节点间的负载均衡. 2> 实现失败切换的功能. 3> 通过Service组件来控制客户端的访问路径. 4> ...
- 理解ip和端口
理解IP和端口 IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可.在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址,如果 ...
- Android横竖屏切换及其对应布局加载问题
第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局. 可以通过以下两种方法来切换布局: 1)在res目录下建立layout-land ...
- js每天进步一点点4
输入数字的验证