首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IP CORE 之 FIFO 设计- ISE 操作工具

IP CORE 之 FIFO 设计- ISE 操作工具

作者头像
FPGA技术江湖
发布于 2020-12-30 08:23:26
发布于 2020-12-30 08:23:26
1.1K00
代码可运行
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖
运行总次数:0
代码可运行
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用,这种快乐试试你就会懂的。话不多说,上货。

IP CORE 之 FIFO 设计 - ISE操作工具

作者:李西锐 校对:陆辉

本篇实现基于叁芯智能科技的SANXIN -B02 FPGA开发板,如有入手开发板,可以登录官方淘宝店购买,还有配套的学习视频。

FIFO(first input first output或者first in first out),先入先出队列,是一种数字电路中常用的缓冲器,先进入的数据或者命令会先出来,后进入的数据或者命令会后出来,不改变数据的先后顺序。FIFO的工作方式就像超市购物结账时的通道,先进入的顾客先结账,然后出超市;当先进入的顾客没有结算完成时,或进入的顾客只能进行等待;进入的顺序和走出超市的顺序是相同的。

在大多数的逻辑接口设计时,都会留有一定的缓冲区(FIFO),避免数据没有及时发送(接收)。

无论多大的缓冲区都可能会被装满。当装满后,再次进行载入时,就会出现错误(覆盖或者丢失),所以缓冲区会给予外部标志信号,表明自己的状态。

FIFO的输入和输出的速率可以是不相同的,这就为我们解决多bit数据线跨时钟域的问题提供了方法。

对于输入端口来说,只要FIFO中还有空余位置,就可以写入数据;对于输出端口来说,只要FIFO中还有数据,就可以读出数据。

写一侧的所有信号都同步于写时钟,读一侧的所有信号都同步于读时钟。

  • 设计要求

设计宽度为8、缓冲深度为256、输入速率为100MHz、输出速率为50MHz和各类标志信号的FIFO。

  • 设计原理

FPGA内部没有FIFO的电路,实现原理为利用FPGA内部的SRAM和可编程逻辑实现。

ISE软件中提供了FIFO的ip core,设计者不需要自己设计可编程逻辑和SRAM组成FIFO。

设计者也可以自己设计FIFO。

本节讲述调用ISE中的FIFO ip core。

  • 架构设计和信号说明

此模块命名为fifo_test,my_fifo为调用的ip core。

由于FIFO的深度为256,所以两侧的使用量信号最大值可以为256,所以位宽为9。

  • 调用FIFO

建立工程,右键点击顶层,选择New Source。新建IP核。

搜索FIFO,选择FIFO Generator。点击Next。

保持默认设置,点击Next。

此界面是设置FIFO读写时钟方式:

Block RAM: 指的是FPGA内部硬件已经存在的RAM,是硬件资源。在FPGA芯片内部都有这种已经设置好的芯片资源;

Distribute RAM: 分布式RAM,使用FPGA内部的寄存器和查找表搭建起来的RAM,当深度要求小于32的时候可以使用;

Shift Register: 使用FIFO产生一个移位寄存器;

Common clock: 指的就是同步FIFO;

Independent clock: 指的就是异步FIFO。

本页需要设置数据参数,包括数据位宽以及数据深度。

这一页的选项就是一些标志位,用来标记我们是否出现了读写溢出之类的。

Almost Full flag:就是我们可以设置一个位置,当写指针写道这个位置的时候,就会提醒说近乎满了,常用来设计警告之类的;

Almost Empty Flag :类似上面的作用;

overflow:就是写指针追到了读指针,然后还继续写就会overflow。

这里需要我们进行初始化设置,复位管脚我们不需要,所以不需要添加。保持默认,点击Next。

点击Next。

设置完成之后,点击Generate。

  • 顶层设计

顶层负责调用my_fifo,例化文件在ipcore_dir -> my_fifo.veo 中。

设计代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module fifo_test(
  input  wr_clk,
  input rd_clk,
  input  [7:0] wrdata,
  input wren,
  input rden,
  output full,
  output empty,
  output [7:0] rdata
    );


my_fifo my_fifo_inst (
  .wr_clk(wr_clk), 
  .rd_clk(rd_clk), 
  .din(wrdata), 
  .wr_en(wren), 
  .rd_en(rden), 
  .dout(rdata), 
  .full(full), 
  .empty(empty) 
);

endmodule
  • RTL仿真

在应用时,只要检测到wrfull不为高时,就可以写入数据;检测到rdempty不为高时,就可以读出数据;在仿真时,我们做简单测试,将随机的256个数据,写入fifo中;然后将256个数据读出。

设计代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
`timescale 1ns/1ps

module fifo_test_tb;

  reg wr_clk;
  reg rd_clk;
  reg [7:0] wrdata;
  reg wren;
  reg rden;
  wire full;
  wire empty;

  // Outputs
  wire [7:0] rdata;

  // Instantiate the Unit Under Test (UUT)
  fifo_test fifo_test_inst (
    .wr_clk(wr_clk), 
    .rd_clk(rd_clk),
    .wrdata(wrdata), 
    .wren(wren), 
    .rden(rden), 
    .full(full), 
    .empty(empty), 
    .rdata(rdata)
  );

  
  initial wr_clk = 1'b0;
  always # 5 wr_clk = ~wr_clk;
  
  initial rd_clk = 1'b0;
  always # 10 rd_clk = ~rd_clk;
  
  initial begin
    wren = 1'b0;
    wrdata = 8'd0;
    rden = 1'b0;
    # 200
    repeat (1100) begin
      @ (posedge wr_clk);
      # 2;
      wren = 1'b1;
      wrdata = {$random} % 256;
    end
    @ (posedge wr_clk);
    # 2;
    wrdata = 8'd0;
    wren = 1'b0;
    
    # 200
    repeat (1100) begin
      @ (posedge rd_clk);
      # 2;
      rden = 1'b1;
    end
    @ (posedge rd_clk);
    # 2;
    rden = 1'b0;
    # 200;
    $stop;
  end

endmodule

wrclk的时钟速率为100MHz,rdclk的时钟速率为50MHz。

通过RTL波形可以看出写一侧的信号同步于wr_clk,读一侧的信号同步于rd_clk。

在没有数据写入时,empty为高电平,当写入第一个数据后,empty信号拉低。

在输入最后一个数据68时,full立刻拉高。

读数据时,输出数据和输入的数据是相同的。延迟一拍后,数据输出并且full拉低,再延迟一拍后,统计量输出。此时写一侧的信号也会有变化,但是会有略微延迟。

读出最后一个数据47后,empty拉高。

- End -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FPGA零基础学习:IP CORE 之 FIFO设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/22
5270
FPGA零基础学习:IP CORE 之 FIFO设计
【FPGA——基础篇】同步FIFO与异步FIFO——Verilog实现「建议收藏」
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
全栈程序员站长
2022/07/28
6.5K0
【FPGA——基础篇】同步FIFO与异步FIFO——Verilog实现「建议收藏」
IP CORE 之 ROM 设计- ISE 操作工具
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2020/12/30
1.2K0
FPGA基础知识极简教程(4)从FIFO设计讲起之异步FIFO篇
一开始是想既然是极简教程,就应该只给出FIFO的概念,没想到还是给出了同步以及异步FIFO的设计,要不然总感觉内容不完整,也好,自己设计的FIFO模块不用去担心因IP核跨平台不通用的缺陷!那我们开始吧。
Reborn Lee
2020/06/29
1.8K0
谈谈跨时钟域传输问题(CDC)
CDC(Clock Domain Conversion)问题,一直是IC前端设计,FPGA设计的热点问题,特别是在校招面试笔试时候,是问的最多的一个问题,我之前关于这个问题以及相关问题,写了一些总结,但比较分散,今天简单汇总总结一下。
Reborn Lee
2020/06/29
3.6K0
FPGA零基础学习:IP CORE 之 RAM设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/22
6190
FPGA零基础学习:IP CORE 之 RAM设计
同步FIFO和异步FIFO
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
碎碎思
2020/06/30
2.1K0
IP CORE 之 RAM 设计- ISE 操作工具
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2020/12/30
8500
异步FIFO设计原理与设计方法以及重要问题汇总(包含verilog代码|Testbench|仿真结果)
经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。快速导航链接如下:
Loudrs
2023/06/05
5.6K1
异步FIFO设计原理与设计方法以及重要问题汇总(包含verilog代码|Testbench|仿真结果)
FIFO系列(三):fifo与格雷码以及异步fifo设计
关于同步fifo的设计疑惑了半天,本以为这个代码是错的,后来自己又写了一遍,但是写到最后又觉得这个是正确的,主要是wr_cnt和rd_cnt的理解。
根究FPGA
2020/06/29
3.7K0
FPGA零基础学习:SDR SDRAM 驱动设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/23
1.1K0
FPGA零基础学习:SDR SDRAM 驱动设计
FPGA零基础学习:IP CORE 之 ROM设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/22
9100
FPGA零基础学习:IP CORE 之 ROM设计
异步FIFO
如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的指针rptr采集到写时钟wr_clk域,然后和写时针wptr进行比较从而产生或撤销写写满标志wfull;类似地,同步模块synchronize to read clk的作用是把写时钟域的写指针wptr采集到读时钟域,然后和读指针rptr进行比较从而产生或撤销读空标志位rempty。
数字芯片社区
2020/08/27
1.5K0
异步FIFO
FPGA零基础学习:图像显示系统设计
大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/23
5730
FPGA零基础学习:图像显示系统设计
FPGA零基础学习:SPI 协议驱动设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2020/12/30
1.7K0
FPGA逻辑设计回顾(6)多比特信号的CDC处理方式之异步FIFO
异步FIFO是处理多比特信号跨时钟域的最常用方法,简单来说,异步FIFO是双口RAM的一个封装而已,其存储容器本质上还是一个RAM,只不过对其添加了某些控制,使其能够实现先进先出的功能,由于这个功能十分的实用,因此得以广泛应用。真双口RAM可以实现在一端存储,另一端读取的功能,两端的时钟可以不同,将数据存入一个容器,再取出来,这个过程在双口RAM的两端完全不存在亚稳态的问题。由于异步FIFO的实现中也存在数据的存取问题,和双口RAM类似,再加上空满信号的控制,存在跨时钟域的问题,因此只要处理好,空满信号的判断中的跨时钟域问题,就可以使用FIFO解决多比特信号的跨时钟域问题。下面从多个方面来了解一下,异步FIFO的内容,最后会给出异步FIFO的一种普遍的实现方式及其仿真,让我们一起进入今天的内容吧。
Reborn Lee
2021/01/21
1.2K0
【手撕代码】同步 FIFO、LIFO/Stack
FIFO 是FPGA设计中最有用的模块之一。FIFO 在模块之间提供简单的握手和同步机制,是设计人员将数据从一个模块传输到另一个模块的常用选择。
碎碎思
2023/08/30
3450
【手撕代码】同步 FIFO、LIFO/Stack
异步fifo的10个测试关注点_异步FIFO
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据。
全栈程序员站长
2022/09/21
1.4K0
异步fifo的10个测试关注点_异步FIFO
跨时钟域传输总结(包含verilog代码|Testbench|仿真结果)
快时钟域相比慢时钟域采样速度更快,也就是说从慢时钟域来到快时钟域的信号一定可以被采集到。既然快时钟一定可以采集到慢时钟分发的数据,那么考虑的问题就只剩下如何保证采样到的信号质量!最常用的同步方法是双级触发器缓存法,俗称延迟打拍法。信号从一个时钟域进入另一个时钟域之前,将该信号用两级触发器连续缓存两次,可有效降低因为时序不满足而导致的亚稳态问题。
Loudrs
2023/06/08
6.4K1
跨时钟域传输总结(包含verilog代码|Testbench|仿真结果)
FIFO系列(二):同步FIFO的verilog设计
关于同步fifo的设计疑惑了半天,本以为这个代码是错的,后来自己又写了一遍,但是写到最后又觉得这个是正确的,主要是wr_cnt和rd_cnt的理解。
根究FPGA
2020/06/29
3.6K0
相关推荐
FPGA零基础学习:IP CORE 之 FIFO设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档