Verilog实现同步FIFO

作为实现RS232串行通信的Verilog实现的预备工作,使用Verilog实现了同步FIFO的功能,其代码段如下

//this program segment realize the function of fifo IPcore
//synchronous fifo
module fifo_ip
#( parameter Addr_Width=8,Bit_Width=8
)
(clk,rst,wren,rden,full,empty,din,dout,counter);
input clk,rst,wren,rden;
input[Bit_Width-1:0] din;
output full,empty;
output reg[Bit_Width-1:0] dout;
output reg[2:0] counter;
reg[3:0] addr_wr,addr_rd;
reg[Bit_Width-1:0] buf_mem[0:Addr_Width-1];
parameter s0=2‘b00,s1=2‘b01,s2=2‘b10,s3=2‘b11;
always @(posedge clk or negedge rst)
begin
if(!rst)
    begin
        dout<=0;
        counter<=0;
        addr_wr<=0;
        addr_rd<=0;
    end
else
    begin
        case({rden,wren})
        s1:begin
                if(!full)
                    begin
                        buf_mem[addr_wr]<=din;
                        addr_wr<=addr_wr+1;
                        counter<=counter+1;
                    end
            end
        s2:begin
                if(!empty)
                    begin
                        dout<=buf_mem[addr_rd];
                        addr_rd<=addr_rd+1;
                        counter<=counter-1;
                    end
            end
        s3:begin
                if(!empty)
                    begin
                        dout<=buf_mem[addr_rd];
                        addr_rd<=addr_rd+1;
                        if(full) counter<=counter-1;
                    end
                if(!full)
                    begin
                        buf_mem[addr_wr]<=din;
                        addr_wr<=addr_wr+1;
                        if(empty) counter<=counter+1;
                    end
            end
        endcase
    end
end
assign full=({~addr_wr[3],addr_wr[2:0]}==addr_rd[3:0])?1:0;
assign empty=(addr_rd[3:0]==addr_wr[3:0])?1:0;
endmodule

主要思想是通过两个输入对读写进行控制,创建一个数组向量,存储每次写入的值,采用先进先出(即FIFO)的思想,当写满时,发送满指令,读空时发送空指令。

此法与网络上能够搜到的其他方法大同小异,纯属记录coding的结果,还没有优化与重构,各位看官见谅!

以上,互相学习!!!

原文地址:https://www.cnblogs.com/lightmonster/p/10198233.html

时间: 2024-10-15 06:10:12

Verilog实现同步FIFO的相关文章

同步FIFO的verilog描述

1 /****************************************************** 2 A fifo controller verilog description. 3 ******************************************************/ 4 module fifo(datain, rd, wr, rst, clk, dataout, full, empty); 5 input [7:0] datain; 6 input

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

Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上升沿触发.当FIFO的数据满和空的时候分别设置相应的高电平加以指示.FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成

【设计开发】 典型同步电路设计- 同步FIFO

一.前言 FIFO (First-In-First-Out) 是一种先进先出的数据交互方式,在数字ASIC设计中常常被使用.FIFO按工作时钟域的不同又可以分为:同步FIFO和异步FIFO. 同步FIFO的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑,常常用于交互数据缓冲.异步FIFO的写时钟和读时钟为异步时钟,FIFO内部的写逻辑和读逻辑的交互需要异步处理,异步FIFO常用于跨时钟域交互. 本文介绍同步FIFO的典型设计方法. 二.原理 典型同步FIFO有三部分组成: (1)

同步FIFO学习笔录--

同步FIFO学习 1.撰写缘由 这几天在初步学习verilog,学习到了同步FIFO,写点东西记录一下,写写心得体会和大家一起交流学习,中间有不对的地方希望大家能多多包涵,欢迎指正,共同进步.学习时主要参考:https://www.cnblogs.com/SYoong/p/6108780.html,感谢大神的分享.本文与参考有些不同,其中我自己认为有些需要改动的地方,若不对,多多指正.其实同步FIFO在实际中应用很少,应用多的还是异步FIFO,不过作为一个新手拿来练习练习感觉是很不错的. 2.什

同步FIFO design and IP level verification

一.前言 应聘IC前端相关岗位时,FIFO是最常考也是最基本的题目.FIFO经常用于数据缓存.位宽转换.异步时钟域处理.随着芯片规模的快速增长,灵活的system verilog成为设计/验证人员的基本功.本文从简易版的同步FIFO开始,熟悉IP设计与验证的基础技能. 二.IP设计 FIFO这一IP核已经相当成熟,因此网上资料也是一抓一大把.其中笔者认为较好的一个在文末附录中,需要详细了解FIFO工作原理的朋友可以仔细看看.这里简单介绍下本文设计FIFO的原理与结构.FIFO的内部存储单元是常见

同步fifo的verilogHDL设计实例

原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: 1 /* 2 date : 2014/10/14 3 version : modelsim 10.1e-altera 4 design : pengxiaoen 5 function : 同步fifo设计 6 */ 7 module test2 ( 8 clock , 9 reset, 10 in_data , 11 12 ou_data , 13 wr_full , 14 r

同步FIFO设计Spec

为什么要写Spec文档: 记得刚进公司实习的时候,导师安排我写一个SM4算法AHB接口模块,要求写代码前 写出详细的设计文档,详细到什么程度呢,看着文档就能把代码写好,作为一个只 在学校写过数字钟的小白来说有点不太理解,后面看的Spec多了,好的Spec的确能够看 着Spec把代码给敲了,能够方便别人理解你的设计思路,特别是当你遇到一份注释不太 清楚,逻辑难懂的代码时,是多么渴望来一份Spec帮助理解. 网页上编辑图和格式不是很方便,就写的简单点吧 1.同步FIFO(First In First

基于Verilog的带FIFO输出缓冲的串口接收接口封装

一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见"基于Verilog的串口接收实验" rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能是不断接收并将数据写入rx_fifo rx_interface:串口接收接口封装,也就是前两个模块的组合 rx_interface_control:串口接收接口控制模块,每隔1s读取一次串口rx_fifo,并将数据的低四位用Led显示出来 rx_interface_top:串口接收接口顶层

同步FIFO的设计

1 module scfifo #( 2 parameter ND = 16, 3 parameter DW = 16 ) ( 4 input clk, 5 input rst_n, 6 input wren, 7 input rden, 8 input [DW-1:0] din, 9 output [DW-1:0] dout, 10 output full, 11 output empty 12 ); 13 14 localparam AW = $clog2(ND); 15 16 // Mem