【Xilinx FPGA】异步 FIFO 的复位

FIFO(First-In-First-Out,先入先出)是一种的存储器类型,在 FPGA 开发中通常用于数据缓存、位宽转换或者跨时钟域(多 bit 数据流)。在使用异步 FIFO 时,应注意复位信号是否遵循相关要求和规范,避免数据丢失或损坏。本文主要介绍 Xilinx FPGA 对异步 FIFO 复位的时序要求,并参考 IP 核示例工程设计异步 FIFO 的复位逻辑。

目录

1 复位类型

2 异步 FIFO 的复位


1 复位类型

        Xilinx FIFO Generator 提供了复位端口,用于复位计数器与输出寄存器。有两种复位的类型:同步复位(Synchronous Reset)和异步复位(Asynchronous Reset)。

        对于同步复位方式,由于复位信号已经是同步的,因此无需设计额外的同步逻辑。

The asynchronous reset (rst) input asynchronously resets all counters, output registers, and memories when asserted. When reset is implemented, it is synchronized internally to the core with each respective clock domain for setting the internal logic of the FIFO to a known state. This synchronization logic allows for proper timing of the reset logic within the core to avoid glitches and metastable behavior.

        对于异步复位方式,复位信号会分别被同步到读/写时钟域,同步逻辑确保 FIFO 正确复位,避免“毛刺”或者亚稳态。

        

        异步复位应遵循以下 2 个设计规则:

(1)复位必须在所有时钟有效时进行,否则 FIFO 的状态无法预测;

(2)复位信号的脉宽至少为 3 个慢时钟周期。

        在复位期间,应避免对 fifo 进行读写操作,以防止数据丢失或损坏。在复位完成后,需要等待一段时间才能对 fifo 进行读写操作。

        开启 Safety Circuit 的 FIFO,复位释放之后需至少等待 60 个慢时钟周期。

        未开启 Safety Circuit 的 FIFO,复位释放之后需至少等待 30 个慢时钟周期。

2 异步 FIFO 的复位

        打开 IP 核自带的 Example Design,参考激励文件异步 FIFO 的复位逻辑。

        在 reset 释放之后 50 个写周期,释放 reset_ext 信号。reset 连接到 FIFO 的异步复位端口,reset_ext 则用于读/写控制逻辑的复位。

        在 Example Design 的顶层文件中,将 reset_ext 信号分别同步到读/写时钟域。这里不知道是不是参考工程的错误,rst_async_rd1 ~ rst_async_rd3 使用了同步复位,同步释放的方式。

        以下是根据参考工程,自己设计的异步 FIFO 的复位控制逻辑。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;entity eth_rx_adjust isport(-- System levelnRst                : in std_logic;sysclk              : in std_logic;-- GMII IN data port--gmii_rxd_rxctl    : in std_logic_vector(9 downto 0);--gmii_rxc          : in std_logic;eth_phy_rxd         : in std_logic_vector(7 downto 0);eth_phy_rxdv        : in std_logic;eth_phy_rxc         : in std_logic;-- eth_rx dataeth_rxd_sys         : out std_logic_vector(7 downto 0);eth_rxdv_sys        : out std_logic);
end entity;
architecture behav of eth_rx_adjust is
-- internal component and signal declarations
component fifo_8bit_2048 isport(din                 : in std_logic_vector(7 downto 0);wr_en               : in std_logic;wr_clk              : in std_logic;full                : out std_logic;dout                : out std_logic_vector(7 downto 0);rd_en               : in std_logic;rd_clk              : in std_logic;empty               : out std_logic;rst                 : in std_logic;wr_data_count       : out std_logic_vector(10 downto 0);rd_data_count       : out std_logic_vector(10 downto 0));
end component;signal reset              : std_logic := '1';
signal reset_cnt          : std_logic_vector(5 downto 0) := (others => '0');
signal reset_ext_cnt      : std_logic_vector(5 downto 0) := (others => '0');
signal RESET_EXT          : std_logic := '1';
signal rst_async_wr1      : std_logic := '1';
signal rst_async_wr2      : std_logic := '1';
signal rst_async_wr3      : std_logic := '1';
signal rst_async_rd1      : std_logic := '1';
signal rst_async_rd2      : std_logic := '1';
signal rst_async_rd3      : std_logic := '1';
signal rst_int_wr         : std_logic := '1';
signal rst_int_rd         : std_logic := '1';signal eth_fifo_wdata     : std_logic_vector(7 downto 0);
signal eth_fifo_wrreq     : std_logic;
signal eth_fifo_empty     : std_logic;
signal eth_fifo_rcnt      : std_logic_vector(10 downto 0);
signal eth_fifo_rdreq     : std_logic;
signal eth_fifo_rdata     : std_logic_vector(7 downto 0);
signal eth_fifo_rdvld     : std_logic;attribute ASYNC_REG: string;
attribute ASYNC_REG of rst_async_wr1: signal is "true";
attribute ASYNC_REG of rst_async_wr2: signal is "true";
attribute ASYNC_REG of rst_async_wr3: signal is "true";attribute ASYNC_REG of rst_async_rd1: signal is "true";
attribute ASYNC_REG of rst_async_rd2: signal is "true";
attribute ASYNC_REG of rst_async_rd3: signal is "true";---------------------------------------------------------
begin
---------------------------------------------------------process(nRst,eth_phy_rxc) 
beginif nRst = '0' thenreset_cnt <= "000000";elsif rising_edge(eth_phy_rxc) thenif reset_cnt < "001000" thenreset_cnt <= reset_cnt + '1';elsereset_cnt <= reset_cnt;end if;end if;
end process;process(nRst,eth_phy_rxc) 
beginif nRst = '0' thenreset <= '1';elsif rising_edge(eth_phy_rxc) thenif reset_cnt < "001000" thenreset <= '1';elsereset <= '0';end if;end if;
end process;process(reset,eth_phy_rxc) 
beginif reset = '1' thenreset_ext_cnt <= "000000";elsif rising_edge(eth_phy_rxc) thenif reset_ext_cnt < "110010" thenreset_ext_cnt <= reset_ext_cnt + '1';elsereset_ext_cnt <= reset_ext_cnt;end if;end if;
end process;process(reset,eth_phy_rxc) 
beginif reset = '1' thenRESET_EXT <= '1';elsif rising_edge(eth_phy_rxc) thenif reset_ext_cnt < "110010" thenRESET_EXT <= '1';elseRESET_EXT <= '0';end if;end if;
end process;-- Asynchronous reset, synchronous release for rst_async_wr1, rst_async_wr2, rst_async_wr3
process(RESET_EXT,eth_phy_rxc) 
beginif RESET_EXT = '1' thenrst_async_wr1 <= '1';rst_async_wr2 <= '1';rst_async_wr3 <= '1';elsif rising_edge(eth_phy_rxc) thenrst_async_wr1 <= RESET_EXT;rst_async_wr2 <= rst_async_wr1;rst_async_wr3 <= rst_async_wr2;end if;
end process;-- Asynchronous reset, synchronous release for rst_async_rd1, rst_async_rd2, rst_async_rd3
process(RESET_EXT,sysclk) 
beginif RESET_EXT = '1' thenrst_async_rd1 <= '1';rst_async_rd2 <= '1';rst_async_rd3 <= '1';elsif rising_edge(sysclk) thenrst_async_rd1 <= RESET_EXT;rst_async_rd2 <= rst_async_rd1;rst_async_rd3 <= rst_async_rd2;end if;
end process;rst_int_wr <= rst_async_wr3;
rst_int_rd <= rst_async_rd3;--===============================================================
-- eth_fifo_inst
eth_fifo_instx: component fifo_8bit_2048
port map(din             => eth_fifo_wdata     , -- in std_logic_vector(7 downto 0)wr_en           => eth_fifo_wrreq     , -- in std_logicwr_clk          => eth_phy_rxc        , -- in std_logicfull            => open               , -- out std_logicdout            => eth_fifo_rdata     , -- out std_logic_vector(7 downto 0)rd_en           => eth_fifo_rdreq     , -- in std_logicrd_clk          => sysclk             , -- in std_logicempty           => eth_fifo_empty     , -- out std_logicrst             => reset              , -- in std_logicwr_data_count   => open               , -- out std_logic_vector(10 downto 0)rd_data_count   => eth_fifo_rcnt        -- out std_logic_vector(10 downto 0)
);process(rst_int_wr,eth_phy_rxc) 
beginif rst_int_wr = '1' theneth_fifo_wdata <= (others => '0');eth_fifo_wrreq <= '0';elsif rising_edge(eth_phy_rxc) theneth_fifo_wdata <= eth_phy_rxd;eth_fifo_wrreq <= eth_phy_rxdv;end if;
end process;process(rst_int_rd,sysclk) 
beginif rst_int_rd = '1' theneth_fifo_rdreq <= '0';eth_fifo_rdvld <= '0';elsif rising_edge(sysclk) thenif eth_fifo_rcnt > 6 theneth_fifo_rdreq <= '1';elsif eth_fifo_rcnt = 1 theneth_fifo_rdreq <= '0';end if;eth_fifo_rdvld <= eth_fifo_rdreq;end if;
end process;process(rst_int_rd,sysclk) 
beginif rst_int_rd = '1' theneth_rxd_sys <= (others => '0');eth_rxdv_sys <= '0';elsif rising_edge(sysclk) theneth_rxd_sys <= eth_fifo_rdata;eth_rxdv_sys <= eth_fifo_rdvld;end if;
end process;
end architecture;

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

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

相关文章

【设计模式-02】Strategy策略模式及应用场景

一、参考资料 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

水和冰一起进微波炉会怎样?不会还有人不知道吧

水和冰一起放到微波炉里加热 3 分钟&#xff0c;水已经冒烟的情况下&#xff0c;冰块会化掉吗&#xff1f; 事实上并不会。 不信&#xff0c;看一下这个视频—— 这个博主把一杯水和一杯冰放到微波炉里同时加热3分钟&#xff0c;结果水已经开始汽化了&#xff0c;冰还是冰。 这…

React入门 - 06(TodoList 列表数据的新增和删除)

本章内容 目录 一、实践一下 React 的列表渲染二、TodoList 新增功能三、列表循环的 key四、删除 上一节内容我们完成了输入框中可以自由输入内容&#xff0c;这一节我们继续 TodoList功能的完善&#xff1a;列表数据的新增和删除。 在开始之前&#xff0c;我们先介绍一下 Re…

LeetCode 145. 二叉树的后序遍历

145. 二叉树的后序遍历 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…

YOLOv8-Seg改进:轻量化改进 | MobileNetV3,轻量级骨架首选

🚀🚀🚀本文改进:MobileNetV3的创新点包括:使用自适应瓶颈宽度、借鉴SENet中的Squeeze-and-Excitation机制、引入h-swish激活函数等。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教…

Jmeter+ant+jenkins持续集成

一、环境准备 1、 jdk环境 要求JDK1.8以上&#xff0c;命令行输入&#xff1a;java -version&#xff0c;出现如下提示说明安装成功。 2、 Jmeter环境 下载Jmeter最新版本&#xff0c;解压即可&#xff0c;添加bin目录到环境变量。 3、 Ant环境 设置ant环境变量&#xff0…

报错解决方法——http404(Spring MVC)

一.检查静态资源是否加载成功 成功的标志就是在项目跑起来之后再target文件夹中的classes文件夹中可以找到自己写的配置文件。 1.查看resources文件夹是否被识别为资源文件夹 如图所示&#xff0c;文件夹图标右下角有三条杠代表被识别为资源文件 2.在pox.xml文件中插入如下…

生信技能33 - gnomAD数据库hg19/hg38 VCF文件批量下载脚本

gnomAD数据库下载地址 gnomAD downloads gnomAD v2.1.1数据集包含来自125,748个外显子组和15,708个全基因组的数据,所有这些数据都映射到GRCh 37/hg 19和GRCh 38/hg 38 两个版本的参考序列。 gnomAD数据库hg19与hg39 VCF文件批量下载脚本 download.sh # 获取当前目录路径…

本地部署 big-AGI

本地部署 big-AGI 1. big-AGI 介绍2. Github 地址3. 本地部署 big-AGI4. 访问 big-AGI5. 配置 API key6. 测试一下 1. big-AGI 介绍 欢迎使用 big-AGI &#x1f44b;&#xff0c;这是一款面向需要功能、形式、简单性和速度的专业人士的 GPT 应用程序。 big-AGI 由 10 个供应商…

UML期末复习(带习题,选择题,判断题)(持续更新)

UML期末复习 UML简介UML模型图的构成UML事物UML包含4种事物&#xff1a;构件事物&#xff1a; UML模型的静态部分&#xff0c;描述概念或物理元素行为事物&#xff1a;UML模型图的动态部分&#xff0c;描述跨越空间和时间的行为分组事物&#xff1a; UML模型图的组织部分&#…

[Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看K8s使用Helm部署mysql集群(主从数据库集群) 一.Helm 搭建mysql集群 1.安装mysql不使用persistence(无本地存储) 无本地存储:当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中…

Vue组件

一&#xff1a;组件化开发基础 1.组件是什么&#xff1f;有什么用&#xff1f; 组件就是&#xff1a;扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;目的是复用 例如&#xff1a;有一个轮播图&#xff0c;可以在很多页面中使用&#xff0c;一个轮播有js&#xff0c;…