当前位置: 首页 > news >正文

数字IC前端学习笔记:异步复位,同步释放

相关阅读

数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482


异步复位的简介

异步复位(包括异步置位)是一种常见的复位方式,可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误,复位释放便是其中的一个重要问题,这将在后面进行讨论。

异步复位是通过触发器的异步复位端实现的,复位端一般是低电平有效,即当复位端为低电平时,触发器输出被强制复位。

异步复位的代码风格

下面的代码显示了如何在Verilog代码中说明带有复位的触发器。注意到复位信号的下降沿事件被加入了敏感列表。其实,异步复位是根据电平生效的,即当复位信号为低时复位。在这里写成下降沿的形式是因为,综合工具要求敏感列表中出现的信号如果有一个是边沿事件,则其他所有事件也必须是边沿敏感的,但这对于仿真工具是可以接受的,甚至仿真工具还可以在敏感列表中存在除了复位沿和时钟沿以外的其他信号事件,这对于综合工具也是不可接受的。

// 综合与仿真工具都支持 module FlipFlop(input clk, rst_n, d, output reg q); always@(posedge clk, negedge rst_n)begin if(!rst_n) q <= 1'b0; else q <= d; end endmodule // 综合工具不支持与仿真工具支持,其实复位效果和上面的代码一致(不要使用它) module FlipFlop(input clk, rst_n, d, output reg q); always@(posedge clk, rst_n)begin if(!rst_n) q <= 1'b0; else q <= d; end endmodule // 一个奇怪的例子,但仿真工具确实支持(不要使用它) module FlipFlop(input clk, rst_n, d, output reg q); always@(posedge clk, rst_n, d)begin if(!rst_n) q <= 1'b0; else q <= d; end endmodule

异步复位的优势

在进入这个话题前,我们先来看一下上面的第一段代码综合出的电路,如图1所示。可以看到综合工具可以直接从异步复位的Verilog描述中推断出一个带异步复位端的触发器。

图1 异步复位综合出的触发器

我们再来看一下同步复位综合出的电路,如图2所示。顺便一提,上面异步复位的代码可以很轻松地改变为同步复位,只要把posedge rst_n从敏感列表中去除即可,如下所示。综合结果显示,同步复位其实就是将异步复位信号当做触发器输入的一部分,而不是综合出一个有同步复位端的触发器(除非库中存在带同步复位端的触发器,且使用了综合指令sync_set_reset)。对于那些时序上比较紧张的设计,在触发器前的组合逻辑再插入同步复位的逻辑无法承受,使用同步复位能保证不会给reg2reg的时序路径带来负面影响。同步复位的另一个优点是无需时钟存在便可复位,这使得在时钟尚未启动时复位电路成为了可能。

// 同步复位 module FlipFlop(input clk, rst_n, d, output reg q); always@(posedge clk)begin if(!rst_n) q <= 1'b0; else q <= d; end endmodule

图2 同步复位综合出的触发器

异步复位的问题

异步复位中也存在一定问题,因为复位信号的使能和释放都是异步的。不正确的复位释放,即复位沿过于接近时钟沿会导致触发器输出现亚稳态(复位的生效不会导致出现亚稳态,因为复位是强制将输出拉低)。其实同步复位也有相似的问题,因为同步复位信号需要像其他输入信号一样满足建立时间、保持时间的要求,否则会在触发器输出产生亚稳态。

异步复位的本质

图3是一个带有异步复位端(置0和置1)的主从结构的D触发器。

图3 带异步复位的主从结构的D触发器

其实想要异步复位功能就只需将非门换为或非门,当Sd复位端有效时,异步复位为1;当Rd复位端有效时,异步复位为0。在复位生效时,或非门的输出被强行拉低并进入反馈环,即使此时另一个输入可能是亚稳态,因此不会有亚稳态的问题(亚稳态传播的条件是其进入了反馈环)。

但是复位释放却可能产生亚稳态。当Sd端有效时,G1门的输出被强行拉低,如果此时输入端D为低电平,当Sd端释放太靠近时钟有效沿的前方,则G1门的输出会变成亚稳态并进入反馈环(类似建立时间);当Sd端释放太靠近时钟有效沿的后方也是同理(类似保持时间)。

即使满足了上面的条件也可能会产生亚稳态,当复位脉冲过窄时,或非门的输出也将是亚稳态并进入反馈环,所以往往也要对信号的最小复位脉冲宽度进行限制(尽管异步置位引脚在特征化时会考虑最小脉冲宽度,但在大多数设计中,复位信号会维持多个时钟周期,因此不会进行检查)。

Removal时间和Recovery时间

与建立时间和保持时间类似,removal时间和recovery时间被用来描述复位信号的时序要求。如图3所示,removal时间指的是复位释放不能过于靠近时钟有效沿的后方,而Recovery指的是复位释放不能过于靠近有效沿的前方。这两种条件都可能造成输出的亚稳态,因为复位相当于内部信号的改变,这种改变过于靠近时钟有效沿会导致电路逻辑状态不定。

图3 复位信号释放的要求

复位同步器

就像CDC(跨时钟域)问题一样,复位信号的释放同样也可以使用同步器与时钟有效沿进行同步,这就是“异步复位,同步释放”,复位同步器的结构如图4所示。

图4 复位同步器

module reset_syn(input clk, rst_in, output reg rst_out); reg rst_r; always@(posedge clk, negedge rst_in)begin if(!rst_n) {rst_out, rst_r} <= 2'b0; else {rst_out, rst_r} <= {rst_r, 1'b1}; end endmodule

在同步了复位释放信号后,第一个触发器的输出依然可能出现亚稳态,但这个不确定状态在传播到第二个触发器输入前已经稳定(可能是1,也可能是0),即下一个时钟边沿在第二个触发器输出不会出现亚稳态,这也意味着同步后复位释放信号会延迟输入的复位释放信号1至2个周期。

甚至为了保险起见还可以使复位再延迟一段时间再释放,这样可以在最大程度上确保复位正常释放,如下所示。

`define count 16'hffff module reset_syn(input clk, rst_in, output reg rst_out); reg rst_r, rst_cnt, rst_pre; always@(posedge clk, negedge rst_in)begin if(!rst_in) {rst_pre, rst_r} <= 2'b0; else {rst_pre, rst_r} <= {rst_r, 1'b1}; end always@(posedge clk, negedge rst_pre)begin if(!rst_pre) rst_cnt <= 0; else if(rst_cnt < `count) rst_cnt = rst_cnt + 1; end always@(posedge clk, negedge rst_pre)begin if(!rst_pre) rst_out <= 0; else if(rst_cnt == `count) rst_out <= 1'b1; else rst_out <= 1'b0; end endmodule
http://www.jsqmd.com/news/654977/

相关文章:

  • 发膜使用报告:20款热门发膜一个月后效果 - 博客万
  • Poppler for Windows终极指南:免费开源PDF处理工具快速上手
  • AI大模型API流式调试进阶:Apipost中的SSE数据解析与可视化实战
  • PufferLib PyTorch集成最佳实践:神经网络模型构建与训练优化终极指南
  • 天龙八部GM工具:单机游戏数据管理的终极解决方案
  • Zotero Reference终极指南:5分钟掌握PDF文献自动引用提取
  • Kali Linux 2024.1 默认Zsh了,但你的oh-my-zsh主题乱码解决了吗?
  • 深聊超声波喷涂制造整套装置生产企业,选哪家国内知名,技术专业 - 工业品牌热点
  • 护发精油排行榜测评:6款热门护发精油品牌产品对比 - 博客万
  • 基于Simulink的开关电容变换器电压均衡控制
  • 终极指南:如何使用py-googletrans实现免费无限的Google翻译API功能
  • 分析性价比高的消泡剂源头厂家,选购时需要注意什么 - 工业推荐榜
  • Qwen3字幕系统快速上手:清音刻墨镜像Docker部署5步完成
  • 2026新疆旅行社哪家口碑好?正规靠谱纯玩无购物旅行社推荐及联系方式 - 栗子测评
  • RDMA编程避坑指南:从ibv_poll_cq到错误处理,详解那些官方手册没说的实战细节
  • 04-07-03 构建金字塔的方法 - 学习笔记
  • 数字IC前端学习笔记:时钟切换电路
  • 终极解决方案:2分钟快速安装iPhone USB网络共享驱动程序
  • 热议靠谱的消泡剂服务商,多角度为你解读品牌和服务如何选择 - myqiye
  • 护发精油品牌推荐:暨2026年护发精油推荐 - 博客万
  • 5分钟快速上手:使用DDrawCompat彻底解决Windows老游戏兼容性问题
  • 解密Windows HEIC缩略图:探索苹果与微软之间的格式桥梁
  • Labelme标注神器进阶:用Python脚本批量转换COCO数据集(含自定义类别处理)
  • Java 8 Stream实战:findAny和findFirst到底怎么选?5个真实业务场景告诉你答案
  • 成都市蜀宏吊装工程有限责任公司:成都市设备吊装搬运 - LYL仔仔
  • 从一次内部渗透测试说起:利用Aria2任意文件写入漏洞,我是如何一步步拿到Shell的
  • 数控立车服务商家哪个口碑好,正规厂家与应用案例细聊 - 工业品网
  • 终极浏览器下载管理指南:5分钟快速上手Motrix WebExtension
  • 程序员和设计师的效率利器:我是如何用Directory Opus双窗格和标签页管理海量项目文件的
  • 【嵌入式】HC32F460驱动ILI9341 SPI屏:从硬件接线到GUI框架移植的实战解析