2019.12.10补充

  结论:先写进的数据在独处时位于高位,后写入的数据在低位,且排序单位为Byte,即先后写入0X01,0X02,读出后也为0x010x02,此外,在写入数据量达到读出数据位宽后5个时钟empty才会拉低。

  过程:

  犯傻的时候想到,不同位宽数据进出时可能有一个先后顺序的问题,通过在数据手册上看到这张图后发现对于写入位宽小于读出位宽时(write_witdh<read_witdh),先写进的数据在读出时位于低位,后写入的数据在高位。

  

  不过在仿真中发现,先进的的在MSB处,后进的在LSB处。。。。。服了 ,此外可以看到,fifo的empty信号,即空标志有效在从写入到拉低,经历了13个时钟周期(稍后验证),在这段时间内,实测是不能读写的。(这个FIFO的设置为writh_witdh为24bit,read_witdh为192bit)

  

  为了验证这13个周期是否是固定的还是什么别的原因造成,我做了几个小测试,

  1.写入第一个数据后,过一段时间再给入剩余数据,总数据量为192bit。在五个时钟周期后empty为低。

    

  2.写入数据未到read_witdh(192bit),empty一直为高。

    

  所以,可以得到结论,当写入数据量达到读取位宽时,empty才会在五个时钟信号后拉低。

1.简介

  定义:

    FIFO(First In First Out)一种先入先出(读写数据是只能顺序写入顺序读出)的数据缓存器,读写数据时,其内部读写指针自动加1,因此没有外部地址线,使用简单。

  分类:

    FIFO可以分为同步FIFO和异步FIFO。同步FIFO的写入时钟和读取时钟完全一样,内核时一个简单双口RAM(Simple Dual Port RAM);异步FIFO写入时钟和读取时钟不同,不仅需要真双口RAM(True Dual Port RAM),还需要专门的握手信号进行跨时钟域的数据传递。

  用途:

    1)使用异步FIFO进行跨时钟域交互数据;2)进行不同数据宽度的读写匹配;3)对高速突发数据进行平均处理,降低瞬时处理速率。

  使用场景:

    1)AXI总线工作在1GHz以上,而USB2.0工作在480MHz时,就需要内嵌异步FIFO;2)AD采样为24位,而传输协议为8位时,可以使用FIFO进行不同数据宽度的读写匹配...

2.空满原理

    空或满时应满足:读写指针相等。当复位后,或者读指针读出FIFO中最后的数据后追上了写指针则说明FIFO为空;当写指针写满一圈后又追上读指针则说明满。但是随之而来又有一个问题,当读写指针相等时,到底是空还是满呢?对此,目前采用的方法有两种:1)指针中增加一个额外的位用于确定满或空。2)采用格雷码完成FIFO空/满判断。

    法1)在异步FIFO中容易出现问题(将一个二进制的计数值从一个时钟域同步到另一个时钟域时容易出现问题),例如1111在下一刻变成0000,但在实际电路中这个过程可能会持续较长时间,实际需要4个状态才能实现(例如1111=>1011=>1001=>1000=>0000),若写时钟而在这个期间采样,得出的指针就会是错误的。

    法2)则能解决这个问题,因为格雷码每次变换只有一位发生改变。

3.创建 

  一般来说,现在使用FIFO时,可以直接使用公司自带的IP核实现,此处以ISE为例(新建项目就不说了,直接新建文件)。

  (1)New Source

    

  (2)选择IP 并填写文件名

    

  (3)在Memories&Storage Elements中找到FIFOs 

    

  (4)接下来程序会自动打开FIFO Generator

    

  (5)此处选择读写公用时钟还是独立时钟,采用块RAM还是分布RAM,(我选择的是独立时钟,Block RAM)

    

  (6)接下来选择写宽度,写深度,读深度,读宽度。(因为本文举例的FIFO实在实际工程中,因此根据实际要求做了选择)

    

  (7)接下来还有一些可选项,可以依照自己的需求选择。

    

    

    

  (8)在生成之后点击View HDL Instantiation Template便可以查看接口信息,方便实例化;同时在

    

  (9)同时在自定义的目录下会生成相关的文件与文件夹,如下图;其中simulation包含仿真信息。

    

    

4.使用(无具体代码,介绍方法)

   fifo_da U2_0_2_F0(
      .rst(!rst_n),      // FIFO复位信号,高电平有效
      .wr_clk(wr_clk),   // 写FIFO时钟
      .wr_en(u_rd_en),   // 写FIFO使能
      .din(din),         // 写入FIFO的数据
    //写入:wr_en为高电平时wr_clk的上升沿会把din写入fifo中;(同步写入)
      .rd_clk(rd_clk),   // 读FIFO时钟
      .rd_en(rd_en),     // 读FIFO使能
      .dout(dout),     // 读出FIFO的数据
      .full(full),       // output full
      .empty(empty)      // output empty
     //读出:rd_en为高电平时,会在下一个rd_clk的上升沿会把fifo的数据读出;(下一个时钟数据读出)
);

  

5.相关

   1)二进制码转格雷码

binarycode = graycode^(graycode>>);

二进制码转格雷码

    2)格雷码转二进制码

     always@(geraycode)begin

     for(i=;i<n-;i=i+)

       binarycode[i]=^(geraycode>>i);

     end

格雷码转二进制码

5.参考资料

  1)《通信IC设计》李庆华著

【实战经验】--Xilinx--IPCore--FIFO的更多相关文章

  1. Modelsim se仿真Xilinx IPcore

    Modelsim se仿真Xilinx IPcore 方法:先写好do文件常规框架,根据modelsim报错再添加ise IP核库仿真文件.注:记得添加并仿真glbl.v全局控制仿真文件到sim/is ...

  2. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)

    RAC 特殊问题和实战经验(五) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  3. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  4. MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

    原文地址:http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的 ...

  5. MySQL索引实战经验总结

    MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源,本篇总结了一些MySQL索引实战经验. 索引是用于快速查找记录的一种数据结构.索引就像是数据库中 ...

  6. 第9期Unity User Group Beijing图文报道:《Unity实战经验分享》

    时间来到了金秋九月,北京UUG活动也来到了第九期.本次活动的主题为<Unity实战经验分享>,为此我们邀请了3位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...

  7. ASP.NET Core & Docker 实战经验分享

    一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...

  8. Jenkins高级用法 - Jenkinsfile 介绍及实战经验

    系列目录 1.Jenkins 安装 2.Jenkins 集群 3.Jenkins 持续集成 - ASP.NET Core 持续集成(Docker&自由风格&Jenkinsfile) 4 ...

  9. HDFS配置参数及优化之实战经验(Linux hdfs)

    HDFS优化之实战经验 Linux系统优化 一.禁止文件系统记录时间 Linux文件系统会记录文件创建.修改和访问操作的时间信息,这在读写操作频繁的应用中将带来不小的性能损失.在挂载文件系统时设置no ...

  10. Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)

    Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)    转 https://blog.csdn.net/lhl1124281072/article/details/800 ...

随机推荐

  1. 面试官:讲讲redis的过期策略如何实现?

    时隔多日,小菜鸡终于接到阿里的面试通知,屁颠屁颠的从上海赶到了杭州. 经过半个小时的厮杀: 自我介绍 hashMap和ConcurrentHashMap区别 jdk中锁的实现原理 volatile的使 ...

  2. 七月伊始 LeetCode算法总结

    七月伊始 早上买了LeetCode的课程,解锁了付费题目,付费倒逼学习: 意识到这么久学习的东西,都是写在自己的笔记, 如今希望自己能够用自己拙笔记录这个学习和总结的过程. 队列的学习 设计循环队列 ...

  3. centos7 下 yum 安装Nginx

    centos7 下 yum 安装和配置 Nginx 添加yum源 Nginx不在默认的yum源中,可以使用epel或者官网的yum源,这里使用官网的yum源 rpm -ivh http://nginx ...

  4. 和群友聊HashTable转到树和图的数据结构

    AVL树 前中后遍历 树的遍历深度和广度 树是一种特殊的图 人脉关系属于图数据结构: 并查集 最小生成树 union find 正常图的遍历用广度也能做,但是速度低: 并查集可以降到logn 数据小的 ...

  5. Python实现感知器的逻辑电路(与门、与非门、或门、异或门)

    在神经网络入门回顾(感知器.多层感知器)中整理了关于感知器和多层感知器的理论,这里实现关于与门.与非门.或门.异或门的代码,以便对感知器有更好的感觉. 此外,我们使用 pytest 框架进行测试. p ...

  6. JavaScript三种方法获取地址栏参数的方法

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split(“?”)这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单 ...

  7. Git问题

    1. LF will be replaced by CRLF rm -rf .git // 删除.git git config --global core.autocrlf false //禁用自动转 ...

  8. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  9. WeUI教程/第三方扩展及其他UI框架对比

    WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一.包含button.cell.dialog. progress. toa ...

  10. springboot 启动的时候报java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext

    解决方案:缺少spring-expression-4.1.4.RELEASE.jar包,丢进项目中就可以了 <dependency> <groupId>org.springfr ...