一、同步复位(by Crazybingo)

    1. module system_ctrl
    2. //==================<端口>==================================================
    3. (
    4. //globel clock ----------------------------------
    5. input wire clk , //时钟,50Mhz
    6. input wire rst_n , //复位,低电平有效
    7. //user interface --------------------------------
    8. input wire a , //输入信号
    9. output reg b //输出信号
    10. );
    11. //==========================================================================
    12. //== 同步复位,rst_n作为外部信号输入,clk全局时钟称为“同步时钟”
    13. //==========================================================================
    14. always @(posedge clk) begin
    15. if(!rst_n)
    16. b <= 0;
    17. else
    18. b <= a;
    19. end
    20. endmodule

    2.RTL视图五、异步复位的同步化设计 - 图1
    3.优点
    ①降低了亚稳态的出现概率;
      ②可以使所设计的系统成为100%的同步时序电路,这将大大有利于时序分析,并且综合出来的fmax一般较高;
      ③因为它只有在时钟有效沿到来时才有效,所以可以滤除高于时钟频率的毛刺。
    4.缺点
    ①复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务,同时还要考虑clk skew、组合逻辑路径延时、复位延时等因素;
      ②由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以倘若采用同步复位,综合器就会在寄存器的数据输入端口插入组合逻辑,这样会耗费较多的逻辑资源。
    二、异步复位(by Crazybingo)

    1. module system_ctrl
    2. //==================<端口>==================================================
    3. (
    4. //globel clock ----------------------------------
    5. input wire clk , //时钟,50Mhz
    6. input wire rst_n , //复位,低电平有效
    7. //user interface --------------------------------
    8. input wire a , //输入信号
    9. output reg b //输出信号
    10. );
    11. //==========================================================================
    12. //== 异步复位,rst_n信号和clk全局时钟信号共同称为“异步时钟”
    13. //==========================================================================
    14. always @(posedge clk or negedge rst_n) begin
    15. if(!rst_n)
    16. b <= 0;
    17. else
    18. b <= a;
    19. end
    20. endmodule

    2.RTL视图
    五、异步复位的同步化设计 - 图2
    3.优点
    ①大多数目标器件的DFF都有异步复位端口,因此采用异步复位可以节省资源;
    ②设计相对简单;
    ③异步复位信号识别方便,并且可以很方便地使用FPGA的全局复位端口。
    ④推荐使用异步复位
    4.缺点
    ①在复位信号释放(Release)时容易出现问题。具体来说,倘若复位释放时恰好在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致不稳定;
    ②复位信号容易受到毛刺的影响。这是由于时钟抖动或按键触发时的硬件原因造成的。
    三、异步复位的同步化设计(by Crazybingo)**

    1. module system_ctrl
    2. //==================<端口>==================================================
    3. (
    4. //globel clock ----------------------------------
    5. input wire clk , //时钟,50Mhz
    6. input wire rst_n , //复位,低电平有效
    7. //user interface --------------------------------
    8. input wire a , //输入信号
    9. output reg b //输出信号
    10. );
    11. //==========================================================================
    12. //== 异步复位的同步化设计
    13. //==========================================================================
    14. reg sys_rst_n;
    15. always @(posedge clk) begin
    16. if(!rst_n)
    17. sys_rst_n <= 0;
    18. else
    19. sys_rst_n <= rst_n;
    20. end
    21. always @(posedge clk or negedge sys_rst_n) begin
    22. if(!sys_rst_n)
    23. b <= 0;
    24. else
    25. b <= a;
    26. end
    27. endmodule

    2.RTL视图
    五、异步复位的同步化设计 - 图3
    3.理解
    ①所谓“异步复位”是针对D触发器的复位端口,它是异步的,但是设计中已经同步了异步复位信号,所以笔者(Crazybingo)认为这只是某种意义上的“异步复位”。
    ②所谓“同步释放”,实际上是由于我们设计了同步逻辑电路,外部复位信号不会在出现释放时与clk信号竞争,整个系统将与全局时钟clk信号同步。
    四、异步复位同步释放(by特权同学)

    1. module system_ctrl
    2. //==================<端口>==================================================
    3. (
    4. //globel clock ----------------------------------
    5. input wire clk , //时钟,50Mhz
    6. input wire rst_n , //复位,低电平有效
    7. //user interface --------------------------------
    8. input wire a , //输入信号
    9. output reg b //输出信号
    10. );
    11. //==========================================================================
    12. //== 异步复位的同步化设计
    13. //==========================================================================
    14. reg sys_rst_n_r;
    15. reg sys_rst_n;
    16. always @(posedge clk or negedge rst_n) begin
    17. if(!rst_n) begin
    18. sys_rst_n_r <= 0;
    19. sys_rst_n <= 0;
    20. end
    21. else begin
    22. sys_rst_n_r <= 1;
    23. sys_rst_n <= sys_rst_n_r;
    24. end
    25. end
    26. always @(posedge clk or negedge sys_rst_n) begin
    27. if(!sys_rst_n)
    28. b <= 0;
    29. else
    30. b <= a;
    31. end
    32. endmodule

    那我就奇怪了,Crazybingo和特权的,哪一个才是真正的“异步复位同步释放”呢?网上比较多的是特权同学这种,但Crazybingo的好像也没有什么错误。
    五、异步复位的同步化设计 - 图4