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

embedded/2024/9/25 16:42:44/

对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) beginif rising_edge (clk_out1_50MHz) thena_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) beginif rising_edge (clk_out1_50MHz) thenif (locked = '0') thena_srst_0 <= '0';a_srst_1 <= '1';elsea_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) beginif rising_edge (clk_out1_50MHz) thenif (locked = '0') thena_arst_0 <= '0';a_arst_1 <= '1';elsea_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) beginif rising_edge (clk_out1_50MHz) thena_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.ppmy.cn/embedded/116714.html

相关文章

研一上课计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、学位课1.应用数理统计&#xff08;学3 开卷考试&#xff09;2.最优化方法&#xff08;学3 开卷考试&#xff09;3.新中特&#xff08;学2 三千五百字的品读…

Django之Haystack对接搜索引擎框架Elasticsearch

Django之Haystack对接Elasticsearch Haystack概述安装依赖环境准备Haystack配置 Haystack建立数据索引创建模型对象创建搜索索引类创建模板文件执行数据库迁移生成索引渲染模板执行测试 搜索请求和结果渲染的自定义处理概述创建搜索视图配置URL创建搜索模板自定义结果渲染执行测…

在Ubuntu中安装多个版本CMake

安装教程请参考这里&#xff0c;只不过不需要修改环境变量&#xff0c;这一步由update-alternatives代理。查看Ubuntu系统版本 cmake --version使用update-alternatives管理多个版本 以下的所有版本号都需要根据自己的情况修改 sudo mv /usr/bin/cmake /usr/bin/cmake-3.10.2…

SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   当Where函数中的检索条件较多时&a…

常用微服务网关详解,底层设计逻辑介绍

1 API网关基础 1.1 什么是API网关 API网关是一个服务器&#xff0c;是系统的唯一入口。 从面向对象设计的角度看&#xff0c;它与外观模式类似。 API网关封装了系统内部架构&#xff0c;为每个客户端提供一个定制的API。它可能还具有其它职责&#xff0c;如身份验证、监控、…

QT编译之后的debug包下运行程序双击运行出现无法定位程序输入点__gxx_personlity_seh0于动态链接库

1.出现这个错误的原因是&#xff1a; 缺少如下文件&#xff1a; 2.解决方法&#xff1a; 在运行程序.exe所在的目录执行&#xff1a;windeployqt untitled.exe&#xff08;指打包的运行程序&#xff09; 3.如果执行提示由于找不到qt5core.dll,无法继续执行代码和无法识别win…

帆软通过JavaScript注入sql,实现数据动态查询

将sql语句设置为参数 新建数据库查询 设置数据库查询的sql语句 添加控件 JavaScript实现sql注入 添加事件 编写JavaScript代码 //获取评价人id var pjrid this.options.form.getWidgetByName("id").getValue();//显示评价人id alert("评价人&#xff1a;&…

第六章 输入和输出处理(IO流)

File类操作文件 public static void main(string[] args){try {//创建File对象// 绝对路径相对路径string path "D:/4072/1/":String fileName "1.txt";File file new File(path);if(!file.exists()&&!file.isDirectory()){ file.mkdirs();//创…