如何解决VHDL 错误 - 未解析的信号“dec”被乘法驱动,这是什么错误?
所以我的小组在我们的项目中遇到了一个错误,并给出了错误消息:
[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,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 值。通过尝试在过程中为其分配值,您会在它应该具有的值之间产生冲突。您的模拟器非常正确地将此识别为语法错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。