Бит переполнения 32-битный ALU VHDL

В настоящее время я пишу 32-битный ALU (Add / Sub) на VHDL. У меня проблема с битом переполнения. Я не вижу, когда устанавливать переполнение в зависимости от операции (сложение, вычитание) и входных значений.

Вы можете мне помочь ?

С уважением, Андре


person Andre    schedule 16.11.2009    source источник


Ответы (2)


Чтобы добавить немного дополнительной информации к ответу Мартина, вам нужно быть осторожным при обнаружении переполнения с помощью арифметики с дополнением до 2.

Например, если у вас есть 3-битные подписанные значения, представленные в формате двух дополнений, и вы хотите обнаружить переполнение, вам нужно подписать расширение в дополнительный бит, а затем посмотреть, отличается ли дополнительный бит от наиболее значимого желаемого бита. :

Например, если вы хотите вычислить a = b + c:

--Declare the signals
signal overflow : std_logic;
signal a : signed(2 downto 0);
signal b : signed(2 downto 0);
signal c : signed(2 downto 0);

-- Declare some additional signals with one more MSB than the original signals
signal a_extended : std_logic(3 downto 0);
signal b_extended : std_logic(3 downto 0);
signal c_extended : std_logic(3 downto 0);

-- Sign extend the MSB
b_extended <= b(2) & b;
c_extended <= c(2) & c;

-- Perform the addition
a_extended <= b_extended + c_extended;

-- Detect the overflow case
overflow <= '1' when a_extended(3) /= a_extended(2) else '0';

-- Calculate the answer
-- Limit to 100 (-4) or 011 (+3) in the case of overflow
process(a_extended)
begin
   if a_extended(3) /= a_extended(2) then
      if a_extended(3) = '1' then
         a <= "100";
      else
         a <= "011";
      end if;
   else
      a <= a_extended(2 downto 0);
   end if;
end process;
person Justin    schedule 01.12.2009
comment
Чтобы добавить к ответу Джастина (что делает хорошие моменты :), есть функции для изменения размеров векторов в библиотеке ieee.numeric_std. Дополнение можно было бы записать как a<=resize(b,a'length)+resize(b,a'length). Кроме того, ограничение ответа обычно не является тем, что вы хотите делать в случае переполнения - это требует дополнительной логики. Если перенос используется для сложения нескольких слов, вам действительно не нужна насыщающая арифметика. - person Martin Thompson; 16.12.2009

Что в спецификации сказано, что он должен делать? Должно быть описание того, при каких условиях должен быть установлен флаг переполнения.

Обычно бит переполнения устанавливается, когда выход слишком велик для хранилища. Вы можете думать об этом как о 33-м бите в ответе на суммирование двух 32-битных чисел. В знаковой арифметике это может произойти, если величина результата операции слишком велика, независимо от знака. При использовании арифметики с дополнением до 2 вы должны быть немного осторожны, так как наибольшее отрицательное число немного более отрицательно, чем наибольшее положительное число, которое вы можете представить в данном количестве битов.

С точки зрения фактического выполнения, просто создайте вектор numeric_std, который на 1 бит шире, чем входные данные, выполните

a<=b+c;

и пусть синтезатор создает логику. Тогда вам не нужно беспокоиться о деталях.

Старший бит "a" можно снять (используя a(a'high) и использовать его как переполнение.

person Martin Thompson    schedule 16.11.2009