学习笔记二:异步FIFO

 
  1 module fifo1 #(parameter DSIZE = 8,
  2                     parameter ASIZE = 4)        //用格雷码的局限性:循环计数深度必须是2的n次幂,否则就失去了每次只变化一位的特性
  3                 (wclk,wrstn,wdata,wfull,winc,rclk,rrstn,rdata,rempty,rinc);
  4         input                         wclk,wrstn,winc;
  5         input    [DSIZE - 1:0]    wdata;
  6         output                    wfull;
  7         
  8         input                        rclk,rrstn,rinc;
  9         output [DSIZE - 1:0] rdata;
 10         output                    rempty;
 11 
 12         reg                        wfull,rempty;                    //空满输出
 13         reg    [ASIZE:0]        rbin,wbin;                        //读写二进制地址
 14         reg    [ASIZE:0]        wptr,rq1_wptr,rq2_wptr,        //读写指针打两拍CDC同步
 15                                     rptr,wq1_rptr,wq2_rptr;
 16         wire    [ASIZE:0]        rbinnext,wbinnext,            //读写指针递增
 17                                     rgraynext,wgraynext;            //读写指针递增对应的格雷码
 18         wire    [ASIZE - 1:0]    waddr,raddr;                    //实际读写mem的地址
 19         
 20         reg    [DSIZE - 1:0]    mem [0:(1<<ASIZE) - 1];    //左移一位表示乘2
 21         
 22         
 23 //---------------------双口RAM存储器 数据读写-----------------------------
 24 assign rdata = mem[raddr];            //
 25 always@(posedge wclk) begin        //
 26     if(winc && !wfull) begin
 27         mem[waddr] <= wdata;
 28     end
 29 end
 30 
 31 //---------------------将读指针CDC到写时钟域------------------------------
 32 always@(posedge wclk or negedge wrstn) begin
 33     if(!wrstn) begin
 34         wq2_rptr <= 5'd0;
 35         wq1_rptr <= 5'd0;
 36     end
 37     else begin
 38         wq1_rptr <= rptr;
 39         wq2_rptr <= wq1_rptr;
 40     end
 41 end
 42 
 43 //---------------------将写指针CDC到读时钟--------------------------------
 44 always@(posedge rclk or negedge rrstn) begin
 45     if(!rrstn) begin
 46         rq2_wptr <= 5'd0;
 47         rq1_wptr <= 5'd0;
 48     end
 49     else begin
 50         rq1_wptr <= wptr;
 51         rq2_wptr <= rq1_wptr;
 52     end
 53 end
 54 
 55 
 56 //读相关指针的产生
 57 always@(posedge rclk or negedge rrstn) begin                
 58     if(!rrstn) begin
 59         rptr <= 5'd0;
 60         rbin <= 5'd0;
 61     end
 62     else begin
 63         rptr <= rgraynext;
 64         rbin <= rbinnext;
 65     end
 66 end
 67 //写相关的指针
 68 always@(posedge wclk or negedge wrstn) begin
 69     if(!wrstn) begin
 70         wbin <= 5'd0;
 71         wptr <= 5'd0;
 72     end
 73     else begin
 74         wbin <= wbinnext;
 75         wptr <= wgraynext;
 76     end
 77 end
 78 
 79 //addr截取与格雷码化指针
 80 assign raddr = rbin[ASIZE - 1:0];                //mem的读地址
 81 assign rbinnext = rbin + (rinc & ~rempty);    //mem的下一个读地址
 82 assign rgraynext = (rbinnext>>1) ^ rbinnext; //mem的读地址对应的格雷码
 83 
 84 assign waddr = wbin[ASIZE - 1:0];
 85 assign wbinnext = wbin + (winc & !wfull);
 86 assign wgraynext = (wbinnext>>1) ^ wbinnext;
 87 
 88 //---------------------rempty产生------------------------------
 89 //FIFO empty when the next rptr == synchronized wptr or on the reset
 90 always@(posedge rclk or negedge rrstn) begin
 91     if(!rclk) begin
 92         rempty <= 1'b1;
 93     else begin
 94         rempty <= (rgraynext == rq2_wptr);
 95     end
 96 end
 97 
 98 //---------------------wfull产生------------------------------
 99 //FIFO full when CDC过来的格雷码(采样值)的最高位+次高位和bin转换过来的格雷码(理论值)均不同,剩下低位都相同
100 always@(posedge wclk or negedge wrstn) begin
101     if(!wrstn) begin
102         wfull <= 0;
103     end
104     else begin
105         wfull <= (wgraynext == {~wq2_rptr[ASIZE,ASIZE-1],wq2_rptr[ASIZE-2:0]});
106     end
107 end
108 
109 endmodule
110 /*Clifford E. Cummings的文章中提到的STYLE #1,构造一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指
111 针转换为二进制指针)。当指针的二进制码中最高位不一致而其它N位都 相等时,FIFO为满(在Clifford E. Cummings的文章中以
112 格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。当指针完全相等时,
113 FIFO为空。
114 这种方法思路非常明了,为了比较不同时钟产生的指针,需要把不同时钟域的信号同步到本时钟域中来,而使用Gray码的目的就是使这个
115 异步同步化的过程发生亚稳态的机率最小。
116 */ 

 

很好的讲解:

https://www.cnblogs.com/aslmer/p/6114216.html#4067080

https://blog.csdn.net/wyj_2016/article/details/78469272

https://blog.csdn.net/IamSarah/article/details/76085635

https://blog.csdn.net/IamSarah/article/details/76093802

https://blog.csdn.net/tnaig/article/details/81503259

 

转载于:https://www.cnblogs.com/ucas-ime/p/10254811.html

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

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

相关文章

重磅:国拨概算5.34亿!“新一代人工智能”重大项目项目申报指南发布

来源&#xff1a;brainnews各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff0c;国务院各有关部门&#xff0c;各有关单位&#xff1a;为落实国务院印发的《新一代人工智能发展规划》总体部署&#xff0c;现根…

java-多线程知识

几个排序算法比较 采用多线程实现几个排序算法&#xff0c;比较各个排序算法的优劣&#xff1b;java实现&#xff0c;一个主类&#xff0c;多个内部排序算法进程的接口&#xff0c;涉及到进程间的通信&#xff0c;因为每个进程包含自己的储存空间&#xff0c;无法直接访问其他…

Idea中在代码顶部添加自定义作者和时间

一、在工具栏找到File>settings>Editor>File and Code Templates 二、选择右边的File Header,在编辑框中添加自定义信息&#xff0c;例如&#xff1a; 三、然后点击应用&#xff0c;保存就OK啦&#xff01; 转载于:https://www.cnblogs.com/HelloBigTable/p/10261145.…

MFC框架解析

通过上述方法&#xff0c;我们进行代码的编写&#xff0c;创建一个空项目&#xff0c;我们要编写MFC应有程序&#xff0c;因此设置项目的属性&#xff0c; 项目->属性->链接器->系统->子系统为&#xff1a;窗口 (/SUBSYSTEM:WINDOWS)&#xff0c;项目->属性-&g…

162年难题,黎曼猜想被印度数学家迎刃而解?克雷数研所发出质疑

来源 &#xff1a; 新智元黎曼猜想又被证明了&#xff1f;5年前&#xff0c;印度一名数学物理学家Kumar Easwaran声称自己证明了「黎曼猜想」&#xff01;他发表了一篇论文「The Final and Exhaustive Proof of the Riemann Hypothesis from First Principles」解释自己的发现&…

js构造函数内存在的闭包

function Func(x) { this.x x; this.printfunction() { console.info(this.x); (function (){ console.info(x); })(); }}var a new Func(30);console.dir(a);a.age 300;console.dir(a.print());//300,30//存在于构造函数内的闭包 age:30 发生了闭包//this.print 内存在闭包…

MFC的六大关键技术

//main.h头文件 #pragma once #include"a.h" class CShape { public:virtual CRuntimeClassTest* GetRuntimeClassTest() const;BOOL IsKindOf(const CRuntimeClassTest* pClass) const; public:static CRuntimeClassTest classCShape; };static char szCShape[] &q…

20210709未来智能实验室收录资料

整理&#xff1a;未来智能实验室1.加州理工博士&#xff1a;用概率模型解析大脑中的神经活动2.智能化战争的基本形态 3.联合全域指挥控制的人工智能生态系统| 新品推荐4.数字化转型白皮书&#xff1a;数智技术驱动智能制造&#xff0c;42页pdf5.2021综述论文《几何深…

HTTP的请求报文与响应报文

报文&#xff1a; 简单来说&#xff0c;报文就是也就是HTTP报文&#xff0c;作用是在各个系统之间进行和响应时用来交换与传输的数据单元&#xff0c;即站点一次性要发送的数据块&#xff0c;这些数据块以一些文本形式的元信息开头&#xff0c;这些信息描述了报文的内容及含义&…

MFC关键技术-动态创建

//a.h头文件 #pragma once #include"m.h" #include<iostream> using namespace std;class CShape;//类声明//RTTI结构体 struct CRuntimeClassTest {LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();//PASCAL宏为…

谷歌利用人工智能设计的芯片揭示了智能的本质

来源&#xff1a;TechTalks 网站作者&#xff1a;Ben Dickson译者&#xff1a;Sambodhi策划&#xff1a;刘燕InfoQ 中文站曾经翻译并分享过《谷歌的深度学习在 AI 芯片中找到了一条关键路径》&#xff0c;该文介绍了 ZDNet 与谷歌大脑总监 Jeff Dean 谈到谷歌如何使用人工智能来…

MFC关键技术-永久保存机制

//Main.h文件 #pragma once #include<afxwin.h>class CEllipse :public CObject {DECLARE_SERIAL(CEllipse)private:double m_point; public:CEllipse(){}void Serialize(CArchive&); };//Main.cpp文件 #include"main.h"IMPLEMENT_SERIAL(CEllipse, CObjec…

2021世界人工智能大会最高奖项——卓越人工智能引领者奖(Super AI Leader,简称SAIL奖)在大会开幕式揭晓...

来源&#xff1a;AIII研究院备受全球人工智能界关注的2021世界人工智能大会最高奖项——卓越人工智能引领者奖&#xff08;Super AI Leader&#xff0c;简称SAIL奖&#xff09;今天在大会开幕式揭晓。获得2021 SAIL奖的是——利物浦大学机器人科学家、中科院上海微系统所免开颅…

ReentrantLock学习

对于并发工作&#xff0c;你需要某种方式来防止两个任务访问相同的资源&#xff0c;至少在关键阶段不能出现这种冲突情况。防止这种冲突的方法就是当资源被一个任务使用时&#xff0c;在其上加锁。在前面的文章--synchronized学习中&#xff0c;我们学习了Java中内建的同步机制…

2021年,深度学习还有哪些未饱和、有潜力且处于上升期的研究方向?

来自&#xff1a;知乎 作者&#xff1a;谢凌曦、数据误码率、Zhifeng编辑&#xff1a;极市平台 在目前的深度学习领域&#xff0c;有些研究方向已经较为成熟&#xff0c;实现新突破的难度与过去相比显著提升。那么就目前来看&#xff0c;还有哪些方向处于朝阳阶段&#xff0c;相…

832. Flipping an Image

题目来源&#xff1a; 自我感觉难度/真实难度&#xff1a; 题意&#xff1a; 分析&#xff1a; 自己的代码&#xff1a; class Solution(object):def flipAndInvertImage(self, A):""":type A: List[List[int]]:rtype: List[List[int]]"""B[]row…

浙江发布数字化改革标准化体系建设方案,将于2025年底建成

来源&#xff1a;中新网近日&#xff0c;记者从浙江省市场监管局获悉&#xff0c;《浙江省数字化改革标准化体系建设方案(2021-2025年)》(以下简称《方案》)已正式印发&#xff0c;该《方案》为浙江省数字化改革标准化体系建设工作明确了总体框架、分阶段目标、重点任务和相关保…

MFC基于对话框的商场交易软件实现

void CHomeViewDlg::OnClickedBtGuke() {// TODO: 在此添加控件通知处理程序代码CUserLoginDlg dlg;//注册窗框口类对象User user;user.m_UserType _T("顾客");dlg.SetUser(user);dlg.DoModal();//进入注册窗口窗口 }void CHomeViewDlg::OnClickedBtShangjia() {// …