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