Debouncing su CPLD

Ciao,

ho appena finito di preparare un programmino per una CPLD e mi resta dello spazio libero.

È possibile metterci dentro il key debouncing o quello devo farlo per forza esternamente?

Grazie Boiler

Reply to
Boiler
Loading thread data ...

Il 24 Feb 2005, 22:26, Boiler ha scritto:

Dipende da quante celle ti sono rimaste e dal clock che hai. In genere si usa uno shift register prendendo lo XOR tra l'ingresso e l'uscita , ma e' piuttosto dispendioso in termini di celle. In alternativa potresti usare una configurazione a trigger di schmidt e una rete RC. Avevo visto qualcosa su una application note Xilinx. Ciao.

-------------------------------- Inviato via

formatting link

Reply to
brown fox

Ti riporto cosa dice il compiler:

** RESOURCE USAGE ** Shareable External Logic Array Block Logic Cells I/O Pins Expanders Interconnect

A: LC1 - LC16 4/16( 25%) 8/ 8(100%) 2/16( 12%) 8/36( 22%) B: LC17 - LC32 4/16( 25%) 5/ 7( 71%) 1/16( 6%) 8/36( 22%) C: LC33 - LC48 10/16( 62%) 7/ 8( 87%) 11/16( 68%) 16/36( 44%) D: LC49 - LC64 0/16( 0%) 2/ 7( 28%) 0/16( 0%) 0/36( 0%)

Total dedicated input pins used: 1/4 ( 25%) Total I/O pins used: 22/30 ( 73%) Total logic cells used: 18/64 ( 28%) Total shareable expanders used: 14/64 ( 21%) Total Turbo logic cells used: 18/64 ( 28%) Total shareable expanders not available (n/a): 0/64 ( 0%) Average fan-in: 6.55 Total fan-in: 118

Total input pins required: 5 Total output pins required: 14 Total bidirectional pins required: 0 Total reserved pins required 4 Total logic cells required: 18 Total flipflops required: 18 Total product terms required: 65 Total logic cells lending parallel expanders: 0 Total shareable expanders in database: 14

Synthesized logic cells: 0/ 64 ( 0%)

Non ho capito bene come fai.

Penso che farò così: rete RC esterna e inverter interno alla CPLD.

Ciao Boiler

Reply to
Boiler

Beh, da questo valore si deduce che di spazio ne hai ancora abbastanza...

Due anni fa' ho realizzato per un esame una cosa simile (16 tasti di una calcolatrice). Se hai solo 1 tasto da gestire il tutto si risolve molto semplicemente, se sono di più si devono considerare anche tutte le possibili combinazioni di tasti premuti quindì la cosa si complica, occore una FSM.

Ti consiglio comunque di implementarla nella CPLD visto che ne hai lo spazio.

Ciao

Reply to
tx_

Tre tasti: uno va tenuto premuto per attivare gli altri due. E questo è già implementato in una FSM e non mi serve il debouncing.

Per gli altri due invece devo farlo. Una FSM non è un po' un'esagerazione? Potrebbe funzionare un latch che viene resettato da un clock relativamente lento (500Hz)?

Boiler

Reply to
Boiler

Occhio che la FSM funzioni veramente senza il debounce di questo tasto, i rimbalzi creano un bel po' di casini...

Visto che hai solo 3 tasti e per quanto ho capito ciascuno con il proprio ingresso puoi usare un po' di logica combinatoria e qualche flip flop, ma ottieni una FSM lo stesso con lo svantaggio di dover fare tutto a "mano". Oppure potresti utilizzare se puoi un codice in vhdl tipo questo per ciascun tasto:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all;

-- Debounce Pushbutton: Filters out mechanical switch bounce for around

40Ms. ENTITY debounce IS PORT(pb, clock_100Hz : IN STD_LOGIC; pb_debounced : OUT STD_LOGIC); END debounce;

ARCHITECTURE a OF debounce IS SIGNAL SHIFT_PB : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN

-- Debounce clock should be approximately 10ms or 100Hz PROCESS BEGIN WAIT UNTIL (clock_100Hz'EVENT) AND (clock_100Hz = '1'); -- Use a shift register to filter switch contact bounce SHIFT_PB(2 DOWNTO 0)

Reply to
tx_

La FSM funziona così: ha un ingresso, 2 uscite e 3 stati. Lo stato di riposo è 1/0. Quando arriva un 1 sull'igresso, dopo un ciclo passa a

0/0. Se sullo 0/0 l'ingresso è ancora 1, passa a 0/1 e ci resta fintanto ché l'ingresso è a 1. Quando l'input passa a zero torna dapprima a 0/0 e poi a 1/0. Il tutto mi serve per iserire una "pausa" nel passaggio da una funzione all'altra. Dato che la funzione implica che il tasto venga tenuto premuto a lungo, non penso che un po' di rumore nella commutazione possa dare fastidio (il clock della FSM sarà inferiore ai 60Hz, quindi lentissimo rispeto ai bounces).

Gli altri due tasti vengono usati per eseguire delle operazioni quando la precedente FSM è nello stato 0/1.

Potrei fare copia e incolla, ma VHDL non lo conosco e non mi va molto di usare cose che non capisco. Grazie comunque.

OK, faccio così sperando che mi ci stia nella CPLD (adesso è al 28%, ma mi basta spostare un PIN e il Fitter non riesce piú a farcela stare).

Ottimo, visto che a settembre avrò l'esame di tecnica digitale ;-)

Grazie mille! Boiler

Reply to
Boiler

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.