Pagina 1 di 1

[Verilog] Sensivity list generazione reset

MessaggioInviato: 28 nov 2020, 14:23
da marioursino
Ciao a tutti. Premessa: non ho mai programmato in Verilog.

Sto utilizzando una MACHXO3LF-6900C di Lattice per generare alcuni segnali digitali. Il codice è molto semplice, c'è solo un top-level che istanzia due blocchi dello stesso tipo, i quali generano onde rettangolari fisse tramite un contatore e un registro di rollover. I due gruppi di onde rettangolari devono essere generati con una fase impostabile all'avvio.

I due blocchi all'avvio vengono appunto caricati con due fasi diverse; la fase è semplicemente il valore a cui parte il timer interno, che al raggiungimento del registro di rollover riparte da zero.

Il conteggio funziona normalmente, ma ho un problema al caricamento della fase. In particolare, sto cercando di generare un reset interno tramite il codice seguente:

(modulo top_level)
Codice: Seleziona tutto
// Internal reset
reg [3:0] rst_cnt = 4'b0000;
wire nrst = rst_cnt[3];

always @(posedge clk) begin
    if(!nrst) begin
        rst_cnt <= rst_cnt + 1'b1;
   
        pr1 <= 49;
        pr2 <= 49;
        phase1 <= 0;
        phase2 <= 24;
    end
end


Il blocco che genera i segnali campiona la fase in modo sincrono quando trova nrst alto:

(modulo core)
Codice: Seleziona tutto
...
reg [7:0] count;

always @(posedge(clk)) begin
    if(!nrst) begin
        count <= phase;
        seq <= 0;
        ...
        ...


In simulazione tutto funziona bene, ma nella realtà entrambi i gruppi di segnali hanno la stessa fase, come se phase1 e phase2 avessero lo stesso valore.

L'unico modo per fare funzionare correttamente il sistema è modificare la sensivity list della generazione del reset in questa versione:

Codice: Seleziona tutto
always @(posedge clk or negedge nrst) begin


in questo modo i segnali compaiono con la fase corretta.

Non riesco proprio a capire cosa non vada nella prima versione.

Re: [Verilog] Sensivity list generazione reset

MessaggioInviato: 28 nov 2020, 14:51
da rugweri
Premettendo che sono molto impegnato e quindi - mi scuso in anticipo nel caso dovesse succedere - potrei non trovare il tempo di aiutarti nel modo migliore, ho un dubbio, perché tu scrivi che a regime tutto funziona normalmente ma poi esponi un problema: vuoi dire che i due segnali iniziano come se fossero in fase e poi si assestano al giusto sfasamento?

Re: [Verilog] Sensivity list generazione reset

MessaggioInviato: 28 nov 2020, 15:03
da marioursino
Hai ragione, non sono stato chiaro. I segnali sono giusti ma hanno la fase sbagliata, questo è quello che intendo. Ora modifico.

Re: [Verilog] Sensivity list generazione reset

MessaggioInviato: 28 nov 2020, 18:01
da rugweri
Onestamente dai pochi estratti di codice che hai trascritto non sono in grado di risponderti :cry: Il fatto che la seconda forma che hai dato alla sensitivity list funzioni mi fa pensare che qualche transizione importante non venga vista dal tuo modulo, ma sono cose che in simulazione dovrebbero apparire :-k