Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
11 years ago

VHDL : Problem with 4-Bit Adder and Subtractor !

Hi

I want to make a 4-Bit Adder and Subtractor with VHDL

I have created 1-Bit Full-Adder , XOR Gate ( for Subtract ) and a 4-Bit Adder as shown below :

Full-Adder :


LIBRARY ieee; USE ieee.std_logic_1164.all;  ENTITY FullAdder_1_Bit IS   PORT(     X, Y : IN STD_LOGIC;     CIn  : IN STD_LOGIC;     Sum  : OUT STD_LOGIC;     COut : OUT STD_LOGIC   ); END FullAdder_1_Bit;  ARCHITECTURE Behavier OF FullAdder_1_Bit IS BEGIN   Sum <= X XOR Y XOR CIn;   COut <= (X AND Y) OR (X AND CIn) OR (Y AND CIn); END Behavier;

XOR Gate :


LIBRARY ieee; USE ieee.std_logic_1164.all;  ENTITY XORGate IS   PORT(     X1, X2 : IN STD_LOGIC;     Y : OUT STD_LOGIC   );   END XORGate;  ARCHITECTURE Declare OF XORGate IS BEGIN    Y <= X1 XOR X2; END Declare;

4-Bit Adder :


LIBRARY ieee; USE ieee.std_logic_1164.all;  ENTITY Adder_4_Bit IS   PORT(     A, B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);     Mode : IN STD_LOGIC;     Sum  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);     COut : OUT STD_LOGIC   );   END Adder_4_Bit;  ARCHITECTURE Structure OF Adder_4_Bit IS COMPONENT FullAdder_1_Bit IS   PORT(     X, Y : IN STD_LOGIC;     CIn  : IN STD_LOGIC;     Sum  : OUT STD_LOGIC;     COut : OUT STD_LOGIC   ); END COMPONENT;  COMPONENT XORGate IS   PORT(     X1, X2 : IN STD_LOGIC;     Y : OUT STD_LOGIC   );   END COMPONENT;  SIGNAL COut_Temp : STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL XB : STD_LOGIC_VECTOR(3 DOWNTO 0);  BEGIN     B_0 : XORGate PORT MAP(Mode, B(0), XB(0));   B_1 : XORGate PORT MAP(Mode, B(1), XB(1));   B_2 : XORGate PORT MAP(Mode, B(2), XB(2));   B_3 : XORGate PORT MAP(Mode, B(3), XB(3));    SUM_0 : FullAdder_1_Bit   PORT MAP (A(0), XB(0), Mode, Sum(0), COut_Temp(0));    SUM_1 : FullAdder_1_Bit   PORT MAP (A(1), XB(1), COut_Temp(0), Sum(1), COut_Temp(1));    SUM_2 : FullAdder_1_Bit   PORT MAP (A(2), XB(2), COut_Temp(1), Sum(2), COut_Temp(2));    SUM_3 : FullAdder_1_Bit   PORT MAP (A(3), XB(3), COut_Temp(2), Sum(3), COut);   END;

and in my Main Codes , i have used those ( like Test-Bench ! ) :


LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.ALL;  ENTITY Add_AND_Sub IS  END Add_AND_Sub;  ARCHITECTURE Declare OF Add_AND_Sub IS COMPONENT Adder_4_Bit IS   PORT(     A, B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);     Mode : IN STD_LOGIC;     Sum  : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);     COut : OUT STD_LOGIC   );   END COMPONENT;  SIGNAL A, B : STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL Mode : STD_LOGIC; SIGNAL As, Bs, E, AVF : STD_LOGIC; SIGNAL XA, XB, Sum : STD_LOGIC_VECTOR(3 DOWNTO 0);  BEGIN    Add : Adder_4_Bit  PORT MAP(XA, XB, Mode, Sum, E);   PROCESS(A, B, Mode)  BEGIN   As <= A(4);   Bs <= B(4);    XA <= A(3 DOWNTO 0);   XB <= B(3 DOWNTO 0);      CASE Mode IS    WHEN '0' =>      IF ((As XOR Bs) = '1') THEN                           Mode <= '1';        XA <= Sum;               AVF <= '0';        IF (E = '1') THEN          IF (XA = "0000") THEN            As <= '0';          END IF;        ELSE                     XA <= (NOT XA) + "0001";          As <= NOT As;        END IF;       ELSE        XA <= Sum;      END IF;        WHEN '1' =>      IF ((As XOR Bs) = '1') THEN                      Mode <= '0';               XA <= Sum;               AVF <= E;              ELSE               AVF <= '0';        XA <= Sum;        IF (E = '1') THEN          IF (XA = "0000") THEN            As <= '0';          END IF;        ELSE          XA <= (NOT XA) + "0001";          As <= NOT As;        END IF;            END IF;    WHEN Others =>       --      END CASE;            END PROCESS;   END Declare;

The main scenario is to Model this algorithm :

http://i.stack.imgur.com/3H6hv.jpg

but now i want to have output in XA and As

  • I Should use registers shown in algorithm such as "E" and "AVF"

there is one question :

we know port maps are continuously connected , so when i change "Mode" Value , Result ( Sum ) must change , is it True ?!

I have tried this code but i cant get output in XA , and there is no True result for sum values , i know there is some problem in my main code ( Process ) , but i cant find problems

please check that codes and tell me what goes wrong !

thanks ...

11 Replies