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. ES6 对象的拓展(三)

    一.对象中的属性及方法1.属性属性简写:当对象属性名与属性值变量相同可以简写eg: let [name,age]=['nzc','18']; let obj = { name:name, age:ag ...

  2. 中国工业的下一个十年在哪里?APS系统或将引领智能化转型

    为什么众多的ERP软件公司没有推出相关产品,当然可以肯定的是并非客户没有此观念,如果一定要说,也只能说目前的需求还不是非常强烈,从ERP厂商非常急切的与APS公司合作,甚至有高价购买APS公司代码的情 ...

  3. Spring Cloud 微服务实战笔记

    Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...

  4. 3.redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

    作者:中华石杉 面试题 redis 都有哪些数据类型?分别在哪些场景下使用比较合适? 面试官心理分析 除非是面试官感觉看你简历,是工作 3 年以内的比较初级的同学,可能对技术没有很深入的研究,面试官才 ...

  5. Django学习之十四:Django ORM继承关系

    目录 Django ORM继承关系 1. SINGLE_TABLE(django好像不支持) 2. TABLE_PER_CLASS 3. JOINED 4. 代理继承 Django ORM继承关系 参 ...

  6. 为 Jupyter Notebook指定虚拟环境的 Python 解释器

    说明:本机系统为 win10 64 位, base 是集成于 Anaconda3 的 64 位的python,以下是创建虚拟环境 py366-32,安装 3.6.6 版的 32 为python,把 3 ...

  7. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  8. CEF 拦截打开超链接事件

    使用 CEF 加载指定页面后,如果你希望控制页面在打开超链接时根据自己预定义的一些行为来操作,比如在自己的 UI 框架中新建一个 Tab 页又或者阻止打开新的页面等.我们就需要通过 CEF 提供的两个 ...

  9. 13-C#笔记-数组

    # 1 初始化 double[] balance = new double[10]; // 隐式初始化为0 double[] balance = { 2340.0, 4523.69, 3421.0}; ...

  10. AtCoder Grand Contest 033 题解

    传送门 我比赛的时候怕不是在睡觉啊-- \(A\ Darker\ and\ Darker\) 我是不是想得太复杂了--根本没必要像我这样做吧-- 首先问题可以转化成令\(p_{i,j}\)表示到\(( ...