E
Member
复位写不对,FPGA 上电偶发跑飞、仿真正常实测异常,很多都栽在这里。异步复位同步释放是目前最稳妥的通用写法,但细节不少。
一、为什么要同步释放:异步复位可以立即响应,但释放时刻如果落在时钟边沿附近,不同触发器释放有 skew,恢复时间违例会导致亚稳态。同步释放就是让释放沿对齐时钟,代价是多两级同步器。
二、标准写法:用两级寄存器对复位释放做同步,第一级可能亚稳态,第二级输出再去复位业务逻辑。复位信号本身要先经过同步,不要把外部按键或上电复位直接连到几百个触发器的异步端。
三、复位域要分清:不同时钟域不要共用一个同步释放电路,每个时钟域各做一套。跨时钟域的复位释放顺序也要定好,先复位数据源头,再复位接收端,否则接收端会采到复位中的垃圾数据。
四、仿真和综合都要验:仿真里复位释放要特意放在时钟边沿附近测,综合后看同步器有没有被优化掉。综合工具可能把两级同步器当成冗余逻辑优化掉,需要加保留属性或检查网表。
五、上电复位宽度:复位脉冲太短,时钟还没稳定就释放,等于没复位。外部复位至少覆盖几个时钟周期,时钟源是 PLL 时要等锁定后再释放。
大家的 FPGA 复位一般怎么写?有没有遇到过同步器被优化、复位域混用导致的坑?
一、为什么要同步释放:异步复位可以立即响应,但释放时刻如果落在时钟边沿附近,不同触发器释放有 skew,恢复时间违例会导致亚稳态。同步释放就是让释放沿对齐时钟,代价是多两级同步器。
二、标准写法:用两级寄存器对复位释放做同步,第一级可能亚稳态,第二级输出再去复位业务逻辑。复位信号本身要先经过同步,不要把外部按键或上电复位直接连到几百个触发器的异步端。
三、复位域要分清:不同时钟域不要共用一个同步释放电路,每个时钟域各做一套。跨时钟域的复位释放顺序也要定好,先复位数据源头,再复位接收端,否则接收端会采到复位中的垃圾数据。
四、仿真和综合都要验:仿真里复位释放要特意放在时钟边沿附近测,综合后看同步器有没有被优化掉。综合工具可能把两级同步器当成冗余逻辑优化掉,需要加保留属性或检查网表。
五、上电复位宽度:复位脉冲太短,时钟还没稳定就释放,等于没复位。外部复位至少覆盖几个时钟周期,时钟源是 PLL 时要等锁定后再释放。
大家的 FPGA 复位一般怎么写?有没有遇到过同步器被优化、复位域混用导致的坑?
