前言
本復位只針對Vivado中的寄存器復位。
什么時候需要復位?到底要不要復位?怎么復位?復位有什么卵用?
該復位的寄存器需要復位,復位使得寄存器恢復初始值,有的寄存器並不需要復位(數據流路徑上)。
官方說法如下:具體可查看ug949。
流程
所以,問題來了,為了不使用復位信號該怎么賦初始值。
注意:reg語句中給寄存器賦初始值,在FPGA上電配置后值就為這個初始值。
如果只有復位語句中的初始值,那么上電配置(configuration )后和復位(reset)后寄存器都為此初始值。
如果reg語句給了初始值x1,且在復位語句中賦初始值x2,那么上電配置后初始值為x1,復位后寄存器初始值為x2。
代碼驗證:
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
2.如下代碼,不復位賦初始值,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
3.如下代碼,使用復位但不給初始值,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
4.如下代碼,既使用復位且給初始值,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窗口中查看初始值如下,右側可以更改初始值(沒使用過。。)
以上。