zoukankan      html  css  js  c++  java
  • 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窗口中查看初始值如下,右侧可以更改初始值(没使用过。。)

    以上。

  • 相关阅读:
    Git 基本使用
    vue cli 构建的 webpack 项目设置多页面
    vue父子组件通信
    路由 vue-router
    IE浏览器下 Vue2.x 和 Angular 应用无法打开
    点击组件外使组件隐藏
    vue2.x 随记
    python学习之路 二 :基本数据类型
    python学习之路 一 :编程语言介绍
    .net Timer定时执行
  • 原文地址:https://www.cnblogs.com/kingstacker/p/9821663.html
Copyright © 2011-2022 走看看