sapienzastudentsnetwork / psd2223

[A/L] Sistemi Digitali [A.A. 2022-2023] Forum di scambio e confronto di soluzioni agli esercizi assegnati dal prof. Salvatore Pontarelli
16 stars 0 forks source link

[Febbraio 2022 - Esame B] Esercizio 3 #103

Closed matypist closed 2 months ago

matypist commented 1 year ago

Esercizio 3 (5 punti)

Descrivere in SystemVerilog un blocco che realizza un contatore modulo 11

Elia-Belli commented 1 year ago
module count11(input logic clk, output logic [3:0] y=4'b0);

  always_ff @(posedge clk)
    begin
      if (y == 4'b1010) y <=0; //un contatore modulo 11 conta da 0 a 10, quindi non arriva mai a 11
      else y <= y+1;
    end

endmodule
ref1o commented 1 year ago

Questa è una variante di modulo contatore che conta da 0 a 11 (binario 1011) utilizzando un registro a 4 bit. L'ingresso clk viene utilizzato per attivare il conteggio, il primo ingresso viene utilizzato per azzerare il contatore e l'uscita del conteggio fornisce il valore di conteggio corrente. Il blocco sempre viene attivato sul fronte positivo del segnale di clock e incrementa il contatore a meno che non venga azzerato o abbia raggiunto il suo valore massimo.

module counter_11 (
    input clk,
    input rst,
    output [3:0] count
);
    reg [3:0] count_reg;
    always @(posedge clk) begin
        if (rst)
            count_reg <= 4'b0000;
        else if (count_reg == 4'b1010)
            count_reg <= 4'b0000;
        else
            count_reg <= count_reg + 1;
    end

    assign count = count_reg;
endmodule
Elia-Belli commented 1 year ago

@ref1o concordo con la soluzione alternativa, solo un piccolo errore: un contatore modulo 11 conta da 0 a 10, quindi il registro viene resettato quando il valore è 1010.

ref1o commented 1 year ago

hai ragione, ho corretto, penso possiamo darlo per risolto btw