Verilog同步FIFO设计

同步FIFO(synchronous)的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑,常常用于交互数据缓冲。

异步FIFO:数据写入FIFO的时钟和数据读出FIFO的时钟是异步的(asynchronous)

在这里插入图片描述

典型同步FIFO有三部分组成:

(1) FIFO写控制逻辑;

(2)FIFO读控制逻辑;

(3)FIFO 存储实体(如Memory、Reg)。

FIFO写控制逻辑主要功能:产生FIFO写地址、写有效信号,同时产生FIFO写 满、写错等状态信号;

FIFO读控制逻辑主要功能:产生FIFO读地址、读有效信号,同时产生FIFO读 空、读错等状态信号。

  • 基本概念

    FIFO:先进先出(First-in-first-out) FIFO的深度 同一块数据内存的大小

    FIFO的宽度:写指针:Write-pointer 读指针:Read-pointer

    一般FIFO使用循环指针(计数溢出自动归零)。一般可以称写指针为头head,读指针为尾tail。 初始化时,读写指针指向同一数据地址。下图可见,FIFO初始化时,WP和RP指针指向同一数据单元。WP指向下一个将要写入的数据单元,RP指向将要读出的数据单元
    在这里插入图片描述

    2种方法判断空满:

    1. counter计数器:判断有效数据是否等于FIFO的深度,为0就表示空

      使用fifo_counter记录FIFO RAM中的数据个数,等于0时,给出empty信号,等于BUF_LENGTH时,给出full信号。

      写而未满时增加1 读而未空时减1 同时发生读写操作时,fifo_counter不变

    2. pointer:如果深度为8,那么3bit就可以表示8个数,但是为了判断空满,会多定义一位,也即4bit,WP为1000,RP为0000,我们使用最高位去判断是否在同一单元,用高位判断空满,如果高位相异,就表示满,如果相同表示空。

  • 程序代码

    `define BUF_WIDTH 4 // 地址宽度为3+1,
    `define BUF_SIZE 8 // 数据个数,FIFO深度
    module fifo_counter( clk,rst_n,buf_in,buf_out,wr_en,rd_en,buf_empty,buf_full,fifo_cnt);input clk,rst_n; // 时钟与复位信号input wr_en,rd_en; // 读写使能信号input [7:0] buf_in; // 写数据output reg [7:0] buf_out; // 读数据output wire buf_empty,buf_full; // 空满两个状态信号output reg [`BUF_WIDTH-1:0] fifo_cnt;  //判断空满计数器// 读写指针:数据指针3位宽度,0-7索引,8个数据深度,循环指针0-7-0-7reg [`BUF_WIDTH-2:0] rd_ptr,wr_ptr;// 读写容器reg [7:0] buf_mem[0:`BUF_SIZE-1];//判断空满 方式1assign buf_empty = (fifo_cnt == 0); //buf_empty若是reg类型则错,不能使用assign持续赋值assign buf_full = (fifo_cnt == `BUF_SIZE);// fifo_cnt = 8就是满的//判断空满 方式2assign buf_empty = (rd_ptr[3] == wr_ptr[3])&&(rd_ptr[2:0] == wr_ptr[2:0]); assign buf_full = (rd_ptr[3] != wr_ptr[3])&&(rd_ptr[2:0] == wr_ptr[2:0]); // 前后必须同时为1//读数据always @(posedge clk or negedge rst_n) begin if(!rst_n)buf_out <= 0;if(rd_en && !buf_empty)buf_out <= buf_mem[rd_ptr];end// 写数据always @(posedge clk) beginif(wr_en && !buf_full)buf_mem[wr_ptr] <= buf_in;end// 更改读写指针always @(posedge clk or negedge rst_n)beginif(!rst_n)beginwr_ptr <= 0;rd_ptr <= 0;endelse begin// 满足写的条件,就把写指针+1if(!buf_full && wr_en)wr_ptr <= wr_ptr + 1;// 满足读的条件,就把读指针+1if(!buf_empty && rd_en)rd_ptr <= rd_ptr + 1;endend// 监控fifo_cntalways @(posedge clk or negedge rst_n)beginif(!rst_n)fifo_cnt <= 0;else if((!buf_full&&wr_en)&&(!buf_empty&&rd_en)) // 同时读写,数量不变fifo_cnt <= fifo_cnt;else if(!buf_full && wr_en) // 写数据:写而未满增加1fifo_cnt <= fifo_cnt + 1;else if(!buf_empty && rd_en) // 读数据:读而未空减1fifo_cnt <= fifo_cnt-1;elsefifo_cnt <= fifo_cnt; // 维持end
    endmodule
    
  • TestBench

    `define BUF_WIDTH 4 //地址宽度为3+1,
    `define BUF_SIZE (8) //数据个数,FIFO深度
    module tb_fifo_counter;reg clk,rst_n;reg wr_en,rd_en;reg [7:0] buf_in; // data input to be pushed to bufferwire [7:0] buf_out; // port to output the data using pop. wire buf_empty,buf_full; // buffer empty and full indicationwire [`BUF_WIDTH-1:0] fifo_cnt; // number of data pushed in to bufferfifo_counter dut(.clk(clk),.rst_n(rst_n),.buf_in(buf_in),.buf_out(buf_out),.wr_en(wr_en),.rd_en(rd_en),.buf_empty(buf_empty),.buf_full(buf_full),.fifo_cnt(fifo_cnt));fifo_counter dut(.clk		(clk),.rst_n	(rst_n),.buf_in	(buf_in),.buf_out	(buf_out),.wr_en	(wr_en),.rd_en	(rd_en),.buf_empty	(buf_empty),.buf_full	(buf_full),.fifo_cnt	(fifo_cnt));always #10 clk = ~clk;// 定义一个临时的数据,将读出来的数据暂存reg [7:0] tempdata;initial beginclk = 0;rst_n = 0;wr_en = 0;rd_en = 0;buf_in = 0;#15; rst_n = 1;push(1);// 同时读写forkpush(2);pop(tempdata); // 读取tempdata = 1joinpush(10);push(20);push(30);push(40);push(50);push(60);push(70);// 70push 就会满push(80);push(90);push(100);push(110);push(120);push(130);pop(tempdata); // 读取tempdata = 2push(tempdata); pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);push(140); // 可以写进去pop(tempdata);push(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);pop(tempdata);push(5);pop(tempdata);// 读取tempdata = 5#50 $finish;end// 将data写入fifotask push (input [7:0] data);if(buf_full)$display("---Cannot push %d: Buffer Full---",data);else begin$display("Push",,data);buf_in = data;wr_en = 1;@(posedge clk);#5 wr_en = 0;endendtask// 将data读取出来task pop(output[7:0] data);if(buf_empty)$display("---Cannot Pop: Buffer Empty---");else beginrd_en = 1;@(posedge clk);#3 rd_en = 0;data = buf_out;$display("------Poped:",,data);endendtask
    endmodule
    

    find -name "*.v" > file.list

    makefile文件:

    all:clean com sim
    SEED=1
    com:vcs -full64 -R -sverilog -debug_all -f file.list -l comp.log +ntb_random_seed=$(SEED) \-cm line+cond+fsm+branch+tgl -cm_name simv -cm_dir ./covdir.vdb
    sim:./simv -l sim.log
    rung:./simv -gui -l sim.log
    cov:dve -full64 -covdir *.vdb &
    clean:rm -rf ./csrc *.daidir *.log *.vpd *.vdb simv* *.key *race.out*rm -rf AN.DBrm -rf novas*rm -rf DVEfilesrm -rf urgReport
    
    VCS Coverage Metrics Release O-2018.09-1_Full64 Copyright (c) 1991-2018 by Synopsys Inc.
    Push   1
    Push   2
    ------Poped:   1
    Push  10
    Push  20
    Push  30
    Push  40
    Push  50
    Push  60
    Push  70
    ---Cannot push  80: Buffer Full---
    ---Cannot push  90: Buffer Full---
    ---Cannot push 100: Buffer Full---
    ---Cannot push 110: Buffer Full---
    ---Cannot push 120: Buffer Full---
    ---Cannot push 130: Buffer Full---
    ------Poped:   2
    Push   2
    ------Poped:  10
    ------Poped:  20
    ------Poped:  30
    ------Poped:  40
    Push 140
    ------Poped:  50
    Push  50
    ------Poped:  60
    ------Poped:  70
    ------Poped:   2
    ------Poped: 140
    ------Poped:  50
    ---Cannot Pop: Buffer Empty---
    ---Cannot Pop: Buffer Empty---
    ---Cannot Pop: Buffer Empty---
    ---Cannot Pop: Buffer Empty---
    ---Cannot Pop: Buffer Empty---
    ---Cannot Pop: Buffer Empty---
    Push   5
    ------Poped:   5
    

    查看波形:make rung

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/73771.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统&#xff08;spring spring…

【数据结构】 单链表面试题讲解

文章目录 引言反转单链表题目描述示例&#xff1a;题解思路代码实现&#xff1a; 移除链表元素题目描述&#xff1a;示例思路解析&#xff1a; 链表的中间结点题目描述&#xff1a;示例&#xff1a;思路解析代码实现如下&#xff1a; 链表中倒数第k个结点题目描述示例思路解析&…

函数性能探测:更简单高效的 Serverless 规格选型方案

作者&#xff1a;拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮&#xff0c;以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…

高校大学生社团管理系统的设计与实现(论文+源码)_kaic

目 录 一、绪论 &#xff08;一&#xff09;选题背景 1、社团管理系统的提出 &#xff08;二&#xff09;系统设计的原则与目标 1、系统设计原则 2、系统设计目标 二、系统关键技术的分析 &#xff08;一&#xff09;JSP技术 &#xff08;二&#xff09;Tomcat简介 1、SERVL…

drawio----输出pdf为图片大小无空白(图片插入论文)

自己在写论文插入图片时为了让论文图片放大不模糊&#xff0c;啥方法都试了&#xff0c;最后摸索出来这个。 自己手动画图的时候导出pdf总会出现自己的图片很小&#xff0c;pdf的白边很大如下如所示&#xff0c;插入论文的时候后虽然放大不会模糊&#xff0c;但是白边很大会显…

pytorch3d成功安装

一、pytorch3d是什么&#xff1f; PyTorch3D的目标是帮助加速深度学习和3D交叉点的研究。3D数据比2D图像更复杂&#xff0c;在从事Mesh R-CNN和C3DPO等项目时&#xff0c;我们遇到了一些挑战&#xff0c;包括3D数据表示、批处理和速度。我们开发了许多有用的算子和抽象&#xf…

2023年Java核心技术面试第二篇(篇篇万字精讲)

目录 四. 强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;幻象引用之间的区别&#xff1f; 1.前言 2.强引用 2.1 强引用赋值为null 2.2 超过了引用的作用域 2.2.1 描述&#xff1a; 2.2.2 作用域内&#xff1a; 2.2.3 不在作用域内: 3. 软引用&#xff08;SoftRefere…

前馈神经网络正则化例子

直接看代码&#xff1a; import torch import numpy as np import random from IPython import display from matplotlib import pyplot as plt import torchvision import torchvision.transforms as transforms mnist_train torchvision.datasets.MNIST(root…

开源数据库Mysql_DBA运维实战 (备份与还原)

Mysql数据库的备份与还原&#x1f343; 备份对于数据库而言是至关重要的。当数据文件发生损坏、MySQL服务出现错误、系统内核崩溃、计算机硬件损坏或者数据被误删等事件时&#xff0c;使用一种有效的数据备份方案&#xff0c;就可以快速解决以上所有的问题。MySQL提供了多种备…

unity 之Transform组件(汇总)

文章目录 理论指导结合例子 理论指导 当在Unity中处理3D场景中的游戏对象时&#xff0c;Transform 组件是至关重要的组件之一。它管理了游戏对象的位置、旋转和缩放&#xff0c;并提供了许多方法来操纵和操作这些属性。以下是关于Transform 组件的详细介绍&#xff1a; 位置&a…

Flink之Task解析

Flink之Task解析 对Flink的Task进行解析前,我们首先要清楚几个角色TaskManager、Slot、Task、Subtask、TaskChain分别是什么 角色注释TaskManager在Flink中TaskManager就是一个管理task的进程,每个节点只有一个TaskManagerSlotSlot就是TaskManager中的槽位,一个TaskManager中可…

蓝光眼镜有效吗?科研团队:无法证明防蓝光镜片可以减少视力伤害

8 月 19 日消息&#xff0c;本次由墨尔本大学、莫纳什大学和伦敦城市大学联合进行的科研团队&#xff0c;对来自 6个国家和地区的 17 项已发表的研究进行了深入研究。他们的研究发现&#xff0c;无法证明防蓝光镜片能够减少眼睛的视力伤害或改善佩戴者的睡眠质量等功效。 这项研…

springboot+Vue--打基础升级--(二)写个主菜单导航界面

1. 华为OD机考题 答案 2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09; 2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 2. 面试题 一手真实java面试题&#xff1a;2023年各大公司java面试真题汇总--…

【李沐】3.2线性回归从0开始实现

%matplotlib inline import random import torch from d2l import torch as d2l1、生成数据集&#xff1a; 看最后的效果&#xff0c;用正态分布弄了一些噪音 上面这个具体实现可以看书&#xff0c;又想了想还是上代码把&#xff1a; 按照上面生成噪声&#xff0c;其中最后那…

YOLOv8改进后效果

数据集 自建铁路障碍数据集-包含路障&#xff0c;人等少数标签。其中百分之八十作为训练集&#xff0c;百分之二十作为测试集 第一次部署 版本&#xff1a;YOLOv5 训练50epoch后精度可达0.94 mAP可达0.95.此时未包含任何改进操作 第二次部署 版本&#xff1a;YOLOv8改进版本 首…

Spring Boot 知识集锦之Spring-Batch批处理组件详解

文章目录 0.前言1.参考文档2.基础介绍2.1. 核心组件 3.步骤3.1. 引入依赖3.2. 配置文件3.3. 核心源码 4.示例项目5.总结 0.前言 背景&#xff1a; 一直零散的使用着Spring Boot 的各种组件和特性&#xff0c;从未系统性的学习和总结&#xff0c;本次借着这个机会搞一波。共同学…

从零实战SLAM-第四课(相机成像及常用视觉传感器)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…

如何学习专业的学术用语01

问题的提出——凭啥人家写的词汇这么专业 做法一 做法二&#xff1a;做一个专业数据库 专门做教育技术类的

Java进阶篇--迭代器模式

目录 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 扩展小知识: 异步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 总结&#xff1a…