一、同步复位(by Crazybingo)
1.代码
module system_ctrl //==================<端口>================================================== ( //globel clock ---------------------------------- input wire clk , //时钟,50Mhz input wire rst_n , //复位,低电平有效 //user interface -------------------------------- input wire a , //输入信号 output reg b //输出信号 ); //========================================================================== //== 同步复位,rst_n作为外部信号输入,clk全局时钟称为“同步时钟” //========================================================================== always @(posedge clk) begin if(!rst_n) b <= 0; else b <= a; end endmodule
2.RTL视图
3.优点
①降低了亚稳态的出现概率;
②可以使所设计的系统成为100%的同步时序电路,这将大大有利于时序分析,并且综合出来的fmax一般较高;
③因为它只有在时钟有效沿到来时才有效,所以可以滤除高于时钟频率的毛刺。
4.缺点
①复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务,同时还要考虑clk skew、组合逻辑路径延时、复位延时等因素;
②由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以倘若采用同步复位,综合器就会在寄存器的数据输入端口插入组合逻辑,这样会耗费较多的逻辑资源。
二、异步复位(by Crazybingo)
1.代码
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 //== 异步复位,rst_n信号和clk全局时钟信号共同称为“异步时钟” 14 //========================================================================== 15 always @(posedge clk or negedge rst_n) begin 16 if(!rst_n) 17 b <= 0; 18 else 19 b <= a; 20 end 21 22 23 24 endmodule
2.RTL视图
3.优点
①大多数目标器件的DFF都有异步复位端口,因此采用异步复位可以节省资源;
②设计相对简单;
③异步复位信号识别方便,并且可以很方便地使用FPGA的全局复位端口。
4.缺点
①在复位信号释放(Release)时容易出现问题。具体来说,倘若复位释放时恰好在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致不稳定;
②复位信号容易受到毛刺的影响。这是由于时钟抖动或按键触发时的硬件原因造成的。
三、异步复位的同步化设计(by Crazybingo)
1.代码
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 //========================================================================== 15 reg sys_rst_n; 16 17 always @(posedge clk) begin 18 if(!rst_n) 19 sys_rst_n <= 0; 20 else 21 sys_rst_n <= rst_n; 22 end 23 24 always @(posedge clk or negedge sys_rst_n) begin 25 if(!sys_rst_n) 26 b <= 0; 27 else 28 b <= a; 29 end 30 31 32 33 endmodule
2.RTL视图
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 //========================================================================== 15 reg sys_rst_n_r; 16 reg sys_rst_n; 17 18 always @(posedge clk or negedge rst_n) begin 19 if(!rst_n) begin 20 sys_rst_n_r <= 0; 21 sys_rst_n <= 0; 22 end 23 else begin 24 sys_rst_n_r <= 1; 25 sys_rst_n <= sys_rst_n_r; 26 end 27 end 28 29 always @(posedge clk or negedge sys_rst_n) begin 30 if(!sys_rst_n) 31 b <= 0; 32 else 33 b <= a; 34 end 35 36 37 38 endmodule
那我就奇怪了,Crazybingo和特权的,哪一个才是真正的“异步复位同步释放”呢?网上比较多的是特权同学这种,但Crazybingo的好像也没有什么错误。
参考资料:
[1]韩彬, 于潇宇, 张雷鸣. FPGA设计技巧与案例开发详解[M]. 电子工业出版社, 2014.
[2]吴厚航. 深入浅出玩转FPGA[M]. 北京航空航天大学出版社, 2013.