Я почти успешно реализовал n-разрядный сумматор-вычитатель. Он отлично работает, за исключением одного.4-разрядная логика сумматора-вычитателя
Выполняйте после вычитания без знака, который не ведет себя, как я ожидал.
Here на странице 11 схема, которую я построил. По-моему, я построил правильный путь. Это 4-разрядный сумматор/вычитатель.
Чтобы понять мои проблемы с неподписанным переносом, давайте вычислим 1111 - 1111 в неподписанном виде. Хорошо 15 - 15 - 0, поэтому должно быть 0000. Что такое неподписанное ношение?
Вход:
a <= "1111";
b <= "1111";
s <= '1';
Единственное s делает, строит дополнение к 2-Ь. Давай сделаем это.
b = 1111
1'st complement
b = 0000
2's complement
b = 0001
Теперь мы можем выполнить сложение 1111 + 0001.
1111
0001
=====
10000
И здесь моя (мысль) проблемой. Перенос (5-й бит) равен 1. Я вычислил 15-15 = 0 с переносом переполнения, который я вообще не понимаю.
С другой стороны, я могу рассчитать 1110 - 1111 (14-15), который должен быть -1, который не может быть представлен беззнаковыми числами. Поэтому здесь я бы ожидал бит переполнения.
b = 1111
2's complement => 0001
1110
0001
=====
01111
Так он говорит мне, что 14-15 15 (что не удивительно), но флаг переполнения устанавливаются в 0.
ли я понял переполнение битого вычитания, или это unsigned_cout xor sub
не хватает?
Мой VHDL-код:
--full сумматор
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity fad is
port(
a,b,cin : in std_logic;
o, cout: out std_logic);
end fad;
architecture behavior of fad is
begin
o <= a xor b xor cin;
cout <= (a and b)or (cin and (a xor b));
end behavior;
--adder-вычитателя
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity add_sub is
generic(N : natural := 4);
port(
a, b : in std_logic_vector(N-1 downto 0);
sub : in std_logic;
o : out std_logic_vector(N-1 downto 0);
scout, ucout : out std_logic);
end add_sub;
architecture behavior of add_sub is
signal carries : std_logic_vector(N downto 0);
signal bXorSub : std_logic_vector(N-1 downto 0);
component fad is
port(a, b, cin : in std_logic;
o, cout : out std_logic
);
end component;
begin
carries(0) <= sub;
subtraction: for i in 0 to N-1 generate
bXorSub(i) <= b(i) xor sub;
end generate subtraction;
RCA: for i in 0 to N-1 generate
fadN: fad port map(
a => a(i),
b => bXorSub(i),
cin => carries(i),
o => o(i),
cout => carries(i+1));
end generate RCA;
ucout <= carries(N);
scout <= carries(N) xor carries(N-1);
end behavior;
Добро пожаловать в SO! У вас есть код, который согласуется с этим? Вы сохранили это описание довольно абстрактным, но последнее последнее предложение подразумевает, что у вас уже есть какой-то программный код, который делает большую часть этого. Если вы можете поделиться им в своем вопросе, это поможет нам ответить на ваш вопрос. – Derek
добавил мой код vhdl – hr0m