FPGA 开发中,有两种方法可以给寄存器赋初值:
- 在定义 reg 变量时,即给寄存器赋初值;
- 在复位语句中给寄存器赋初值。
这两种的区别在于:reg 语句中给寄存器赋初始值,在 FPGA 上电配置后就为这个初始值;如果只有复位语句中的初始值,那么上电配置(configuration )后和复位(reset)后寄存器都为此初始值。

代码验证
- 如下代码,不复位也不赋初始值,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
- 如下代码,不复位赋初始值,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
- 如下代码,使用复位但不给初始值,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
- 如下代码,既使用复位且给初始值,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)打开综合后的工程。

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

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

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

每天学习电路设计和嵌入式系统的专业知识,关注一波,没准就用上了。
原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/1282.html