代码之家  ›  专栏  ›  技术社区  ›  Katu

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

  •  0
  • Katu  · 技术社区  · 7 年前

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

    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。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Matthew Taylor    7 年前

    幸运的是,既然你的怪人在左边,你可以这样做:

    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

    上帝抵抗军说

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

    像泥一样清澈。

        2
  •  1
  •   Katu    6 年前

    我找到了另一种方法,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);
    
        3
  •  0
  •   Tricky    6 年前

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

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