该示例将使用已解析的信号来显示波形,因此问题将由
X
元值指示。
给出这段代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY ent IS
END ENTITY ent;
ARCHITECTURE arch OF ent IS
SIGNAL slv : std_logic_vector(3 DOWNTO 0) := x"0";
SIGNAL i0 : integer RANGE 3 DOWNTO 0 := 0;
SIGNAL i1 : integer RANGE 3 DOWNTO 0 := 2;
SIGNAL clk : std_logic := '0';
BEGIN
PROCESS IS
BEGIN
WAIT FOR 1 NS;
clk <= NOT clk;
END PROCESS;
slv(i0) <= '1' WHEN rising_edge(clk);
slv(i1) <= '1' WHEN rising_edge(clk);
END ARCHITECTURE arch;
详细分析并使用这些命令运行:
ghdl -a --std=08 ex.vhdl
ghdl -e --std=08 ent
ghdl -r ent --wave=wave.ghw --stop-time=10ns
这是波形:
信号的行为就好像有另一个全 0 的赋值,即使我没有在这里写任何类似的东西。
我已经使用分辨率函数来测试(未在 MRE 中显示以保持 MRE 最小),并且似乎确实在每个信号分配上也分配了初始值。
当只分配一个信号或两个索引都恒定时,不会发生这种额外的分配,并且一切都按照我的预期运行。
这是为什么?
你有一个初始化语句:
SIGNAL slv : std_logic_vector(3 DOWNTO 0) := x"0";
这解释了为什么所有
slv
位从一开始就是 0
。
随着
clk
的上升沿,您的设计仅分配给四个位中的两个。所以其他人就变成了X
。