异步fifo实现

news/2025/4/1 3:40:40/

下面展示一些 内联代码片

//`include "../../rtl/defines.v" //mike 0201
//`define FFD 1
module fifo_async # (parameter DATWIDTH = 18,parameter FIFODEEP = 8,parameter ADRWIDTH = 3)(input wire 		     rstn,//writeinput wire 		     wclk,input wire 		     we,input wire [DATWIDTH-1:0] dati,//readinput wire 		     rclk,input wire 		     re,output reg [DATWIDTH-1:0] dato,//statusoutput reg 		     full,output reg 		     empty);//------------------------------------------------------------------------//------------------------------------------------------------------------//------------------------------------------------------------------------reg    [DATWIDTH-1:0] mem [FIFODEEP-1:0];wire   [ADRWIDTH-1:0] wadr;reg	   [  ADRWIDTH:0] wptr_b;reg    [  ADRWIDTH:0] wptr_g;reg	   [  ADRWIDTH:0] rptr_g_wsync1;reg    [  ADRWIDTH:0] rptr_g_wsync2;wire   [  ADRWIDTH:0] wptr_b_next;wire   [  ADRWIDTH:0] wptr_g_next;wire	  	  full_flag;wire   [ADRWIDTH-1:0] radr;reg	   [  ADRWIDTH:0] rptr_b;reg	   [  ADRWIDTH:0] rptr_g;reg    [  ADRWIDTH:0] wptr_g_rsync1;reg    [  ADRWIDTH:0] wptr_g_rsync2;wire   [  ADRWIDTH:0] rptr_b_next;wire   [  ADRWIDTH:0] rptr_g_next;wire	  	  empty_flag;//------------------------------------------------------------------------// rptr sync to wclk domainalways @(posedge wclk or negedge rstn)if (~rstn)beginrptr_g_wsync1 <=  0;rptr_g_wsync2 <=  0;endelsebeginrptr_g_wsync1 <=  rptr_g;rptr_g_wsync2 <=  rptr_g_wsync1;end// fifo write ptr and flagalways @(posedge wclk or negedge rstn)if (~rstn)beginwptr_b <=  0;wptr_g <=  0;full   <=  0;endelsebeginwptr_b <=  wptr_b_next;wptr_g <=  wptr_g_next;full   <=  full_flag;endassign wptr_b_next = (we && ~full) ? (wptr_b + 1'b1) : wptr_b;assign wptr_g_next = {1'b0, wptr_b_next[ADRWIDTH:1]} ^ wptr_b_next;assign full_flag   = (wptr_g_next == {~rptr_g_wsync2[ADRWIDTH:ADRWIDTH-1], rptr_g_wsync2[ADRWIDTH-2:0]});assign wadr        = wptr_b[ADRWIDTH-1:0];// wptr sync to rclk domainalways @(posedge rclk or negedge rstn)if (~rstn)beginwptr_g_rsync1 <=  0;wptr_g_rsync2 <=  0;endelsebeginwptr_g_rsync1 <=  wptr_g;wptr_g_rsync2 <=  wptr_g_rsync1;end// fifo read ptr and flagalways @(posedge rclk or negedge rstn)if (~rstn)beginrptr_b <=  0;rptr_g <=  0;empty  <=  1;endelsebeginrptr_b <=  rptr_b_next;rptr_g <=  rptr_g_next;empty  <=  empty_flag;endassign rptr_b_next = (re && ~empty) ? (rptr_b + 1'b1) : rptr_b;assign rptr_g_next = {1'b0, rptr_b_next[ADRWIDTH:1]} ^ rptr_b_next;assign empty_flag  = (rptr_g_next == wptr_g_rsync2);assign radr        = rptr_b[ADRWIDTH-1:0];// fifo accessalways @(posedge wclk)if (we && ~full)mem[wadr] <=  dati;always@(posedge rclk, negedge rstn)if(!rstn)dato <= {DATWIDTH{1'b0}};else if(re && ~empty)dato <= mem[radr];//assign dato = mem[radr];endmodule
//`undef FFD

http://www.ppmy.cn/news/500943.html

相关文章

QAC用户使用手册

文章目录 1 QAC介绍1.1 QAC简介1.2 QAC dashboard简介 2 QAC使用&#xff08;基本操作&#xff09;2.1 创建QAC工程2.2 创建QAC工程2.3 添加代码到QAC工程2.4 添加代码到QAC工程2.5 上传分析报告及结果 1 QAC介绍 1.1 QAC简介 Helix QAC是Perforce公司(原PRQA公司)产品,主要用…

人机接口回路原理(四)

五、硬件时钟电路 接口插件设置了一个硬件时钟电路&#xff0c;由一片MC146818时钟芯片及辅助元器件组成&#xff0c;如图1&#xff0d;35所示。 MC146818芯片是智能式硬件时钟&#xff0c;其内部由电子时钟和存储器两部分组成。可计年、月、日、时、分、秒、星期&#xff1b;能…

Spring使用通知 Advice 管理事务

Spring使用通知 Advice 管理事务 Spring 默认采用声明式事务管理(通过配置的方式) &#xff0c;也可以实现 编程式事务管理 Spring 声明式 事务管理 默认 只能对 RuntimeException 进行回滚 &#xff01;&#xff01;&#xff01; 在Spring中 配置 事务管理器 常见的事务管理器…

中科院、中科大团队精确测量子引力对量子自旋的影响

光子盒研究院 由中国科学院盛东教授、陆征天教授和中国科学技术大学的合作研究小组利用高精度氙气同位素磁力仪研究了中子自旋和引力之间的耦合效应。5月15日&#xff0c;这项题为Search for Spin-Dependent Gravitational Interactions at Earth Range的研究发表在《物理评论快…

强化学习:随机近似与随机梯度下降

mean estimation 通过前面的学习&#xff0c;我们知道可以通过很多采样来求期望。而求 x ˉ \bar x xˉ 的方法由两种&#xff0c;一是直接将采样数据相加再除以个数&#xff0c;但这样的方法运行效率较低。 第二种方法是迭代式的计算&#xff0c;即来几个数据就算几个数据&a…

使用esp32+micropython+microdot搭建web(http+websocket)服务器(超详细)第二部分

使用esp32micropythonmicrodot搭建web(httpwebsocket)服务器&#xff08;超详细&#xff09;第二部分 microdot文档速查 什么是Microdot?Microdot是一个可以在micropython中搭建物联网web服务器的框架micropyton文档api速查 Quick reference for the ESP32 实现http服务器 …

如何学习LoadRunner性能测试?

最近组内同事针对性能测试LR的脚本部分做了介绍&#xff0c;是个不错的分享。会后反思自己也有很长一段时间没做性能测试了&#xff0c;根据以往的经验&#xff0c;有必要做些整理和补充&#xff0c;本文主要介绍一些LoadRunner性能测试的学习方法、思路、流程以及测试过程中需…

报表测试如何做?软件测试实战,超详细测试点分析(全覆盖)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 报表测试是一项重…