3. Lattice FPGA复位资源:全局复位网络、分布式复位、复位优先级

好,咱们接着聊复位。上一节我们把同步复位和异步复位的区别讲清楚了。这一节,我带你看看Lattice FPGA里具体有哪些复位资源可以用。

说白了,复位信号在FPGA里怎么走、走多快、能不能到所有寄存器,这些都得靠芯片内部的专用资源来保证。Lattice在这方面做得挺实在的,没有太多花里胡哨的东西,但该有的都有。

3.1 全局复位网络

全局复位网络,你可以把它想象成一条高速公路。复位信号从芯片的一个专用引脚进来,经过专门的布线资源,快速到达每一个逻辑单元。

Lattice的器件里,通常有专门的全局复位引脚,比如我常用的Lattice ECP5系列,GSR(Global Set/Reset)就是一个全局复位信号。它走的是全局时钟网络类似的路径,延迟小、扇出大。

全局复位的特点:

  • 延迟低,到达所有寄存器的时差很小
  • 不需要额外的逻辑资源去扇出
  • 适合上电初始化、系统级复位

我在一个项目中用过这个特性。当时板子上电后,需要所有寄存器同时清零。如果用普通IO加逻辑扇出,复位信号到达不同模块的时间差会很大,容易出问题。后来我直接用了GSR引脚,问题就解决了。

小提示:全局复位网络一般只支持异步复位。如果你需要同步复位,得在逻辑里自己处理。Lattice的GSR默认是低电平有效,这点和很多芯片不一样,设计时要注意。

3.2 分布式复位

分布式复位,说白了就是不用全局网络,而是用普通的逻辑资源和布线来传递复位信号。

什么时候用分布式复位?

  • 你只需要复位一小块逻辑,比如一个计数器
  • 全局复位网络已经被占用了
  • 你想节省全局资源给时钟用

分布式复位的实现方式很简单,就是每个寄存器都接一个复位信号,这个信号通过普通的LUT和布线网络传过来。

// 分布式复位示例
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        counter <= '0;
    else
        counter <= counter + 1;
end

这段代码里,rst_n就是分布式复位。它没有走全局网络,而是通过普通布线到达每个寄存器。

注意:分布式复位的扇出能力有限。如果你一个复位信号接了上千个寄存器,布线延迟会很大,时序可能跑不过。我曾经在一个设计里,一个复位信号接了2000多个寄存器,结果布局布线后时序报告一片红。后来改成全局复位才解决。

3.3 复位优先级

这个问题很有意思。一个寄存器可以同时有多个复位信号吗?理论上可以,但实际设计中很少这么干。

Lattice的寄存器原语里,复位和置位是有优先级的。以Lattice的FD1S3AX为例,这是一个带异步复位和时钟使能的D触发器。

信号 优先级 说明
异步复位 (R) 最高 只要复位有效,输出立即清零
异步置位 (S) 次高 复位无效时,置位有效则输出置1
时钟使能 (CE) 最低 复位和置位都无效时,时钟使能控制数据采样

为什么会这样设计?你想想看,复位是最紧急的操作,必须第一时间响应。置位次之。时钟使能只是控制数据更新,优先级最低。

我在一个项目中遇到过复位和置位同时使用的情况。当时需要设计一个状态机,上电后所有状态位清零,但有一个标志位需要置1。我用了异步复位清零所有寄存器,再用异步置位单独设置那个标志位。嗯,这里要注意,复位和置位不能同时有效,否则逻辑行为不确定。

经验总结:

  • 尽量只用一种复位方式,要么全局复位,要么分布式复位
  • 不要在一个设计里混用同步复位和异步复位
  • 复位优先级:异步复位 > 异步置位 > 时钟使能

3.4 知识体系结构图

下面这张图,我画了Lattice FPGA复位资源的整体结构。你可以看到全局复位和分布式复位是怎么分布的,以及它们的优先级关系。

Lattice FPGA复位资源结构 全局复位网络 专用GSR引脚 低延迟、高扇出 适合系统级复位 分布式复位 普通逻辑和布线 扇出有限 适合局部复位 寄存器阵列 每个寄存器可选择全局复位或分布式复位 复位优先级:异步复位 > 异步置位 > 时钟使能

从这张图可以看得很清楚:全局复位网络和分布式复位最终都汇聚到寄存器阵列。区别在于走的路不同、延迟不同、扇出能力不同。你选哪种,取决于你的设计需求。

我的建议:新手做设计,优先用全局复位。等你对时序和资源有了感觉,再考虑分布式复位。别一开始就想着优化,先把功能跑通再说。

好了,这一节的内容就到这里。复位资源这块,说白了就是选对工具、用对地方。下一节我们聊聊复位电路的具体设计方法,到时候我会拿几个实际案例出来分析。


公众号:蓝海资料掘金营,微信deep3321