【问题标题】:VHDL: use WHEN - ELSE statement with variablesVHDL:使用带有变量的 WHEN - ELSE 语句
【发布时间】:2014-03-15 00:00:57
【问题描述】:

问题
我正在一个包中编写一个函数,它为测试台转换一些值。我想检查输出是否超过最大值,如果是,我想将其设置为该最大值。我累的是以下几点:

  -- vec_in: 0...1023, returns -14...23.5 dB
  function conv_dac602_scale (
    vec_in : std_logic_vector)
    return real is
    variable val_in, dB : real := 0.0;
    constant lower : real := -14.0;
    constant upper : real := 23.5;
  begin  -- function conv_dac602_scale
    val_in := real(to_integer(unsigned(vec_in)));
    dB := (lower+(val_in*((upper-lower)/1024.0)));
    return dB when dB <= upper else upper;  -- this is the important line! (129)
  end function conv_dac602_scale;

当我尝试编译时,出现以下错误:

** Error: myfile.vhd(129): near "when": expecting ';'
** Error: myfile.vhd(260): VHDL Compiler exiting

然后我尝试先将其分配给变量 r:

  ...
    r := dB when dB <= upper else upper;  -- this is the important line! (129)
    return r;
  end function conv_dac602_scale;

这并没有改变结果。我知道我可以改用简单的if/else 子句,但我的问题是为什么我不能使用when 子句。

系统
Modelsim SE 10.0b,VHDL 2008

【问题讨论】:

    标签: vhdl modelsim


    【解决方案1】:

    target &lt;= signal when x 是一个所谓的并发语句,旨在轻松创建进程外的信号分配。您可以在架构中使用它,但不能在进程中使用。 if 和 else 是为进程中的顺序语句而设计的。在您的情况下,您必须使用 if/else。

    编辑: 似乎这只适用于 2008 年前的 Vhdl。正如 fru1tbat 指出的那样,这是有效的 vhdl 2008 代码,问题是 Modelsim 编译器不支持的功能。

    【讨论】:

    • 使用 VHDL-2008,允许在顺序进程中进行并发分配。问题可能是 ModelSim 10.0b 不支持这种结构(我手边没有 10.0b,但 10.1 编译它就好了)。
    • 不知道。我必须查一下,在某些情况下听起来很不错:)
    • @fru1tbat 我得试试 aldec。
    • 我应该澄清一下,它编译 with 您在首先分配给变量的位置所做的调整。你仍然不能做“return ... when ... else”。
    【解决方案2】:

    我会重新考虑更改您调用退货的方式,因为您使用 WHEN 的语法看起来不正确。

    澄清你要做什么:

    return dB when dB <= upper else upper;
    

    这本质上是“当dB 小于或等于upper 时返回dB,否则为上”,其中upper 将不会因为您制作return 语句的方式而被返回。你可能想说:... else return upper

    在这种情况下,我更喜欢if 声明:

    if ( dB <= upper) then
         return dB;
    else
         return upper;
    end if;
    

    【讨论】:

    • 怎么什么都不做?它本质上是“如果值大于限制,则返回限制”,这对我来说似乎完全合理(除了首先将它与“返回”一起使用的问题)。
    • 它不会返回upper,因为他做出返回声明的方式。
    • 对不起,我将您的陈述解释为质疑这个想法,而不是语法。从概念上讲,它是完全有效的。
    • 不用担心。我将在我的回复中澄清这一点。谢谢!
    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多