Vivado寄存器初始值问题

本文详细解析了在Vivado中寄存器复位的重要性及实现方式,包括何时需要复位、如何复位以及复位的作用。通过四种不同场景的代码示例,展示了寄存器赋初值的方法及其对综合结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本复位只针对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窗口中查看初始值如下,右侧可以更改初始值(没使用过。。)

以上。

 

转载于:https://www.cnblogs.com/kingstacker/p/9821663.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值