verilog 实现异步fifo

news2024/11/25 2:42:59

理论知识参考

异步FIFO_Verilog实现_verilog实现异步fifo_Crazzy_M的博客-CSDN博客

代码

/*
位宽8bit, 位深8
*/
module async_fifo#(
    parameter FIFO_DEPTH = 8,
    parameter FIFO_WIDTH = 8
)
(
    input       rst_n,
    input       wr_clk,
    input       wr_en,
    input [FIFO_WIDTH - 1:0] din,

    input    rd_clk,
    input    rd_en,
    
    output reg [FIFO_WIDTH - 1:0] dout,
    output     wire    full,
    output     wire    empty
);

reg [FIFO_WIDTH - 1:0] mem [FIFO_DEPTH - 1:0];

//地址的位数要满足fifo的位深
wire [2:0] wr_addr;
wire [2:0] rd_addr;

//指针的位数和格雷码的位数要比地址位数大1位
reg [3:0] wr_addr_ptr;
reg [3:0] rd_addr_ptr;

wire [3:0] wr_gray;
reg [3:0] wr_gray1;
reg [3:0] wr_gray2;

wire [3:0] rd_gray;
reg [3:0] rd_gray1;
reg [3:0] rd_gray2;


assign wr_addr = wr_addr_ptr;
assign rd_addr = rd_addr_ptr;

//二进制转格雷码
assign wr_gray = (wr_addr_ptr >> 1) ^ wr_addr_ptr;
assign rd_gray = (rd_addr_ptr >> 1) ^ rd_addr_ptr;

//判断异步FIFO空的条件:读写地址(格雷码)完全相同
assign empty = rd_gray == wr_gray2 ? 1'b1 :1'b0;

//判断异步FIFO满的条件:读写地址(格雷码)的高2位不同,其余位均相同
assign full = ((wr_gray[3:2] != rd_gray2[3:2]) && (wr_gray[1:0] == rd_gray2[1:0])) ? 1'b1 : 1'b0;


//写
always @(posedge wr_clk) begin
    if(wr_en && ~full)
        mem[wr_addr] <= din;
    else 
        mem[wr_addr] <= mem[wr_addr];
end

always @(posedge wr_clk or negedge rst_n) begin
    if(!rst_n)
		wr_addr_ptr <= 0;
	else if(wr_en && ~full)
		wr_addr_ptr <= wr_addr_ptr + 1'b1;
	else 
		wr_addr_ptr <= wr_addr_ptr; 
end

//读
always@ (posedge rd_clk or negedge rst_n)
	if(!rst_n)
		rd_addr_ptr <= 0;
	else if(rd_en && ~empty)
		rd_addr_ptr <= rd_addr_ptr + 1'b1;
	else
		rd_addr_ptr <= rd_addr_ptr;
		
always@ (posedge rd_clk or negedge rst_n)
	if(!rst_n)
		dout <= 11;
	else if(rd_en && ~empty)
		dout <= mem[rd_addr];
	else 
		dout <= 11;


//读地址格雷码同步到写时钟域
always @(posedge wr_clk or negedge rst_n)
	if(!rst_n) begin
		rd_gray1 <= 0;
		rd_gray2 <= 0;
	end
	else begin
		rd_gray1 <= rd_gray;
		rd_gray2 <= rd_gray1;
	end

//写地址格雷码同步到读时钟域
always@ (posedge rd_clk or negedge rst_n)
	if(!rst_n) begin
		wr_gray1 <= 0;
		wr_gray2 <= 0;
	end
	else begin
		wr_gray1 <= wr_gray;
		wr_gray2 <= wr_gray1;
	end

endmodule

 

testbench

`timescale 1ns/1ps

module fifo_tb ();
	reg rst_n;
	reg [7:0] data_in;
	reg wr_clk;
	reg rd_clk;
	reg wr_en;
	reg rd_en;
	wire [7:0]data_out;
	wire full;
	wire empty;

	async_fifo fifo(
	.wr_clk(wr_clk),//写时钟
	.rd_clk(rd_clk),//读时钟
	.rst_n(rst_n),//复位信号
	.wr_en(wr_en),//写使能
	.rd_en(rd_en),//读使能
	.din(data_in),//写入的数据
	.dout(data_out),//读出的数据
	.empty(empty),//读空信号
	.full(full)//写满信号
	);
	
	initial wr_clk = 0;//产生写时钟
	always #10 wr_clk = ~wr_clk;

	initial rd_clk = 0;//产生读时钟
	always #30 rd_clk = ~rd_clk;

	always@(posedge wr_clk or negedge rst_n)//产生写入的数据
		if(!rst_n)
			data_in <= 0;
		else if (wr_en) begin
			data_in <= data_in + 1'b1;
		end
		else
			data_in <= data_in;
    initial begin
        rst_n = 0;
        wr_en = 0;
        rd_en = 0;
        #200;
        rst_n = 1;
        wr_en = 1;
        #200;
        rd_en = 1;
		#200
		wr_en = 0;
		#1100
        rd_en = 0;
        #20000;
        $stop; 
    end
	
		
	
	
endmodule
 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之红黑树

二叉搜索树对于某个节点而言&#xff0c;其左子树的节点关键值都小于该节点关键值&#xff0c;右子树的所有节点关键值都大于该节点关键值。二叉搜索树作为一种数据结构&#xff0c;其查找、插入和删除操作的时间复杂度都为O(logn),底数为2。但是我们说这个时间复杂度是在平衡的…

C#小轮子 Debug,Release,发布模式如何运行不同的代码

文章目录 前言C#运行模式运行模式介绍三种模式区分代码 前言 编译模式和发布模式的代码不一样是非常正常的。比较常见的是数据库不一样。编译测试数据库和发布真实的数据库地址不一样。 C#运行模式 运行模式介绍 运行模式有三种&#xff1a; Debug 不进行优化&#xff0c;…

逆向破解学习-经典贪吃蛇大作战_1.00

试玩游戏 有支付取消关键字 找静态代码 找到关键字 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5d9f3cc57d18477794197ea5fae8c5ba.png Hook代码 import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.r…

MyBatis操作数据库常用用法总结1

文章目录 1.单表查询1.1返回所有的表记录1.2根据id查找结果1.3根据名字查找结果 2.单表修改2.1修改密码 3.单表删除3.1根据id删除信息 4.单表增加&#xff08;根据业务情况返回&#xff09;4.1添加返回影响的行数4.2添加返回影响行数和id 5.多表查询&#xff08;多&#xff09;…

网易云信回声消除量化评估方法

背景 随着现代通信技术的发展&#xff0c;语音通信成为了人们生活中不可或缺的一部分。然而&#xff0c;环境噪声和回声等因素对语音通信质量产生了不良影响&#xff0c;降低了通信效率和用户体验&#xff0c;声学回声消除技术的应用变得越来越重要。如何评估回声消除的效果也变…

详解如何计算字符中的字节数

文章目录 字符概念转义 进制的表示前缀区分后缀区分 什么是ASCII产生表述局限性字节计算 什么是Unicode编码方式UCS-2UCS-4 实现方式UTF的字节序和BOM字节计算 JavaScript中使用字符字符使用缺陷规避字符使用缺陷 MIME 编码Base64编码字节计算QP(Quote-Printable) 总结 字符概念…

进阶-LayUI的基本必知入门教程使用3-layui-laydate选择的值怎么获取?苟日新一刻钟总结反观:

1 效果镇楼&#xff1a; 对于layui框架的刚接触没几天&#xff0c;但是您的年轻同事为啥能搞出来功能啊&#xff01;&#xff1f; 到您就不行了呢&#xff1f; 这就是您对您饭碗的态度了吗&#xff01; 但是&#xff0c;是您尽力了&#xff0c;还能说明啥子问题&#xff1f; 就…

SOLIDWORKS自动标注插件

在设计工作中&#xff0c;三维模型设计好之后&#xff0c;还要创建二维工程图&#xff0c;用来指导加工生产。二维图出图的过程是一个非常枯燥的过程&#xff0c;而且还需要根据公司规范来进行尺寸标注、公差标注等&#xff0c;所以有时候&#xff0c;可能建模只用了几分钟&…

在UOS系统中管理ORACLE数据库

在明确了“数字中国”建设战略后。自主创新与国产化已成为我国实现科技强国、经济强国的发展趋势与行业共识。 即信息技术应用创新产业&#xff0c;简称“信创”。 而现有的国产操作系统&#xff0c;虽然已日趋成熟&#xff0c;但因为很多应用软件由国外垄断&#xff0c;因此…

一键获取数百张免费商用人脸!AI人脸生成器来袭

随着科技的发展&#xff0c;人工智能正在渗透到生活的各个角落&#xff0c;设计行业也不例外。在网页、APP、PPT 等界面设计中&#xff0c;设计师经常需要插入真实的人脸素材&#xff0c;以增强作品的真实感和场景化。但是获取素材既不容易&#xff0c;质量和价格也难免成为设计…

PK Nounique CASCADE DROP INDEX keep index

Explicit Control Over Indexes when Creating, Disabling, or Dropping PK/Unique Constraints (Doc ID 139666.1)​编辑To Bottom PURPOSEIn Oracle 9i, the DBA has an explicit control over how indexes are affectedwhile creating, disabling, or dropping Primary Ke…

【网络基础实战之路】基于BGP协议连接三个AS区域的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…

网页版的微信客户管理系统是怎样的?

登录账号密码&#xff1a; 微信扫码登录到系统上&#xff1a; 支持多个微信号登录到系统&#xff0c;聚合管理聊天&#xff0c;可以快速查看客服号的聊天记录 群发助手&#xff1a;群发可突破200 朋友圈功能&#xff1a;定时发圈&#xff0c;支持多个微信账号同步发圈、跟圈和一…

恒运资本:投资前瞻:储能产业迎政策密集支持 AIGC有望进入加速状态

昨日&#xff0c;沪指、深成指盘中弱势下探&#xff0c;创业板指冲高回落。到收盘&#xff0c;沪指跌0.49%报3244.49点&#xff0c;深成指跌0.53%报11039.45点&#xff0c;创业板指微跌0.01%报2228.73点&#xff0c;科创50指数跌0.85%&#xff1b;两市合计成交7366亿元&#xf…

STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置&#xff0c;文章提供原理&#xff0c;代码&#xff0c;测试工程下载。 目录 时钟树与时钟系统&#xff1a; 滴答计时器&#xff1a; 定时器计时中断&#xff1a; 测试结果&#xff1a; 测…

echarts3d柱状图

//画立方体三个面 const CubeLeft echarts.graphic.extendShape({shape: {x: 0,y: 0,width: 9.5, //柱状图宽zWidth: 4, //阴影折角宽zHeight: 3, //阴影折角高},buildPath: function (ctx, shape) {const api shape.api;const xAxisPoint api.coord([shape.xValue, 0]);con…

OSCS 闭门研讨第一期实录:软件供应链安全建设价值

2023 年 7 月 18 日晚 19:30&#xff0c;软件供应链安全技术交流群&#xff08;OSCS&#xff09;组织了第一次线上的闭门研讨会&#xff0c;本次研讨会我们收到 71 个来自各个企业关注软件供应链安全的技术专家的报名&#xff0c;根据研讨会参与规则要求&#xff0c;我们对报名…

一文告诉你,Intellij IDEA神器隐藏的11种实用小技巧!

el/2022/10/4 6:58:50 点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; Intellij IDEA真是越用越觉得它强大&#xff0c;它总是在我们写代码的时候&#xff0c;不时给我们来个小惊喜。出于对Intellij IDEA的喜爱&#x…

【uniapp】uniapp打包H5(网页端):

文章目录 一、设置appid&#xff1a;二、设置router&#xff1a;三、打包&#xff1a;【1】[CLI 发行uni-app到H5&#xff1a;https://hx.dcloud.net.cn/cli/publish-h5](https://hx.dcloud.net.cn/cli/publish-h5)【2】HBuilderX 四、最终效果&#xff1a; 一、设置appid&…

W5100S-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W5100S-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…