VHDL 错误 - 未解析的信号 "dec" 是乘法驱动的,这是什么错误?
VHDL error - unresolved signal "dec" is multiply driven, what is this error?
所以我的小组 运行 遇到了我们项目的错误,给出了错误消息:
[XSIM 43-3249] 文件 C:/Users/hp/Desktop/correct_file_WTB/correct_file_WTB/project/project.srcs/sources_1/new/Sports_venue.vhd,第 53 行。未解析的信号“dec”是乘法驱动的。
我们已经尝试做一些研究,我认为这与我们将向量加在一起只是一个信号这一事实有关,但我可能完全错了,因为我对 VHDL 的了解不是很好。我用这个网页来研究这个问题并试图理解它,但我仍然感到困惑:https://forums.xilinx.com/t5/Simulation-and-Verification/Vivado-2015-4-Simulator-XSIM-43-3249-Unresolved-signal-quot-from/td-p/777979
我也查看了此网站上提出的类似问题,但我觉得情况差异太大,无法将解决方案正确实施到我自己的代码中。
解释我们的项目,让任何帮助我们了解我们正在努力实现的目标:我们正在设计 12 个计数器,用于计算在通用体育场观看体育比赛的人数,这 12 个计数器计算 12 个座位区的入场人数对于与会者,我们然后制作了一个加法器,它将获取计数器的所有输出并将它们加在一起以获得总出席人数,这最终大约是一个 12 位数字左右,然后我们将其转换为二进制编码的十进制数,并转化为4个4位数字,以便将数据发送到4个7段显示器显示出勤总数的每一位数字。
这是我们编写的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Sports_venue is
Port(enable_in, reset_in, updown_in : in std_logic_vector(0 to 11);
seg_1, seg_2, seg_3, seg_4 : out std_logic_vector(3 downto 0));
end Sports_venue;
architecture Behavioral of Sports_venue is
type counter_output is array (positive range <>) of unsigned (7 downto 0);
component counter
port(CLK, enable, reset, updown : in std_logic;
Q : out unsigned(7 downto 0));
end component;
signal enable, reset, updown : std_logic_vector(1 to 12);
signal CLK_TB : std_logic;
signal adder_input : counter_output(1 to 12);
signal add_output : unsigned(11 downto 0);
signal dec, z : integer;
begin
CLK_loop : process
begin
while now <= 3000ns loop
CLK_TB <= '1';
wait for 5 ns;
CLK_TB <= '0';
wait for 5 ns;
end loop;
wait;
end process;
add_output <= unsigned(adder_input(12) + adder_input(1) + adder_input(2) + adder_input(3)
+ adder_input(4) + adder_input(5)+ adder_input(6) + adder_input(7) + adder_input(8)
+ adder_input(9) + adder_input(10) + adder_input(11));
dec <= to_integer(add_output);
seg_1_loop : process(dec)
begin
case dec is
when 0 to 999 => z <= 0;
when 1000 to 1999 => z <= 1;
when 2000 to 2999 => z <= 2;
when 3000 => z <= 3;
when others => z <= 0;
end case;
if( z = 0) then
seg_1 <= "0000";
elsif( z = 1) then
dec <= dec - 1000;
seg_1 <= "0001";
elsif(z = 2) then
dec <= dec - 2000;
seg_1 <= "0010";
elsif(z = 3) then
dec <= dec - 3000;
seg_1 <= "0011";
end if;
end process;
counter_gen:
for i in 1 to 12 generate
counterX: counter
port map (CLK => CLK_TB, enable => enable(i), reset => reset(i), updown => updown(i), Q => adder_input(i));
end generate;
end Behavioral;
我删除了部分完整代码,仅显示我认为存在问题的部分,如果您觉得需要其余部分,我可以重新添加这些部分。
谢谢。
信号dec正在不同的地方分配;它有多个驱动程序。你在进程seg_1_loop之前使用并发语句给dec赋值。然后,您还可以在该进程中为 dec 分配一个值。这是语言不允许的。
这里发生的是所有并发语句都是连续执行的,而不是顺序执行的。因此,dec 不断更新为 add_output。通过尝试在此过程中为其分配一个值,您会在它应该具有的值之间产生冲突。您的模拟器非常正确地将此识别为语法错误。
所以我的小组 运行 遇到了我们项目的错误,给出了错误消息:
[XSIM 43-3249] 文件 C:/Users/hp/Desktop/correct_file_WTB/correct_file_WTB/project/project.srcs/sources_1/new/Sports_venue.vhd,第 53 行。未解析的信号“dec”是乘法驱动的。
我们已经尝试做一些研究,我认为这与我们将向量加在一起只是一个信号这一事实有关,但我可能完全错了,因为我对 VHDL 的了解不是很好。我用这个网页来研究这个问题并试图理解它,但我仍然感到困惑:https://forums.xilinx.com/t5/Simulation-and-Verification/Vivado-2015-4-Simulator-XSIM-43-3249-Unresolved-signal-quot-from/td-p/777979
我也查看了此网站上提出的类似问题,但我觉得情况差异太大,无法将解决方案正确实施到我自己的代码中。
解释我们的项目,让任何帮助我们了解我们正在努力实现的目标:我们正在设计 12 个计数器,用于计算在通用体育场观看体育比赛的人数,这 12 个计数器计算 12 个座位区的入场人数对于与会者,我们然后制作了一个加法器,它将获取计数器的所有输出并将它们加在一起以获得总出席人数,这最终大约是一个 12 位数字左右,然后我们将其转换为二进制编码的十进制数,并转化为4个4位数字,以便将数据发送到4个7段显示器显示出勤总数的每一位数字。
这是我们编写的代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity Sports_venue is
Port(enable_in, reset_in, updown_in : in std_logic_vector(0 to 11);
seg_1, seg_2, seg_3, seg_4 : out std_logic_vector(3 downto 0));
end Sports_venue;
architecture Behavioral of Sports_venue is
type counter_output is array (positive range <>) of unsigned (7 downto 0);
component counter
port(CLK, enable, reset, updown : in std_logic;
Q : out unsigned(7 downto 0));
end component;
signal enable, reset, updown : std_logic_vector(1 to 12);
signal CLK_TB : std_logic;
signal adder_input : counter_output(1 to 12);
signal add_output : unsigned(11 downto 0);
signal dec, z : integer;
begin
CLK_loop : process
begin
while now <= 3000ns loop
CLK_TB <= '1';
wait for 5 ns;
CLK_TB <= '0';
wait for 5 ns;
end loop;
wait;
end process;
add_output <= unsigned(adder_input(12) + adder_input(1) + adder_input(2) + adder_input(3)
+ adder_input(4) + adder_input(5)+ adder_input(6) + adder_input(7) + adder_input(8)
+ adder_input(9) + adder_input(10) + adder_input(11));
dec <= to_integer(add_output);
seg_1_loop : process(dec)
begin
case dec is
when 0 to 999 => z <= 0;
when 1000 to 1999 => z <= 1;
when 2000 to 2999 => z <= 2;
when 3000 => z <= 3;
when others => z <= 0;
end case;
if( z = 0) then
seg_1 <= "0000";
elsif( z = 1) then
dec <= dec - 1000;
seg_1 <= "0001";
elsif(z = 2) then
dec <= dec - 2000;
seg_1 <= "0010";
elsif(z = 3) then
dec <= dec - 3000;
seg_1 <= "0011";
end if;
end process;
counter_gen:
for i in 1 to 12 generate
counterX: counter
port map (CLK => CLK_TB, enable => enable(i), reset => reset(i), updown => updown(i), Q => adder_input(i));
end generate;
end Behavioral;
我删除了部分完整代码,仅显示我认为存在问题的部分,如果您觉得需要其余部分,我可以重新添加这些部分。
谢谢。
信号dec正在不同的地方分配;它有多个驱动程序。你在进程seg_1_loop之前使用并发语句给dec赋值。然后,您还可以在该进程中为 dec 分配一个值。这是语言不允许的。
这里发生的是所有并发语句都是连续执行的,而不是顺序执行的。因此,dec 不断更新为 add_output。通过尝试在此过程中为其分配一个值,您会在它应该具有的值之间产生冲突。您的模拟器非常正确地将此识别为语法错误。