VHDL将有符号变量长度初始化为最大值

VHDL将有符号变量长度初始化为最大值,vhdl,Vhdl,我有一个函数,当它可以用给定的长度作为参数表示时,它返回值变量。如果值超出限制,则应根据值的符号返回最大可能值或最大负值 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'); c

我有一个函数,当它可以用给定的长度作为参数表示时,它返回值变量。如果值超出限制,则应根据值的符号返回最大可能值或最大负值

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;
函数截断(
值:在签名中;
长度:整数)
已签署的报税表
常量最大正数值:有符号(长度-1到0):=((长度-1)=>“0”,其他=>“1”);
常量最大负值:有符号(长度-1到0):=((长度-1)=>“1”,其他=>“0”);
变量返回值:有符号(长度-1到0):=(其他=>“0”);
开始
如果(值>=最大正值),则
返回值:=最大正值;

elsif(value幸运的是,由于您的单兵出局在左侧,您可以执行以下操作:

constant max_positive_value  : signed(length-1 downto 0) := ('0', others => '1');
constant max_negative_value  : signed(length-1 downto 0) := ('1', others => '0');

LRM说

除了与单一选择的最终元素关联之外, 数组聚合的其余元素关联(如果有) 应为全位置的或全命名的。一个 允许数组聚合具有非本地的选项 静态,或者类似地,选择为空范围,仅当 聚合包括单个元素关联和此元素 关联只有一个选项。如果 适用的索引约束是局部静态的


这就像泥浆一样清晰。

我找到了另一种方法,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);

另一种方法是在本地声明一个常量,以解决旧的“非本地静态”VHDL问题:

constant C_LEN : integer := length
constant max_negative_value  : signed(length-1 downto 0) := ((C_LEN-1) => '1', others => '0');

这修复了GHDL中的错误,但modelsim vcom仍然显示警告
非本地静态其他选择仅当它是唯一关联的唯一选择时才允许。
在发布我的答案之前,我在其他两个模拟器上尝试了它,碰巧我发现两个都很高兴。我刚刚尝试了另一个,它具有相同的操作作为Modelsim,我必须考虑到LRM的惊人清晰性。EDA代码长度的函数调用参数是一个局部静态表达式(
V5:=truncate(V,5);
)。函数声明部分中的常量声明在详细说明参数列表后的运行时详细说明。请注意,这是Modelsim警告,除非使用-pendanticerrors(未提供的特定消息编号请参见verror)。-IEEE Std 10761993 7.3.3函数调用“函数调用的求值包括对调用中指定的实际参数表达式的求值…”2.1子程序声明、2.1.1形式参数、2.1.1常量和变量参数,“对于具有标量类型或访问类型参数的非外文子程序,参数通过副本传递。“复制的方式没有定义,而7.3.3说实际的参数表达式是经过计算的。s/others/(length-2 down to 0)/但Katu的回答不那么老练。这并不能避免使用Quartus vcom编译警告消息