如何检查" ZZZZ"用VHDL输入?

时间:2017-07-22 17:16:24

标签: vhdl quartus

我有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时显示的示例)

enter image description here

1 个答案:

答案 0 :(得分:4)

您用于验证设计的工具可能不是VHDL模拟器。更可能的是,它是一个逻辑合成器,与门级模拟器相结合。它首先生成设计的门级实现,然后模拟它。

区分VHDL代码的仿真,VHDL代码的合成以及合成结果的仿真非常重要。

  1. 让我们从模拟开始

    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标准)都会表现相同。此代码有效。

  2. 合成

    逻辑综合是组装逻辑门(寄存器,和,或xor,而不是......)来实现VHDL代码行为的过程。在那里,你遇到了一个问题,因为创建能够检测到值"1010"的硬件非常困难,特别是要将"ZZZZ"'Z''H'和{{1区分开来},这是其他高阻抗值。即使类型仅限于'L''W''0''1'不是这种情况),检测硬件中的高阻抗可能并非不可能,但也很困难。当您使用Quartus时,我猜您的目标是Altera FPGA。 FPGA中没有这种高阻抗检测硬件。

  3. 综合后模拟

    模拟综合结果让我们回到了模拟(计算机科学)世界。处理弱('Z'std_logic'Z''L')或未知​​('H''W''U')值取决于工具。在大多数情况下,门级模拟器突出显示这些值,因为除极少数情况外,它们是不合需要的,并且是设计或编码错误的结果。并且即使真正的硬件不能传播这些值,该工具也可能选择过度夸大。这是一种警告你出错的方法(再次,除非在极少数情况下,你不想在数字硬件中使用这些值)。

  4. 无论如何,你显然设计的是7段控制器。处理'X'选项中不是'-''0'的所有值,这些值也将涵盖您上次有效的配置。这应该在模拟,合成和后综合模拟中按预期工作。如果您确实希望在其中一个输入不是'1'others时收到警告,那么在预合成模拟期间,您可以添加一个非可合成的断言,类似于:

    '0'
相关问题