不,您不能将案例陈述表达为 VHDL 案例陈述
与 Verilog 不同,IEEE Std 1364-2005 9.5 案例声明第 4 段:
case 表达式和 case item 表达式可以在
运行;两个表达式都不需要是常量表达式。
在 IEEE Std 1076-1993 8.8 案例声明中,第 8 段(也代表 -2008):
在案例中作为选择给出的简单表达式和离散范围
语句必须是本地静态的。由离散范围定义的选择
代表相应范围内的所有值。别人的选择是
只允许最后一个选择并且作为它的唯一选择;它
代表未在选择中给出的所有值(可能没有)
以前的替代品。元素简单名称(见 7.3.2 )不是
允许作为 case 语句替代的选择。
来自词汇表:
本地静态表达式:可以在分析它所在的设计单元期间评估的表达式。
分析:对 VHDL 设计文件中的源代码进行句法和语义分析,并将设计单元的中间形式表示插入设计库。
(告诉我们编译时间而不是细化(链接和加载)的一种奇特方式。VHDL 的定义也包含解释性实现。)
本地静态表达式的定义要求将 A 声明为常量,并且在 VHDL LRM -1993 版本中,切片名称或索引名称不是本地静态的(参见 IEEE Std 1076-1993, 7.4. 1 局部静态初选,第 1 段,7.4.2 全局静态初选,r. - 全局静态意味着在细化时)。这在 IEEE Std 1076-2008 中针对静态索引表达式或静态索引范围进行了更改(参见 IEEE Std 1076-2008, 9.4.2, n. and o.)。可能是合成供应商的工具滞后,即使您可以模拟它,您今天也可能无法合成它。
还有多个选择具有相同值的问题。参见 IEEE Std 1076-1993 8.8 Case statement, 第 3 段(也代表 -2008 对此问题):
表达式必须是离散类型,或者是一维的
其元素基类型为字符类型的数组类型。这种类型必须
可以独立于表达式所在的上下文来确定
发生,但使用表达式必须是离散的事实
类型或一维字符数组类型。案例中的每一个选择
语句替代必须与表达式的类型相同;这
选择列表指定表达式的哪些值
选择了替代方案。
表达式 std_logic'('1') 或 S 的基本类型为 std_ulogic。这消除了不属于 std_logic 基本类型的选择(std_ulogic - 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '- ',参见 IEEE Std 1076-2008 16.7 标准多值逻辑包和附件 A 脚注 15,它提供了包 std_logic_1164 的源链接)。
注意 fru1tbat 显示选项 '0'、'1' 和其他选项,表达式 A(2)、A(1) 或 A(0) 的计算返回一个 std_ulogic 子类型,并会为您提供表示相同值的多个选项 ( '1')。参见 IEEE Std 1076-1993, 8.8 第 7 段:
对于其他形式的表达式,每个(基)类型的值
表达式必须在集合中表示一次且仅一次
选项,并且不允许其他值。
因此,case 语句不能直接用 VHDL 表达,我们只对 A(2)、A(1) 和 A(0) 为“1”且只允许一个选择的情况感兴趣。相反,我们可以使用条件信号赋值语句:
library ieee;
use ieee.std_logic_1164.all;
entity constexp is
end entity;
architecture foo of constexp is
signal A: std_logic_vector (2 downto 0) := "001";
signal Y: std_logic_vector (1 downto 0);
begin
COND: -- Conditional Signal Assignment statement
Y <= "11" when A(2) = '1' else
"10" when A(1) = '1' else
"01" when A(0) = '1' else
"00";
end architecture;
(并且本设计规范分析、阐述和模拟。)
条件信号赋值是 1076-1993 标准中的并发语句(参见 9.5.1 条件信号赋值),而条件信号赋值在 1076 中也可以用作顺序语句-2008 标准(参见 11.6 并发信号分配语句和 10.5.3 条件信号分配)。今天,合成供应商很可能符合 -1993 标准。
根据定义,这里的任何构造都可以转化为 if 语句,它们是顺序语句。