Vivado寄存器初始值問題


前言

本復位只針對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窗口中查看初始值如下,右側可以更改初始值(沒使用過。。)

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM