You are on page 1of 10

Project Description

This project makes use of the Spartan-3E FPGA Starter Kit Board Expansion Connectors,

specifically the 6-Pin Accessory Headers, Header J1 and Header J2. Using the expansion

connector of the Spartan-3E, we will input data from a keypad. The key pressed in the keypad

will be displayed in the first line of the on-board Liquid Crystal Display (LCD) of the Spartan-3E.

A numeric keypad to a MM74C922 will be used to output a five-bit data to the 6-pin headers.

The four-bit data will be connected to the J1 header and the data available which is the fifth bit

will be connected to the J2 header. The bit in the J2 header is a check bit if there is a key

pressed. The data sent in the J1 header are the data to be displayed in the LCD. The LCD is

configured to display the desired number to be displayed or the key pressed in the keypad.

1
Over-all Block Diagram

2
Entity Diagram(s)

For keypad_input.vhd:

For lcd_expansion.vhd:

3
For top_module.vhd:

4
Source Code(s)

--keypad_module.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity keypad_module is
Port ( keypress_in : in STD_LOGIC_VECTOR (4 downto 0);
keypress_out : out STD_LOGIC_VECTOR (11 downto 0));
end keypad_module;

architecture Behavioral of keypad_module is

begin

process(keypress_in)

variable temp1: std_logic_vector(4 downto 0);


variable temp2: std_logic_vector(11 downto 0);

begin

case keypress_in is
when "10000" => temp2 := "100011100001"; -- 0 1
when "10001" => temp2 := "100011100010"; -- 1 2
when "10010" => temp2 := "100011100011"; -- 2 3
when "10100" => temp2 := "100011100100"; -- 4 4
when "10101" => temp2 := "100011100101"; -- 5 5
when "10110" => temp2 := "100011100110"; -- 6 6
when "11000" => temp2 := "100011100111"; -- 8 7
when "11001" => temp2 := "100011101000"; -- 9 8
when "11010" => temp2 := "100011101001"; -- 10 9
when "11100" => temp2 := "100010101010"; -- 12 *
when "11101" => temp2 := "100011100000"; -- 13 0
when "11110" => temp2 := "100010100011"; -- 14 C
when others => null;
end case;

keypress_out <= temp2;

end process;

end Behavioral;

5
--lcd_module.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity lcd_module is
Port ( clk: in STD_LOGIC;
sf_ce0, rs, rw, en : out STD_LOGIC;
lcd_data : out STD_LOGIC_VECTOR (3 DOWNTO 0);
keypad_output : in STD_LOGIC_VECTOR (11 downto 0));
end lcd_module;

architecture Behavioral of lcd_module is

signal a: STD_LOGIC := '1';


signal mask, count1: STD_LOGIC := '0';
signal lcd_data_op : STD_LOGIC_VECTOR (5 downto 0);
signal final_out: STD_LOGIC_VECTOR (6 downto 0) := "0000000";
signal count: STD_LOGIC_VECTOR(25 downto 0) := "00000000000000000000000000";

begin

process (clk)

begin
if rising_edge(clk) then

count <= count + 1;


count1 <= not count1;
sf_ce0 <= '1';

-------------------LCD initialization process -------------------------------

case (count(25 downto 20)) is

when "000000" => lcd_data_op <= "000011"; --X"03"


when "000001" => lcd_data_op <= "000011"; --X"03"
when "000010" => lcd_data_op <= "000000"; --X"03"
when "000011" => lcd_data_op <= "000010"; --X"02"
when "000100" => lcd_data_op <= "000010"; --X"02" function set
when "000101" => lcd_data_op <= "001000"; --X"08"
when "000110" => lcd_data_op <= "000000"; -- X"00" entry mode
when "000111" => lcd_data_op <= "000110"; --X"06"
when "001000" => lcd_data_op <= "000000"; -- display on/off
when "001001" => lcd_data_op <= "001100";
when "001010" => lcd_data_op <= "000000"; -- display clear
when "001011" => lcd_data_op <= "000001";
when "001100" => lcd_data_op <= "000000"; -- Take cursor home
when "001101" => lcd_data_op <= "001111";

6
------------- Data operation for LCD ----------------------------------

when "001110" => lcd_data_op <= keypad_output(11 downto 6);


when "001111" => lcd_data_op <= keypad_output( 5 downto 0);
when "010000" => lcd_data_op <= keypad_output(11 downto 6);
when "010001" => lcd_data_op <= keypad_output( 5 downto 0);
when "010010" => lcd_data_op <= keypad_output(11 downto 6);
when "010011" => lcd_data_op <= keypad_output( 5 downto 0);
when "010100" => lcd_data_op <= keypad_output(11 downto 6);
when "010101" => lcd_data_op <= keypad_output( 5 downto 0);
when "010110" => lcd_data_op <= keypad_output(11 downto 6);
when "010111" => lcd_data_op <= keypad_output( 5 downto 0);
when "011000" => lcd_data_op <= keypad_output(11 downto 6);
when "011001" => lcd_data_op <= keypad_output( 5 downto 0);
when "011010" => lcd_data_op <= keypad_output(11 downto 6);
when "011011" => lcd_data_op <= keypad_output( 5 downto 0);
when "011100" => lcd_data_op <= keypad_output(11 downto 6);
when "011101" => lcd_data_op <= keypad_output( 5 downto 0);
when "011110" => lcd_data_op <= keypad_output(11 downto 6);
when "011111" => lcd_data_op <= keypad_output( 5 downto 0);
when "100000" => lcd_data_op <= keypad_output(11 downto 6);
when "100001" => lcd_data_op <= keypad_output( 5 downto 0);
when "100010" => lcd_data_op <= keypad_output(11 downto 6);
when "100011" => lcd_data_op <= keypad_output( 5 downto 0);
when "100100" => lcd_data_op <= keypad_output(11 downto 6);
when "100101" => lcd_data_op <= keypad_output( 5 downto 0);
when "100110" => lcd_data_op <= keypad_output(11 downto 6);
when "100111" => lcd_data_op <= keypad_output( 5 downto 0);
when "101000" => lcd_data_op <= keypad_output(11 downto 6);
when "101001" => lcd_data_op <= keypad_output( 5 downto 0);
when "101010" => lcd_data_op <= keypad_output(11 downto 6);
when "101011" => lcd_data_op <= keypad_output( 5 downto 0);
when "101100" => lcd_data_op <= keypad_output(11 downto 6);
when "101101" => lcd_data_op <= keypad_output( 5 downto 0);
when others => lcd_data_op <= "ZZZZZZ";

end case;

end if;

end process;

a<= count(19) or count(18);


mask <= a and NOT lcd_data_op(4);
final_out(6) <= mask;
final_out(5 downto 0) <= lcd_data_op;

en <= final_out(6);
rs <= final_out(5);
rw <= final_out(4);
lcd_data<= final_out(3 downto 0);

end Behavioral;

7
--top_module.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top_module is
Port ( data_in : in STD_LOGIC_VECTOR (4 downto 0);
clk : in STD_LOGIC;
sf_ce0, rs, rw, en : out STD_LOGIC;
data_out: out STD_LOGIC_VECTOR (3 downto 0));
end top_module;

architecture structural of top_module is

component keypad_module is
Port ( keypress_in : in STD_LOGIC_VECTOR (4 downto 0);
keypress_out : out STD_LOGIC_VECTOR (11 downto 0));
end component;

component lcd_module is
Port ( clk: in STD_LOGIC;
sf_ce0, rs, rw, en : out STD_LOGIC;
lcd_data : out STD_LOGIC_VECTOR (3 DOWNTO 0);
keypad_output : in STD_LOGIC_VECTOR (11 downto 0));
end component;

signal temp: STD_LOGIC_VECTOR (11 downto 0);

begin

input: keypad_module port map(data_in, temp);


output: lcd_module port map(clk, sf_ce0 , rs, rw, en, data_out, temp);

end structural;

8
Simulation Waveform

UCF File(s)

NET "clk" LOC = "C9" | IOSTANDARD = LVCMOS33;


NET "sf_ce0" LOC = "D16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "rs" LOC = "L18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "rw" LOC = "L17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "en" LOC = "M18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "data_out<0>" LOC = "R15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "data_out<1>" LOC = "R16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "data_out<2>" LOC = "P17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
NET "data_out<3>" LOC = "M15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;

# ==== 6-pin header J1 ====


# These four connections are shared with the FX2 connector

NET "data_in<0>" LOC = "B4" | IOSTANDARD = LVCMOS33;


NET "data_in<1>" LOC = "A4" | IOSTANDARD = LVCMOS33;
NET "data_in<2>" LOC = "D5" | IOSTANDARD = LVCMOS33;
NET "data_in<3>" LOC = "C5" | IOSTANDARD = LVCMOS33;
NET "data_in<4>" LOC = "A6" | IOSTANDARD = LVCMOS33;

9
10

You might also like