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。通过尝试在此过程中为其分配一个值,您会在它应该具有的值之间产生冲突。您的模拟器非常正确地将此识别为语法错误。