4-bits additionneur-soustracteur logique
J'ai presque mis en œuvre avec succès à n bits additionneur-soustracteur. Il fonctionne très bien, sauf pour une chose.
Effectuer après un unsigned soustraction ne pas se comporter, comment je m'y attendais.
Ici est à la page 11, le circuit que j'ai créer. Dans mon opinion que j'ai de construire le droit chemin. C'est un 4 bits additionneur/soustracteur.
Afin de comprendre mes problèmes avec la unsigned réaliser, nous allons calculer 1111 - 1111 en non signé. Bien 15 - 15 est de 0, de sorte qu'il devrait être 0000. Qu'est-ce que la non signé?
D'entrée:
a <= "1111";
b <= "1111";
s <= '1';
La seule chose s est la construction d'un complément de 2 de b. Let's do it.
b = 1111
1'st complement
b = 0000
2's complement
b = 0001
Maintenant, nous pouvons effectuer un ajout 1111 + 0001.
1111
0001
=====
10000
Et à droite voici ma (pensée) problème. Les porter (la 5-ième bit) est de 1. J'ai calculé 15-15 = 0 avec un débordement de la porter, mais je ne comprends pas du tout.
Sur l'autre main, je peux calculer 1110 - 1111 (14-15), qui doit être -1, ce qui ne peut pas être représenté avec des nombres non signés. Donc ici, je m'attends à un bit de dépassement de capacité.
b = 1111
2's complement => 0001
1110
0001
=====
01111
Donc il me dit que les 14 et 15 est 15 (qui n'est pas surprenant), mais l'indicateur de débordement est mis à 0.
Ai-je mal compris la soustraction bit de dépassement de capacité, ou est un unsigned_cout xor sub
manquant?
Mon VHDL-Code:
--le plein additionneur
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;
--additionneur-soustracteur
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;
ajouté mon code vhdl
OriginalL'auteur hr0m | 2013-12-04
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai dormi et maintenant evrything est beaucoup plus clair 😉
Après une unsigned soustraction, le carry est à '1', sinon il y a un débordement, une voici pourquoi.
Le ripple carry adder se compose de plus (ici 4) additionneurs complets. Donc, nous ne sommes jamais vraiment la soustraction. Toutefois, dans signé outre, nous pouvons calculer pour exampe
4 + (-1)
.Avec unsigned chiffres, je ne peux pas représenter un nombre négatif. Donc, en fait, j'ai simplement ne peut pas calculer
4 - 1
. Je n'ai pas de soustracteur et je ne peux pas représenter un negatie nombre.Alors, comment puis-je effectuer une telle opération. Parce qu'il fonctionne bien. 4 - 1 = 3 (0100 - 0001 = 0011).
La seule façon, pour diminuer un unsigned nombre avec seulement un additionneur, est à débordement. Le fait, que nous ne pouvons pas représenter tous les nombres positifs est la solution (avec 4 bits est la unsigned maximum 15).
Par exemple, nous calculons 15 - 15 avec 4 bits unsigned numéros. 15 - 15 est de 0. Alors, que faisons-nous ajouter sur "1111" pour obtenir "0000"? Il suffit juste d'une "0001", qui ist le complément à Deux de 15 ans. Nous rember:
Et puis on ajoute ce nombre sur notre 15.
Et là, comme vous pouvez le voir, c'est la (bonne) de débordement.
Donc le dernier transporter des bits par un unsigned soustraction doit être mis à " 1 " si le calcul a été effectué en droit. Sinon, si il est "0", la soustraction du nombre doivent être négatifs, dont un nombre non signé ne peut pas représenter.
Je pense que votre exemple était tellement différent parce que vous avez été à la recherche spécifiquement à la réaliser bits, ce qui je ne se soucient pas. Les outils de juste gérer ce genre de choses pour moi 🙂
Eh bien, mon objectif est de mettre en œuvre un processeur mips, mais ça va prendre du temps. Il est de mon apprentissage par la pratique du projet. Ma première étape est de l'alu. Mais d'abord, j'ai besoin de ces componets (additionneurs, des manettes, des comparateurs, etc.). Je pourrais utiliser la bibliothèque de solution, mais ce n'est pas mon but. J'ai vraiment envie de connaître et de le comprendre en profondeur. Et comme vous pouvez le voir, certaines questions seront à la hausse, qui habituellement personne ne vous le demande.
OriginalL'auteur hr0m