VHDL инициализирует подпись переменной длины до максимального значения - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующая функция, которая возвращает значение переменной, когда она может быть представлена ​​с длиной, заданной в качестве параметра. Если значение выходит за пределы, оно должно возвращать максимально возможное значение или максимальное отрицательное значение в зависимости от знака значения.

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 ]

0 голосов
/ 03 июля 2018

Я нашел другой способ сделать это, что 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);
0 голосов
/ 09 июля 2018

Другой способ сделать это - объявить константу локально, чтобы обойти старые добрые «не локально статические» проблемы VHDL:

constant C_LEN : integer := length
constant max_negative_value  : signed(length-1 downto 0) := ((C_LEN-1) => '1', others => '0');
0 голосов
/ 03 июля 2018

К счастью, поскольку ваш нечетный человек слева, вы можете сделать это:

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 говорит

Помимо окончательной ассоциации элементов с одним другим выбором, остальные (если таковые имеются) из ассоциаций элементов агрегата массива должен быть либо всем позиционным, либо всем именованным. Именованная ассоциация агрегат массива может иметь выбор, который не локально статический, или аналогично, выбор, который является нулевым диапазоном, только если агрегат включает в себя один элемент ассоциации и этот элемент Ассоциация имеет один выбор. Другой выбор является локально статичным, если применимое ограничение индекса является локально статическим.

который так же чист, как грязь.

...