在VHDL中,如何检查case语句值部分满足某些信号值,其余部分不满足';没关系吧?

在VHDL中,如何检查case语句值部分满足某些信号值,其余部分不满足';没关系吧?,vhdl,Vhdl,如果是If检查,我可以这样做:val\u q/=“11”,因为我知道我的计数器永远不会达到最大值。我如何在案例陈述中做到这一点 我想要case语句的原因是因为我不想要30+深度的分支 case (my_state_val & val_q) is when ("000" & "00") => do something; when ("001" & "00") => do something else; when ("010" &

如果是If检查,我可以这样做:
val\u q/=“11”
,因为我知道我的计数器永远不会达到最大值。我如何在案例陈述中做到这一点

我想要case语句的原因是因为我不想要30+深度的分支

case (my_state_val & val_q) is
    when ("000" & "00") => do something;
    when ("001" & "00") => do something else;
    when ("010" & "10") => do a 3rd thing;
    when ("100" & "DONT CARE") => do a non-default thing because my_state_val is valid;
    when others => default state or null;
end case;

我最初尝试这样做:

if 1 then
elsif 2 then
...
elsif 25 then
elsif 26 then
elsif 27 then
else
end if;
模拟成功了。然而,我的导师已经习惯了非2008 VHDL,即使它是可合成的,也可能会引起其他工程师的质疑。所以我想要一些通过我们的编码准则的东西

我在这个案例陈述中使用了if-else

case (my_state_val & val_q) is
    when ... => ....;
    ...
    when ("100" & "--") => do something;
    when others => null;
end case;

我建议:


案例(my_state_val&val_q)为
当(“000”和“00”)=>做某事时;
当(“001”和“00”)=>做其他事情时;
当(“010”和“10”)=>做第三件事时;
当其他人=>
如果我的状态值=100,那么
执行非默认操作,因为我的状态值有效
其他的
默认状态或空;
如果结束;
终例

或者这个:


案例(我的状态)是
当(“000”)=>评估值;
当(“001”)=>评估值;
当(“010”)=>评估值;
当(“100”)=>评估val_q;
当others=>默认状态或null时;

终例

没有为
my_state_val
val_q
提供声明,您的案例表达式(
(my_state_val&val_q)
充满冗余括号)仅在-2008年合法,它还提供了具有特定语法的匹配案例陈述(IEEE Std 1076-2008 10.9案例陈述)允许在选项中使用表示标准逻辑值的“-”字符。可能不支持合成(Vivado除外)。如果您的case表达式是标量类型,那么您可以提供一系列值的选择。我的信号也是std#U逻辑#U向量(#downto 0)。我也遇到了类似的问题,最后,我写了一个非常大的if语句,因为我意识到我可以解决它。然而,您的问题似乎已经暗示了对
my_state\u val
信号的优先处理,也许您可以为该特定信号创建一个case语句,然后将每个子案例分解为if语句或case语句。另一种选择是创建类型为
type'(my_state\u val&val\q)的常量
(VHDL 2008)然后你可以把它放在一个大的case语句中?嘿,诵读困难的格鲁法洛,我不想要一个长的if-elsif优先级编码器。如果时间足够长的话,我想这是个时间问题。然而,我确实使用了if语句来检查我的_state_val first等于“100”,否则它将进入case语句。所以我删除了
when(“100”&“->”=>
,因为user1155120让我害怕不可合成的评论。我对您的第一个答案使用了类似的方法,但如果在合成过程中出现错误,我将使用您的版本。
 if my_state_val = "100" then
     my do something here;
 else
     case (my_state_val & val_q) is
        when ... => ....;
        ...
        -- removed "--"
        when others => null;
    end case;
end if;