有时,做某事的方法不止一种。好的,大多数时候,您可以在 VHDL 中以多种方式做事。查看您想要根据另一个信号的值为信号分配不同值的情况。
选定的信号分配
最具体的方法是使用 as selected 信号分配。根据 的几个可能值b
,您为 分配一个值a
。这里的代码没有冗余。
with a select b <=
"1000" when "00",
"0100" when "01",
"0010" when "10",
"0001" when "11";
条件信号分配
条件信号分配的构造更通用一些。对于每个选项,您必须给出一个条件。这意味着您可以将任何布尔表达式编写为条件,这比相等检查给您更多的自由。虽然这个结构会给你更多的自由,但也有更多的冗余。a =
我们必须在每一行上写相等检查 ( )。如果你使用一个名字很长的信号,这会使你的代码变得更庞大。此外,所选信号分配中使用的分隔符是逗号。在条件信号分配中,您需要else
关键字。相同功能的更多代码。
b <= "1000" when a = "00" else
"1000" when a = "01" else
"1000" when a = "10" else
"1000" when a = "11";
结合案例陈述的过程
最常用的构造是过程。在此过程中,您可以编写 case 语句或 if 语句的级联。这里有更多的冗余。您的流程(开始、结束)和敏感度列表的框架代码。这不是一个很大的努力,但是当我起草这个时,我把b
敏感列表而不是a
. 容易犯一个小错误。您还需要指定案例中发生的other
情况。
process(a)
begin
case a is
when "00" => b <= "1000";
when "01" => b <= "0100";
when "10" => b <= "0010";
when "11" => b <= "0001";
when others => assert "unreachable" severity failure;
end case;
end process;
虽然最后一个代码片段是最大的并且可能最容易出错,但它也可能是最常见的。它使用两个熟悉且经常使用的结构:过程和案例陈述。
选择和条件信号分配的问题在于它们的语法中没有系统。含义几乎相同,但语法不同,足以让您失望。我认识许多工程师,他们的办公桌上永远有一本 Doulos Golden Reference Guide to VHDL。这对 Doulos 有好处,因为他们的名字一直被提及。