随着FPGA设计越来越复杂,芯片内部的时钟域也越来越多,使全局复位已不能够适应FPGA设计的需求,更多的设计趋向于使用局部的复位。本节将会从FPGA内部复位“树”的结构来分析复位的结构。
我们的复位线将会是一个和时钟一样多扇出的网络,如此多的扇出,时钟信号是采用全局时钟网络的,那么复位如何处理?有人提出用全局时钟网络来传递复位信号,但是在FPGA设计中,这种方法还是有其弊端。一是无法解决复位结束可能造成的时序问题,因为全局网络的延时较大,并且不可以直接连到寄存器的复位端。仍然需要局部走线,这对于时序要求紧张的场合,较难满足时序;二是会占用全局时钟资源,多个复位信号会占用更多的全局时钟资源。
在这里提出一个区域化复位的方案,如图1所示。外部的异步复位信号被二级寄存器同步化之后,复制不同的复位寄存器连到不同的模块来作为复位控制。如果单个模块的复位扇出太大的话,还可以在模块内部复制复位寄存器。强烈建议那些在datapath上不需要复位的寄存器不要在代码中复位,因为这样会增加复位信号的扇出,并增加逻辑资源和降低逻辑速度。
对于那些有多个时钟区域,需要多个时钟区域内独立复位的设计由多个同步化的寄存器的模块来完成同步,然后送到各模块进行复位。
当然,对于选择同步化的异步复位的方案,也可以如图2所示来安排复位。将复位信号转换成同步后送到不同的模块,在各模块中进行同步化处理,各模块完成自己的本地复位。
综合本节说明的复位路径设计,推荐采用局部复位,即各模块或多个模块采用自己的独立复位信号。