当前位置: 首页 > article >正文

对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置位之前生效。


http://www.kler.cn/a/319145.html

相关文章:

  • matlab建模入门指导
  • 解决表格出现滚动条样式错乱问题
  • 软件测试项目实战
  • 【知识科普】SPA单页应用程序介绍
  • dapp获取钱包地址,及签名
  • Vue常用加密方式
  • 基于PHP的CRM管理系统源码/客户关系管理CRM系统源码/php源码/附安装教程
  • 免费分享必看!AI合规常见问题解答(二)
  • java之斗地主部分功能的实现
  • 修改Linux服务器系统语言
  • 深入解析Debian与Ubuntu:技术特点与用户使用指南
  • Git 详细安装教程(详解 Git 安装过程的每一个步骤)
  • Python 课程19-FastAPI
  • 开源 AI 智能名片与 S2B2C 商城小程序:嫁接权威实现信任与增长
  • 深入解析:HTTP 和 HTTPS 的区别
  • 51单片机开关电路+限位+舵机
  • 【玉米田】
  • Springboot多种请求参数
  • Cloudera 安装不再难:下载安装全流程指南
  • 数据库基础01
  • 《使用 LangChain 进行大模型应用开发》学习笔记(四)
  • 【图论】最短路应用
  • 封面设计用什么软件最高效?分享5款新手必备工具
  • 数据报文解析
  • 【CSS】变量的声明与使用
  • 水电站/水库大坝安全监测系统完整解决方案