VHDL Behavioral & Structural CSET 4650 Field Programmable Logic Devices Dan Solarek VHDL Concepts Entity and Architecture – similar to symbol and schematic views of a logic circuit: symbol schematic 2 VHDL Example Entity declaration for the 2 to 1 MUX from today’s quiz. ENTITY mux2_1 IS PORT (in0, in1, sel: IN STD_LOGIC; yout: OUT STD_LOGIC); END mux2_1; 3 VHDL Example Logic circuit for a 2-1 MUX device Helpful for understanding architecture In1 sel yout In0 4 VHDL Example Behavioral architecture for the 2 to 1 MUX In1 sel ARCHITECTURE P1: PROCESS BEGIN IF (sel = yout <= ELSE yout <= END IF; END P1; END a1; a1 OF mux2_1 IS (sel, in0, in1) In0 yout ‘0’) THEN in0; in1; 5 VHDL Example Structural architecture for the 2 to 1 MUX In1 sel U2 U4 U3 In0 U1 yout ARCHITECTURE a2 OF mux2_1 IS SIGNAL sel_not, in0_and, in1_and: STD_LOGIC; COMPONENT OR_GATE PORT(x,y: IN STD_LOGIC; z: OUT STD_LOGIC); COMPONENT AND_GATE PORT (x,y: IN STD_LOGIC; z: OUT STD_LOGIC); COMPONENT INV_GATE PORT (x: IN STD_LOGIC; z: OUT STD_LOGIC); BEGIN U1: AND_GATE PORT MAP (in0, sel_not, in0_and); U2: AND_GATE PORT MAP (in1, sel, in1_and); U3: INV_GATE PORT MAP (sel, sel_not); U4: OR_GATE PORT MAP (in0_and, in1_and, yout); END a2; 6 VHDL Example Dataflow architecture for the 2 to 1 MUX In1 sel In0 yout ARCHITECTURE a3 OF mux2_1 IS BEGIN yout <= ((in0 AND NOT(sel)) OR (in1 AND sel)); END a3; 7 Half Adder Circuit Looking at the truth table for a half adder, it is easy to visualize the circuit AB CS A B S C 9 Full Adder Circuit The circuit at right shows a full adder constructed from two half adders. XOR generates the sum output AND generates the carry output half adder half adder 10 Full Adder – Entity & Architecture -- Dataflow model for a full adder circuit -- Library Statement declares the standard ieee synthesis library LIBRARY ieee; USE ieee.std_logic_1164.ALL; -- Entity declares the inputs and outputs using a PORT statement ENTITY fulladder IS PORT(Ain, Bin, Cin: IN STD_LOGIC; Cout, Sout: OUT STD_LOGIC); END fulladder; -- Architecture defines the function or entity -- In this case the function is defined using Boolean equations ARCHITECTURE dataflow OF fulladder IS BEGIN -- Concurrent Signal Assignment Statements Sout <= Ain XOR Bin XOR Cin; Cout <= (Ain AND Bin) OR (Ain AND Cin) OR (Bin AND Cin); END dataflow; 11 Full Adder - Architecture -- In this case the function is defined by a circuit structure ARCHITECTURE structural OF fulladder IS COMPONENT AND2 PORT( A, B: IN STD_LOGIC; F: OUT STD_LOGIC); END COMPONENT; COMPONENT OR3 PORT( A, B, C: IN STD_LOGIC; F: OUT STD_LOGIC); END COMPONENT; COMPONENT XOR2 PORT( A, B: IN STD_LOGIC; F: OUT STD_LOGIC); END COMPONENT; SIGNAL AXB, AB, BC, AC: STD_LOGIC; BEGIN F1: XOR2 port map (Ain, Bin, AXB); F2: XOR2 port map (AXB, Cin, Sout); F3: AND2 port map (Ain, Bin, AB); --Port Map Statements F4: AND2 port map (Bin, Cin, BC); F5: AND2 port map (Ain, Cin, AC); F6: OR3 port map (AB, BC, AC, Cout); END structural; 12 Binary Addition: 4-Bit Numbers The following example illustrates the addition of two 4-bit numbers A(A3A2A1A0) and B(B3B2B1B0): How would this change for a BCD adder? 13 Binary Addition: 4-Bit Numbers The addition can be split-up in bit slices Each slice performs the addition of the bits Ai, Bi and the Carry-in bit Ci Ci <= carry-out bit of the previous slice Each slice is simply a full adder 14 4-Bit Binary Adder Circuit for a 4-bit parallel binary adder constructed from full adder building blocks 15 4-Bit Adder - Entity LIBRARY ieee; USE ieee.std_logic_1164.ALL; -- VHDL model of a 4-bit adder constructed from four full adders ENTITY four_bit_adder_st IS PORT (A, B : IN STD_LOGIC_VECTOR(3 downto 0); SUM : OUT STD_LOGIC_VECTOR(3 downto 0); CIN : IN STD_LOGIC; COUT : OUT STD_LOGIC); END four_bit_adder_st; Cin Cout 16 4-Bit Adder Structural -- The architecture in this case is a structural one ARCHITECTURE structural OF four_bit_adder_st IS -- First all the components are declared. The full adder is -- declared only once, even though it will be used 4 times. COMPONENT fulladder PORT(Ain, Bin, Cin: IN STD_LOGIC; Cout, Sout: OUT STD_LOGIC); END COMPONENT; -- The full adders are connected by carry signals. These must -- be declared also. SIGNAL C : STD_LOGIC_VECTOR(1 to 3); -- Port map statements are used to define full adder instances -- and how they are connected. BEGIN F1: fulladder port map (A(0),B(0),CIN,C(1),SUM(0)); F2: fulladder port map (A(1),B(1),C(1),C(2),SUM(1)); F3: fulladder port map (A(2),B(2),C(2),C(3),SUM(2)); F4: fulladder port map (A(3),B(3),C(3),COUT,SUM(3)); END structural; 17 4-Bit Adder Structural -- The architecture in this case is a dataflow one ARCHITECTURE dataflow OF four_bit_add_df IS -- Again there will be internal carry signals that are not -- inputs or outputs. These must be declared as signals. SIGNAL C : STD_LOGIC_VECTOR(1 to 3); -- Concurrent signal assignments can be used to describe -- each of the 4 outputs and the carry signals. BEGIN SUM(0) <= A(0) XOR B(0) XOR Cin; C(1) <= (A(0) AND B(0)) OR (A(0) AND Cin) OR (B(0) AND Cin); SUM(1) <= A(1) XOR B(1) XOR C(1); C(2) <= (A(1) AND B(1)) OR (A(1) AND C(1)) OR (B(1) AND C(1)); SUM(2) <= A(2) XOR B(2) XOR C(2); C(3) <= (A(2) AND B(2)) OR (A(2) AND C(2)) OR (B(2) AND C(2)); SUM(3) <= A(3) XOR B(3) XOR C(3); COUT <= (A(3) AND B(3)) OR (A(3) AND C(3)) OR (B(3) AND C(3)); END dataflow; 18 4-Bit Adder Behavioral -- This is the current Lab assignment Work with Anil to get this done! 19