This shows you the differences between two versions of the page.
|
soc:laboratoare:04:todo [2025/03/24 23:51] matei_calin.ceausu |
soc:laboratoare:04:todo [2026/03/22 17:11] (current) robert_fabian.tudor |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | **Task 1** (2p + 0.25p + 0.25p) **Implementați un modul** care să aprindă și se stingă un LED la un anumit interval de timp. Astfel, vom folosi un FSM simplu, cu doar două stări. După simularea cu succes a circuitului, **completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | + | **Task 1** (2p + 0.25p + 0.25p) **Implementați un modul** care să aprindă și să stingă un LED la un interval regulat de timp. Pentru a realiza acest lucru, veți construi un automat finit simplu, cu doar două stări: |
| - | *În prima stare, LED-ul va fi stins, se va aștepta un anumit interval de timp (1s), iar apoi trece in starea 2. | + | ***Starea 1:** LED-ul este stins. Automatul așteaptă timp de 1 secundă, după care tranzitează în starea 2. |
| - | *Starea a doua, în care va petrece același interval de timp, dar aprins. | + | ***Starea 2:** LED-ul este aprins. Automatul așteaptă același interval de 1 secundă, după care revine în starea 1. |
| + | **Completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | ||
| Urmăriți TODO-urile din schelet! | Urmăriți TODO-urile din schelet! | ||
| - | **Task 2** (2.5p + 0.25p + 0.75p) Chiar dacă a trecut Craciunul, acum știm destul de multe pentru a realiza o simplă instalație de pom. Implementați un FSM care să producă următoarea secvență folosind LED-urile. După simularea cu succes a circuitului, **completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | + | **Task 2** (2.5p + 0.25p + 0.75p) Chiar dacă a trecut Crăciunul, acum știm destul de multe pentru a realiza o simplă instalație de pom. Implementați un FSM care să producă secvența de mai jos folosind LED-urile. |
| * "*" înseamnă că LED-ul este aprins; | * "*" înseamnă că LED-ul este aprins; | ||
| * "-" înseamnă că LED-ul respectiv este stins; | * "-" înseamnă că LED-ul respectiv este stins; | ||
| * T00, T01, ..., T14 sunt stările posibile ale LED-urilor; | * T00, T01, ..., T14 sunt stările posibile ale LED-urilor; | ||
| - | * Durata tranziției de la starea Tn la Tn+1 trebuie să fie de o secundă. <code> t00 *-*-*-*- | + | * Timpul petrecut de automat în fiecare stare (Tn) trebuie să fie de 1 secundă, după care se face tranziția la următoarea stare (Tn+1). <code> t00 *-*-*-*- |
| t01 -*-*-*-* | t01 -*-*-*-* | ||
| t02 *-*-*-*- | t02 *-*-*-*- | ||
| Line 26: | Line 27: | ||
| t14 -**-*--* | t14 -**-*--* | ||
| mergi la t00</code> | mergi la t00</code> | ||
| + | | ||
| + | **Completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | ||
| | | ||
| <note tip> **Hint!** \\ **Pentru întârzierea tranziției trebuie să folosiți un timer.** Timer-ul este un circuit simplu care numără într-un contor tranzițiile ceasului. Astfel, pentru cronometrare folosiți frecvența ceasului ca să aflați câte tranziții trebuie numărate. **Apoi, blocați FSM-ul în starea curentă până când contorul ajunge la valoare dorită.** \\ Pentru simulare, va trebui să micșorați intervalul cronometrat.</note> | <note tip> **Hint!** \\ **Pentru întârzierea tranziției trebuie să folosiți un timer.** Timer-ul este un circuit simplu care numără într-un contor tranzițiile ceasului. Astfel, pentru cronometrare folosiți frecvența ceasului ca să aflați câte tranziții trebuie numărate. **Apoi, blocați FSM-ul în starea curentă până când contorul ajunge la valoare dorită.** \\ Pentru simulare, va trebui să micșorați intervalul cronometrat.</note> | ||
| - | **Task 3** (2.5p + 0.5p + 1p) Implementați un modul care să simuleze comportamentul unui semafor pentru pietoni controlat prin apăsarea unui buton. **Completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | + | **Task 3** (2.5p + 0.5p + 1p) Implementați un modul care să simuleze comportamentul unui semafor pentru mașini, controlat prin apăsarea unui buton. Pentru acest task vom folosi unul dintre **LED-urile RGB** de pe placă. Modul de operare al automatului este prezentat mai jos. |
| - În starea inițială mențineți aprinsă culoarea verde. | - În starea inițială mențineți aprinsă culoarea verde. | ||
| - La apăsarea unui buton, cronometrați un interval de 1 secundă. | - La apăsarea unui buton, cronometrați un interval de 1 secundă. | ||
| Line 35: | Line 38: | ||
| - Apoi, modificați culoarea în roșu și mențineți-o timp de 3 secunde. | - Apoi, modificați culoarea în roșu și mențineți-o timp de 3 secunde. | ||
| - Reveniți la starea inițială. | - Reveniți la starea inițială. | ||
| + | **Completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | ||
| - | + | <note important> | |
| - | <note important>Pentru a asigura o funcționare corectă pe un circuit real, trebuie să folosiți în mod normal un debouncer, pe care să îl atașați butonului folosit (vezi secțiunea [[:soc:laboratoare:03bis:debouncing|Switch debouncing]] din laborator).\\ | + | |
| - | **Pentru simulare tratați intrările de tip buton ca fiind deja eșantionate, deoarece schimbarea de semnal se produce instantaneu, fara niciun fel de zgomot.** | + | |
| Având în vedere că nu ați mai lucrat cu **define**, aveți un exemplu de cum se folosește: | Având în vedere că nu ați mai lucrat cu **define**, aveți un exemplu de cum se folosește: | ||
| <code> | <code> | ||
| Line 45: | Line 46: | ||
| out = `DEFINE_EXAMPLE; | out = `DEFINE_EXAMPLE; | ||
| </code> | </code> | ||
| + | </note> | ||
| - | În plus, dacă folosiți butonul de CPU Reset, să luați în considerare că funcționează în logică negată. | + | <note important> |
| + | Pentru a asigura o funcționare corectă pe un circuit real, trebuie să folosiți în mod normal un debouncer, pe care să îl atașați butonului folosit (vezi secțiunea [[:soc:laboratoare:03bis:debouncing|Switch debouncing]] din laborator). În plus, dacă folosiți butonul de CPU Reset, să luați în considerare că funcționează în logică negată. | ||
| </note> | </note> | ||
| - | **Bonus** (3p) Considerăm ADN-ul unei specii ca fiind o succesiune de nucleotide: adenină(A), guanină(G), citozină(C) şi timină(T). Implementați un modul care să identifice exemplarele mutante, care au în succesiunea de nucleotide secvenţa **GGTC**. Trebuie să creaţi un automat Moore care: | + | **Bonus** (1p) Pornind de la implementarea anterioară, dorim să adăugăm un semafor pentru pietoni, utilizând și al doilea LED RGB de pe FPGA. |
| - | - Primeşte la fiecare pas câte o nucleotidă; | + | Funcționarea automatului este descrisă astfel:\\ |
| - | - Dacă identifică un exemplar mutant, se blochează într-o stare rezervată. | + | - Starea inițială – Mașinile au verde, iar pietonii trebuie să aștepte (roșu). |
| - | Porturi modul: | + | - Apăsarea butonului – Când un pieton apasă butonul, se inițiază un temporizator de 1 secundă, după care mașinile intră în faza de avertizare. |
| - | * intrări: clock, reset (pentru posibilitatea introducerii altui ADN) şi cele 4 nucleotide; (pentru nucleotide putem folosi butoane, adică porturi pe un 1 bit) | + | - Avertizarea mașinilor – Mașinile pot trece pe galben timp de 1 secundă, iar pietonii încă așteaptă la roșu. |
| - | * ieșire: mutant (un LED care, dacă este aprins, semnalează detecţia unui mutant). | + | - Trecerea pietonilor – Mașinile se opresc la roșu, iar pietonii primesc verde timp de 3 secunde, permițând traversarea. |
| + | - Avertizare pietoni – Pietonii primesc un semnal intermitent (verde/stins, de patru ori la intervale de 0.5 secunde), indicând sfârșitul timpului de traversare. | ||
| + | - Sistemul revine la starea inițială. | ||
| + | |||
| + | **Completați** fișierul ''**xdc**'' și **încărcați** soluția **pe FPGA**. | ||
| <note tip> | <note tip> | ||
| - | FSM-ul trebuie să fie capabil să identifice pattern-ul menționat și să trateze corect inclusiv input-urile eronate. | + | Pentru ca LED-urile RGB să nu funcționeze la intensitate maximă, am folosit o metodă numită PWM (Pulse-Width Modulation). Pentru cei interesați, vă recomandăm să citiți [[https://ocw.cs.pub.ro/courses/apm/laboratoare/07#:~:text=Edit-,PWM,-Pulse%2Dwidth%20modulation|această]] secțiune din laboratul de APM. (mic spoiler) |
| - | (Spre exemplu: "ATCG" este greșit, "AAAAAAA" este greșit, "**GGTC**" este corect, "ATC**GGTC**" este corect, "GGG**GGTC**" este corect, "**GGTC**A" este corect) | + | |
| </note> | </note> | ||
| - | **Completați** fișierul ''**xdc**'' pentru modulul de detecție al mutanților (**Task 4**) și **încărcați** soluția **pe FPGA**. | ||
| - | * intrări: un switch pentru resetare şi 4 push-buttons pentru nucleotide; | ||
| - | * ieșiri: un led care se aprinde cand se detecteaza un mutant. | ||