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;
Bienvenue DONC! Avez-vous de code qui va avec? Vous avez gardé cette description un peu abstrait, mais votre dernière phrase, implique que vous en avez déjà un code de programmation fait la plupart de ce. Si vous pouvez le partager dans votre question, il serait de nous aider à répondre à votre question.
ajouté mon code vhdl

OriginalL'auteur hr0m | 2013-12-04