当前位置: 首页 > news >正文

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

相关文章:

  • 做个md5查询站(3)数据格式
  • C语言博客作业06--结构体文件
  • 事件类型
  • 英语数字读法
  • bootstrp的datetimepicker插件获取选定日期
  • 08年cpu
  • VMware网络适配器的选择
  • 三、MyBatis-全局配置文件
  • Legato Backup Server DR SOP
  • HDFS,MongoDB,HBase的区别和使用场景
  • WinAVI Video Converter v8.0 注册码
  • 不利用C语言库函数,实现字符串相关函数
  • 中午又可以打篮球了
  • UI框架
  • 中央气象台发寒潮橙色警报 将现大范围大风降温
  • php的引用
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android Studio:GIT提交项目到远程仓库
  • DOM的那些事
  • flask接收请求并推入栈
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel 中的一个后期静态绑定
  • mac修复ab及siege安装
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • python_bomb----数据类型总结
  • Spring Cloud Feign的两种使用姿势
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 无服务器化是企业 IT 架构的未来吗?
  • 在Docker Swarm上部署Apache Storm:第1部分
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #QT(智能家居界面-界面切换)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (转)关于多人操作数据的处理策略
  • ***通过什么方式***网吧
  • .NET MVC 验证码
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中创建支持集合初始化器的类型
  • .NET序列化 serializable,反序列化
  • @angular/cli项目构建--http(2)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [20190113]四校联考
  • [AIGC codze] Kafka 的 rebalance 机制
  • [ARM]ldr 和 adr 伪指令的区别
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [Codeforces] probabilities (R1600) Part.1
  • [Docker]五.Docker中Dockerfile详解
  • [Head First设计模式]策略模式
  • [JS]JavaScript 注释 输入输出语句