2009-11-16 5 views
1

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

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

наилучшими пожеланиями, Андре

ответ

1

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

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

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

a<=b+c;

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

Старший разряд «а» может быть снята (с помощью a(a'high) и использовать его в качестве перелива.

3

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

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

Например, если вы хотите для расчета = 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; 
+0

Вы делаете важный вопрос о переполнении дополнительного кода ... – Marty

+0

Чтобы добавить ответ Джастина (что делает хорошие моменты :) есть функции для изменения размера векторов в ieee.numeric_std библиотека. Добавление может быть записано как 'a <= resize (b, a'length) + resize (b, a'length)'. Кроме того, ограничение ответа обычно не является тем, что вы хотите сделать в случае переполнения - это требует дополнительной логики. Если перенос используется для многословных дополнений, вы * действительно * не хотите насыщающей арифметики. –

Смежные вопросы