不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

FPGA寄存器上电初始值

FPGA内部寄存器的上电初值是什么? 有说是低的,有说是高的, 也有说和器件相关的,还有些人说是不确定. 对于一个系统来讲, 用户并不在意初值是高电平,或者是低电平, 用户真正关心的是寄存器的初值是不是确定可预测的,也就是说每次编译,每次上电的初值是不是一致的。

来举个例子,有个客户在调试FPGA设计,在头一个月编译的几百次结果中,一个寄存器的初值一直都是低电平。某一天改了一部分看似不相关的代码之后,这个寄存器的初值从此之后就变成高电平了。这种情况通常会让用户不知所措,非常痛苦。后来在我们的一起努力下,采用了一些措施,最终可以控制寄存器的初值.

那么到底是什么?简单说,寄存器的初值是由综合工具(synthesis tool)决定下来的,综合synthesis过后,电路网表就确定了,初值也就决定了。换句话说,初值不会随后端的布局布线过程影响。但是如果没有针对性的规则来约束综合synthesis,那么一次编译后的初值和上一次编译的初值是有可能不一样的,当然更多的时候是一样的。本文后面会对这个现象作进一步分析的.

1. 工作原理

寄存器的初值到底是怎么回事? 我们来看一张图。Figure 1.1是FPGA内部一个寄存器的复位功能模型。FPGA的寄存器要么工作在复位RST模式,要么工作在置位SET模式,不会同时支持RST和SET功能。这是当前市场是多数FPGA的共同特性。RST或者SET的选择是通过下载到FPGA的Fuse bit决定的。FPGA芯片内部有一个上电检测模块,一旦检测到电源电压超过检测门限后,就产生一个上电复位脉冲(Power On Reset)送给所有的寄存器. 对于某个特定的寄存器,POR的作用是RST还是SET, 完全取决于编程到FPGA的FUSE bit。而FUSE值在综合(synthesis)之后,事实上已经完全确定了.
FPGA的寄存器只能配置为RST或者SET两种模式之一,而不能同时支持RST和SET。
RST或者SET信号的极性是可编程的。

每一个寄存器都可以配置为受全局复位(GSR)控制,或者局部复位(LSR)控制。

FPGA有一个上电检测电路,上电检测电路产生上电复位POR,POR的作用取决于FUSE的配置。除了上电,重新加载FPGA也会产生POR。

 FPGA寄存器的上电初值

2. 代码风格和初值的关系

下面我们来看几个例子,看不同的代码和初值的对应关系。
2.1 带有异步复位的寄存器代码
module top(
input wire rst,
input wire clk,
input wire d,
input wire cke,
output reg q
);
always @(posedge rst or posedge clk)
begin
if(rst==1'b1)
q <= 1'b0;
else if(cke==1'b1)
q <= d;
end
endmodule

 FPGA寄存器的上电初值


这种带有异步复位的寄存器描述,其对应的网表如图Figure 2.1. 显然上电初值为0.

2.2 带有异步置位的寄存器代码
module top(
input wire rst,
input wire clk,
input wire d,
input wire cke,
output reg q
);
always @(posedge rst or posedge clk)
begin
if(rst==1'b1)
q <= 1'b1;
else if(cke==1'b1)
q <= d;
end
endmodule

 FPGA寄存器的上电初值


这种带有异步置位的寄存器描述,其对应的网表如图Figure 2.2. 显然上电初值为1.

2.2 没有异步复位,也没有异步置位的寄存器代码
这种情况比较复杂,让我们来看两个例子。

2.2.1 较简单的场景
module top(
input wire clk,
input wire d,
input wire cke,
output reg q
);
always @(posedge clk)
begin
if(cke==1'b1)
q <= d;
end
endmodule

 FPGA寄存器的上电初值


在寄存器的输入比较简单的情况下,其对应的网表如图Figure 2.3. 综合工具不使用RST/SET功能。FPGA后端工具默认使用RST,并把RST连接到地GND. 那么显然上电初值为0.

2.2.2 较复杂的场景
.....
.....
always @(posedge clk)
begin
if(cond1[7:0] == 8'h55)
q <= 1’b0;
else if(cond2[7:0] == 8'haa)
q <= 1’b1;
else if(cond3[7:0] == 8'h0f)
q <= 1’b0;
else if(cond4[7:0] == 8'h00)
q <= 1’b1;
else;
end
.....
.....
在寄存器的输入相对复杂的情况下, 综合工具有很大的空间去做优化. 一种可能的优化结果是, 在不改变逻辑功能的前提下, 综合工具为了降低数据输入端D的逻辑复杂度,抽取一个节点信号或作RST,或作SET. 

posted on 2022-05-07 16:40  皮皮祥  阅读(918)  评论(0编辑  收藏  举报