Mappatura delle porte per nome
Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 34 di 90.
Nella lezione precedente, hai imparato a istanziare un modulo passando i segnali nello stesso ordine in cui le porte compaiono nella definizione del modulo. Funziona, ma presenta un problema: l’ordine è importante.
Se per sbaglio confondi l’ordine, i segnali si collegano alle porte sbagliate. Questo può essere difficile da diagnosticare.
Il problema del collegamento per ordine
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Associazione per posizione: l'ordine DEVE corrispondere
or_gate or1 (input_a, input_b, output_y); // Corretto
or_gate or1 (input_b, input_a, output_y); // Errato! Ingressi scambiatiLa seconda riga collega input_b a in1 e input_a a in2: un bug sottile che è facile non notare.
Soluzione: mappatura delle porte per nome
La mappatura delle porte per nome usa il nome della porta per creare le connessioni. L'ordine non è importante perché ogni connessione è etichettata in modo esplicito.
Sintassi:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);Il punto . prima del nome della porta indica che ci stiamo riferendo a una porta all'interno del modulo. Il segnale tra parentesi è ciò che colleghiamo a essa.
Esempio
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Questo dice esplicitamente:
- La porta
in1riceve il segnaleinput_a - La porta
in2riceve il segnaleinput_b - La porta
resultriceve il segnaleoutput_y
L’ordine non è importante
Con il collegamento delle porte tramite nome, puoi scrivere le connessioni in qualsiasi ordine:
// Tutti e tre sono IDENTICI
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);
or_gate or1 (
.result(output_y),
.in1(input_a),
.in2(input_b)
);
or_gate or1 (
.in2(input_b),
.result(output_y),
.in1(input_a)
);Fanno tutti esattamente la stessa cosa perché ogni connessione è etichettata.
Sfida
Completa l’istanza aggiungendo le connessioni mancanti delle porte usando la mappatura delle porte per nome.
Cosa fare:
- Collega la porta
clkal segnaleclock_signal - Collega la porta
data_inal segnaleinput_data - Collega la porta
data_outal segnaleoutput_data
Provalo tu
module register (
input clk,
input [7:0] data_in,
output reg [7:0] data_out
);
always @(posedge clk) begin
data_out <= data_in;
end
endmodule
module top (
input clock_signal,
input [7:0] input_data,
output [7:0] output_data
);
register reg1 (
// TODO: Aggiungi le associazioni delle porte usando la sintassi .port(signal)
);
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online