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. 在React中写一个Animation组件,为组件进入和离开加上动画/过度

    问题 在单页面应用中,我们经常需要给路由的切换或者元素的挂载和卸载加上过渡效果,为这么一个小功能引入第三方框架,实在有点小纠结.不如自己封装. 思路 原理 以进入时opacity: 0 --> ...

  2. 5.如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

    作者:中华石杉 面试题 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis ...

  3. MySQL 重要参数 innodb_flush_log_at_trx_commit 和 sync_binlog

    innodb_flush_log_at_trx_commit 主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0.1.2三个.该参数控制重做日志写入 ...

  4. Robot Framework常用关键字

    虽然通过RIDE提供"填表"一样的写测试用例的方式.但它却支持强大的关键字功能,以及可以开发关键字的扩展能力. Comment 注释功能,也可以使用python中的"#& ...

  5. csv数据的读取和写入,以及好看的可视化

    参考: https://www.jianshu.com/p/5511cb3bdbb1 https://www.baidu.com/link?url=fbslMHoMviGOyn5Ub36VGdVQBD ...

  6. 《linux就该这么学》课堂笔记19 iSCSI、MariaDB、无人值守安装

    1.iSCSI技术介绍 硬盘是计算机硬件设备中重要的组成部分之一,硬盘存储设备读写速度的快慢也会对服务器的整体性能造成影响. 为了进一步提升硬盘存储设备的读写速度和性能,人们一直在努力改进物理硬盘设备 ...

  7. <人人都懂设计模式>-装饰模式

    书上,真的用一个人穿衣打拌来讲解装饰模式的呢. from abc import ABCMeta, abstractmethod class Person(metaclass=ABCMeta): def ...

  8. CSS伪类选择器:is、not

    本文介绍一下Css伪类:is和:not,并解释一下is.not.matches.any之前的关系 :not The :not() CSS pseudo-class represents element ...

  9. 使用Psi Probe监控Tomcat8.5

    一.从GitHub上下载Psi Probe的war包 https://github.com/psi-probe/psi-probe/releases 可以看到当前最新版是3.3.1,下载 probe. ...

  10. 20180610模拟赛T4——木棍

    有\(N\)根木棍,每根的长度\(L\)和重量\(W\)已知.这些木棍将被一台机器一根一根地加工.机器需要一些启动时间来做准备工作,启动时间与木棍被加工的具体情况有关.启动时间遵循以下规则: 加工第一 ...