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的更多相关文章

  1. Verilog学习笔记简单功能实现(三)...............同步有限状态机

    在Verilog中可以采用多种方法来描述有限状态机最常见的方法就是用always和case语句.如下图所示的状态转移图就表示了一个简单的有限状态机: 图中:图表示了一个四状态的状态机,输入为A和Res ...

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

    基本原理:       1.读写指针的工作原理 写指针:总是指向下一个将要被写入的单元,复位时,指向第1个单元(编号为0). 读指针:总是指向当前要被读出的数据,复位时,指向第1个单元(编号为0). ...

  3. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  4. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  5. Verilog学习笔记简单功能实现(五)...............序列检测设计

    这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...

  6. 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 ...

  7. Verilog学习笔记简单功能实现(四)...............译码器和编码器

    这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...

  8. Verilog学习笔记简单功能实现(七)...............接口设计(并行输入串行输出)

    利用状态机实现比较复杂的接口设计: 这是一个将并行数据转换为串行输出的变换器,利用双向总线输出.这是由EEPROM读写器的缩减得到的,首先对I2C总线特征介绍: I2C总线(inter integra ...

  9. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

随机推荐

  1. Ubuntu14中supervisor的安装及配置

    supervisor是一款很好用的进程管理工具,其命令也很简单,其安装过程如下: Ubuntu14: 首先保证本地的Python环境是OK的,并且已经安装supervisor包,如果没有安装可以用ea ...

  2. PHP将富文本编辑后的内容,去除样式图片等只保留txt文本内容

    1.从数据库读取富文本内容样式如下: <p style=";text-indent: 0;padding: 0;line-height: 26px"><span ...

  3. iOS $299刀企业证书申请的过程以及细节补充

    最近申请了iOS的 299刀企业证书,相关过程有些问题,分享出来,以便后来人参考. 申请的过程我主要参考了别人以前的文章,链接如下: 1.https://developer.apple.com/cn/ ...

  4. 抛弃强大的TFS ,借助于BugTracker.NET + Visual Source Safe + SourceLink搭建项目开发环境

    微软公司的Team Foundation Server是个强大的项目管理工具,如果用.NET开发,它应该是首选的项目管理平台.TFS的成本比较高,而且和Visual Studio集成紧密.比如TSF有 ...

  5. mac+apache+php+phpmyadmin集成php开发环境配置

    刚开始才接触php才发现macos还是比较强大了,macbook不仅是时尚达品还很实用哦. --------------他山之石-------------------------- http://da ...

  6. 01-Vue.js入门系列

    1.1. Vue简介 Vue是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 view].新的Vue版本参考了React的部分设计,当然也有自己独特的地方,比如Vue的单文件组件开发方 ...

  7. [java] jsoup使用简介-汇率换算器实现-插曲2

    [java] jsoup使用简介-汇率换算器实现-插曲2 // */ // ]]>   [java] jsoup使用简介-汇率换算器实现-插曲2 Table of Contents 1 系列文章 ...

  8. github代码管理工具的使用方法

    一.创建一个存储库 1.点击页面右上方你的用户名右边的+标志,然后点击下拉列表中的"new repository"选项,一般填写项目名称和选择public 和选择初始化有READM ...

  9. 意译:《JVM Internals》

    译者语 为加深对JVM的了解和日后查阅时更方便,于是对原文进行翻译.内容是建立在我对JVM的认识的基础上翻译的,加上本人的英语水平有限,若有纰漏请大家指正,谢谢. 原文地址:http://blog.j ...

  10. SQL Server时间粒度系列----第5节小时、分钟时间粒度详解

    本文目录列表: 1.SQL Server小时时间粒度2.SQL Server分钟时间粒度 3.总结语 4.参考清单列表   SQL Server小时时间粒度          这里说的时间粒度是指带有 ...