0% found this document useful (0 votes)
210 views11 pages

VHDL Com Models

VHDL

Uploaded by

Sergiu Pop
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
210 views11 pages

VHDL Com Models

VHDL

Uploaded by

Sergiu Pop
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 11

Supplement of Lecture 5: VHDL Codes of some Combinational Devices.

VHDL model of comparator (8 bits):


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
-- 8 Bit Unsigned Comparator
entity cmp8 is
port (
A,B : in std_logic_vector(7 downto 0);
aeqb, altb, agtb : out std_logic
);
end cmp8;
architecture a of cmp8 is
begin
aeqb <= '1' when (a = b) else '0';
altb <= '1' when (a < b) else '0';
agtb <= '1' when (a > b) else '0';
end;
The operators =, /=, <=, <, >, >= are defined in the std_logic_arith package which is part of the IEEE
library.
-- vhdl model for the 3 to 8 decoder
--*************************************************************************
-- IO Interface Declaration
--*************************************************************************
library ieee;
use ieee.std_logic_1164.all;
entity dec3to8 is
port
(
-- inputs
signal sel: in std_logic_vector(2 downto 0); -- selector
signal en: in std_logic;
-- enable
-- outputs

signal y: out std_logic_vector(7 downto 0)


);
end dec3to8;

-- outputs are high true

--*************************************************************************
-- Architecture body
--*************************************************************************
architecture behavior of dec3to8 is
begin
process (sel,en)
begin
y <= "11111111";
if (en = '1') then
case sel is
when "000" => y(0) <= '1';
when "001" => y(1) <= '1';
when "010" => y(2) <= '1';
when "011" => y(3) <= '1';
when "100" => y(4) <= '1';
when "101" => y(5) <= '1';
when "110" => y(6) <= '1';
when "111" => y(7) <= '1';
when others => y(7) <= '1';
end case;
end if;
end process;
end behavior;

74LS138 (3 x 8 decoder)
VHDL Code:
Library ieee
Use ieee.std_logic_1164.all;
Entity V74x138 is
Port (G1, G2A_L, G2B_L: in std_logic; -- enable inputs
A: in std_logic_vector (2 downto 0); -- select inputs A= A(2), B= A(1), C = A(0)
Y_L: out std_logic_vector (0 to 7)); -- decoded outputs
End V74x138;
Architecture V74x138_arch of V74x138 is
Signal Y_int: std_logic_vector(0 to 7);
Begin
With A select Y_int <=
01111111 when 000,
10111111 when 001,

11011111 when 010,


11101111 when 011,
11110111 when 100,
11111011 when 101,
11111101 when 110,
11111110 when 111,
11111111 when others;
Y_L<=Y_L_i when (G1 and not G2A_L and not G2B_L) =1 else 11111111;
End V74x138_arch;

-- vhdl model for 8 level priority circuit


--*************************************************************************
-- IO Interface Declaration
--*************************************************************************

library ieee;
use ieee.std_logic_1164.all;
entity priority_new is
port
(
-- inputs
signal y1: in std_logic;
signal y2: in std_logic;
signal y3: in std_logic;
signal y4: in std_logic;
signal y5: in std_logic;
signal y6: in std_logic;
signal y7: in std_logic;
-- outputs
signal vec: out std_logic_vector(2 downto 0)
);
end priority_new;
--*************************************************************************
-- Architecture body
--*************************************************************************
architecture behavior of priority_new is
begin
process (y1,y2,y3,y4,y5,y6,y7)
begin
vec <= "000";
if (y1 = '1') then vec <= "001";

end if;
if (y2 = '1') then vec <= "010";
end if;
if (y3 = '1') then vec <= "011";
end if;
if (y4 = '1') then vec <= "100";
end if;
if (y5 = '1') then vec <= "101";
end if;
if (y6 = '1') then vec <= "110";
end if;
if (y7 = '1') then vec <= "111";
end if;
end process;
end behavior;
VHDL model of a 4 to 1 multiplexers
library ieee;
use ieee.std_logic_1164.all;
-- 4 to 1 mux, 8 bit inputs, using concurrent statements
entity mux4to1_8_conc is
port (
I0,I1,I2,I3 : in std_logic_vector(7 downto 0);
sel : in std_logic_vector(1 downto 0);
dout : out std_logic_vector(7 downto 0)
);
end mux4to1_8_conc;
architecture a of mux4to1_8_conc is
begin
WITH sel SELECT
dout <= I0 when "00",
I1 when "01",

I2 when "10",
I3 when others;
end a;
Arithmetic and Logic Unit
Consider a small 1-bit arithmetic logic unit (ALU) performs the following operations:
A+1
A + B + Cin
A
A-1
Not A
A and B
A or B
A xor B
Let us analyze and model the 1-bit ALU using VHDL. We will use the designed 1-bit ALU and the
structural-type modeling, to write the VHDL model of a 16-bit ALU. Assume that the arithmetic addition
generates the output carry Cout.
By analyzing the specification of the problem, we can establish the function table of a 1-bit ALU as
follows:
FS2
0
0
0
0
1
1
1
1

FS1
0
0
1
1
0
0
1
1

FS0
0
1
0
1
0
1
0
1

Function Implemented
A +1 (increment)
A + B + Cin (addition)
A (identity)
A 1 (decrement)
Not A ( complement)
A and B (and logic)
A or B ( or logic )
A exor B (exclusive or
logic)
We have to implement two arithmetic operations (+ and - ) plus other logic functions (and, not, identity, or,
xor) using basic logic gates. Data involved are of type BIT. The truth Tables for a full adder and full
subtractor are given as follows:

Subtraction Truth Table:

Bin

Diff. = A - B

Bout

Bin = Borrow in; Bout = Borrow out. Using K-map for minimization, we have :

Diff = A exor B exor Bin

Bout = [ Bin and ((not A) or B)] or [(not A) and B]


Full Adder Truth Table:

Cin

Sum = A + B

Cout

Cin: carry in; Cout: carry out.

Sum = A exor B exor Cin

Cout = [Cin and ( A or B)] or [ A and B]


In our design we will use Cin for Borrow in and Carry in; Cout for Carry out and
Borrow out depending of the type of operation requested (function selection). This is
done at the level of the VHDL code.
The VHDL model of a 1-bit ALU is given as:
library IEEE;
-- File alu_1.vhdl
use IEEE.std_logic_1164.all;
entity alu_1 is
port (
a: in BIT;
b: in BIT;
Cin: in BIT; -- Use for Borrow in or Carry in
FS: in BIT_VECTOR(2 downto 0);
c: out BIT;
Cout: out BIT
-- Use for carry out or borrow out
);
end alu_1;
architecture alu_1_arch of alu_1 is
begin
-- <<enter your statements here>>
process(a,b,FS,Cin)
variable v1, v2: BIT;
begin
case FS is
when "000" => -- Increment a by 1 = add 1 to a ( b =1, Cin = 0)
v1 := '1'; -- v1 is used for b
v2 := '0'; -- is used for Cin
c<= a xor v1 xor v2;--addition
Cout <= (a and v1) or (v2 and (a or v1));
when "001" =>
c<= a xor b xor cin;--addition
Cout <= (a and b) or (Cin and (a or b));
when "010" =>
-- Identity

c<= a ;
Cout <= '0';
when "011" =>
-- Decrement a by 1
v1 := '1'; -- v1 is used for b = 1
v2 := '0';
-- v2 is used for Bin = 0
c<= a xor v1 xor v2;--addition
Cout <= ( (not a) and v1) or (v2 and ((not a) or v1) );
when "100" =>
-- Not a
c<= not a;
Cout <= '0';
when "101" =>
c<= a and b;
Cout <='0';
when "110" =>
c<= a or b;
Cout <= '0';
when "111" =>
c<= a xor b;
Cout <= '0';
when others =>
c<='0';
Cout <='0';
end case;

end process;
end alu_1_arch;

The library xslib that contains alu_1 is built using a package alu_1pckg defined within
the file alu_1pck.vhd as follows:
library IEEE;
use IEEE.std_logic_1164.all;
PACKAGE
alu1_1pckg is
COMPONENT alu_1
port (
a: in BIT;
b: in BIT;
Cin: in BIT;
FS: in BIT_VECTOR(2 downto 0);
c: out BIT;
Cout: out BIT
);
end COMPONENT;
end alu1_1pckg;
library IEEE;
-- File alu_1.vhdl
use IEEE.std_logic_1164.all;

entity alu_1 is
port (
a: in BIT;
b: in BIT;
Cin: in BIT; -- Use for Borrow in or Carry in
FS: in BIT_VECTOR(2 downto 0);
c: out BIT;
Cout: out BIT
-- Use for carry out or borrow out
);
end alu_1;
architecture alu_1_arch of alu_1 is
begin
-- <<enter your statements here>>
process(a,b,FS,Cin)
variable v1, v2: BIT;
begin
case FS is
when "000" => -- Increment a by 1 = add 1 to a ( b =1, Cin = 0)
v1 := '1'; -- v1 is used for b
v2 := '0'; -- is used for Cin
c<= a xor v1 xor v2;--addition
Cout <= (a and v1) or (v2 and (a or v1));
when "001" =>
c<= a xor b xor cin;--addition
Cout <= (a and b) or (Cin and (a or b));
when "010" =>
-- Identity
c<= a ;
Cout <= '0';
when "011" =>
-- Decrement a by 1
v1 := '1'; -- v1 is used for b = 1
v2 := '0';
-- v2 is used for Bin = 0
c<= a xor v1 xor v2;--addition
Cout <= ( (not a) and v1) or (v2 and ((not a) or v1) );
when "100" =>
-- Not a
c<= not a;
Cout <= '0';
when "101" =>
c<= a and b;
Cout <='0';
when "110" =>
c<= a or b;
Cout <= '0';
when "111" =>
c<= a xor b;
Cout <= '0';

when others =>


c<='0';
Cout <='0';
end case;

end process;
end alu_1_arch;

Finally the structural model of a 16-bit ALU using 16 1-bit ALUs is given:
library IEEE, XSLIB; -- File alu_16b.vhd
use IEEE.std_logic_1164.all;
use XSLIB.alu1_1pckg.all;
entity alu_16b is
port (
A: in BIT_VECTOR (15 downto 0);
B: in BIT_VECTOR (15 downto 0);
Cin: in BIT;
Sel: in BIT_VECTOR(3 downto 0);
C: out BIT_VECTOR (15 downto 0);
Cout: out BIT

);
end alu_16b;

architecture alu_16b_arch of alu_16b is


signal C_inout: BIT_VECTOR(14 downto 0);
component alu_1 is
port (
a: in bit;
b: in bit;
Cin: in bit;
FS: in BIT_VECTOR (3 downto 0);
c: out bit;
Cout: out bit);
end component;
begin
-- <<enter your statements here>>
alu0: alu_1 port map(A(0), B(0),Cin,Sel,C(0), C_inout(0));
alu1:alu_1 port map(A(1), B(1),C_inout(0),Sel,C(1), C_inout(1));
alu2:alu_1 port map(A(2),B(2),C_inout(1),Sel,C(2), C_inout(2));
alu3:alu_1 port map(A(3), B(3),C_inout(2),Sel,C(3), C_inout(3));
alu4:alu_1 port map(A(4), B(4),C_inout(3),Sel,C(4), C_inout(4));
alu5:alu_1 port map(A(5), B(5),C_inout(4),Sel,C(5), C_inout(5));
alu6:alu_1 port map(A(6), B(6),C_inout(5),Sel,C(6), C_inout(6));

10

alu7:alu_1 port map(A(7), B(7),C_inout(6),Sel,C(7), C_inout(7));


alu8:alu_1 port map(A(8), B(8),C_inout(7),Sel,C(8), C_inout(8));
alu9:alu_1 port map(A(9), B(9),C_inout(8),Sel,C(9), C_inout(9));
alu10:alu_1 port map(A(10), B(10),C_inout(9),Sel,C(10), C_inout(10));
alu11:alu_1 port map(A(11), B(11),C_inout(10),Sel,C(11), C_inout(11));
alu12:alu_1 port map(A(12), B(12),C_inout(11),Sel,C(12), C_inout(12));
alu13:alu_1 port map(A(13), B(13),C_inout(12),Sel,C(13), C_inout(13));
alu14:alu_1 port map(A(14), B(14),C_inout(13),Sel,C(14), C_inout(14));
alu15:alu_1 port map(A(15), B(15),C_inout(14),Sel,C(15), Cout);

end alu_16b_arch;

11

You might also like