【 FPGA 】关于FPGA中复位的设计问题(包含异步复位,同步释放方案)

举报
李锐博恩 发表于 2021/07/15 06:16:21 2021/07/15
【摘要】 目录   复位的目的 同步复位 异步复位 优缺点比较 异步复位,同步释放(撤离) 复位的目的 复位的基本目的是使器件进入到可以稳定工作的确定状态,这避免了器件在上电后进入到随机状态导致跑飞了。在实际设计过程中,设计者必须选择最适合于设计本身的复位方式。 耳熟能详的是同步复位和异步复位,分别介绍如下: 同步复位 同步复位就是指复位信号只有在时钟...

目录

 

复位的目的

同步复位

异步复位

优缺点比较

异步复位,同步释放(撤离)


复位的目的

复位的基本目的是使器件进入到可以稳定工作的确定状态,这避免了器件在上电后进入到随机状态导致跑飞了。在实际设计过程中,设计者必须选择最适合于设计本身的复位方式。

耳熟能详的是同步复位和异步复位,分别介绍如下:

同步复位

同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。同步复位的Verilog HDL描述为:


  
  1. module syn_reset(
  2. input rst_n,
  3. input clk,
  4. input data_in,
  5. output out
  6. );
  7. reg out;
  8. always@(posedge clk)
  9. begin
  10. if(!rst_n)
  11. out <= 1'b0;
  12. else
  13. out <= data_in;
  14. end
  15. endmodule

综合后的RTL图为:

复位有效的时候,要等到时钟有效沿输出才复位为0,否则正常运行。

图中,MUX可以换成与门。


异步复位

异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。异步复位的Verilog HDL描述为:


  
  1. module test
  2. (
  3. input clk,
  4. input rst_n,
  5. input data_in,
  6. output out
  7. );
  8. reg out;
  9. always @ (posedge clk or negedge rst_n)
  10. if(!rst_n) out <= 1'b0;
  11. else out <= data_in;
  12. endmodule

综合后的RTL图为:

既然同步复位使用了Quartus进行了综合,这里也试下,觉得Altera这个公司的工具还真不错,综合出来的电路很简洁。

 

优缺点比较

同步复位的优点

  • 一般能够确保电路是百分之百同步的。
  • 确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。

同步复位的缺点:

  • 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位。同时还要考虑如:时钟偏移、组合逻辑路径延时、复位延时等因素。
  • 由于大多数的厂商目标库内的触发器都只有异步复位端口,采用同步复位的话,就会耗费较多的逻辑资源

异步复位优点:

  • 异步复位信号识别方便,而且可以很方便的使用全局复位。
  • 由于大多数的厂商目标库内的触发器都有异步复位端口,可以节约逻辑资源

异步复位缺点:

  • 复位信号容易受到毛刺的影响。
  • 复位结束时刻恰在亚稳态窗口内时,无法决定现在的复位状态是1还是0,会导致亚稳态。(复位撤离时间不满足复位恢复时间会导致亚稳态。)


异步复位,同步释放(撤离)


  
  1. module Reset_test(
  2. input clk,
  3. input rst_nin,
  4. output reg rst_nout
  5. );
  6. reg rst_mid;
  7. always@(posedge clk or negedge rst_nin)
  8. begin
  9. if(!rst_nin)
  10. begin
  11. rst_mid <= 0;
  12. rst_nout <= 0;
  13. end
  14. else
  15. begin
  16. rst_mid <= 1;
  17. rst_nout <= rst_mid;
  18. end
  19. end
  20. endmodule

异步复位、同步释放机制,既解决了同步复位浪费资源问题,又解决了异步复位带来的亚稳态。

下面调用上面的异步复位,同步释放处理后的复位信号,并给出RTL电路图:


  
  1. `timescale 1ns / 1ps
  2. module test_main(
  3. input rst_nin,
  4. input clk,
  5. input data_in,
  6. output rst_nout,
  7. output reg data_out
  8. );
  9. reg data_mid;
  10. Reset_test u1(.clk(clk),.rst_nin(rst_nin),.rst_nout(rst_nout));
  11. always@(posedge clk or negedge rst_nout)
  12. begin
  13. if(!rst_nout)
  14. data_mid <= 1'b0;
  15. else
  16. data_mid <= data_in;
  17. end
  18. always @ (posedge clk or negedge rst_nout)
  19. if(!rst_nout)
  20. data_out <= 1'b0;
  21. else
  22. data_out <= data_mid;
  23. endmodule

 

RTL电路图如下,其中的复位处理模块一并给出:

关于异步复位,同步释放的分析,放到下一篇博客分析。

 

 

参考文献:

FPGA深度解析

https://zhuanlan.zhihu.com/p/32071206

https://www.cnblogs.com/yfwblog/p/4793118.html

http://www.cnblogs.com/qiweiwang/archive/2010/11/25/1887888.html

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/84728636

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。