FPGA中复位电路的设计

news2024/11/16 3:36:22

复位电路也是数字逻辑设计中常用的电路,不管是 FPGA 还是 ASIC 设计,都会涉及到复位,一般 FPGA或者 ASIC 的复位需要我们自己设计复位方案。复位指的是将寄存器恢复到默认值。一般复位功能包括同步复位和异步复位。复位一般由硬件开关触发引起,也可以由复位逻辑控制引起。

复位电路的作用

数字电路中寄存器和 RAM 在上电之后默认的状态和数据是不确定的,如果有复位,就可以把寄存器复位到初始状态 0,RAM 的数据可以通过复位来触发 RAM 初始化到全 0,因为一般逻辑起始都是从 0 开始变化的,这个是根据设计的需要设定的一个值,如果设计需要寄存器上电复位为 1,也是可以的。

还有就是如果逻辑进入了错误的状态,通过复位可以把所有的逻辑状态恢复到初始值。

复位电路的控制方式

1 按键复位

在硬件电路设计中,一般会留下一个复位按键,按下开关复位,就可以简单快捷地进行复位。

但按键复位存在一个问题,就是一般按键在按下时会产生抖动,释放时也会产生抖动。这是因为大多数按键所使用的开关为机械弹性开关,当我们按下或松开按键时,由于弹片的物理特性,不能立即闭合或断开,往往会在断开或闭合的短时间内产生机械抖动。
按键消抖可分为硬件消抖和软件消抖。硬件消抖主要使用RS触发器或电容等方法实现消抖, 一般在按键较少时使用。软件消抖的原理主要为按键按下或松开后延时5ms—20ms采样,这种方法经常使用。
按键去抖的思路是检测到按下时延时 20ms,再检测,如果状态仍为按下,则确认是按下的;如果状态为弹起的,则确认是干扰,无按键按下。
假如rst_in 为一个 普通 按键,直接连接至 FPGA里面的复位引脚作为全局复位,所以按键消抖的原理为:当 rst_in按键按下时可能会出现抖动,需要 等 20ms之后再去检测这个按键是否按下 FPGA里面的这个引脚的电平是否改变 )),这样就达到了按键消抖的目的 。
如下图所示:

检测到第一次按下(检测到低电平),此时延迟20ms,然后 20ms之后,再次检测是否有稳定的低电平 。
由于按键 弹片的物理特性,按键按下时会有抖动,也就是说我们其实只按一次,但是实际产生的“按下”却是许多次的,这些许多次集中在这 20ms里。通过延时 20ms,把其他的“按下(也就是抖动)给滤除了。然后再次判断是否有按下,因为有的时候干扰很大。

2 RC复位电路

这种是一种简单的 RC 复位电路,电源接通时候,通过 R1 对 C2 进行充电,经过一段延迟后加到电路当中产生复位信号,这个复位信号的上升速度低于电源的上电速度,当复位引脚检测到高电平时候,系统复位结束,进入正常工作状态。

3 FPGA上电复位

如果在硬件电路设计时没有留下复位按键,对FPGA来说也没有太大问题,因为 FPGA 内部也会有上电复位的功能,就是 POR(Power On Reset)电路。FPGA 芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)并将其送给所有的寄存器,这个脉冲会自动作用在各个寄存器的复位端,和功能复位管脚共同控制寄存器的复位。
另外,就是 FPGA 重新配置之后,也会触发上电复位。

复位电路的类型

同步复位

同步复位指的是当时钟上升沿检测到复位信号,执行复位操作,有效的时钟沿是前提。实现同步复位通常意味着将复位信号与时钟信号同步。

以下是一个简单的例子,展示了如何使用同步复位来重置一个计数器:

module sync_reset_counter(  
    input wire clk,          // 时钟信号  
    input wire rst,          // 同步复位信号(高电平有效)  
    input wire enable,       // 使能信号  
    input wire inc_dec,      // 增减控制信号(例如,1为增,0为减)  
    output reg [7:0] count   // 计数器输出  
);  
  
always @(posedge clk) begin  
    if (rst) begin  
        // 当rst为高电平时,进行同步复位  
        count <= 8'h00; // 计数器被重置为0  
    end else if (enable) begin  
        // 如果复位信号无效且使能信号有效,则更新计数器  
        if (inc_dec) begin  
            // 如果inc_dec为高,则增加计数器  
            if (count < 8'hFF) // 防止计数器溢出  
                count <= count + 1'b1;  
        end else begin  
            // 如果inc_dec为低,则减少计数器  
            if (count > 8'h00) // 防止计数器下溢  
                count <= count - 1'b1;  
        end  
    end  
end  
  
endmodule

在这个例子中,rst是同步复位信号,它是一个高电平有效的信号。当rst为高时,在下一个clk的上升边沿到来时,计数器count会被重置为0。与异步复位不同,同步复位不会立即发生,而是会在下一个时钟边沿发生时生效。

同步复位的优点如下:

  • 能确保复位信号和时钟信号的相位一致,从而避免由于信号传输延迟而导致的问题;
  • 以同步的方式与其他信号进行控制,减少信号冲突的可能性;
  • 避免由于时序问题(如时钟闪烁、时钟脉冲不稳定等)而导致的系统复位不准确或延迟;
  • 便于仿真;
  • 可以使所设计的系统成为 100%的同步时序电路,有利于时序分析,而且可综合出较高的 Fmax;
  • 由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺,可有效避免因毛刺造成的亚稳态和错误。

同步复位也有一些缺点,缺点如下

  • 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度。此外,很难保证复位信号到达各个寄存器的时序,这增加了设计的复杂性。
  • 同步复位是依赖于时钟信号的。如果电路中的时钟信号出现问题,例如时钟停振或者时钟周期不稳定,那么同步复位可能无法完成,导致电路无法正常工作。
  • 由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加 FPGA 内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。

异步复位

异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。实现异步复位电路通常涉及在寄存器或状态机的更新逻辑中包含一个复位信号。

以下是一个简单的例子,展示了如何在Verilog中使用异步复位来重置一个计数器:

module async_reset_counter(  
    input wire clk,          // 时钟信号  
    input wire rst_n,        // 异步复位信号(低电平有效)  
    input wire enable,       // 使能信号  
    input wire inc_dec,      // 增减控制信号(例如,1为增,0为减)  
    output reg [7:0] count   // 计数器输出  
);  
  
always @(posedge clk or negedge rst_n) begin  
    if (!rst_n) begin  
        // 当rst_n为低电平时,进行异步复位  
        count <= 8'h00; // 计数器被重置为0  
    end else if (enable) begin  
        // 如果复位信号无效且使能信号有效,则更新计数器  
        if (inc_dec) begin  
            // 如果inc_dec为高,则增加计数器  
            if (count < 8'hFF) // 防止计数器溢出  
                count <= count + 1'b1;  
        end else begin  
            // 如果inc_dec为低,则减少计数器  
            if (count > 8'h00) // 防止计数器下溢  
                count <= count - 1'b1;  
        end  
    end  
end  
  
endmodule

在这个例子中,rst_n是异步复位信号,它是一个低电平有效的信号。当rst_n为低时,无论时钟信号clk的状态如何,计数器count都会被立即重置为0。当rst_n为高且enable信号也为高时,计数器会根据inc_dec信号的值进行增加或减少。
优点:

  • 大多数目标器件库的 DFF 都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;
  • 某些情况下,使用异步复位可以简化逻辑设计。由于复位操作不依赖于时钟信号,因此不需要额外的逻辑来同步复位信号和时钟信号;
  • 可以在任何时间响应复位信号,而不需要等待下一个时钟边沿。这意味着复位操作能够立即发生;
  • 在某些应用中,异步复位可以提高系统的可靠性。例如,在电源上电或复位按钮被按下时,异步复位能够确保系统迅速并可靠地进入已知状态。

异步复位也有一些缺点,缺点如下

  • 最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是 0 是 1是不确定的),从而导致复位失败。
  • 可能因为噪声或者毛刺造成虚假复位信号(比如系统正常工作时突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);
  • 静态定时分析比较困难,静态时序分析一般是针对同步设计的,都是基于时钟周期来分析时序的;
  • 对于 DFT(DesignForTest 可测性设计)设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路;
  • 在某些情况下,异步复位信号可能会与时钟信号或其他输入信号产生冲突,导致冒险现象(冒险条件)。这可能会导致系统进入不确定的状态,需要进行额外的逻辑设计来避免这种情况。

总结下来,我们推荐使用异步复位、同步释放的方式,并且复位信号为低电平有效。即:
1、复位信号到来的有效与否与 clk 无关,而且复位信号的撤除也与 clk 无关,但是复位信号的撤除是在下一个 clk 来到后才起的作用。
2、异步复位同步撤离的目的为了防止复位信号撤除时,可能产生的亚稳态。

这意味着复位操作是异步的(可以在任何时刻发生),但复位后的撤离(即恢复正常的逻辑操作)是同步的(在时钟边沿发生)。

以下是一个使用这种策略的计数器的Verilog代码示例:
 

module async_reset_sync_release_counter(  
    input wire clk,          // 时钟信号  
    input wire rst_n,        // 异步复位信号(低电平有效)  
    input wire enable,       // 使能信号  
    input wire inc,          // 增加控制信号  
    output reg [7:0] count   // 计数器输出  
);  
  
// 初始化计数器为0,但注意这里不会立即生效,因为Verilog没有真正的初始化语句  
reg [7:0] count_reg = 8'h00; // 使用局部变量进行初始化  
  
always @(posedge clk or negedge rst_n) begin  
    if (!rst_n) begin  
        // 异步复位,任何时候rst_n为低时,计数器立即被置0  
        count_reg <= 8'h00;  
    end else begin  
        // 同步撤离,在rst_n为高且时钟上升边沿到来时,根据enable和inc更新计数器  
        if (enable) begin  
            if (inc) begin  
                if (count_reg < 8'hFF) // 防止计数器溢出  
                    count_reg <= count_reg + 1'b1;  
            end  
        end  
    end  
end  
  
// 同步输出到外部接口  
assign count = count_reg;  
  
endmodule

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

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

相关文章

把Deepin塞进U盘,即插即用!Deepin To Go来袭

前言 小伙伴之前在某篇文章下留言说&#xff1a;把Deepin塞进U盘的教程。 这不就来了吗&#xff1f; 事实是可以的。这时候你要先做点小准备&#xff1a; 一个大小为8GB或以上的普通U盘 一个至少64GB或以上的高速U盘 一个Deepin系统镜像文件 普通U盘的大概介绍&#xff1…

Xtuner微调

环境安装 studio-conda xtuner0.1.17 conda activate xtuner0.1.17 进入家目录 &#xff08;~的意思是 “当前用户的home路径”&#xff09; cd ~ 创建版本文件夹并进入&#xff0c;以跟随本教程 mkdir -p /root/xtuner0117 && cd /root/xtuner0117 拉取 0.1.17 的版…

海外盲盒APP开发,盲盒出海热!

当下&#xff0c;盲盒作为一种热门的娱乐休闲模式&#xff0c;在全球消费市场中都非常火热&#xff0c;各种热门盲盒商品刚一上线就受到了秒杀&#xff0c;受到了各地年轻消费者的追捧&#xff01; 盲盒全球化对于我国盲盒企业来说是一个新的机会&#xff0c;有助于我国盲盒快…

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构&#xff08;Client-Server Architecture&#xff09;是一种分布式计算模型&#xff0c;其中客户端和服务器之间通过网络进行通信。在这种架构中&#xff0c;客户端负责向服务器发送请求&#xff0c;并接收服务器返回的响应。服务器则负责处理客户端的…

利用Python爬取天气数据并实现数据可视化,一个完整的Python项目案例讲解

要使用Python爬取天气数据并进行制图分析分几个步骤进行&#xff1a; 选择数据源&#xff1a;首先&#xff0c;你需要找到一个提供天气数据的API或网站。一些常见的选择包括&#xff1a;OpenWeatherMap、Weatherbit、Weather Underground等。 安装必要的库&#xff1a;你需要安…

数据库 | 试卷五试卷六试卷七

1. 主码不相同&#xff01;相同的话就不能唯一标识非主属性了 2.从关系规范化理论的角度讲&#xff0c;一个只满足 1NF 的关系可能存在的四方面问题 是&#xff1a; 数据冗余度大&#xff0c;插入异常&#xff0c;修改异常&#xff0c;删除异常 3.数据模型的三大要素是什么&…

PythonWeb前端

摘要 学校的一门选修课&#xff0c;PythonWeb开发从入门到实践&#xff0c;用到的技术有Python,Flask,MySQL,前端三件套等&#xff0c;但因为是选修课&#xff0c;所以都只涉及到了一点点 Web前端基础 1.Web工作原理 概念&#xff1a; Web&#xff0c;万维网&#xff0c;一…

第21篇 Intel FPGA Monitor Program的使用<四>

Q&#xff1a;如何编译运行创建好的Intel FPGA Monitor Program工程呢&#xff1f; A&#xff1a;上一篇的Nios II汇编语言简易应用程序创建完成后&#xff0c;点击Intel FPGA Monitor Program的Action-->Compile即编译程序&#xff0c;在Info&Errors区域显示编译结果…

软件产品进行确认测试有什么好处?第三方软件测试机构分享

软件确认测试是一项旨在验证软件是否符合预期需求和规格的测试活动。通过确认测试&#xff0c;您可以确保软件的功能、性能和用户界面的符合程度&#xff0c;从而降低软件发布后出现问题的风险。 一、软件产品进行确认测试的好处   1、减少软件发布后修复问题的成本。通过及…

SpringBoot整合Minio(支持公有及私有bucket)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合Minio(支持公有及私有bucket) ⏱️ 创作时间&#xff1…

机器学习课程复习——决策树

Q:这三个算法哪一个可以用来做回归? CART Q:这学期学过的分类算法有哪些? 支持向量机、决策树、k近邻、逻辑回归、朴素贝叶斯、ANN (注意区分分类算法与聚类算法) Q:计算题 根据以上条件,生成相应的决策树 1. ID3算法

Jenkins教程-5-gitee自动化测试任务构建

上一小节我们学习了Jenkins构建gitlab自动化测试任务的方法&#xff0c;本小节我们讲解一下gitee自动化测试任务的构建方法。 接下来我们以windows系统为例&#xff0c;讲解一下构建实际自动化测试任务的具体步骤。 安装git和gitee插件 点击进入Jenkins插件管理页面 安装完插…

mac禁用电池睡眠-mac盒盖连接显示器

mac禁用电池睡眠-mac盒盖连接显示器-mac断点盒盖连接显示器 讲解&#xff1a;mac盒盖的时候连接显示器会睡眠并断开和显示器的连接&#xff0c;只有在电池->选项->选择使用电源适配器的时候防止睡眠&#xff0c;才可以连接电源线外界显示器 但是苹果的电池相当于手机电…

Linux使用lrzsz实现虚拟机和本机进行文件传输

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、lrzsz是什么&#xff1f;二、使用步骤1.下载lrzsz2.文件传输 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 使用lrzsz代替xfpt进行…

大模型时代的具身智能系列专题(一)

通用具身机器人 具身智能定义 从图灵定义看&#xff0c;知识由感知、智能体环境交互获得&#xff0c;具身智能要拥有足够的知识完成机器人任务。从字面上理解就是具有身体的智能&#xff0c;可以从交互中学习并有可能涌现新能力。近期的具身智能更多和大模型和端到端有关&…

KVB投资安全小知识:你知道情绪面、技术面与基本面的关系吗?

摘要&#xff1a;当涉及到金融市场分析时&#xff0c;情绪面、技术面和基本面是三个重要的方面。它们相互交织&#xff0c;共同影响着市场的走势和投资者的决策。下面我来详细解释它们之间的关系。 情绪面的影响 情绪面指的是投资者情绪和市场情绪&#xff0c;它反映了市场参与…

曾从钦:共同做大露酒产业蛋糕,共建露酒产业命运共同体

执笔 | 尼 奥 编辑 | 扬 灵 6月15日&#xff0c;由中国酒业协会主办、五粮液股份公司承办的以“文化焕新&#xff0c;价值绽放”为主题的第三届中国露酒T5峰会在四川省宜宾市召开&#xff0c;参会企业对当前露酒产业现状、结构性矛盾、品类价值表达等议题进行深入探讨和交…

ARM功耗管理框架之LPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f;如何配合&#xff1f; 目录 一、功耗管理框架中的LPI 二、LPI分类 三、Q-Channel和P-Channel对比 四、Q-Channel和P-Ch…

QT/基于TCP的服务端实现

代码 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),p(new QTcpServer(this))//给服务器指针申请空间 {ui->setupUi(this); }Widget::~Widget() {delete ui; }void W…

VM安装Ubuntu

系统安装 先安装好VM软件&#xff08;版本> 17&#xff09; 创建新的虚拟机 步骤1&#xff1a; 步骤2&#xff1a;&#xff08;选择好对应的ISO&#xff0c;可以去官网下载&#xff09; 注意&#xff1a;ISO文件要放到 英文目录&#xff08;路径中不能有中文和空格&#…