我有以下函数,当可以使用给定的长度作为参数表示值时,它返回值变量。如果值超出限制,则应根据值的符号返回最大可能值或最大负值。
function truncate (
value : in signed;
length : in integer)
return signed is
constant max_positive_value : signed(length-1 downto 0) := ((length-1) => '0', others => '1');
constant max_negative_value : signed(length-1 downto 0) := ((length-1) => '1', others => '0');
variable return_value : signed(length-1 downto 0) := (others => '0');
begin
if (value >= max_positive_value) then
return_value := max_positive_value;
elsif (value <= max_negative_value) then
return_value := max_negative_value;
else
return_value := resize(value, length);
end if;
return return_value;
end;
问题是max_positive_value
和max_negative_value
的初始化。 GHDL抱怨not static choice exclude others choice
。
如果长度可变,如何初始化极限值?
我正在使用VHDL 93。
答案 0 :(得分:1)
幸运的是,由于您的单人出局在左边,因此您可以执行以下操作:
constant max_positive_value : signed(length-1 downto 0) := ('0', others => '1');
constant max_negative_value : signed(length-1 downto 0) := ('1', others => '0');
https://www.edaplayground.com/x/64S7
LRM说
除了与单选其他元素的最终元素关联外, 数组聚合的其余元素关联(如果有) 应全部为位置或全部命名。的命名关联 允许数组聚合具有非本地选择 静态,或者同样是一个空范围的选择,仅当 集合包括单个元素关联,并且此元素 协会只有一个选择。其他选择在本地是静态的,如果 适用的索引约束是局部静态的。
像泥一样清澈。
答案 1 :(得分:1)
我找到了另一种方法,Modelsim无需警告即可接受它,但长度必须小于32:
constant max_positive_value : signed(length-1 downto 0) := to_signed(2**(length-1)-1, length);
constant max_negative_value : signed(length-1 downto 0) := to_signed(-2**(length-1), length);
答案 2 :(得分:0)
另一种方法是在本地声明一个常量,以解决旧的“非本地静态” VHDL问题:
.+@.+\..+