如何检查;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;