Бит переполнения 32Bit ALU VHDL - PullRequest
1 голос
/ 16 ноября 2009

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

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

С наилучшими пожеланиями, Andre

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

Просто чтобы добавить немного дополнительной информации к ответу Мартина, нужно быть осторожным, обнаруживая переполнение с помощью арифметики дополнения 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;
1 голос
/ 16 ноября 2009

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

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

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

a<=b+c;

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

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

...