目录
1. Xilinx FPGA要不要复位电路?
根据不同的实际应用场景,复位信号实现相关寄存器状态回到默认值,一个确定的状态,能够使很多问题得到有效解决,所以复位还是有必要的。
FPGA提供了一个GSR(Global Set/,Reset) 复位信号,官方给出的该信号特性:
- 预布线
- 高扇出
- 可靠的
GSR信号确实可以在程序初始化时直接调用,确实也可以实现全部芯片的复位,但是Xilinx官方有一篇白皮书(WP272)文栏,不推荐调用该信号做全局复位,主要原因官方也给出了解释:FPGA内部提供高速布线资源给复位信号,可以通过代码实现复位,响应速度比GSR快的不止一点点。
我们执行复位的目的是将寄存器的输入输出处于确定的试态,而FPGA上电启动过程包括如下8个步骤,步骤里面就有初始化的过程,实现初始化目的:
- 上电
- 清除配置缓存
- 采样启动模式配置
- 同步引导数据
- 确认器件ID
- 加载数据
- CRC校验
- 启动
小结:根据实际硬件电路设计及Xilinx FPGA的特性,复位电路还是有必要的,但是由于FPGA的特殊性,可以在上电初期执行FPGA间接复位,例如在上电初期添加依据GSR语句,强制复位。
2. FPGA内部同步复位和异步复位的问题?
从Xilinx FPGA的内部架构可以看出,里面都是通过与门型D型触发器实现的,触发器(Flip-Flop,简写为 FF),也叫双稳态门,又称双稳态触发器。是一种可以在两种状态下运行的数字逻辑电路。触发器一直保持它们的状态,直到它们收到输入脉冲,又称为触发。当收到输入脉冲时,触发器输出就会根据规则改变状态,然后保持这种状态直到收到另一个触发。触发器(flip-flops)电路相互关联,从而为使用内存芯片和微处理器的数字集成电路(IC)形成逻辑门。它们可用来存储一比特的数据。该数据可表示音序器的状态、计数器的价值、在计算机内存的ASCII字符或任何其他的信息。其中“FD”为“D-Flip-Flop”即D型触发器,“C”为“Clear”,“P”为“Present”,“R”为“Reset”,“S”为“Reset”,“S”为“Set”,“E”为“Clock Enable”,SR信号控制寄存器输出,可以和SCK同步,也可以不同步。
白皮书(WP272)里面提到异步复位99.99%不会出问题,但是0.01%概率会发生,时钟信号还没有到时,SR信号恢复了。
全局的同步复位主要问题是会占用大量的查找表造成资源的浪费,而且会挤占关键信号的布线资源空间,降低起布线的自由度,甚至不满足时序要求,实现时间会增加很多。
小结:在执行Xilinx FPGA复位时,推荐执行同步复位或异步复位同步操作(注:部分FPGA的资源可能不支持异步复位),即必须在相关的时钟域同步释放,插入一个局部的高性能复位网络来控制那些只需要局部复位的触发器。
3. 复位电平用高电平复位还是低电平复位?
同步复位较异步复位也会牺牲一些资源,但基于WP272的介绍,可以执行局部复位。一般情况下,复位信号都是低电平复位,这在绝大多数MCU中很常见,而在Xilinx设计的内部触发器是高电平复位,如果采用低电平复位就会消耗额外的资源对复位信号做处理,根据FPGA的特点,Xilinx FPGA执行高电平实现复位(Altera FPGA是低电平执行复位)
4. 具体硬件电路如何实现?
具体到硬件电路实现部分,建议可以从两部分实:
- 全局复位执行
Xilinx本身在上电时,内部执行了相关的初始化操作,为内部系统自动完成,使内部寄存器恢复在默认的状态,但只局限在上电POR状态。
另外,在上电阶段,可以通过加GSR(Global Set/Reset)复位语句,在启动阶段强制执行复位。
- 区域复位执行
为了实现局部或自己设计的或IP相关区域复位,在添加一个硬件复位接口,后续编写Verilog语言时,将该port配置成复位功能。
参考资料:
AMD 官方应用及用户手册: WP272, WP275, UG949