Related
Index
Obbiettivi HDL
2 principali obbiettivi:
- Simulazione: si forniscono gli input e controllando gli output si osserva se il modulo si comporta correttamente
- Sintesi: La descrizione del modulo viene tradotta in un circuito
oss
HDL = hardware description language
Definizione Modulo
Esistono due “stili” per descrivere un modulo:
- Comportamentale: descrive cosa fa un modulo (utilizzando espressioni booleane e controlli condizionali)
- Strutturale: descrive com il circuito interno di un modulo, suddividendolo in moduli più piccoli.
oss
Noi descriveremo i moduli in modo comportamentale
Sintassi Modulo
module
inizializza il moduloname
è il nome che diamo al modulo- dopo
input logic
scriviamo gli input- Data type 2 opzioni:
- Variabile booleana (default, non scrivere niente)
- Bus di bit (scrivere [start:end] dove start ed end indicano la grandezza del bus )
- gli input scritti sulla stessa “linea” sono dello stesso datatype
- se abbiamo più input di tipo diverso scriverli su
input logic
diversi
- Data type 2 opzioni:
- dopo
output logic
scriviamo gli output- Stessa cosa degli input
assign
è usato per assegnare a una variabile un valore o un risultato di un operazione
Variabili logiche
Esistono 3 modi diversi per definire delle variabili:
- Input Logic : Variabili in ingresso (input del modulo)
- Output Logic : variabili in uscita (output del modulo)
- Logic: variabili interne
Esistono 2 tipi di variabili logiche:
- Variabili booleane: variabile che può assumere vero (1) o falso (0)
- Bus: più variabili booleane racchiuse in una sola variabile
Come definire variabili:
oss
Sostituendo
logic
conlogic input
ologic output
si definiscono rispettivamente gli input e gli output logici
Bus multipli
Un bus è una serie di variabili booleane contenuta in una sola variabile
Definizione base:
[0:3] a
→ bus a 4 bit (dal meno significativoa[0]
al più significativoa[3]
)[4:1] a
→ bus a 4 bit (dal più significativoa[4]
al meno significativoa[1]
)
oss: [0:2] a
⇒ a[0], a[1], a[2]
Bus concatenati
b = {a[0], a[1]}
→ bus a 2 bit (b[0] = a[0]
eb[1] = a[1]
)c = {3{a[0]}}
→ bus a 3 bit (copia dia[0]
x 3 volte)d = {3'b110}
→ bus a 3 bit (d[0] = 1
,d[1] = 1
,d[2] = 0
)
oss: leggi Numeri in verilog per capire meglio caso 4
Notazione particolare (tipo slicing python):
- È possibile selezionare alcuni canali di un bus con questa sintassi
Esempi generali bus:
Esempio 1
Esempio 2
Oss:
Esempio 1 ed Esempio 2 fanno stessa cosa
Numeri in verilog
Operatori
Operatori Logici
Operatori Bitwise: Questi sono operatori logici Bitwise, ovvero operatori che lavorano su singolo bit o su bus multipli
Esempi:
Esempio 1:
Esempio 2:
Esempio 3:
Oss:
Esempio 2 e 3 fanno la stessa cosa
Operatori assegnazione continua
- Assign o operatore di assegnazione continua, assegna a una variabile un valore.
- Viene utilizzato per la realizzazioni di reti combinatorie
Assegnare a una variabile true o false:
assign y = 1'b1;
⇒ assegno a y un bit di binario di valore 1assign y = 1'b0;
⇒ assegno a y un bit di binario di valore 0
Assegnare a una variabile attraverso un operazione altre variabili:
assign y = a | b;
Assegnazione tra bus:
assign
{x, y, z} = ~{a, b, c};
⇒ Significato: x = ~a, y = ~b, x = ~c
Oss:
Ogni volta che cambia a o b il valore di y viene ricalcolato
Assign con ritardo
Sintassi:
- Ritardo indica l’unita di tempo del ritardi
- esempio: 1ns (1 nano second), 10ms (10 millisecondi) ecc.
- Precisione indica il possibile errore
- infatti per simulare circuiti reali serve prendere in considerazione anche possibili errori
assign #n
indica dopo quante unita di mistura eseguire l’assegnazione- esempio:
ritardo = 1ns
e alloraassign #1
verra effettuato dopo1ns
eassign #2
dopo2ns
- esempio:
Esempio:
Operatore condizionale
- Selezione in base a una condizione la prima o la seconda espressione
Sintassi:
Esempio:
Operatore always
- Istruzione viene eseguita quando è rispettata una condizione
- Viene utilizzate
Sintassi:
- always@ va sostituito con:
- sensitivity va sostituita con:
posedge
(sensibile al fronte di salita)negedge
(sensibile al fronte di discesa)
- list va sostituito con segale di ingresso, solitamente di usa:
clk
(clock)en
(enable)
Bloccante e non bloccante: Esistono due tipi di always:
- Non bloccante ⇐ (sequenziale, usato con always_ff e always_latch)
- Bloccante = (combinatoria, usato con always_comb)
Operatore case
Modellazione Strutturale
- Utilizzo di uno p più moduli in un latro modulo
Dope aver definito un modulo con la sentassi
È possibile riutilizzare il modulo in un altro modulo assegnatogli un nome univoco
Esempio:
mux4:1
costruito utilizzandomux2:1
- Definire
mux2:1
- Definire
mux4:1
Esempio con bus:
mux4:1
costruito utilizzandomux2:1
Esercizi:
Shift register 8 bit con load e reset asincrono