FPGA的复位设计

本文转载自: FPGA的现今未微信公众号

注:本文由作者授权转发,如需转载请联系作者本人

无论是FPGA开发还是芯片开发,其中一个重要的环节就是复位设计,本文主要说明FPGA的复位设计。其实关于FPGA的复位,也有一些不同的讨论,比如FPGA是否需要复位?同步复位好还是异步复位好等等,有很多的资料都有这方面的介绍了,本文不想重复已有的内容,这里作者就工作中的经验和遇到的一些问题来做个简单的总结。

一、是否需要复位?

FPGA厂商建议是不用复位,因为在上电的时候,FPGA内部的所有逻辑单元都处于确定的状态,理论上确实应该这样,毕竟复位也是需要额外资源的。但是也有不同的声音,是否需要复位,这里不展开讨论,只说明工程上的建议,从实际工程经验来看,控制信号还是需要复位,数据处理信号不复位,如下代码所示。

always@(posedge clk_sys)
begin
dout <= shift_data_temp >> (DOUT_WIDTH - DIN_WIDTH*data_cnt_1dly);
end

always@(posedge clk_sys or posedge rst)
begin
if(rst == 1'b1) begin
dout_vld <= 1'b0;
end
else if((shift_done_1dly == 1'b1) || (din_eop_1dly == 1'b1)) begin
dout_vld <= 1'b1;
end
else begin
dout_vld <= 1'b0;
end
end

对于有一种场景就必须这样,即FPGA上电后立马开始工作,比如来自网络报文的处理,甚至还没有上电完成,报文就已经来了。这就要求控制信号最好有“统一的步伐”。

二、同步复位和异步复位

关于同步复位和异步复位的问题,又是一个很大的话题了,网上已经有大量的资料,这里也不再做比较。直接说结果,常用的方案是:异步复位,同步解复位,也称为复位同步化。这里其实有2个问题:

1、异步复位,这个好理解,复位条件满足后,立马复位相应的逻辑;

2、同步解复位,这个是重点,首先是解复位要同步,那么隐藏的含义就是解复位需要时钟,即不同的时钟域,应该有不同的解复位。这里给出一个通用的复位方案。如下图所示,关键就是复位的同步化,即异步复位,要同步到不同的时钟域进行解复位。

三、复位同步化的设计

复位同步化的设计方案,其实已经有了“标准”,采用这样的方案其实就是很好的解决了复位的“建立保持”时间。电路和代码如下图所示:

always@(posedge clk_sys or posedge rst)
begin
if(rst == 1'b1) begin
rst_1dly <= 1'b1;
rst_2dly <= 1'b1;
rst_syned <= 1'b1;
end
else begin
rst_1dly <= 1'b0;
rst_2dly <= rst_1dly;
rst_syned <= rst_2dly;
end
end

四、工程实践

有了上面描述的几点基础知识,这里说明下复位在实际项目中的运用。通常FPGA的管脚上有一个复位输入信号,叫硬复位,这个复位信号复位FPGA全局逻辑,它应该在不同的时钟域先做同步处理。

在有的场景中,FPGA逻辑还会自己产生一个软复位,这个软复位可以复位局部逻辑,也可以复位全局逻辑。软复位和硬复位做一个或处理后,再做时钟域同步。

总之,FPGA的复位设计,是一个很关键的部分,在项目方案阶段,就需要有明确的时钟复位方案。关于如何做时钟复位设计,欢迎留言讨论。

最新文章