FPGA复位信号设计讨论

news2024/11/26 22:20:30

复位概述

        复位作为电子系统中最常见的信号同时也是最重要的信号,它对工程师整体的设计表现有着极大的影响。复位信号可能深刻影响设计的性能表现,功耗,面积等等。对于一个优秀的系统设计,很难不把复位信号当成一个关键信号来设计。

        同步的代码可能会综合出LUTs,Registers,SRLs,Block or LUT memory,DSP48 registers。对复位方式的不同选择以及对复位的使用不同会影响基本元件的选择。可能会引入更多或者更少的资源,影响整体设计的表现,功耗,甚至会导致系统运行异常。

什么时候什么地方使用复位?

        对于很多新入门工程师来讲,很少会评估是否需要复位信号,绝大所数都是使用提供的模板,对所有的信号进行复位,尽管可能不是那么必要,如果是这样会增加资源,对复位时序也会产生影响,所以评估是否需要复位是很有必要的。

        对赛灵思器件而言,厂家对FPGA提供了专用的全局复位(GSR)。这个信号在配置结束会把所有的时序元件都设置为一个初始的值。如果这个初始值没有被指定,大多数情况下都会被设置为0。每个器件都会在配置结束设置为一个定值,因此,有些上电时单一目的复位必要性不是很大。下面代码初始化registers和latches的指定初始值。

// Verilog代码
reg register1 = 1’b0; // specifying regsiter1 to start as a zero
reg register2 = 1’b1; // specifying register2 to start as a one
reg [3:0] register3 = 4’b1011; //specifying INIT value for 4-bit register
-- VHDL代码
signal reg1 : std_logic := '0'; -- specifying register1 to start as a zero
signal reg2 : std_logic := ‘1’; -- specifying register2 to start as a one
signal reg3 : std_logic_vector(3downto0):="1011"; -- specifying INIT value for 4-bit register

        所以像之前所诉述,工程师应该仔细考虑和评估什么时候,什么地方需要复位。因为不必要的复位可能会导致诸多的问题。限制复位的使用可能具备的优势:

  • 限制全局复位网络的扇出

  • 减少复位路径的互联

  • 简化复位路径的时序分析

  • 提升整体设计的性能表现,面积,功耗等

        功能性的仿真是可以容易区分复位是否需要,所以建议去评估每一个同步模块是否需要复位,尽量减少在未评估真实需要复位的情况下就引入复位。

同步复位异步复位

        同步复位就是复位信号在时钟触发边沿才有效,简单讲敏感列表中没有复位信号,异步复位在复位信号被置位后即有效,简单说敏感列表中存在复位信号。如下面两段Verilog代码:

// 同步复位
module sync_resetFFstyle (
 outputreg q,
 input d, clk, rst_n);
always @(posedge clk)
 if (!rst_n)
     q <= 1'b0;
 else
     q <= d;
endmodule
// 异步复位
module async_resetFFstyle (
 outputreg q,
 input d, clk, rst_n);
 always @(posedge clk ornegedge rst_n)
 if (!rst_n)
     q <= 1'b0;
 else
     q <= d;
endmodule

同步复位相比较异步复位有以下的特点:

  • 同步复位可以映射更多种类的资源单元

  • 全局的异步复位会增加设计元件的布线复杂度(每个register都要连接复位信号)

  • 如果需要提高电路的集成密度或者对电路进行调优布局,同步复位更加灵活

  • 有些资源仅提供提供同步复位,如DSP48和RAM模块,如果使用异步复位,很难在不影响模块功能的前提下将异步信号正确施加在这些模块。(Xilinx)

同步复位特点:

  • 电路是百分之百同步化的

  • 时钟可以充当同步复位信号的一个毛刺滤波,但如果毛刺发生在时钟触发边沿,flip-flop仍然可能出现亚稳态。

  • 同步复位可能需要一个计数器来保障复位信号的宽度足够宽来实现有效的复位。

  • 因为同步复位需要时钟来复位,有些极少数的情况下,如某些低功耗设计,时钟可能在复位前就被无效,那么同步复位也无效,这里可能只有异步复位有效。

异步复位优点

只要具有可复位的触发器,那么异步复位就可以生效

异步复位不会在数据路径引入其他逻辑

异步复位缺点

反断言阶段,即复位移除阶段,复位信号沿如果距离时钟触发沿很近,则可能发生亚稳态,那么复位状态可能会丢失,也就是常说的符合Recovery Time以及Removal Time(类似Setup TimeHold Time

板子的毛刺和噪声可能引起虚假复位。

其他的一些缺点已经在(同步复位相比较异步复位有以下特点)上面小节阐述。

注意:异步复位都应该同步释放,以处理可能出现的亚稳态和异常情况,如下面所示代码:

// 异步复位同步释放
module sync_reset #
(
    // depth of synchronizer
    parameter N = 2
)
(
    inputwire clk,
    inputwire rst,
    outputwire out
);

(* srl_style = "register" *)
reg [N-1:0] sync_reg = {N{1'b1}};

assign out = sync_reg[N-1];

always @(posedge clk orposedge rst) begin
    if (rst) begin
        sync_reg <= {N{1'b1}};
    endelsebegin
        sync_reg <= {sync_reg[N-2:0], 1'b0};
    end
end

endmodule
// 代码来自开源项目AlexForencich

如何去除不必要复位信号?

        当需要去除一些复位信号时,直接注释掉相关的代码是不合适并且会引入非预期的结构以及会导致异常问题。如下面的代码,注释掉复位代码块里的din_dly1din_dly2会让复位信号成为寄存器的使能信号,显然属于引入无关逻辑,可能会引起设计的问题。如图一为未注释代码前综合出的异步复位电路,图二为直接注释掉复位区域信号的代码。产生这种问题也很容易理解,代码逻辑就是非复位状态din_dly1din_dly2才能工作。

always@(posedge sysclk orposedge rst)
begin
    if(rst)
    begin
//         din_dly1 <= 8'b0;
//         din_dly2 <= 8'b0;
         da_out <= 8'b0;
    end
    else
    begin
        din_dly1 <= da_in;
        din_dly2 <= din_dly1;
        da_out <= din_dly2;
    end
end


                                                          图一:未注释掉复位信号的代码
                                图二:注释掉复位信号的代码(引入非期望的电路)

         当遇到需要去除一些寄存器的复位信号时,记住一个基本原则:一个时序模块不可以混合不同复位类型的寄存器,简单讲就是不能出现不复位的寄存器和复位的寄存器,只要使用复位信号,那么时序模块的寄存器都应该复位。那么需要去除一些寄存器的复位信号应该怎么办?同样功能的代码如下,将复位的寄存器放入一个always块中,不需要复位的寄存器放入另一个always块中。图三是实际综合出的电路也是实际期望的电路,没有引入其他逻辑。

always @(posedge sysclk) begin
    din_dly1 <= da_in;
    din_dly2 <= din_dly1;
end

always @(posedge sysclk orposedge rst) begin
    if(rst)
        da_out <= 8'b0;
    else
        da_out <= din_dly2;
    
end

 

                                        图三:不同复位类型区分综合出的电路

        总结:本篇文章主要总结复位类型和其优缺点,在不同的情形下对复位类型选择进行权衡,尤其要评估一些不需要复位的情况,以实现设计的更优性能表现。具体的内容还可以查阅参考文献所列内容。

参考文献

[^1]:Asynchronous & Synchronous Reset Design Techniques - Clifford E. Cummings 

[^2]:UltraFast Design Methodology Guide for Xilinx FPGAs and SoCs - UG949 

[^3]: OpenSource -AlexForencich

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【车载基础软件 |ASF中间件 系列二】— 国产汽车生态平台ASF的生态框架

本文主要介绍国产基础软件开发平台架构下基于ASF的生态框架。 背景信息 随着E/E架构演进,从最初传统的分布式架构,由独立功能的ECU通过CANLIN等高实时性 总线通讯。诼渐演进到当前分域集中式结合车联网功能的结构,车载以大网逐渐步入了整车电子电器架构之中,除了高实时性…

【AIGC使用教程】论文阅读神器 SciSpace 从注册到体验

欢迎关注【AIGC使用教程】 专栏 【AIGC使用教程】论文阅读神器 SciSpace 从注册到体验 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用 【AIGC使用教程】GitHub Copilot 免费注册及在 PyCharm …

golang第一个简单项目实战+源码(gin+gorm)

创建项目并新建包 点击file->settings->GOPATH&#xff0c;把当前项目加进GOPATH目录中&#xff0c;然后点击apply&#xff0c; 点击加号完成之后&#xff0c;在左边选择go build 新建数据库 编写配置信息 这里将数据的信息都写在了配置文件里面 dns的内容为&#x…

二叉树概念结构,以及画图加代码分析二叉树遍历,创建,销毁,层序遍历,判断是否完全二叉树等等

二叉树 树的概念及结构树的概念树的相关概念树的表示 二叉树的概念及结构概念特殊的二叉树二叉树性质二叉树的存储结构 二叉树的实现二叉树顺序结构的实现二叉树链式结构的实现二叉树的遍历前序遍历中序遍历后序遍历 二叉树结点数量叶子结点数量求树高求k层结点数量 二叉树创建…

SpringMVC第一阶段:SpringMVC的介绍和使用

1、SpringMVC的概述 Spring MVC框架是一个开源的Java平台&#xff0c;为开发强大的基于JavaWeb应用程序提供全面的基础架构支持&#xff0c;并且使用起来非常简单容易。 Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构&#xff0c;用于开发灵活和松散耦合的Web应用程…

【原创】创建Vue3 ts项目

文章目录 创建Vue3 ts项目工作空间创建vue 项目进入项目目录启动项目 & 停止项目访问成功 创建Vue3 ts项目 工作空间 进入工作空间目录&#xff1a;D:\workspace\vue 创建vue 项目 vue create vt #创建vt项目vue test 选择手动进行配置&#xff1a; 选中下面几个核心…

利用 Mybatis-Plus 的动态数据源实现多数据源配置

目录 一、导入依赖 二、Application.yaml配置文件 三、切换数据源 四、其他方法 4.1 配置多个数据源 4.2 定义Datasource和EntityManager 4.3 在需要使用数据源的地方注入不同的EntityManager 官网&#xff1a;https://baomidou.com/pages/a61e1b/#dynamic-datasource …

vue2实现路由跳转后隐藏底部固定导航栏Tabber的一种方式

在使用vue路由的时候&#xff0c;跳转到某些页面上是不需要展示底部固定的导航栏的&#xff0c;所以在某些特定的页面跳转时候&#xff0c;就需要隐藏底部的导航栏 这里用了一种方式去解决这个问题 1、前提 这里我把底部导航栏做了一个组件的封装&#xff0c;然后在App.vue里…

玩转 LLMs 之基础设施「利刃出鞘」

LLMs 时代已经到来&#xff0c;这个由 ChatGPT 开始的全球化技术浪潮&#xff0c;所经之处&#xff0c;风起云涌。LLMs 之于当下&#xff0c;更像是 iOS 、Android 之于移动互联网时代。开发者沸腾&#xff0c;投资机构争抢&#xff0c;与赛道相关的基础设施建设自然也成为整个…

IOC容器中的核心容器ApplicationContext

文章目录 1 环境准备2 容器2.1 容器的创建方式2.2 Bean的三种获取方式2.3 容器类层次结构2.4 BeanFactory的使用 前面已经完成bean与依赖注入的相关知识学习&#xff0c;接下来我们主要学习的是IOC容器中的核心容器。 这里所说的核心容器&#xff0c;大家可以把它简单的理解为…

聊聊我在三家IT公司的工作经历,C++程序员都在做什么?

我想分享一些关于C程序员工作的经验。我先自我介绍一下&#xff1a;我是一名毕业于普通985大学的程序员&#xff0c;已经工作了5年&#xff0c;但是我曾在三家互联网公司工作过&#xff0c;这些公司都还算是比较有名的互联网公司。 好了&#xff0c;不多说了&#xff0c;进入正…

真题详解(自顶向下)-软件设计(七十六)

真题详解&#xff08;传引用&#xff09;-软件设计&#xff08;七十五)https://blog.csdn.net/ke1ying/article/details/130695214 计算机软件著作权&#xff0c;正确的是_____。 非法进行拷贝、发布或更改软件的人被称为软件盗版者 循环冗余CRC校验&#xff0c;设数据位为k位…

KVM网络管理-创建桥接网络

KVM网络管理-创建桥接网络 分类 网络&#xff1a; nat isolated 接口&#xff1a; bridge 虚拟交换机&#xff1a; linux-bridge(linux) ovs(open-Vswitch) NAT网络拓扑图 仅主机模式网络拓扑图 桥接模式网络拓扑图 在Linux主机上开启vm1&#xff0c;从交换机上把…

第五章 面向对象-6.内部类

内部类 内部类分为: 成员内部类、静态嵌套类、匿名内部类&#xff08;直接new 抽象类&#xff0c;直接new 接口&#xff09;$1 $2。 如果是函数式接口&#xff0c;可以使用lambda表达&#xff0c;这样可以避免new 接口产生内部匿名类 内部类仍然是一个独立的类&#xff0c;在…

接口测试要测试什么?怎么测?我来告诉你

目录 本文主要分为两个部分&#xff1a; 第一部分&#xff1a; 第二部分&#xff1a; 备注&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与…

SGI STL(四)——_S_chunk_alloc函数解析

情况一&#xff1a;内存池剩余空间的大小不满足需要分配的内存空间 假设调用为 _S_chunk_alloc(8, 20), 即希望分配8个20B的内存小块构成的chunk块 代码如下 template <bool __threads, int __inst> char* __default_alloc_template<__threads, __inst>::_S_chu…

Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)

文章目录 一、playbooks 概述以及实例操作1、playbooks 的组成2、操作示例一&#xff1a;3、操作实例二&#xff1a;定义、引用变量4、操作示例三&#xff1a;指定远程主机sudo切换用户5、操作示例四&#xff1a;when条件判断6、操作示例:五&#xff1a;迭代 二、playbook的模块…

怎么把视频压缩变小一点,必须收藏的方法

怎么把视频压缩变小一点&#xff1f;我们发现现在视频在工作中的占比也很大的。当我们拍摄了很多视频后&#xff0c;当然是需要进行后续的编辑和传输啦。但是我们发现视频的进行传输的时候最大的问题就是&#xff0c;视频太大导致无法发送或是发送的时间很慢。现今许多平台都对…

5springboot

SpringBoot 1.SpringBoot是什么 我们知道&#xff0c;从 2002 年开始&#xff0c;Spring 一直在飞速的发展&#xff0c;如今已经成为了在Java EE&#xff08;Java Enterprise Edition&#xff09;开发中真正意义上的标准&#xff0c;但是随着技术的发展&#xff0c;Java EE使…

C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历 总结&#xff1a; 1.图的基本概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G (V,E),其中顶点集合V{x|x属于某个对象集}是有穷非空集合…