• FPGA - 科学设计复位信号(XILINX)


    1,同步复位与异步复位

            简单来说:复位信号与时钟同步,称之为同步复位。

                             复位信号与时钟不同步,称之为异步复位。

    2、xilinx 的复位策略

            ① 同步高复位

            ② 计数器和状态机必须复位

            ③ 能不使用复位尽量不使用复位,比如中间打拍的信号。因为过多的复位会增加扇出(一个复位信号驱动了过多的信号,这种情况下就称为扇出过大),引起时序不稳定。

    3、实际工程复位的写法

    实际项目工程一般有几万行甚至几十万行的代码,工程里面有多个时钟域, 这种情况怎么处理时钟和复位的问题呢?一般单独弄一个时钟复位模块管理不同的时钟和复位信号

    4、同步复位致命的缺点

    虽然 xilinx 推荐同步复位,不过同步复位有个致命的缺点,没有控制好,非常容易引起时序问题

    ui_clk在开始时是不稳定的,但是复位信号在不稳定的时候已经结束了,右面这个代码就进不去复位信号为为高时,LED为0。这是,这种复位是有问题的,这时LED为不定态。这是需要怎么做呢就是需要把reset信号展宽,展宽到ui_clk稳定时,复位一段时间,再拉低。

    5、多时钟域下的同步复位设计(非常容易引起时序问题)

    多时钟域下,如果使用同步复位,一定要注意复位信号的设计,比如读写 DDR3 的时候,有个 ui_clk 和用户 clk,一定要注意 DDR3 模块的复位信号设计。

    reset 信号不能作为 ui_clk 的复位信号,即使打两拍也不行,因为 reset 复位 时间比较短,在 ui_clk 还没有稳定就复位结束了。

    常见的做法就是将 reset 信号展宽后进行打拍。时序图和代码如下:

    1. always @(posedge ui_clk or posedge reset) begin
    2. if (reset) begin
    3. reset_timer <= 'do;
    4. end
    5. else if (reset_timer <= 4'hf) begin
    6. reset_timer <= reset_timer + 1'b1;
    7. end
    8. else
    9. beginreset_timer <= reset_timer;
    10. end
    11. end
    12. always @(posedge ui_clk or posedge reset) begin
    13. if (reset) begin
    14. u_reset_sync_do <= 1'b1;
    15. u_reset_sync_d1 <= 1'b1;
    16. ui_clk_reset_sync <= 1'b1;
    17. end
    18. else begin
    19. u_reset_sync_do <= reset_timer <= 4'hf;
    20. u_reset_sync_d1 <= u_reset_sync_do;
    21. u_reset_sync <= u_reset_sync_di;
    22. end
    23. end
    24. always @(posedge ui_clk) begin
    25. if (u_reset_sync) begin
    26. led <= 1'b0;
    27. end
    28. else begin
    29. led <= led;
    30. end
    31. end

  • 相关阅读:
    java家政服务平台计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    30+下岗程序员专职奶爸如何生存?
    【Linux-常用命令-基础命令-删除文件夹以及内容-rm--r-命令-笔记】
    python图形界面化编程GUI(五)坦克大战(一)
    【springboot】自定义starter(学习笔记)
    用动态规划求解均分纸牌
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理
    蓝桥杯练习题
    vue自定义指令directives
  • 原文地址:https://blog.csdn.net/weixin_46897065/article/details/136601674