如何检查;ZZZZ";VHDL中的输入?

如何检查;ZZZZ";VHDL中的输入?,vhdl,quartus,Vhdl,Quartus,我有一个输入标准逻辑向量(3到0)和一个输出标准逻辑向量(6到0)。通过一个过程和案例,我正在检查所有可能的二进制条件,例如当“0000”=>output\u var output\u var output\u var output\u var output\u var output\u var用于验证设计的工具可能不是VHDL模拟器。更可能的是,它是一个逻辑合成器,与门级模拟器相结合。它首先生成设计的门级实现,然后模拟它 区分VHDL代码的模拟、VHDL代码的合成和合成结果的模拟是非常重要的

我有一个
输入标准逻辑向量(3到0)
和一个
输出标准逻辑向量(6到0)
。通过一个过程和案例,我正在检查所有可能的二进制条件,例如当“0000”=>output\u var output\u var output\u var output\u var output\u var output\u var用于验证设计的工具可能不是VHDL模拟器。更可能的是,它是一个逻辑合成器,与门级模拟器相结合。它首先生成设计的门级实现,然后模拟它

区分VHDL代码的模拟、VHDL代码的合成和合成结果的模拟是非常重要的

  • 让我们从模拟开始

    std\U逻辑
    是一种九值枚举类型(
    '0'
    '1'
    'Z'
    是其中的3个,其他6个是
    '-'
    'U'
    'X'
    'H'
    'L'
    'W'
    )。因此,您的4位
    std_逻辑_向量
    input_var
    可以采用9^4=6561个不同的值。您的第一个代码无效,甚至不应该编译,因为您的case语句没有列出选择器的所有可能值。使用特殊选项
    其他
    ,涵盖所有尚未列出的选项,是处理此类情况的一种优雅方式:

    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;
    

    案例陈述是在测试台上还是在可合成的块/模块中?@ahmedus抱歉,我对这个主题的理解不够,无法理解这个问题。我有一个vhdl文件,其中包含我编译的实体和体系结构。之后,我创建了一个“University program VWF”文件,从编译的节点中导入节点,并设置一些用于模拟/测试的输入波形。全套Quartus Prime Lite软件。@ahmedus谢谢。您能给我推荐一些关键字吗?我可以查一下,以了解为什么输出可以是Z,但输入检查不能是Z?IEEE Std 1076-2008 16.8.2.4.10高阻抗值(“Z”)的解释第4段-当静态高阻抗值出现在赋值语句中的值表达式以外的任何上下文中时,合成工具应将其视为等同于静态金属值。16.8.2.4.5金属值作为案例陈述第1段(部分)中的选择-如果金属值作为选择出现,或作为选择的一个元素出现,则在由合成工具解释的案例陈述中,合成工具应将选择解释为永远不会出现的选择@user1155120我编辑了这个问题,添加了代码的相关部分。回答得很好。但最好使用标准化函数
    std\u logic\u 1164
    中的,如果通过,
    to_x01
    可能成功?
    ieee标准逻辑_1164.is_x
    略有不同:它在
    L
    H
    上返回false。这就是为什么我建议跟进
    to_x01
    ,以解决弱高和弱低的问题……是的,但是
    to_x01
    'L'
    转换为
    '0'
    'H'
    转换为
    '1'
    。我并不是说这是一个错误的想法,只是它不同于我提出的
    is\u 01
    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;
    
    architecture arch of my_entity is
    
      function is_01(v: std_logic_vector) return boolean is
      begin
        for i in v'range loop
          if v(i) /= '0' and v(i) /= '1' then
            return false;
          end if;
        end loop;
        return true;
      end function is_01;
    
    begin
    
    -- pragma synthesis_off
      assert is_01(input_var) report "Invalid input" severity error; 
    -- pragma synthesis_on
    
      process (input_var) 
      begin
        case input_var is
          when "0000" => output_var <= "1011110";
          when "0001" => output_var <= "0100000";
          when others => output_var <= "0101101"; -- others, including "0010"
        end case;
      end process;
    
    end architecture arch;