Xilinx FPGA设计之寄存器初始值问题

FPGA 开发中,有两种方法可以给寄存器赋初值:

  1. 在定义 reg 变量时,即给寄存器赋初值;
  2. 在复位语句中给寄存器赋初值。

这两种的区别在于:reg 语句中给寄存器赋初始值,在 FPGA 上电配置后就为这个初始值;如果只有复位语句中的初始值,那么上电配置(configuration )后和复位(reset)后寄存器都为此初始值。

Xilinx FPGA 设计之寄存器初始值问题

代码验证

  1. 如下代码,不复位也不赋初始值,vivado 综合后寄存器初始值全为 0。
(*DONT_TOUCH="yes"*)reg [5:0] r_cnt_1;
always @(posedge i_clk)
begin
    r_cnt_1 <= r_cnt_1 + 6'd1;
end //always
  1. 如下代码,不复位赋初始值,vivado 综合后寄存器初始值为代码中赋的初始值。
(*DONT_TOUCH="yes"*)reg [5:0] r_cnt_1 = 6'h34;
always @(posedge i_clk)
begin
    r_cnt_1 <= r_cnt_1 + 6'd1;
end //always
  1. 如下代码,使用复位但不给初始值,vivado 综合后寄存器初始值为代码中复位语句中赋的初始值(Xilinx 不推荐异步复位)。
(*DONT_TOUCH="yes"*)reg [5:0] r_cnt_0;
always @(posedge i_clk,negedge i_rst_n)
begin
    if (~i_rst_n)
        r_cnt_0 <= 6'h12;
    else
        r_cnt_0 <= r_cnt_0 + 6'd1;
end //always
  1. 如下代码,既使用复位且给初始值,vivado 综合后寄存器初始值为 reg 赋的初始值。
(*DONT_TOUCH="yes"*)reg [5:0] r_cnt_2 = 6'h01;
always @(posedge i_clk,negedge i_rst_n)
begin
    if (~i_rst_n)
        r_cnt_2 <= 6'h12;
    else
        r_cnt_2 <= r_cnt_2 + 6'd1;
end //always

在 Vivado 中查看寄存器初始值

(1)打开综合后的工程。

在 Vivado 中查看寄存器初始值

(2)在网表中查看,不过只能单个点击查看。

在 Vivado 中查看寄存器初始值

(3)在 properties 窗口中查看初始值如下,右侧可以更改初始值。

在 Vivado 中查看寄存器初始值

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月20日 20:18
下一篇 2022年9月25日 21:18

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注