我记得在Verilog中,在case语句的表达式中使用常量是有效的,但它在VHDL中是否也有效?
// Verilog example
case(1'b1)
A[2]: Y<=2'b11;
A[1]: Y<=2'b10;
A[0]: Y<=2'b01;
default:Y<=2'b00;
endcase
答案 0 :(得分:6)
以下代码与您的示例并不完全平行,但它可能很有用:
编译:
process
constant S : std_logic := '1';
begin
case S is
when '0' =>
when '1' =>
when others =>
end case;
end process;
这样做:
process
begin
case std_logic'('1') is
when '0' =>
when '1' =>
when others =>
end case;
end process;
不:
process
begin
case '1' is
when '0' =>
when '1' =>
when others =>
end case;
end process;
'1'
含糊不清(std_logic
/ character
)。
现在,你实际做的事情有点不同,我不确定你的意图是什么。您似乎想要确定设置的最高位。在VHDL中,如果A
也是常量(案例选择需要局部静态),那么你的构造只能在语法上有效,在这种情况下,有更简单的方法来实现这一点(例如for循环)。但是存在互斥的问题 - 一般情况下,案例选择必然会重叠,我认为这应该是非法的(尽管ModelSim在我尝试时并没有抱怨 - 综合工具可能是另一个故事)。无论如何,我认为这绝对不是一个好主意。
答案 1 :(得分:2)
不,您不能将案例陈述表达为VHDL案例陈述
与Verilog不同,IEEE Std 1364-2005 9.5案例陈述第4段:
案例表达式和案例项表达式可以在 运行;表达式都不需要是一个常量表达式。
在IEEE Std 1076-1993 8.8案例陈述中,第8段(也代表-2008):
简单表达式和离散范围作为案例中的选项给出 语句必须是本地静态的。由离散范围定义的选择 代表相应范围内的所有值。别人的选择 只允许最后一种选择,作为唯一的选择;它 代表在选择中没有给出的所有值(可能没有) 以前的选择。元素简单名称(见7.3.2)不是 允许作为案例陈述备选的选择。
来自术语表:
局部静态表达式:在分析出现的设计单元期间可以评估的表达式。
分析:VHDL设计文件中源代码的语法和语义分析,以及将设计单元的中间形式表示插入到设计库中。
(一种告诉我们编译时间而非详细说明(链接和加载)的奇特方式.VHDL的定义也包含解释性实现。)
本地静态表达式的定义要求A声明为常量,而在VHDL LRM -1993版本中,片名称或索引名称不是本地静态(参见IEEE Std 1076-1993, 7.4.1局部静态原色第1,7.4.2全局静态原色,r。 - 全局静态意味着在精化时间)。对于静态索引表达式或静态索引范围(参见IEEE Std 1076-2008,9.4.2,n。和o。),在IEEE Std 1076-2008中进行了更改。它可能是合成供应商的工具滞后,即使你可以模拟它,你今天很可能无法合成它。
还存在具有相同值的多个选项的问题。参见IEEE Std 1076-1993 8.8案例陈述,第3段(此问题也代表-2008):
表达式必须是离散类型,或者是一维的 数组类型,其元素基类型是字符类型。这种类型必须 可以独立于表达式的上下文来确定 发生,但使用表达式必须是离散的事实 类型或一维字符数组类型。案例中的每个选择 声明替代必须与表达式具有相同的类型;该 选项列表指定表达式的值 选择替代方案。
表达式std_logic&#39;(&#39; 1&#39;)或S的基本类型为std_ulogic。这消除了不属于std_logic基本类型的选择(std_ulogic - &#39; U&#39;&#39; X&#39;,&#39; 0&#39;,&#39; 1&#39 ,&#39; Z&#39;&#39; W&#39;,&#39; L&#39;,&#39; H&#39;,&#39; - &#39;,参见IEEE Std 1076-2008 16.7标准多值逻辑包和附件A脚注15,它提供了包std_logic_1164的源代码链接。
请注意,fru1tbat显示了选择&#39; 0&#39;,&#39; 1&#39;和其他人一样,对表达式A(2),A(1)或A(0)的评估会返回一个std_ulogic子类型,并为您提供多个表示相同值的选择(&#39; 1&#39;)。参见IEEE Std 1076-1993,8.8 para 7:
对于其他形式的表达式,(基本)类型的每个值 表达式必须在集合中表示一次且仅表示一次 选择,不允许其他任何值。
因此,案例陈述不能在VHDL中直接表达,我们只对A(2),A(1)和A(0)是&#39; 1&#39;并且只允许一个选择。相反,我们可以使用条件信号赋值语句:
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语句,这些语句是顺序语句。