常量表达式在VHDL case语句中是否有效?
我记得在Verilog中,在case语句的表达式中使用常量是有效的,但在VHDL中也是有效的吗常量表达式在VHDL case语句中是否有效?,vhdl,verilog,system-verilog,Vhdl,Verilog,System Verilog,我记得在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 //Verilog示例 箱子(1'b1) A[2]:Y以下代码与您
// 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
//Verilog示例
箱子(1'b1)
A[2]:Y以下代码与您的示例并不完全平行,但它可能很有用:
这包括:
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;
这并不是:
'1'
不明确(std\u逻辑
/字符
)
现在,你实际上做的有点不同,我不确定你的意图是什么。您似乎想要确定设置的最高位。在VHDL中,只有当A
也是常量时(案例选择需要是局部静态的),您的构造才会在语法上有效,在这种情况下,有更简单的方法来实现这一点(例如for循环)。但存在互斥的问题——一般来说,案例选择必然会重叠,我认为这应该是非法的(尽管ModelSim在我尝试时没有抱怨——合成工具可能是另一回事)。我想说,无论如何,这绝对不是一个好主意。不,您不能将case语句表示为VHDL case语句
与Verilog不同,IEEE标准1364-2005 9.5案例陈述第4段:
可以在以下位置计算案例表达式和案例项表达式:
运行时间;这两个表达式都不要求是常量表达式
在IEEE标准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标准1076-2008对静态索引表达式或静态索引范围作了更改(见IEEE标准1076-2008,9.4.2,n.和o.)。很可能是合成工具滞后,即使你能模拟它,你今天也不能合成它
还有一个问题是具有相同价值的多项选择。参见IEEE Std 1076-1993 8.8案例陈述,第3段(也代表-2008年的本问题):
表达式必须是离散类型或一维表达式
数组类型,其元素基类型为字符类型。这种类型必须
可以独立于表达式所在的上下文来确定
发生,但使用表达式必须为离散表达式这一事实
类型或一维字符数组类型。一个案例中的每个选择
语句替换必须与表达式的类型相同;这个
选项列表指定表达式的哪些值
选择替代方案
其中表达式std_logic'('1')或S的基类型为std_ulogic。这消除了非标准逻辑基本类型的选择(标准逻辑-‘U’、‘X’、‘0’、‘1’、‘Z’、‘W’、‘L’、‘H’、‘Z’、‘W’、‘L’、‘H’、’-’,参见IEEE标准1076-2008 16.7标准多值逻辑包和附录A脚注15,其中提供了到标准逻辑包1164源的链接)
请注意,fru1tbat显示了选项“0”、“1”和其他选项,表达式A(2)、A(1)或A(0)的求值将返回一个标准逻辑子类型,并将为您提供表示相同值(“1”)的多个选项。见IEEE标准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;
ieee库;
使用ieee.std_logic_1164.all;
实体constexp是
终端实体;
constexp的体系结构foo是
信号A:std_逻辑_向量(2到0):=“001”;
信号Y:标准逻辑向量(1到0);
开始
COND:--条件信号分配语句
我问题中的Verilog代码只是一个常量表达式的例子。我其实并不想用VHDL来重现Verilog代码。虽然这个答案中的例子可以编译,但它们看起来不像使用常量case表达式提供了任何有用的函数。不,不,不可否认,它们没有。因此,我在您的示例中关于A
的观点需要保持不变。在这种情况下,使用常量作为测试值似乎根本不会产生任何有用的函数。与Verilog或任何其他语言一样,如果您以传统方式使用案例陈述。。。
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;