Sommario:
- Passaggio 1: diagramma della scatola nera
- Passaggio 2: macchine a stati
- Passaggio 3: tabelle di verità della macchina a stati, equazioni di eccitazione ed equazioni di output
- Passaggio 4: wrapper, sottomoduli e vincoli
- Passaggio 5: porte I/O per LED
Video: L I G H T S: 5 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:04
Lo scopo di questo progetto finale era creare qualcosa che si concentrasse sulla sostenibilità e implementasse concetti di design digitale, e per fare questo, ho deciso di progettare un sistema scalabile di risparmio energetico usando vhdl e realizzato per la Basys 3 Board (serie Artix-7 35T). Scalabile perché è possibile inserire un numero qualsiasi di sensori in una stanza e un numero qualsiasi di questi sistemi può essere posizionato intorno a un edificio oa una casa. Ciò che questo sistema farebbe, è teoricamente risparmiare migliaia di dollari in edifici commerciali e diminuire una grande percentuale di consumo energetico nelle comunità residenziali più piccole implementando un sistema connesso di luci controllate attivamente e passivamente, rilevatori di movimento, timer visualizzati su display a sette segmenti e interruttori di controllo. Questo esempio riguarda un singolo sistema con tre rilevatori di movimento, un interruttore principale, un interruttore manuale/normale, quattro display a sette segmenti e una luce singola che il sistema controlla.
Ad esempio, in una stanza scelta, verrebbero posizionati diversi rilevatori di movimento (questo progetto di esempio ne ha tre) e ciascuno invierebbe un segnale (1) se rileva un movimento e (0) se non lo fa. Se almeno uno dei rilevatori di movimento rileva un movimento, le luci si accendono se non sono già accese e rimangono accese se già accese. In qualsiasi momento tutti i rilevatori di movimento non rilevano nulla, un timer inizia il conto alla rovescia per un determinato periodo di tempo (regolabile nel codice) e le luci rimangono accese durante il conto alla rovescia. Al termine del conto alla rovescia, il timer si ferma e le luci si spengono. Se almeno un rilevatore di movimento rileva un movimento durante il conto alla rovescia, il timer si ferma e si ripristina. E se almeno un rilevatore di movimento rileva un movimento mentre le luci sono spente, le luci si accendono immediatamente.
Questo sistema ha due modalità, una con il timer come detto sopra, e una seconda dove è presente un interruttore che comanda manualmente le luci (ignorando i sensori). C'è un interruttore principale che consente all'utente di scegliere quale modalità desidera utilizzare in base a quella che ritiene possa risparmiare più energia in generale. Ex. Una stanza come un corridoio potrebbe trarre vantaggio dalla modalità timer passiva: gli utenti non sono sicuri di quando le persone passeranno, ma accendere e spegnere le luci ogni volta che entrano ed escono sarebbe un inconveniente, mentre una stanza come come una camera da letto con un solo utente sarebbe meglio gestita manualmente. E l'interruttore principale sarebbe utile in casi come se la persona che vive nella camera da letto dovesse uscire per un lungo periodo di tempo, quindi l'interruttore principale potrebbe essere spento e la modalità timer funzionerebbe per risparmiare energia in modo più efficiente.
Quindi in questo sistema ci sono due macchine a stati, una è la macchina a stati principale e un'altra per il conto alla rovescia. La macchina a stati principale ha cinque stati definiti come tali: 1. "luci accese, movimento rilevato" (id = 000), 2. "luci accese, nessun movimento rilevato" (id = 001), 3. "luci spente, nessun movimento rilevato" (id = 010), 4. "acceso manualmente" (id = 011) e 5. "spento manualmente" (id = 100). Questa macchina a stati principale ha quattro ingressi: l'interruttore principale (ms), l'interruttore manuale/normale (ns), un segnale che è alto quando almeno un interruttore rileva un movimento e che è basso altrimenti (orx) e un segnale che è alto una volta terminato il timer, basso altrimenti (td). La macchina a stati principale ha due uscite: luci (luci) e un segnale che indica quando accendere il timer per il conto alla rovescia (timer) o (t) (entrambi sono usati in modo intercambiabile).
La seconda macchina a stati, il timer per il conto alla rovescia, ha 12 stati: 10 di questi hanno ID associati al numero visualizzato dal segmento di sette: "seg 10" (id = 1010), "seg 9" (id = 1001), […], “seg 2” (id = 0010), “seg 1” (id = 0001) e gli altri due stati visualizzano entrambi zero, che rappresenta il timer spento, quindi c'è il primo spazio "blank 1" (id = 1111) e il secondo spazio "blank 2" (id = 0000). Il timer per il conto alla rovescia ha un ingresso: timer (t) e tre uscite: il numero visualizzato in binario con quattro bit (bin) e un segnale che indica che il timer è terminato (td).
Passaggio 1: diagramma della scatola nera
Questa è una panoramica di come dovrebbe funzionare l'intero sistema ed è descritta con un diagramma a scatola nera.
- L'orologio viene utilizzato per sincronizzare la macchina a stati principale e il decodificatore a sette segmenti; è necessario un clock più lento per il contatore all'indietro, quindi c'è un modulo divisore di clock che prende l'ingresso del clock e emette un clock più lento per il contatore all'indietro.
- La variabile intermedia (orx) nell'involucro è legata ai sensori di movimento e sarà alta se almeno uno dei sensori rileva qualcosa, e bassa altrimenti; l'equazione booleana per questo è solo orx = s(2) o s(1) o s(0).
-
Il principale fsm controlla in quale stato generale si trova il sistema, a seconda degli ingressi (orx, ms, ns, td) e delle uscite lo stato attuale in cui si trova (sm) mostrato semplificato con i due segnali per cui è utilizzato (timer e luci).
- (timer) è un segnale wrapper che viene inviato al contatore alla rovescia fsm come suo ingresso ed è controllato dallo stato corrente dell'fsm principale. Indica quando accendere il timer.
- (luci) è un segnale wrapper utilizzato per controllare il led ed è controllato dallo stato corrente dell'fsm principale.
-
Il contatore all'indietro fsm controlla ciò che i sette segmenti visualizzano a seconda dell'ingresso (timer) e emette lo stato corrente in cui si trova (sd) mostrato semplificato con i due segnali per cui è utilizzato (td e bin).
- (td) è un segnale wrapper che viene inviato all'fsm principale come suo input ed è controllato dallo stato corrente dell'fsm contatore alla rovescia. Funziona come un segnale di feedback che indica quando il timer è terminato.
- (bin) è un segnale wrapper a quattro bit che è concatenato con quattro bit di zero ("0000" e bin) e gli otto bit combinati vengono inviati a (q), un segnale wrapper a otto bit, che a sua volta viene inviato ai sette bit decodificatore di segmento sotto (ALU_VAL).
-
Il modulo a sette segmenti è lo stesso di Polylearn; i suoi ingressi principali accettano un numero di 8 bit (bin) in (ALU_VAL) per essere visualizzato su quattro diversi display a sette segmenti utilizzando le uscite (SEGMENTS) per il segnale wrapper (seg) e (DISP_EN) per wrapper (disp_en).
- Poiché due o più display a sette segmenti non possono visualizzare cifre diverse contemporaneamente, è necessario un orologio per scorrere i quattro segmenti, visualizzando la cifra appropriata alla volta per ogni sseg che viene acceso individualmente, e il ciclo abbastanza veloce rende il sseg sembrano essere tutti in una volta.
- (segno e valido) sono costanti in tutto questo programma, quindi (segno) è impostato permanentemente basso e (valido) è impostato permanentemente alto.
- (ALU_VAL) riceve come input il segnale wrapper (q) che rappresenta il numero che verrà visualizzato sul display a sette segmenti in formato binario.
- L'uscita (SEGMENTS) viene inviata a un segnale wrapper a otto bit (seg) e (DISP_EN) a un segnale wrapper a quattro bit (disp_en).
-
C'è anche un modulo flip flop D non mostrato esplicitamente nel diagramma ma è necessario per le due macchine a stati come sottomoduli e aiuta la transizione degli stati in modo sincrono.
- (3) di questi sono necessari per l'fsm principale poiché 2^(3) = 8 > 5 stati per la codifica
- (4) di questi sono necessari per il contatore alla rovescia fsm poiché 2^4 = 16 > 12 stati per la codifica
Passaggio 2: macchine a stati
Per progettare correttamente le due macchine a stati, è necessario definire chiaramente i singoli stati, con i relativi output e lo stato a cui si passa in base ai diversi input possibili.
Principali stati fsm:
“Luci accese, movimento rilevato” (id = 000)
Le luci sono accese, almeno uno dei rilevatori di movimento rileva il movimento, quindi orx deve essere alto e ms è acceso.
- Uscite: luci = 1 e timer = 0
- Rimane in questo stato quando ms = 1 e orx = 1.
- Passa allo stato “luci accese, nessun movimento rilevato” se ms = 1 e orx = 0.
- Passa allo stato “acceso manualmente” se ms = 0 e ns = 1.
- Passa allo stato “spegnimento manuale” se ms = 0 e ns = 0.
“Luci accese, nessun movimento rilevato” (id = 001)
Le luci sono accese, nessun movimento rilevato da alcun rilevatore di movimento, quindi orx deve essere basso e ms è acceso. Inoltre, all'inizio di questo stato, il timer impostato su alto dice al conto alla rovescia fsm di iniziare il conto alla rovescia, procede al conto alla rovescia e interrompe il conto alla rovescia una volta che il conto alla rovescia fsm dice a questo fsm che ha finito di contare.
- Uscite: luci = 1 e timer = 1.
- Rimane in questo stato quando ms = 1 e orx = 0 e td (il timer è terminato) = 0.
- Passa allo stato “luci accese, movimento rilevato” se ms = 1 e orx = 1.
- Passa allo stato “luci spente, nessun movimento rilevato” se ms = 1 e orx = 0 e td = 1.
- Passa allo stato “acceso manualmente” se ms = 0 e ns = 1.
- Passa allo stato “spegnimento manuale” se ms = 0 e ns = 0.
“Luci spente, nessun movimento rilevato” (id = 010)
Le luci sono spente, nessun movimento rilevato da alcun sensore di movimento e il timer ha terminato il conto alla rovescia, quindi orx deve essere basso, ms è acceso e td è spento.
- Uscite: luci = 0 e timer = 0.
- Rimane in questo stato quando ms = 1 e orx = 0.
- Passa allo stato “luci accese, movimento rilevato” se ms = 1 e orx =1.
- Passa allo stato “acceso manualmente” se ms = 0 e ns = 1.
- Passa allo stato “spegnimento manuale” se ms = 0 e ns = 0.
“Acceso manualmente” (id = 011)
Le luci sono accese, i rilevatori di movimento sono irrilevanti, quindi ms è spento e ns è acceso.
- Uscite: luci = 1 e timer = 0.
- Rimane in questo stato quando ms = 0 e ns = 1.
- Passa allo stato “spegnimento manuale” se ms = 0 e ns = 0.
- Passa allo stato “luci spente, nessun movimento rilevato se ms = 1.
“Spegnimento manuale” (id = 100)
Le luci sono spente, i rilevatori di movimento sono irrilevanti, quindi ms è spento e ns è spento.
- Uscite: luci = 0 e timer = 0.
- Rimane in questo stato quando ms = 0 e ns = 0.
- Passa allo stato “acceso manualmente” se ms = 0 e ns = 1.
- Passa allo stato “luci spente, nessun movimento rilevato se ms = 1.
Il contatore indica:
“Segmento 10” (id = 1010)
Il display a sette segmenti mostra un 10.
- Uscite: bin = “1010” e td = 0.
- Passa allo stato “seg 9” se timer = 1.
- Passa allo stato “vuoto 2” se timer = 0.
“Segmento 9” (id = 1001)
Il display a sette segmenti mostra un 9.
- Uscite: bin = “1001” e td = 0.
- Passa allo stato “seg 8” se timer = 1.
- Passa allo stato “vuoto 2” se timer = 0.
(Gli stati "Seg 8" fino a "Seg 2" sono omessi perché seguono lo stesso schema di "Seg 10" e "Seg 9" e non sono necessari per la spiegazione)
“Segmento 1” (id = 0001)
Il display a sette segmenti mostra un 1.
- Uscite: bin = “0001” e td = 0.
- Passa allo stato "vuoto 2" al successivo fronte di salita del clock (nessun input necessario).
"Vuoto 2" (id = 1111)
Il display a sette segmenti mostra uno 0. Lo scopo di un secondo stato vuoto è che ci sia uno stato separato per quando td = 1 per sicurezza.
- Uscite: bin = “1111” e td = 1.
- Passa allo stato "vuoto 1" al successivo fronte di salita del clock (nessun input necessario).
“Vuoto 1” (id = 0000)
Il display a sette segmenti mostra uno 0. Questo è lo stato in cui si trova il sistema quando la macchina a stati principale è nello stato "luci spente, nessun movimento rilevato".
- Uscite: bin = “0000” e td = 0.
- Passa allo stato “seg 10” se timer = 1.
Passaggio 3: tabelle di verità della macchina a stati, equazioni di eccitazione ed equazioni di output
Il passaggio successivo consiste nel creare tabelle di verità per le due macchine a stati, equazioni di eccitazione ed equazioni di output per ciascun fsm. Per ogni equazione di eccitazione fsm, ci devono essere equazioni per ogni bit codificato di stato successivo in termini di stato corrente e dei suoi segnali di ingresso. Per ogni equazione di uscita fsm, ci devono essere equazioni per ogni segnale di uscita in termini di stato corrente. Tutti e quattro gli insiemi di equazioni possono essere ricavati dalle tabelle di verità raffigurate. (qn è il prossimo bit di stato codificato per ogni macchina a stati e q è lo stato corrente)
(000) equivalente a q(2)'q(1)'q(0)' e (0000) equivalente a q(3)'q(2)'q(1)'q(0)'
(es. (0101) è q(3)'q(2)q(1)'q(0) e (110) è q(2)q(1)q(0)')
Equazioni di eccitazione per il fsm principale:
- qn(2) = (ms)'(ns)
- qn(1) = (ms)'(ns)' + (ms)(orx)'[(td)(001) + (010)] + (ms)[(011) + (100)]
- qn(0) = (ms)'(ns)' + (ms)(orx)'[(000) + (td)'(001)]
Equazioni di output per l'fsm principale:
- luci = (000) + (001) + (100)
- temporizzatore = (001)
Equazioni di eccitazione per il contatore fsm:
- qn(3) = t[(0000) + (1010) + (1001) + (0001)]
- qn(2) = t[(1000) + (0111) + (0110) + (0101) + (0001)]
- qn(1) = t[(0000) + (1000) + (0111) + (0100) + (0011) + (0001)]
- qn(0) = t[(1010) + (1000) + (0110) + (0100) + (0010) + (0001)]
Equazioni di output per il contatore all'indietro fsm:
- td = (1111)
- contenitore(3) = (1010) + (1001) + (1000) + (1111) + (0000)
- contenitore(2) = (0111) + (0110) + (0101) + (0100) + (1111) + (0000)
- contenitore(1) = (1010) + (0111) + (0110) + (0011) + (0010) + (1111) + (0000)
- contenitore(0) = (1001) + (0111) + (0101) + (0011) + (0001) + (1111) + (0000)
Passaggio 4: wrapper, sottomoduli e vincoli
Come spiegato già nel passaggio 1, questi moduli sono necessari per questo progetto e sono tutti legati insieme al modulo wrapper denominato "final_proj.vhd". Il file di vincolo denominato "Basys3_Master.xdc" viene utilizzato per collegare tutti gli ingressi e le uscite del wrapper agli switch, ai sette segmenti e alle porte I/O sulla scheda Basys 3. L'interruttore principale dovrebbe essere l'interruttore sulla scheda più vicino al lato in cui sono accesi i fili, l'interruttore normale/manuale è il secondo più vicino e i tre interruttori che rappresentano i tre sensori di movimento sono i tre interruttori immediatamente accanto all'interruttore normale/manuale. Tutto il codice (equazioni booleane, dichiarazioni di moduli, ecc.) è già scritto nei file, quindi non devi scrivere nient'altro per farlo funzionare.
Passaggio 5: porte I/O per LED
L'ultimo passaggio di questo progetto consiste nell'utilizzare un led per mostrare se (le luci) si accendono e si spengono effettivamente. Il cablaggio è mostrato nelle due immagini. Assicurarsi che ci sia una resistenza in serie al led (almeno 330 ohm) per non bruciare il led e assicurarsi che il pin lungo del led sia collegato allo stesso header femmina sulla scheda base come mostrato il filo rosso (in alto più a destra) e il pin più corto è collegato a terra, la stessa intestazione femmina del filo nero mostrato (in alto, il secondo da sinistra).
Consigliato:
Come realizzare un'antenna doppia biQuade 4G LTE Semplici passaggi: 3 passaggi
Come realizzare un'antenna doppia biQuade 4G LTE Semplici passaggi: La maggior parte delle volte che ho affrontato, non ho una buona potenza del segnale per i miei lavori quotidiani. Così. Cerco e provo diversi tipi di antenna ma non funziona. Dopo aver perso tempo ho trovato un'antenna che spero di realizzare e testare, perché è principio costruttivo non
Rilevamento del volto su Raspberry Pi 4B in 3 passaggi: 3 passaggi
Rilevamento del volto su Raspberry Pi 4B in 3 passaggi: In questo Instructable eseguiremo il rilevamento del volto su Raspberry Pi 4 con Shunya O/S utilizzando la libreria Shunyaface. Shunyaface è una libreria di riconoscimento/rilevamento facciale. Il progetto mira a raggiungere la massima velocità di rilevamento e riconoscimento con
Specchio per il trucco fai-da-te in semplici passaggi (usando le strisce luminose a LED): 4 passaggi
Specchio per il trucco fai-da-te in semplici passaggi (usando le strisce luminose a LED): in questo post, ho realizzato uno specchio per il trucco fai-da-te con l'aiuto delle strisce LED. Sono davvero fantastici e devi provarli anche tu
Gioca a Doom sul tuo iPod in 5 semplici passaggi!: 5 passaggi
Gioca a Doom sul tuo iPod in 5 semplici passaggi!: una guida passo passo su come eseguire il dual-boot di Rockbox sul tuo iPod per giocare a Doom e a dozzine di altri giochi. È qualcosa di veramente facile da fare, ma molte persone rimangono stupite quando mi vedono giocare a doom sul mio iPod e si confondono con le istruzioni
Come installare plugin in WordPress in 3 passaggi: 3 passaggi
Come installare plugin in WordPress in 3 passaggi: In questo tutorial ti mostrerò i passaggi essenziali per installare il plugin wordpress sul tuo sito web. Fondamentalmente puoi installare i plugin in due modi diversi. Il primo metodo è tramite ftp o tramite cpanel. Ma non lo elencherò perché è davvero completo