我有in std_logic_vector(3 downto 0)
和out std_logic_vector(6 downto 0)
。通过一个过程和案例,我正在检查所有可能的二进制条件,例如when "0000" => output_var <= "1111111";
等。我的程序适用于模拟中输入到输出的所有指定二进制组合。
我在案例中添加了这一额外的行:when "ZZZZ" => output_var <= "0000000";
但是这在模拟(quartus)中输出未定义,当输入是&#34; ZZZZ&#34;时。我可能做错了什么,检查&#34; ZZZZ&#34;不允许?
EDIT1:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity my_entity is
port(
input_var : in std_logic_vector(3 downto 0);
output_var : out std_logic_vector(3 downto 0));
end my_entity;
architecture arch of my_entity is
begin
process(input_var) begin
case input_var is
when "0000" => output_var <= "1011110";
when "0001" => output_var <= "0100000";
when "0010" => output_var <= "0101101"; -- and so on
when "ZZZZ" => output_var <= "0000000"; -- ++
end case;
end process;
end arch;
EDIT2:
最重要的是4输入,底部:扩展7输出;波形模拟(编辑3:对于上面显示的相同的精确代码, - 但是为了演示模拟在ZZZZ时显示的示例)
答案 0 :(得分:4)
您用于验证设计的工具可能不是VHDL模拟器。更可能的是,它是一个逻辑合成器,与门级模拟器相结合。它首先生成设计的门级实现,然后模拟它。
区分VHDL代码的仿真,VHDL代码的合成以及合成结果的仿真非常重要。
让我们从模拟开始
std_logic
是九个值的枚举类型('0'
,'1'
和'Z'
是其中的3个,其他6个是'-'
,{{ 1}},'U'
,'X'
,'H'
,'L'
)。因此,您的4位'W'
std_logic_vector
可以获得9 ^ 4 = 6561个不同的值。您的第一个代码无效,甚至不应该编译,因为您的case语句没有列出选择器的所有可能值。使用特殊选择input_var
,涵盖所有尚未列出的选项,是处理这种情况的一种优雅方式:
others
修复此错误后,您的代码应编译,模拟并生成您期望的确切结果:当选择器取值process (input_var)
begin
case input_var is
when "0000" => output_var <= "1011110";
when "0001" => output_var <= "0100000";
when "0010" => output_var <= "0101101"; -- and so on
when "ZZZZ" => output_var <= "0000000"; -- ++
when others => output_var <= "0000000"; -- others
end case;
end process;
时,输出应取值"ZZZZ"
。对于模拟器"0000000"
只是"ZZZZ"
的可能值之一,没有任何特殊含义,就像input_var
或"1111"
一样。任何有效的模拟器(遵循VHDL标准)都会表现相同。此代码有效。
合成
逻辑综合是组装逻辑门(寄存器,和,或xor,而不是......)来实现VHDL代码行为的过程。在那里,你遇到了一个问题,因为创建能够检测到值"1010"
的硬件非常困难,特别是要将"ZZZZ"
与'Z'
,'H'
和{{1区分开来},这是其他高阻抗值。即使类型仅限于'L'
,'W'
和'0'
('1'
不是这种情况),检测硬件中的高阻抗可能并非不可能,但也很困难。当您使用Quartus时,我猜您的目标是Altera FPGA。 FPGA中没有这种高阻抗检测硬件。
综合后模拟
模拟综合结果让我们回到了模拟(计算机科学)世界。处理弱('Z'
,std_logic
,'Z'
或'L'
)或未知('H'
,'W'
或'U'
)值取决于工具。在大多数情况下,门级模拟器突出显示这些值,因为除极少数情况外,它们是不合需要的,并且是设计或编码错误的结果。并且即使真正的硬件不能传播这些值,该工具也可能选择过度夸大。这是一种警告你出错的方法(再次,除非在极少数情况下,你不想在数字硬件中使用这些值)。
无论如何,你显然设计的是7段控制器。处理'X'
选项中不是'-'
或'0'
的所有值,这些值也将涵盖您上次有效的配置。这应该在模拟,合成和后综合模拟中按预期工作。如果您确实希望在其中一个输入不是'1'
或others
时收到警告,那么在预合成模拟期间,您可以添加一个非可合成的断言,类似于:
'0'