【问题标题】:Can a constant expression ever be valid in a VHDL case statement?常量表达式在 VHDL 案例语句中是否有效?
【发布时间】:2014-08-20 16:37:23
【问题描述】:

我记得在 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

【问题讨论】:

    标签: vhdl verilog system-verilog


    【解决方案1】:

    以下代码与您的示例并不完全平行,但它可能有用:

    这样编译:

    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 在我尝试时没有抱怨 - 综合工具可能是另一回事)。我会说这绝对不是一个好主意。

    【讨论】:

    • 我的问题中的 Verilog 代码只是常量表达式案例的一个示例。我实际上并不想在 VHDL 中重现 Verilog 代码。虽然此答案中的示例可能会编译,但它们看起来不像使用常量 case 表达式提供任何有用的功能。
    • 不,诚然他们没有。因此,我在您的示例中关于A 的观点需要保持不变。在这种情况下,使用常量作为测试值似乎根本不会产生 any 有用的功能。与 Verilog 或任何其他语言相同,就此而言,如果您以传统方式使用 case 语句...
    【解决方案2】:

    不,您不能将案例陈述表达为 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 语句,它们是顺序语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多