Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Simulazione semplice contatore con Verilog

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Simulazione semplice contatore con Verilog

Messaggioda Foto Utenteg26 » 6 nov 2016, 1:39

Scusate, ho già pubblicato stamattina una domanda simile inerente ad un multiplexer. Purtroppo mi trovo in una situazione simile con un contatore, stavolta la simulazione parte subito, però è sbagliata, ma non riesco a trovare l'errore.
Quello che volevo realizzare era un semplice contatore non dotato di reset, che, ad ogni colpo di clock, cominciava a sommare 1, a partire da 000. (Il tutto solo quando abilitato, cioè con en=1, per en=0, non dovrebbe sommare nulla)

Ok, quindi scrivo il codice del contatore.
Codice: Seleziona tutto
`timescale 1ns / 1ps

module counter(
input en, ck,

output reg [2:0]cnt
);
reg [2:0]cnt_nxt;

always @(posedge ck)            //rete sequenziale (insieme di ffd)
    cnt <= cnt_nxt;
always @(cnt)                   //rete combinatoria
    if (en)
    cnt_nxt = cnt + 3'b001;
    else cnt_nxt = cnt;   
endmodule


Poi scrivo il testbench
Codice: Seleziona tutto
`timescale 1ns / 1ps

module tbcounter;
reg enable, clock;
reg [2:0]cnt_nxt;
wire [2:0]cnt;
counter dut(enable,clock,cnt);

initial
    begin
        $monitor($time,,"enable=%b clock=%b cnt_nxt=%d cnt=%d", enable,clock,cnt_nxt,cnt);
        enable = 0;
        clock = 0;
        #10 enable = 1;
        #30 $stop;
    end

always #2 clock = ~clock;

endmodule


La simulazione si avvia, enable passa da 0 a 1 come richiesto, idem il clock, mentre cnt e cnt_nxt rimangono ad un valore di "don't care" x.
Non capisco quale sia l'errore. Potreste farmi capire dove sbaglio?

----

Siccome mi veniva peggio commentare troppo nel listato, scrivo qui:
- en (o enable, nel testbench) serve per abilitare il contatore, quando è a 0 non somma, quando è a 1, somma;
- ck (o clock, nel testbench) è il segnale di clock;
- cnt è il segnale di uscita della rete sequenziale che entra nella rete combinatoria, e se en=1, si incrementa di uno;
- cnt_nxt è il segnale in uscita dalla rete combinatoria (cioè, se en=1, cnt_nxt = cnt+1), che entra nella rete sequenziale.

Grazie per l'aiuto!
Avatar utente
Foto Utenteg26
55 4
 
Messaggi: 19
Iscritto il: 1 mag 2014, 10:49

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti