同步复位
同步与异步的不同可以体现在代码上,主要是敏感信号不同,导致在执行的时候会有不同结果,下面是同步复位的代码模型:
always@(posedge clk) begin //同步只有时钟上升沿到来时才执行
if(!rst_n) ...
else ...
end
异步复位
always@(posedge clk or negedge rst_n) begin //异步会有复位信号的上升/下降沿
if(!rst_n) ...
else ...
end
异步复位的问题及时序解决方案
- 异步信号会占用更多的FPGA布局布线资源
- 容易出现时序问题(时序的竞争与冒险)
时序解决方案:先做同步处理再做异步复位信号使用,即先将异步信号锁存在一个寄存器中,并将这个锁存信号当做新的信号进行异步处理
举个例子:
//对复位信号做同步处理,产生新的异步复位信号
reg r_rst_n; //定义一个锁存信号
always @(posedge i_clk)
r_rst_n <= i_rst_n; //在时钟上升沿将异步复位信号锁存在寄存器中
always @(posedge i_clk or negedge r_rst_n) //新的异步复位信号来临(其实在上一语句已经将原来的复位信号与时钟进行同步了,锁存是最关键的一点)
if(!r_rst_n) o_asyn_data <= 4'd0;
else o_asyn_data <= i_data;