对FPGA加载过程中不同寄存器初始化方式现象的分析
对FPGA加载过程中不同寄存器初始化方式现象的分析
- 概述
- 目的
- 术语和缩略语
- 参考资料
- 相关原理
- 分析
- MMCM时钟锁定分析
- 声明信号时进行初始化
- RTL测试代码
- 示波器现象
- 同步复位/置位初始化
- RTL测试代码
- 示波器现象
- 异步复位/置位初始化
- RTL测试代码
- 示波器现象
- 不进行任何初始化操作,Vivado自动生成
- RTL测试代码
- 示波器现象
- 结论
概述
目的
本文档针对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置位之前生效。