VHDL:使用带变量的WHEN - ELSE语句

时间:2014-03-13 12:53:28

标签: vhdl modelsim

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

  -- 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

2 个答案:

答案 0 :(得分:3)

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

编辑: 似乎这只适用于Vhdl pre 2008.由于fru1tbat pointet out,这是有效的vhdl 2008代码,而且问题是Modelsim编译器不支持的功能。

答案 1 :(得分:0)

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

澄清你想要做的事情:

return dB when dB <= upper else upper;

dB小于或等于dB时,基本上是“返回upper,否则由于您的制作方式而不会返回upper退货声明。您可能想说:... else return upper

在这种情况下我更喜欢if语句:

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