You are on page 1of 29

PART B

Q1) Design and implement a DE2/DE1 project that demonstrates a binary to BCD converter. Use
the switches SW [15:0] to define the input binary value and the seven-segment displays to show
the resulting decimal equivalent. For example, if the first five switches are on: 0x1F, the sevensegment display should read 31.
VHDL CODE FOR Q1:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity binary2bcd is
port ( clk : in std_logic;
sw: in std_logic_vector(15 downto 0);
--7SEGMENT PIN ASSIGNMENT
hex0:out std_logic_vector(6 downto 0);
hex1:out std_logic_vector(6 downto 0);
hex2:out std_logic_vector(6 downto 0);
hex3:out std_logic_vector(6 downto 0);
hex4:out std_logic_vector(6 downto 0));
end binary2bcd;
architecture behavior of binary2bcd is
begin
my_proc: process (clk)

variable random: std_logic_vector(15 downto 0) := "0000000000000000";


variable one : std_logic_vector(3 downto 0) := "0000";
variable ten : std_logic_vector(3 downto 0) := "0000";
variable hund : std_logic_vector(3 downto 0) := "0000";
variable thou : std_logic_vector(3 downto 0) := "0000";
variable tthou: std_logic_vector(3 downto 0) := "0000";
begin
if (rising_edge(clk)) then
random := sw;
for i in 0 to 15 loop
if (tthou >= "0101") then
tthou := std_logic_vector (unsigned(tthou) +3);
end if;
if (thou >= "0101") then
thou := std_logic_vector (unsigned(thou) +3);
end if;
if (hund >= "0101") then
hund := std_logic_vector (unsigned(hund) +3);
end if;
if (ten >= "0101") then
ten := std_logic_vector (unsigned(ten) +3);

end if;
if (one >= "0101") then
one := std_logic_vector (unsigned(one) +3);
end if;
-- THIS IS SHIFTING WORK
tthou := tthou(2 downto 0)& thou(3);
thou := thou (2 downto 0)& hund(3);
hund := hund (2 downto 0)& ten(3);
ten := ten (2 downto 0)& one(3);
one := one (2 downto 0)& random(15);
random := std_logic_vector(unsigned(random) sll 1);
end loop;
--DISPLAYING THE VALUE ON THE SEVEN SEGMENT
case one is
when "0000" => hex0 <= "1000000" ; -- 0
when "0001" => hex0 <= "1111001" ; -- 1
when "0010" => hex0 <= "0100100" ; -- 2
when "0011" => hex0 <= "0110000" ; -- 3
when "0100" => hex0 <= "0011001" ; -- 4
when "0101" => hex0 <= "0010010" ; -- 5
when "0110" => hex0 <= "0000010" ; -- 6

when "0111" => hex0 <= "1111000" ; -- 7


when "1000" => hex0 <= "0000000" ; -- 8
when "1001" => hex0 <= "0010000" ; -- 9
when "1010" => hex0 <= "0001000" ; -- 10 or A
when "1011" => hex0 <= "0000011" ; -- 11 or B
when "1100" => hex0 <= "1000110" ; -- 12 or C
when "1101" => hex0 <= "0100001" ; -- 13 or D
when "1110" => hex0 <= "0000110" ; -- 14 or E
when "1111" => hex0 <= "0001110" ; -- 15 or F
when others => hex0 <= "1111111" ; -- TURN ON ALL LIGHTS
end case;
case ten is
when "0000" => hex1 <= "1000000" ;
when "0001" => hex1 <= "1111001" ;
when "0010" => hex1 <= "0100100" ;
when "0011" => hex1 <= "0110000" ;
when "0100" => hex1 <= "0011001" ;
when "0101" => hex1 <= "0010010" ;
when "0110" => hex1 <= "0000010" ;
when "0111" => hex1 <= "1111000" ;
when "1000" => hex1 <= "0000000" ;

when "1001" => hex1 <= "0010000" ;


when "1010" => hex1 <= "0001000" ;
when "1011" => hex1 <= "0000011" ;
when "1100" => hex1 <= "1000110" ;
when "1101" => hex1 <= "0100001" ;
when "1110" => hex1 <= "0000110" ;
when "1111" => hex1 <= "0001110" ;
when others => hex1 <= "1000000" ;
end case;
case hund is
when "0000" => hex2 <= "1000000" ;
when "0001" => hex2 <= "1111001" ;
when "0010" => hex2 <= "0100100" ;
when "0011" => hex2 <= "0110000" ;
when "0100" => hex2 <= "0011001" ;
when "0101" => hex2 <= "0010010" ;
when "0110" => hex2 <= "0000010" ;
when "0111" => hex2 <= "1111000" ;
when "1000" => hex2 <= "0000000" ;
when "1001" => hex2 <= "0010000" ;
when "1010" => hex2 <= "0001000" ;

when "1011" => hex2 <= "0000011" ;


when "1100" => hex2 <= "1000110" ;
when "1101" => hex2 <= "0100001" ;
when "1110" => hex2 <= "0000110" ;
when "1111" => hex2 <= "0001110" ;
when others => hex2 <= "1000000" ;
end case;
case thou is
when "0000" => hex3 <= "1000000" ;
when "0001" => hex3 <= "1111001" ;
when "0010" => hex3 <= "0100100" ;
when "0011" => hex3 <= "0110000" ;
when "0100" => hex3 <= "0011001" ;
when "0101" => hex3 <= "0010010" ;
when "0110" => hex3 <= "0000010" ;
when "0111" => hex3 <= "1111000" ;
when "1000" => hex3 <= "0000000" ;
when "1001" => hex3 <= "0010000" ;
when "1010" => hex3 <= "0001000" ;
when "1011" => hex3 <= "0000011" ;
when "1100" => hex3 <= "1000110" ;

when "1101" => hex3 <= "0100001" ;


when "1110" => hex3 <= "0000110" ;
when "1111" => hex3 <= "0001110" ;
when others => hex3 <= "1000000" ;
end case;
case tthou is
when "0000" => hex4 <= "1000000" ;
when "0001" => hex4 <= "1111001" ;
when "0010" => hex4 <= "0100100" ;
when "0011" => hex4 <= "0110000" ;
when "0100" => hex4 <= "0011001" ;
when "0101" => hex4 <= "0010010" ;
when "0110" => hex4 <= "0000010" ;
when "0111" => hex4 <= "1111000" ;
when "1000" => hex4 <= "0000000" ;
when "1001" => hex4 <= "0010000" ;
when "1010" => hex4 <= "0001000" ;
when "1011" => hex4 <= "0000011" ;
when "1100" => hex4 <= "1000110" ;
when "1101" => hex4 <= "0100001" ;
when "1110" => hex4 <= "0000110" ;

when "1111" => hex4 <= "0001110" ;


when others => hex4 <= "1000000" ;
end case;

one := "0000";
ten := "0000";
hund := "0000";
thou := "0000";
tthou:= "0000";
end if;
end process ;
end behavior;

2- Modify the binary to BCD converter project so that it handles and displays signed values.
VHDL CODE FOR Q2:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
entity binary2bcdsigned is
port ( CLK : in std_logic;
input: in signed(17 downto 0);
segment0:out signed(6 downto 0);
segment1:out signed(6 downto 0);
segment2:out signed(6 downto 0);
segment3:out signed(6 downto 0);
segment4:out signed(6 downto 0);
segment5:out signed(6 downto 0));
end binary2bcdsigned;
architecture behavior of binary2bcdsigned is
begin
my_proc: process (CLK)
--Variable assignment
variable random: signed(17 downto 0) := "000000000000000000";
variable one: std_logic_vector(3 downto 0) := "0000";

variable ten: std_logic_vector(3 downto 0) := "0000";


variable hund: std_logic_vector(3 downto 0) := "0000";
variable thou: std_logic_vector(3 downto 0) := "0000";
variable tthou: std_logic_vector(3 downto 0) := "0000";
begin
if (rising_edge(CLK)) then
random := input;
if input(16)>='0' then
if input(17)>='0' then
for i in 0 to 15 loop
segment5<="1000000";
if (tthou >= "0101") then
tthou := std_logic_vector (unsigned(tthou) +3);
end if;
if (thou >= "0101") then
thou := std_logic_vector (unsigned(thou) +3);
end if;
if (hund >= "0101") then
hund := std_logic_vector (unsigned(hund) +3);
end if;
if (ten >= "0101") then

ten := std_logic_vector (unsigned(ten) +3);


end if;
if (one >= "0101") then
one := std_logic_vector (unsigned(one) +3);
end if;
tthou := tthou(2 downto 0) & thou(3);
thou := thou(2 downto 0)& hund(3);
hund := hund(2 downto 0)& ten(3);
ten := ten(2 downto 0)& one(3);
one := one(2 downto 0)& random(15);
random := signed(unsigned(random) sll 1);
end loop;
CASE one IS
when "0000" => segment0 <= "1000000" ; -- 0
when "0001" => segment0 <= "1111001" ; -- 1
when "0010" => segment0 <= "0100100" ; -- 2
when "0011" => segment0 <= "0110000" ; -- 3
when "0100" => segment0 <= "0011001" ; -- 4
when "0101" => segment0 <= "0010010" ; -- 5
when "0110" => segment0 <= "0000010" ; -- 6
when "0111" => segment0 <= "1111000" ; -- 7

when "1000" => segment0 <= "0000000" ; -- 8


when "1001" => segment0 <= "0010000" ; -- 9
when "1010" => segment0 <= "0001000" ; -- 10 or A
when "1011" => segment0 <= "0000011" ; -- 11 or B
when "1100" => segment0 <= "1000110" ; -- 12 or C
when "1101" => segment0 <= "0100001" ; -- 13 or D
when "1110" => segment0 <= "0000110" ; -- 14 or E
when "1111" => segment0 <= "0001110" ; -- 15 or F
when others => segment0 <= "1111111" ; -- TURN OFF ALL LIGHTS
end case;
CASE ten IS
when "0000" => segment1 <= "1000000" ;
when "0001" => segment1 <= "1111001" ;
when "0010" => segment1 <= "0100100" ;
when "0011" => segment1 <= "0110000" ;
when "0100" => segment1 <= "0011001" ;
when "0101" => segment1 <= "0010010" ;
when "0110" => segment1 <= "0000010" ;
when "0111" => segment1 <= "1111000" ;
when "1000" => segment1 <= "0000000" ;
when "1001" => segment1 <= "0010000" ;

when "1010" => segment1 <= "0001000" ;


when "1011" => segment1 <= "0000011" ;
when "1100" => segment1 <= "1000110" ;
when "1101" => segment1 <= "0100001" ;
when "1110" => segment1 <= "0000110" ;
when "1111" => segment1 <= "0001110" ;
when others => segment1 <= "1111111" ;
end case;
CASE hund IS
when "0000" => segment2 <= "1000000" ;
when "0001" => segment2 <= "1111001" ;
when "0010" => segment2 <= "0100100" ;
when "0011" => segment2 <= "0110000" ;
when "0100" => segment2 <= "0011001" ;
when "0101" => segment2 <= "0010010" ;
when "0110" => segment2 <= "0000010" ;
when "0111" => segment2 <= "1111000" ;
when "1000" => segment2 <= "0000000" ;
when "1001" => segment2 <= "0010000" ;
when "1010" => segment2 <= "0001000" ;
when "1011" => segment2 <= "0000011" ;

when "1100" => segment2 <= "1000110" ;


when "1101" => segment2 <= "0100001" ;
when "1110" => segment2 <= "0000110" ;
when "1111" => segment2 <= "0001110" ;
when others => segment2 <= "1000000" ;
end case;
CASE thou IS
when "0000" => segment3 <= "1000000" ;
when "0001" => segment3 <= "1111001" ;
when "0010" => segment3 <= "0100100" ;
when "0011" => segment3 <= "0110000" ;
when "0100" => segment3 <= "0011001" ;
when "0101" => segment3 <= "0010010" ;
when "0110" => segment3 <= "0000010" ;
when "0111" => segment3 <= "1111000" ;
when "1000" => segment3 <= "0000000" ;
when "1001" => segment3 <= "0010000" ;
when "1010" => segment3 <= "0001000" ;
when "1011" => segment3 <= "0000011" ;
when "1100" => segment3 <= "1000110" ;
when "1101" => segment3 <= "0100001" ;

when "1110" => segment3 <= "0000110" ;


when "1111" => segment3 <= "0001110" ;
when others => segment3 <= "1000000" ;
end case;
CASE tthou IS
when "0000" => segment4 <= "1000000" ;
when "0001" => segment4 <= "1111001" ;
when "0010" => segment4 <= "0100100" ;
when "0011" => segment4 <= "0110000" ;
when "0100" => segment4 <= "0011001" ;
when "0101" => segment4 <= "0010010" ;
when "0110" => segment4 <= "0000010" ;
when "0111" => segment4 <= "1111000" ;
when "1000" => segment4 <= "0000000" ;
when "1001" => segment4 <= "0010000" ;
when "1010" => segment4 <= "0001000" ;
when "1011" => segment4 <= "0000011" ;
when "1100" => segment4 <= "1000110" ;
when "1101" => segment4 <= "0100001" ;
when "1110" => segment4 <= "0000110" ;
when "1111" => segment4 <= "0001110" ;

when others => segment4 <= "1000000" ;


end case;

one := "0000";
ten:= "0000";
hund := "0000";
thou := "0000";
tthou:= "0000";
end if;
end if;
random := input;

if input(16) ='1' then

if input(17)>='0' then

for i in 0 to 15 loop
segment5<="0111111";
if (tthou >= "0101") then
tthou := std_logic_vector (unsigned(tthou) +3);
end if;
if (thou >= "0101") then
thou := std_logic_vector (unsigned(thou) +3);

end if;
if (hund >= "0101") then
hund := std_logic_vector (unsigned(hund) +3);
end if;
if (ten >= "0101") then
ten := std_logic_vector (unsigned(ten) +3);
end if;
if (one >= "0101") then
one := std_logic_vector (unsigned(one) +3);
end if;
tthou := tthou(2 downto 0) & thou(3);
thou := thou(2 downto 0)& hund(3);
hund := hund(2 downto 0)& ten(3);
ten := ten(2 downto 0)& one(3);
one := one(2 downto 0)& random(15);
random := signed(unsigned(random) sll 1);
end loop;
CASE one IS
when "0000" => segment0 <= "1000000" ; -- 0
when "0001" => segment0 <= "1111001" ; -- 1
when "0010" => segment0 <= "0100100" ; -- 2

when "0011" => segment0 <= "0110000" ; -- 3


when "0100" => segment0 <= "0011001" ; -- 4
when "0101" => segment0 <= "0010010" ; -- 5
when "0110" => segment0 <= "0000010" ; -- 6
when "0111" => segment0 <= "1111000" ; -- 7
when "1000" => segment0 <= "0000000" ; -- 8
when "1001" => segment0 <= "0010000" ; -- 9
when "1010" => segment0 <= "0001000" ; -- 10 or A
when "1011" => segment0 <= "0000011" ; -- 11 or B
when "1100" => segment0 <= "1000110" ; -- 12 or C
when "1101" => segment0 <= "0100001" ; -- 13 or D
when "1110" => segment0 <= "0000110" ; -- 14 or E
when "1111" => segment0 <= "0001110" ; -- 15 or F
when others => segment0 <= "1111111" ; -- TURN ON ALL LIGHTS
end case;
CASE ten IS
when "0000" => segment1 <= "1000000" ;
when "0001" => segment1 <= "1111001" ;
when "0010" => segment1 <= "0100100" ;
when "0011" => segment1 <= "0110000" ;
when "0100" => segment1 <= "0011001" ;

when "0101" => segment1 <= "0010010" ;


when "0110" => segment1 <= "0000010" ;
when "0111" => segment1 <= "1111000" ;
when "1000" => segment1 <= "0000000" ;
when "1001" => segment1 <= "0010000" ;
when "1010" => segment1 <= "0001000" ;
when "1011" => segment1 <= "0000011" ;
when "1100" => segment1 <= "1000110" ;
when "1101" => segment1 <= "0100001" ;
when "1110" => segment1 <= "0000110" ;
when "1111" => segment1 <= "0001110" ;
when others => segment1 <= "1111111" ;
end case;
CASE hund IS
when "0000" => segment2 <= "1000000" ;
when "0001" => segment2 <= "1111001" ;
when "0010" => segment2 <= "0100100" ;
when "0011" => segment2 <= "0110000" ;
when "0100" => segment2 <= "0011001" ;
when "0101" => segment2 <= "0010010" ;
when "0110" => segment2 <= "0000010" ;

when "0111" => segment2 <= "1111000" ;


when "1000" => segment2 <= "0000000" ;
when "1001" => segment2 <= "0010000" ;
when "1010" => segment2 <= "0001000" ;
when "1011" => segment2 <= "0000011" ;
when "1100" => segment2 <= "1000110" ;
when "1101" => segment2 <= "0100001" ;
when "1110" => segment2 <= "0000110" ;
when "1111" => segment2 <= "0001110" ;
when others => segment2 <= "1000000" ;
end case;

CASE thou IS
when "0000" => segment3 <= "1000000" ;
when "0001" => segment3 <= "1111001" ;
when "0010" => segment3 <= "0100100" ;
when "0011" => segment3 <= "0110000" ;
when "0100" => segment3 <= "0011001" ;
when "0101" => segment3 <= "0010010" ;
when "0110" => segment3 <= "0000010" ;
when "0111" => segment3 <= "1111000" ;

when "1000" => segment3 <= "0000000" ;


when "1001" => segment3 <= "0010000" ;
when "1010" => segment3 <= "0001000" ;
when "1011" => segment3 <= "0000011" ;
when "1100" => segment3 <= "1000110" ;
when "1101" => segment3 <= "0100001" ;
when "1110" => segment3 <= "0000110" ;
when "1111" => segment3 <= "0001110" ;
when others => segment3 <= "1000000" ;
end case;
CASE tthou IS
when "0000" => segment4 <= "1000000" ;
when "0001" => segment4 <= "1111001" ;
when "0010" => segment4 <= "0100100" ;
when "0011" => segment4 <= "0110000" ;
when "0100" => segment4 <= "0011001" ;
when "0101" => segment4 <= "0010010" ;
when "0110" => segment4 <= "0000010" ;
when "0111" => segment4 <= "1111000" ;
when "1000" => segment4 <= "0000000" ;
when "1001" => segment4 <= "0010000" ;

when "1010" => segment4 <= "0001000" ;


when "1011" => segment4 <= "0000011" ;
when "1100" => segment4 <= "1000110" ;
when "1101" => segment4 <= "0100001" ;
when "1110" => segment4 <= "0000110" ;
when "1111" => segment4 <= "0001110" ;
when others => segment4 <= "1000000" ;
end case;
one := "0000";
ten:= "0000";
hund := "0000";
thou := "0000";
tthou:= "0000";
end if;
end if;
random := input;
if input(17)>='1' then
segment5<="1000000";
if input(16)>='0' then
for i in 0 to 15 loop
segment5<="1000000";

if (tthou >= "0101") then


tthou := std_logic_vector (unsigned(tthou) +3);
end if;
if (thou >= "0101") then
thou := std_logic_vector (unsigned(thou) +3);
end if;
if (hund >= "0101") then
hund := std_logic_vector (unsigned(hund) +3);
end if;
if (ten >= "0101") then
ten := std_logic_vector (unsigned(ten) +3);
end if;
if (one >= "0101") then
one := std_logic_vector (unsigned(one) +3);
end if;
tthou := tthou(2 downto 0) & thou(3);
thou := thou(2 downto 0)& hund(3);
hund := hund(2 downto 0)& ten(3);
ten := ten(2 downto 0)& one(3);
one := one(2 downto 0)& random(15);
random := signed(unsigned(random) sll 1);

end loop;
CASE one IS
when "0000" => segment0 <= "1000000" ;
when "1111" => segment0 <= "1111001" ;
when "1110" => segment0 <= "0100100" ;
when "1101" => segment0 <= "0110000" ;
when "1100" => segment0 <= "0011001" ;
when "1011" => segment0 <= "0010010" ;
when "1010" => segment0 <= "0000010" ;
when "1001" => segment0 <= "1111000" ;
when "1000" => segment0 <= "0000000" ;
when "0111" => segment0 <= "0010000" ;
when "0110" => segment0 <= "0001000" ;
when "0101" => segment0 <= "0000011" ;
when "0100" => segment0 <= "1000110" ;
when "0011" => segment0 <= "0100001" ;
when "0010" => segment0 <= "0000110" ;
when "0001" => segment0 <= "0001110" ;
when others => segment0 <= "1111111" ; -- TURN ON ALL LIGHTS
end case;
CASE ten IS

when "0000" => segment1 <= "1000000" ;


when "1111" => segment1 <= "1111001" ;
when "1110" => segment1 <= "0100100" ;
when "1101" => segment1 <= "0110000" ;
when "1100" => segment1 <= "0011001" ;
when "1011" => segment1 <= "0010010" ;
when "1010" => segment1 <= "0000010" ;
when "1001" => segment1 <= "1111000" ;
when "1000" => segment1 <= "0000000" ;
when "0111" => segment1 <= "0010000" ;
when "0110" => segment1 <= "0001000" ;
when "0101" => segment1 <= "0000011" ;
when "0100" => segment1 <= "1000110" ;
when "0011" => segment1 <= "0100001" ;
when "0010" => segment1 <= "0000110" ;
when "0001" => segment1 <= "0001110" ;
when others => segment1 <= "1111111" ;
end case;
CASE hund IS
when "0000" => segment2 <= "1000000" ;
when "1111" => segment2 <= "1111001" ;

when "1110" => segment2 <= "0100100" ;


when "1101" => segment2 <= "0110000" ;
when "1100" => segment2 <= "0011001" ;
when "1011" => segment2 <= "0010010" ;
when "1010" => segment2 <= "0000010" ;
when "1001" => segment2 <= "1111000" ;
when "1000" => segment2 <= "0000000" ;
when "0111" => segment2 <= "0010000" ;
when "0110" => segment2 <= "0001000" ;
when "0101" => segment2 <= "0000011" ;
when "0100" => segment2 <= "1000110" ;
when "0011" => segment2 <= "0100001" ;
when "0010" => segment2 <= "0000110" ;
when "0001" => segment2 <= "0001110" ;
when others => segment2 <= "1000000" ;
end case;
CASE thou IS
when "0000" => segment3 <= "1000000" ;
when "1111" => segment3 <= "1111001" ;
when "1110" => segment3 <= "0100100" ;
when "1101" => segment3 <= "0110000" ;

when "1100" => segment3 <= "0011001" ;


when "1011" => segment3 <= "0010010" ;
when "1010" => segment3 <= "0000010" ;
when "1001" => segment3 <= "1111000" ;
when "1000" => segment3 <= "0000000" ;
when "0111" => segment3 <= "0010000" ;
when "0110" => segment3 <= "0001000" ;
when "0101" => segment3 <= "0000011" ;
when "0100" => segment3 <= "1000110" ;
when "0011" => segment3 <= "0100001" ;
when "0010" => segment3 <= "0000110" ;
when "0001" => segment3 <= "0001110" ;
when others => segment3 <= "1000000" ;
end case;
CASE tthou IS
when "0000" => segment4 <= "1000000" ;
when "1111" => segment4 <= "1111001" ;
when "1110" => segment4 <= "0100100" ;
when "1101" => segment4 <= "0110000" ;
when "1100" => segment4 <= "0011001" ;
when "1011" => segment4 <= "0010010" ;

when "1010" => segment4 <= "0000010" ;


when "1001" => segment4 <= "1111000" ;
when "1000" => segment4 <= "0000000" ;
when "0111" => segment4 <= "0010000" ;
when "0110" => segment4 <= "0001000" ;
when "0101" => segment4 <= "0000011" ;
when "0100" => segment4 <= "1000110" ;
when "0011" => segment4 <= "0100001" ;
when "0010" => segment4 <= "0000110" ;
when "0001" => segment4 <= "0001110" ;
when others => segment4 <= "1000000" ;
end case;
one := "0000";
ten:= "0000";
hund := "0000";
thou := "0000";
tthou:= "0000";
end if;
end if;
end if;
end process ;

end behavior;

You might also like