自学内容网 自学内容网

对FPGA加载过程中不同寄存器初始化方式现象的分析

概述

目的

本文档针对FPGA上电加载过程中不同寄存器初始化方式的现象进行分析。

术语和缩略语

参考资料

  • 《ug470_7Series_Config》 Xilinx

相关原理

FPGA加载过程中非专用配置I/O引脚电平受PUDC_B配置引脚状态影响。PUDC_B 引脚为FPGA配置期间I/O引脚内部上拉电阻使能,低有效。该引脚不可悬空,可以通过小于等于1kΩ的电阻接GND或者VCCO_14。

  • 如果PUDC_B引脚为低电平,配置期间所有非专用配置I/O引脚为高电平状态;

  • 如果PUDC_B引脚为高电平,配置期间所有非专用配置I/O引脚为高阻态。

在这里插入图片描述

分析

针对寄存器初始化方式对寄存器输出值的影响,分以下四种情况进行分析:

a) 声明信号时进行初始化;

b) 同步复位/置位初始化;

c) 异步复位/置位初始化;

d) 不进行任何初始化操作,Vivado 自动生成。

MMCM时钟锁定分析

通过图 2、图 3可知,MMCM输出时钟在FPGA加载完成指示信号(config_done)置位后12us开始输出,但是MMCM锁定信号locked在config_done信号置位后40us才置位。

  • 0时刻:config_done信号置位;
  • 12us:MMCM开始输出时钟;
  • 40us:MMCM的locked置位,时钟锁定。

在这里插入图片描述

在这里插入图片描述

声明信号时进行初始化

RTL测试代码
signal a_init_0 : std_logic := '0';
signal a_init_1 : std_logic := '1';

--信号声明时进行初始化
process (clk_out1_50MHz) begin
    if rising_edge (clk_out1_50MHz) then
        a_init_0 <= '1';
    a_init_1 <= '0';
    end if;
end process;
示波器现象

通过图 5 可知,只在信号声明时初始化的信号,当config_done置位后变为初始状态,但只要有时钟,不管时钟是否锁定都会根据RTL代码对寄存器重新赋值。

  • 0时刻:config_done 信号置位;a_init_0 初始化为 ‘0’;a_init_1 初始化为 ‘1’;

  • 12us:MMCM 开始输出时钟,此时根据 RTL 代码 a_init_0 变为 ‘1’;a_init_1 变为 ‘0’。

在这里插入图片描述

同步复位/置位初始化

RTL测试代码
signal a_srst_0 : std_logic;
signal a_srst_1 : std_logic;

--同步复位/置位初始化
process (clk_out1_50MHz) begin
   if rising_edge (clk_out1_50MHz) then
       if (locked = '0') then
           a_srst_0 <= '0';
           a_srst_1 <= '1';
   else
           a_srst_0 <= '1';
           a_srst_1 <= '0';
       end if;
   end if;
end process;
示波器现象

通过图 7可知,同步复位/置位的信号在config_done置位后&&时钟产生之前初始值都默认为低电平,时钟产生之后到locked置位前才是同步复位/置位状态。

  • 0时刻:config_done 信号置位;a_srst_0、a_srst_1 默认值均为 ‘0’;

  • 12us:MMCM 开始输出时钟;a_srst_0 同步初始化为 ‘0’;a_srst_1 同步初始化为 ‘1’;

  • 40us:MMCM 的 locked 置位,时钟锁定;此时根据 RTL 代码 a_ srst_0 变为 ‘1’;a_ srst_1 变为 ‘0’。

在这里插入图片描述

异步复位/置位初始化

RTL测试代码
signal a_arst_0 : std_logic;
signal a_arst_1 : std_logic;

--异步复位/置位初始化
process (clk_out1_50MHz,locked) begin
    if rising_edge (clk_out1_50MHz) then
        if (locked = '0') then
            a_arst_0 <= '0';
            a_arst_1 <= '1';
    else
            a_arst_0 <= '1';
            a_arst_1 <= '0';
        end if;
    end 
示波器现象

通过图 9 可知,异步复位/置位在 config_done 置位后 && locked 置位前即为同步复位/置位状态。

  • 0时刻:config_done 信号置位;a_arst_0 异步初始化为 ‘0’;a_arst_1 异步初始化为 ‘1’;

  • 40us:MMCM 的 locked 置位,时钟锁定;此时根据 RTL 代码 a_ arst_0 变为 ‘1’;a_ arst_1 变为 ‘0’。

在这里插入图片描述

不进行任何初始化操作,Vivado自动生成

RTL测试代码
signal a_0 : std_logic;
signal a_1 : std_logic;

--不进行初始化
process (clk_out1_50MHz) begin
    if rising_edge (clk_out1_50MHz) then
        a_0 <= '1';
        a_1 <= '0';
    end if;
end process;
示波器现象

通过图 11可知,未初始化的信号在 config_done 置位后 && 时钟产生之前初始值都默认为低电平,时钟产生之后则为 RTL 逻辑状态。

在这里插入图片描述

结论

a) 逻辑开发前需先确定硬件状态,FPGA 配置引脚 PUDC_B 不可悬空,根据需要上拉或者下拉;

b) 在不进行初始化情况下,Xilinx 编译软件 Vivado 默认所有寄存器初始化为低电平;

c) 异步初始化和信号声明初始化均在 config_done 置位后生效;而同步初始化和不初始化信号在存在时钟之后&&locked置位之前生效。


原文地址:https://blog.csdn.net/qq_38695100/article/details/142467281

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!