FPGA设计的复位方式有两大类,同步复位和异步复位:
1、同步复位:
复位信号在时钟有效边沿到来时刻有效,执行一次复位动作,因此同步复位 是 瞬间的、离散的。
复位动作是离散的非常有利于防真。其次,复位信号只有在时钟有效的边沿有效,可以过滤高于时钟频率的矛刺。
使用 同步复位逻辑 的系统可以被设计成纯粹的同步时序电路,有利于时序约束和时序分析,综合出来的FPGA有更好的性能。
同步复位也有如下的缺点:
复位信号 的 有效长度必须大于一个clk,否则会被当做毛刺过滤
同步复位信号和时钟相关,需要考虑时序问题,综合时也会消耗更多逻辑资源(大多数寄存器只有异步复位端口)
2、异步复位:
只要复位信号到来,就立即执行复位操作,直到复位信号结束才停止复位,异步复位是持续的。
异步复位信号和时钟没有相关,不需要考虑时钟,大多数寄存器只有异步复位端口,综合更加节省资源,设计简单。
但由于异步复位是持续的,无法过滤毛刺。
同时异步复位信号在释放的时候会导致出现不定态,原因如下:
1、当异步复位信号释放的时刻和时钟有效边沿比较接近,可能会导致寄存器出现亚稳态,亚稳态 下 电平信号的电压比较弱。
2、异步复位 的 复位信号控制的各个寄存器和复位信号信号源之间的 data_path delay层次不齐,当异步复位信号释放的时候,一部分寄存器在时钟有效沿之前完成复位,另一部分寄存器在时钟有效沿之后完成复位,会出现一个clk的偏差。
复位设计方法
1、同步信号同步复位
always@(posedge clk)
begin
if(rst == 1'b1)
begin
//执行复位动作
end
else
begin
//执行工作动作
end
end
2、异步信号异步复位
always@(posedge clk or posedge rst)
begin
if(rst == 1'b1)
begin
//执行复位动作
end
else
begin
//执行工作动作
end
end
3、异步信号同步复位
//异步复位信号 的 同步
always@(posedge clk)
begin
ibuf_aRst <= aRst ;
rst <= ibuf_aRst ;
end
//动作描述
always@(posedge clk)
begin
if(rst == 1'b1)
begin
//复位动作
end
else
begin
//工作动作
end
end
4、异步信号异步复位
//异步复位信号 的 同步
always@(posedge clk)
begin
ibuf_aRst <= aRst ;
rst <= ibuf_aRst ;
end
//动作描述
always@(posedge clk or posedge rst)
begin
if(rst == 1'b1)
begin
//复位动作
end
else
begin
//工作动作
end
end
5、复位高扇出的解决方案
在FPGA设计中,可以通过寄存器的复制来解决复位信号大扇出,假设FPGA中有1000个寄存器需要复位,可以对复位信号复制10个,每个衍生复位信号去复位附近的100个寄存器。
按照上述,只要让复位信号在FPGA中被一个寄存器驱动,至于创建多少,如何分布,综合工具就可以代替完成。操作如下:
always@(posedge clk)
begin
rst <= reser ;
end
这个rst就是衍生复位信号 ,直接使用这个衍生复位信号去复位逻辑就可。
如果是异步信号作为复位信号,就需要将原有的二级采样扩展为三级采样
//异步复位信号 的 同步、复制
always@(posedge clk)
begin
ibuf_aRst <= aRst ;
reset <= ibuf_aRst ;
rst <= reset ;
end
寄存器的复制只会多消耗一些寄存器资源,是推荐的复位方式。
6、全局时钟树 资源也可以解决复位信号高扇出
BUFG CLKontree(.O(clk),.I(clock)) ;
BUFG RSTontree(.O(rst),.I(reset)) ;
7、减少不必要的复位扇出信号,不需要复位的寄存器可以不用做复位,如一些零时中间变量。
8、全局复位和 局部复位,针对不同的逻辑使用不同的复位信号,不需要全部逻辑都采用全局复位。