0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详细解读FPGA复位的重点

454398 来源: 科学计算technomania 作者:猫叔 2020-11-18 17:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本篇文章参考Xilinx White Paper:Get Smart About Reset: Think Local, Not Global

在没看这篇文章前,回想一下平时我们常用的复位方式:
① 首先,上电后肯定是要复位一下,不然仿真时会出现没有初值的情况;
② 最好有个复位的按键,在调试时按一下复位键就可以全局复位了;
③ 也许是同步复位,也许是异步复位,不同的工程师可能有不同的方案。

但如果认真看了Xilinx的White Paper,就会对复位有了新的认识。

我们把White Paper的内容总结为下面4个问题:
① 需不需要复位?
② 同步复位 or 异步复位?
③ 高复位 or 低复位?
④ 全局复位 or 局部复位?怎么用?

1. 需不需要复位?

看到这个问题,可能很多同学会有点懵,怎么可能不需要复位?其实Xilinx FPGA在系统上电配置时,会有一个GSR(Global Set/Reset)的信号,这个信号有以下几个特点:
• 预布线
• 高扇出
• 可靠的

这个信号可初始化所有的cell,包括所有的Flip-Flop和BRAM。


如果我们在程序里用自己生成的复位信号,也只能复位Flip-Flop。

这个GSR信号我们可以在程序中通过实例化STARTUP直接调用,但Xilinx并不推荐这么使用。


主要原因是FPGA会把像系统复位这种高扇出的信号放到高速布线资源上,这比使用GSR要快,而且更容易进行时序分析。

虽然有GSR,但这并不是说要避免使用复位信号,以下两种情况就必须要加复位:

• 带有反馈的模块,比如IIR这种滤波器和状态机,当状态跑飞了,就需要复位一下


• 应用过程中需要复位的寄存器

这个就具体看是什么应用了,我们公司的很多寄存器都需要在调试过程中需要经常复位,像这种复位就是必须的了。

所以,需不需要复位完全看设计。这里多提一点,时序收敛也是一样,主要看设计,而不是约束。

2. 同步复位 or 异步复位?

在HDL中,如果敏感列表中不包含rst,会被综合成同步复位:

always @ ( posedge clk )
begin
    if(rst)
        ...
end

如果敏感列表中包含rst,则会被综合成异步复位:

always @ ( posedge clk or posedge rst)
begin
    ...
end

同步复位的好处,不言而喻,有利于时序分析,降低亚稳态的几率,避免毛刺。

同步信号的缺点:
• 复位信号有效电平持续时间必须大于时钟周期,不然时钟可能采不到复位
• 在没有时钟的时候无法复位

也有很多同学会说同步复位会需要额外的资源,但对于Xilinx的FPGA,是没有这个问题的,具体原因后面讲。

对于异步复位,好处就是同步复位的反方面:脉冲宽度没有限制,没有时钟也可以复位。

缺点就是异步电路,容易引起亚稳态,产生毛刺,不利于时序分析,而且不同触发器的复位时间可能不同。下面这个图中,在A时刻接收到复位信号拉低的FF可以在下一个时钟上升沿时就释放复位状态,但C时刻接收到复位信号拉低的FF则在下下个时钟上升沿时才能释放复位状态。


按照White Paper上所讲,99.99%的概率这种情况都不会发生,但如果你刚好碰到一次这种现象,那你就是那0.01%。

下面我们来举一个例子来说明同步复位和异步复位,FPGA为V7,代码如下:

module rst_demo(
 input clk,
 input rst1,
 input rst2,
 input in1,
 input in2,
 output reg out1,
 output reg out2);

 always @ ( posedge clk )
 begin
    if(rst1)
        out1 <= 1'b0;
    else
        out1 <= in1;
 end

 always @ ( posedge clk or posedge rst2 )
 begin
    if(rst2)
        out2 <= 1'b0;
    else
        out2 <= in2;
 end

 endmodule

综合后的schematic如下图:


可以看出来,同步复位和异步复位都是占用一个Storage Element,我们在之前的一篇文章中讲过Storage Element可以配置为Latch,同样的,也可以配置为FDRE和FDCE,而且在7Series手册中也并未提到配置成FDRE或FDCE时是否会占用更多资源(比如,7Series的FPGA中,一个Slice中有8个Storage Element,如果其中一个被配置成了Latch,那有4个Storage Element是不能用的),因此在Xilinx的FPGA中,同步复位和异步复位在资源占用上,并没有区别。

3. 高复位 or 低复位?

很多处理器上的复位都是低复位,这也导致了很多同学在使用复位信号时也习惯使用低复位了。但从我们上一节所讲中可以看出,无论是同步复位还是异步复位,复位信号都是高有效,如果采用低复位,还需要增加一个反相器。

如果接收到其他处理器发过来的低有效复位信号,我们最好在顶层模块中翻转复位信号的极性,这样做可以将反相器放入IO Logic中,不会占用FPGA内部的逻辑资源和布线资源。

这里多补充一点,如果使用Zynq和Microblaze,则Reset模块默认是低复位,我们可以手动设置为高复位。

4. 全局复位 or 局部复位?怎么用?

我们对复位常用的做法是将系统中的每个FF都连接到某个复位信号,但这样就造成了复位信号的高扇出,高扇出就容易导致时序的违规。而且全局复位占用的资源比我们想象中要高的多:

• 布线资源占用
• 其他网络的布线空间就相应减少
• 可能会降低系统性能
• 增加布线时间
• 逻辑资源占用
• 占用FF作为专门的复位电路
• 如果该复位信号还受其他信号控制,会导致FF的输入前增加门电路
• 会增加整个设计的size
• 增加的逻辑资源会影响系统性能
• 增加布局布线时间
• 全局复位不会使用像SRL16E这种高效结构
• 在LUT中SRL16E可当作16个FF
• 这些Virtual FF不支持复位
• 增加设计的size,并降低系统性能
• 增加布局布线时间

因此,Xilinx推荐尽量使用局部复位的方式,前面我们也讲到然同步复位和异步复位都多多少少有些问题,那有没有一种方式可以结合同步复位和异步复位的优点?当然有,就是异步复位,同步释放。这种方法可以将两者结合起来,取长补短。如下图所示,所谓异步复位,就是输入的复位信号仍然是异步的,这样可以保证复位信号能够起效;而同步释放是指当复位信号释放时,输出的sys_rst并不是立即变化,而且被FF延迟了一个时钟周期,这样让复位和时钟同步起来。


图中的Verilog代码如下:

module rst_demo(
 input      clk, 
 input      rst_async, 
 (* keep = "true" *)
 output  reg  rst_module1 = 0,
 (* keep = "true" *)
 output  reg  rst_module2 = 0
    );

reg         sys_rst;
reg         rst_r;

always @(posedge clk or posedge rst_async) begin
    if (rst_async) begin
        rst_r <= 1'b1;
    end
    else begin
        rst_r <= 1'b0;
    end
end

always @(posedge clk or posedge rst_async) begin
    if (rst_async) begin
        sys_rst <= 1'b1;
    end
    else begin
        sys_rst <= rst_r;
    end
end

always @ ( posedge clk ) begin
    rst_module1 <= sys_rst;
    rst_module2 <= sys_rst;
end

endmodule

综合后的schematic如下图:


异步复位模块输出的sys_rst通过n个D触发器后输出给n个模块,当做模块的复位信号。

总结

在使用复位信号时,考虑这个寄存器需不需要在运行过程中进行复位,如果只需要上电后复位一次,那只需在定义时写上初值即可,无需使用其他复位信号;在Xilinx的FPGA中尽量使用高有效的复位信号,采用异步复位同步释放的方式,并且要将复位信号局部化,避免使用高扇出的全局复位。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22287

    浏览量

    630300
  • 寄存器
    +关注

    关注

    31

    文章

    5589

    浏览量

    129066
  • Xilinx
    +关注

    关注

    73

    文章

    2192

    浏览量

    129938
  • 复位信号
    +关注

    关注

    0

    文章

    70

    浏览量

    6753
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何使用FPGA实现SRIO通信协议

    本例程详细介绍了如何在FPGA上实现Serial RapidIO(SRIO)通信协议,并通过Verilog语言进行编程设计。SRIO作为一种高速、低延迟的串行互连技术,在高性能计算和嵌入式系统中广
    的头像 发表于 11-12 14:38 4960次阅读
    如何使用<b class='flag-5'>FPGA</b>实现SRIO通信协议

    基于FPGA平台的蜂鸟E203 JTAG debug出错问题的解决思路

    固化存在的问题并不大,只需要按照硬件电路完成管脚的删减和映射(约束)即可,这里重点说明一下debug出错问题的解决思路。 我在FPGA固化文件完成后,在上位机SDK中debug helloworld
    发表于 10-28 07:38

    HarmonyOSAI编程智能代码解读

    CodeGenie > Explain Code,开始解读当前代码内容。 说明 最多支持解读20000字符以内的代码片段。 使用该功能需先完成CodeGenie登录授权。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-02 16:29

    GraniStudio:轴复位例程

    1.文件运行 导入工程 双击运行桌面GraniStudio.exe。 通过引导界面导入轴复位例程,点击导入按钮。 打开轴复位运动例程所在路径,选中轴复位运动.gsp文件,点击打开,完成导入。 2.
    的头像 发表于 08-22 16:05 479次阅读
    GraniStudio:轴<b class='flag-5'>复位</b>例程

    HarmonyOS AI辅助编程工具(CodeGenie)代码智能解读

    。 选中.ets文件或者.cpp文件中需要被解释的代码行或代码片段,右键选择CodeGenie > Explain Code,开始解读当前代码内容。 说明 最多支持解读20000字符以内
    发表于 07-17 17:02

    开源的e203rtl 可以在FPGA板子(DDRt)跑50M主频吗?

    开源的e203rtl 可以在FPGA板子(DDRt)跑50M主频吗? 跑25M时,可以通过spi打印出来数数据,但是跑50M主频时候,看似下载进去了,什么也没打印出来,有遇到这个问题的同学吗?老师或者大佬可以解读一下吗?用的芯来的全套东西,
    发表于 07-11 07:58

    GraniStudio零代码平台轴复位算子支持多少个轴同时复位,有哪些回零模式?

    GraniStudio平台在轴复位的功能上未对同时复位的轴数进行硬性限制,理论上支持任意数量轴同步复位,需要考虑的是在做多轴同步复位时要评估机械安全风险,建议提前确认机械在多轴同时
    的头像 发表于 07-07 18:02 484次阅读
    GraniStudio零代码平台轴<b class='flag-5'>复位</b>算子支持多少个轴同时<b class='flag-5'>复位</b>,有哪些回零模式?

    复位电路的核心功能和主要类型

    复位电路(Reset Circuit) 是数字系统中的关键功能模块,用于确保设备在上电、电压波动或异常状态下可靠复位至初始状态。其设计直接影响系统的稳定性和抗干扰能力。
    的头像 发表于 06-30 14:24 906次阅读
    <b class='flag-5'>复位</b>电路的核心功能和主要类型

    【经验分享】玩转FPGA串口通信:从“幻觉调试”到代码解析

    FPGA开发,思路先行!玩FPGA板子,读代码是基本功!尤其对从C语言转战FPGA的“宝贝们”来说,适应流水线(pipeline)编程可能需要点时间。上篇点灯代码解读了基础,而如果能亲
    的头像 发表于 06-05 08:05 881次阅读
    【经验分享】玩转<b class='flag-5'>FPGA</b>串口通信:从“幻觉调试”到代码解析

    SPI协议,寄存器解读

    最近在学习SPI协议,对寄存器操作不是特别熟练。发帖希望有大佬能从寄存器角度提供帮助,帮忙指导根据手册去解读协议。有偿。
    发表于 05-22 20:08

    【高云GW5AT-LV60 开发套件试用体验】代码解读-点灯实验

    这篇文章解读一下开发板的第一个demo,这个demo是个点灯demo,通过这个demo可以让小白了解高云开发的基本过程,所以也是非常重要的,如果之前完全没用过高云的产品,通过学习这篇文章可以快速
    发表于 05-17 20:23

    LM3724系列 低功率电压监控和复位IC,带手动复位功能数据手册

    LM3722/LM3723/LM3724 微处理器监控电路可监控电源 在微处理器和数字系统中。它们在上电期间为微处理器提供复位, 掉电、掉电条件和手动复位。 LM3722/LM3723
    的头像 发表于 04-12 11:11 786次阅读
    LM3724系列 低功率电压监控和<b class='flag-5'>复位</b>IC,带手动<b class='flag-5'>复位</b>功能数据手册

    复位电路的作用、控制方式和类型

    复位电路也是数字逻辑设计中常用的电路,不管是 FPGA 还是 ASIC 设计,都会涉及到复位,一般 FPGA或者 ASIC 的复位需要我们自
    的头像 发表于 03-12 13:54 3539次阅读
    <b class='flag-5'>复位</b>电路的作用、控制方式和类型

    做APPSFPGA的vhdl源码,fpga如何修改pgen送数据到数据总线然后复位

    有人在做 APPSFPGA的 vhdl 源码吗,我刚开始接触 fpga 如何修改 pgen 送数据 到数据总线 然后 复位 ,有大佬可以指点一下吗
    发表于 02-21 06:01

    MOSFET参数解读

    SGT-MOSFET各项参数解读
    发表于 12-30 14:15 1次下载