目录
1. 简介
本文对比分析两个方面的初始化和复位:阵列和控制(也即块级)
阵列的初始化和复位
- 阵列初始化:初始化是在编译时(或上电时)为变量(包括阵列)赋予初始值的过程。对于 C/C++ ,全局变量和静态变量默认初始化为0,但也可以给它们指定初始值。对于硬件逻辑,阵列会被实现为存储器(例如RAM),并且在上电或编程 FPGA 时,这些存储器会被预加载指定的初始值。
- 阵列复位:在运行时,通过复位信号将变量(包括阵列)恢复到其初始状态的过程。不同于初始化,复位是一个动态过程,可以在程序执行期间任何时刻发生。如果选择将变量复位到其初始状态,这会导致设计中增加额外的逻辑和存储器资源。
控制的初始化与复位
- 控制初始化:初始化行为主要关注变量(包括阵列和寄存器)在编译时或上电时的状态。
- 控制复位:在 kernel 端口添加复位信号,当用复位信号使能,立即将连接到复位端口的寄存器和 BRAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。
2. 块级的初始化与复位
2.1 块级的初始化
默认情况下,C/C++ 中以 static 变量和全局变量都初始化为 0,也可由用户赋予特定初始值。
在 Vitis HLS 工具中,需要注意:
- 在 RTL 仿真期间,为这些变量设置的初始值与 C/C++ 语言代码中相同。
- 在用于对 FPGA 进行编程的比特流中,也会对这些变量进行初始化。当器件上电时,变量将以其初始状态启动。
在 RTL 中,虽然变量启动时使用的初始值与 C/C++ 语言代码相同,但无法强制该变量返回至此初始状态。要复原初始状态,必须通过复位信号来实现。
2.2 块级的复位
复位端口在 FPGA 中用于在应用复位信号时,立即将连接到复位端口的寄存器和块 RAM 还原为初始值。通常 RTL 配置中最重要的操作即选择复位行为。
* TOP LEVEL CONTROL
+-----------+---------------+-----------+
| Interface | Type | Ports |
+-----------+---------------+-----------+
| ap_clk | clock | ap_clk |
| ap_rst_n | reset | ap_rst_n |
| interrupt | interrupt | interrupt |
| ap_ctrl