FPGA之道(26)VHDL初始化
VHDL初始化
未初始化的信号会对芯片的行为有什么影响
信号最终都会对应到存储单元或者连线上,对于组合逻辑的信号,在FPGA上的归属应该是连线,而对于时序逻辑的信号,在FPGA上的归属上应该是寄存器、查找表、块存储等存储单元。
对于连线类的信号,是否初始化对于芯片的行为几乎没有影响,因为芯片一上电后,整个FPGA的输入就由客观环境确定了,那么的连线被高电平驱动源驱动就是高电平,被低电平驱动源驱动就呈现低电平。而不会因为你给信号赋了初值而影响这个结果,否则这也就不是一个组合逻辑了。
对于类似寄存器类的存储单元信号,如果不赋初值的话,不同FPGA芯片型号的默认的上电状态会不同。有的是上电自动存储高电平,有的是自动存储低电平。由于时序逻辑的运算结果很多时候是和当前存储单元中存储的数值有关的,所以这类信号如果未赋初值,很可能造成设计在不同的芯片上运行结果的不同,这是比较危险的。
当然了,也许有的编译器或者芯片型号不支持赋初值的操作,那么这个时候一定要注意复位逻辑的编写。
初始化与仿真
初始化与仿真是息息相关的,无论是连线类还是存储类的信号,若没有初始化,在仿真的一开始都会出现不可确定的波形,如果是std_logic类型的话,就会显示’U’。
对于连线类信号,只要在后续给定输入,那么输出端的连线还是能够回归正常结果的。
但是对于存储类的信号,例如寄存器,如果这个寄存器存在反馈,例如:
signal a : std_logic;
process(clk)
begin
if(clk'event and clk = '1')then
a <= not a;
end if;
end process;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
那么对于a信号,仿真器将永远不可能给出确定的仿真结果。
- 1
如何初始化
初始化一般是在定义时,配合“:=”赋值符号进行的,例如:
signal a : std_logic := '1';
variable b : integer := 512;
port(…
c : in std_logic_vector(3 downto 0) := "1010";
…);
- 1
- 2
- 3
- 4
- 5
对于数组类型的信号,参考如下方法:
type rt is array (1 downto 0) of std_logic_vector (7 downto 0);
signal r0: rt := (X"11", X"88");
- 1
- 2
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/104272422
- 点赞
- 收藏
- 关注作者
评论(0)