Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers
20690 Discussions

comparator with memory

Altera_Forum
Honored Contributor II
972 Views

Hello, 

I'm starting with vhdl, and i'm try to write any kind of comaprator with memory of the out signal. 

Can anyboidy help me.. 

Program have to check state of input from keypad (ps2) and check it is signal of a letter. if pressed keypad is a letter then on the out will be signal of these key 

 

LIBRARY ieee;  

USE ieee.std_logic_1164.all;  

ENTITY bufor IS  

PORT(in: IN STD_LOGIC_VECTOR (21 downto 0);  

out: OUT STD_LOGIC_VECTOR (7 downto 0));  

END ENTITY;  

ARCHITECTURE mem OF bufor IS  

shared variable li1 : std_logic_vector(7 downto 0); 

shared variable li2 : std_logic_vector(7 downto 0); 

BEGIN 

 

process (in) is  

begin 

li1 := "00000000"; 

li2 := "00000000"; 

 

li1 := in(8 downto 1); 

-- checking of keypad key 

if (((li2) /= (li1))and (li1=( X"21" OR X"23" OR X"24" OR X"2B" OR X"34" OR X"33" OR X"43" OR X"3B" OR X"42" OR X"4B" OR X"3A" OR X"31" OR X"44" OR X"4D" OR X"15" OR X"2D" OR X"1B" OR X"2C" OR X"3C" OR X"2A" OR X"1D" OR X"22" OR X"35" OR X"1A"))) then 

li2 := li1; 

end if; 

out <= li2;  

end process; 

end mem;
0 Kudos
3 Replies
Altera_Forum
Honored Contributor II
310 Views

The OR chain you wrote is not correct; it will reduce in a  

((li2) /= (li1)) and (li1 = X"7F") 

condition, since you are logically ORing the 8bit codes of keys. 

You should write: 

... (li1 = X"21") OR (li1 = X"23") OR (li1 = X"24") OR ....
0 Kudos
Altera_Forum
Honored Contributor II
310 Views

Cris72 i've fixed that :) you're BIG :) now i have a little problem, beacouse when the input signal isn't signal of keypad i have 0 ont the out... 

 

Sorry for my english ;]
0 Kudos
Altera_Forum
Honored Contributor II
310 Views

 

--- Quote Start ---  

when the input signal isn't signal of keypad i have 0 ont the out... 

 

--- Quote End ---  

 

That's correct. The process you wrote indeed makes this. 

Infact every time the process runs (when 'in' changes), you assign 

li1 := "00000000"; 

li2 := "00000000"; 

then, whenever the 'if' condition is not fulfilled (namely when signal is not from keypad) 

your output keeps this zero status. 

If your code is supposed to hold the last keypad code on 'out' as long as a non-keypad code is received, simply remove these 2 lines.
0 Kudos
Reply