EmbDev.net

Forum: FPGA, VHDL & Verilog VHDL calculator matrix input help.


Author: ed jones (Guest)
Posted on:

Rate this post
0 useful
not useful
code for matrix button input so far. getting signals from buttons but 
not sending signals to 4bit led output,
any help would be great.
Library IEEE;
Use IEEE.STD_LOGIC_1164.ALL;
Use IEEE.STD_LOGIC_ARITH.ALL;
Use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
Entity keypad_input is
Port( clk                : in std_logic;
      col_line           : in  std_logic_vector(2 downto 0);
      row_line           : out std_logic_vector(3 downto 0);
      Number             : out std_logic_vector(3 downto 0));
End keypad_input;
 

Architecture Behavior of keypad_input is 
signal sig_c : std_logic_vector(2 downto 0):= "000";
signal sig_r : std_logic_vector(3 downto 0):= "0001" ;
signal num  : std_logic_VECTOR (3 DOWNTO 0);
Signal C0    : std_logic_vector (2 downto 0):= "000";
Signal C1    : std_logic_vector (2 downto 0):= "000";
Signal C2    : std_logic_vector (2 downto 0):= "000";
 
begin
  
-- send signal to rows of keypad --
process (clk) is
  Begin
    If (clk 'event and clk = '0') then
  sig_r <= sig_r(0) & sig_r(3 downto 1);        
end if;
end process;
 row_line <= sig_r;
 
debounce: process (clk,sig_c,col_line) is
  Begin
    If (Clk 'event and Clk = '1') then
       C0 <= C0(1 downto 0) & Col_line(0);
       C1 <= C1(1 downto 0) & Col_line(1); 
       C2 <= C2(1 downto 0) & Col_line(2);
    end if;
   
sig_c(0) <= C0(0) and C0(1) and (not C0(2));
sig_c(1) <= C1(0) and C1(1) and (not C1(2));
sig_c(2) <= C2(0) and C2(1) and (not C2(2));
 
 End process;

-- read debounces signals --
input: Process (num, sig_r, sig_c)  is
begin
if sig_r = "0001" then
  if sig_c(0) = '1' then 
    num <= "1110"; -- e
  elsif sig_c(1) = '1' then
    num <= "0000"; -- 0
  elsif sig_c (2) = '1' then 
    num <= "1010"; -- a
   else null;
  end if;
  
elsif sig_r = "0010" then
  if sig_c(0) = '1' then 
    num <= "0011"; -- 3
  elsif sig_c(1) = '1' then
    num <= "0010"; -- 2
  elsif sig_c (2) = '1' then  
    num <= "0001"; -- 1
  else null;
  end if;

elsif sig_r = "0100" then
  if sig_c(0) = '1' then 
    num <= "0110"; -- 6
  elsif sig_c(1) = '1' then
    num <= "0101"; -- 5
  elsif sig_c (2) = '1' then  
    num <= "0100"; -- 4
  else null;
  end if;

elsif sig_r = "1000" then
  if sig_c(0) = '1' then 
    num <= "1001"; -- 9
  elsif sig_c(1) = '1' then
    num <= "1000"; -- 8
  elsif sig_c (2) = '1' then 
    num <= "0111"; -- 7
  else null;
  end if;
 end if;  
end process;
number <= num;

end Behavior;


: Edited by Moderator
Author: Lothar Miller (lkmiller) (Moderator)
Posted on:
Attached files:

Rate this post
0 useful
not useful
ed jones wrote:
> getting signals from buttons but not sending signals to 4bit led output
How did you find that out? What do you expect? And what do you get 
instead?


BTW1: your "debounce" process suffers three big design flaws.
1. sig_c and col_line are not necessary in the sensitivity list.
2. at the moment C0, C1 and C2 are missing for a correct simualation!!
3. do NOT combine synchronous and combinatorial processes into one.
So finally: only clk must be in that sensitivity list. And after 
"end if" there must follow "end process":
  process (clk) begin
    If (Clk 'event and Clk = '1') then
       -- this is the synchronous process
    end if;
    -- nothing here!!!!!!!
  end process;


BTW2: please read that very short manual for the editbox here. Most 
important is that thing with those [vhdl] tags...

: Edited by Moderator

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [vhdl]VHDL code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.