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.