This shows you the differences between two versions of the page.
ac-is:lab:lab03 [2021/09/26 19:48] eduard.ciurezu [Construcții de control] added hyperlink to "Blocuri always@" section |
ac-is:lab:lab03 [2023/10/27 15:15] (current) teodor.dicu [Resurse] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laboratorul 3 - Circuite combinaționale - descrierea comportamentală ====== | ====== Laboratorul 3 - Circuite combinaționale - descrierea comportamentală ====== | ||
- | |||
În laboratoarele anterioare am studiat descrierea structurală, folosind primitive, precum și descrierea comportamentală, folosind atribuiri continue. Am remarcat faptul că generalizarea modulelor folosind parametri conduce la o capacitate de reutilizare mai mare, cu schimbări minime. Cu toate acestea, soluțiile prezentate nu sunt pretabile funcțiilor complexe, întrucât ele devin complicat de implementat sau de urmărit, în momentul când este găsit un bug în cod. | În laboratoarele anterioare am studiat descrierea structurală, folosind primitive, precum și descrierea comportamentală, folosind atribuiri continue. Am remarcat faptul că generalizarea modulelor folosind parametri conduce la o capacitate de reutilizare mai mare, cu schimbări minime. Cu toate acestea, soluțiile prezentate nu sunt pretabile funcțiilor complexe, întrucât ele devin complicat de implementat sau de urmărit, în momentul când este găsit un bug în cod. | ||
Line 144: | Line 143: | ||
În cadrul blocurilor //initial// și //always// atribuirile pot fi de două feluri, cu semantici diferite: | În cadrul blocurilor //initial// și //always// atribuirile pot fi de două feluri, cu semantici diferite: | ||
- | * Atribuiri blocante: sunt folosite pentru descrierea logicii combinaționale (porți logice). Atribuirile blocante sunt interpretate ca executându-se secvențial, semantica fiind identică cu cea din limbajele de programare procedurale. | + | * **Atribuiri blocante**: sunt folosite pentru descrierea logicii combinaționale (porți logice). Atribuirile blocante sunt interpretate ca executându-se secvențial, semantica fiind identică cu cea din limbajele de programare procedurale. |
- | * Atribuiri non-blocante: sunt folosite pentru descrierea logicii secvențiale (ne vom întâlni cu ele în laboratorul următor). | + | * **Atribuiri non-blocante**: sunt folosite pentru descrierea logicii secvențiale (ne vom întâlni cu ele în laboratorul următor). |
În Verilog putem declara variabile de tipul //reg// și //wire// pentru a crea circuite combinaționale. Atunci când se fac atribuirile există totuși următoarele restricții: | În Verilog putem declara variabile de tipul //reg// și //wire// pentru a crea circuite combinaționale. Atunci când se fac atribuirile există totuși următoarele restricții: | ||
Line 198: | Line 197: | ||
* //Hint//: Folosiți convenția Verilog pentru interfața modulului. Câți biți are ieșirea? | * //Hint//: Folosiți convenția Verilog pentru interfața modulului. Câți biți are ieșirea? | ||
* //Hint//: Înmulțiți pe hârtie, în baza 2, numerele 1001 și 1011. Transpuneți în limbajul Verilog algoritmul folosit. | * //Hint//: Înmulțiți pe hârtie, în baza 2, numerele 1001 și 1011. Transpuneți în limbajul Verilog algoritmul folosit. | ||
- | - **(2p)** Implementați și simulați un **multiplicator parametrizat pe n biți**, bazat pe implementarea efectuată la exercițiul anterior. Parametrizarea se va efectua asupra dimensiunii variabilelor. | + | - **(2p)** Implementați și simulați un modul de **afișaj cu 7 segmente** pentru numere în baza 10. Descrierea sumară a funcționalității acestuia se poate regăsi în [[lab03#Anexă|Anexă]]. |
- | * //Hint//: De câți parametri este nevoie? Observați dependența între dimensiunea variabilelor de între și cea de ieșire. | + | |
- | * //Hint//: Analizați fișierul de test. | + | |
- | - **(3p)** Implementați și simulați un modul de **afișaj cu 7 segmente** pentru numere în baza 10. Descrierea sumară a funcționalității acestuia se poate regăsi în Anexă. | + | |
* //Hint//: Există o ieșire validă pentru fiecare intrare? Nu uitați de cazul ''default''. | * //Hint//: Există o ieșire validă pentru fiecare intrare? Nu uitați de cazul ''default''. | ||
+ | * //Hint//: Se vor testa doar cifrele de la 0 la 9. | ||
- **(4p)** Implementați o **unitate aritmetico-logică** simplă (UAL), pe **4** biți, cu 2 operații: adunare și înmulțire. Folosiți o intrare de selecție de 1 bit pentru a alege între cele două operații astfel: 0 - adunare, 1 - înmulțire. | - **(4p)** Implementați o **unitate aritmetico-logică** simplă (UAL), pe **4** biți, cu 2 operații: adunare și înmulțire. Folosiți o intrare de selecție de 1 bit pentru a alege între cele două operații astfel: 0 - adunare, 1 - înmulțire. | ||
- | * //Hint//: Este necesar să creați un nou proiect. Se poate folosi tutorialul. | + | * //Hint//: Este necesar să creați un nou proiect. Se poate folosi [[ac-is:tutoriale:1-ise-proiect|tutorialul]]. |
* //Hint//: Câți biți au ieșirea sumatorului și a multiplicatorului? Dar a UAL-ului? | * //Hint//: Câți biți au ieșirea sumatorului și a multiplicatorului? Dar a UAL-ului? | ||
* //Hint//: Pentru selecția dintre ieșirea sumatorului și cea a multiplicatorului se poate folosi atribuirea continuă sau se poate implementa un modul multiplexor 2:1 | * //Hint//: Pentru selecția dintre ieșirea sumatorului și cea a multiplicatorului se poate folosi atribuirea continuă sau se poate implementa un modul multiplexor 2:1 | ||
- | * //Hint//: Pentru testarea UAL trebuie creat un scenariu de test, folosind tutorialul. Presupunând că sumatorul și multiplicatorul sunt testate temeinic la exercițiile anterioare, creați un scenariu relevant funcționării UAL-ului ca un ansamblu. | + | * //Hint//: Pentru testarea UAL trebuie creat un scenariu de test, folosind [[ac-is:tutoriale:2-ise-simulare|tutorialul]]. Presupunând că sumatorul și multiplicatorul sunt testate temeinic la exercițiile anterioare, creați un scenariu relevant funcționării UAL-ului ca un ansamblu. |
- | * **Notă(+2p)**: Pentru o utilizare mai generală, încercați implementarea unui UAL cu operatori parametrizați. | + | - **(3p)**: Pentru o utilizare mai generală, implementați un UAL cu operatori cu dimensiune variabilă. |
+ | * //Hint//: Pentru a-l implementa, este necesară implementarea unui multiplicator parametrizat - atenție la dimensiunea semnalelor! | ||
Line 226: | Line 224: | ||
Pentru mai multe detalii asupra acestui tip de modul, consultați pagina de [[https://en.wikipedia.org/wiki/Seven-segment_display|Wiki]]. | Pentru mai multe detalii asupra acestui tip de modul, consultați pagina de [[https://en.wikipedia.org/wiki/Seven-segment_display|Wiki]]. | ||
- | <ifauth @user> | + | |
+ | ===== Resurse ===== | ||
+ | * {{.:lab03:lab3_skel.zip|Schelet de cod}} | ||
+ | * <html><a class="media mediafile mf_pdf" href="https://ocw.cs.pub.ro/courses/ac-is/lab/lab03?do=export_pdf">PDF laborator</a></html> | ||
+ | * {{.:lab03:sol:lab3_sol.zip|Soluție laborator}} | ||
+ | |||
+ | <ifauth @ac-is> | ||
---- | ---- | ||
- | * [[:internal:synth|Ghid asistent]] | + | * {{.:lab03:sol:lab3_sol.zip|Soluție laborator}} |
+ | * [[ac-is:internal:guidelines|Ghid asistent]] | ||
</ifauth> | </ifauth> | ||
+ |