2010-10-17 9 views
6

Ho problemi con questo codice Verilog. Fondamentalmente, non mi lascerà fare l'istruzione Y = 3'di. Fondamentalmente, voglio Y uguale a i. Sono abbastanza sicuro che il problema sia il i. Quindi, c'è un modo per farlo in Verilog? Inoltre, W è un input con 8 bit (in altre parole, W[7:0]).Assegna un numero intero a reg in Verilog

for (i = 7; i >= 0; i = i - 1) 
begin 
    if(W[i]) Y=3'di; 
end 

Grazie.

+1

Qual è la definizione di '' W' e y'? – ChaosPandion

+1

input [7: 0] W, reg di uscita [2: 0] Y – DemonicImpact

risposta

9

È possibile selezionare i bit utilizzando le parentesi.

for (i = 7; i >= 0; i = i - 1) 
begin 
    if(W[i]) Y = i[2:0]; 
end 

ma non è nemmeno necessario se i è stato dichiarato di essere un numero intero. Ci vorranno tuttavia molti adattamenti in Y automaticamente e si desidera solo gli LSB.

+0

Grazie! Inoltre, solo per chiarire, io [2] è il bit più significativo, giusto? – DemonicImpact

+0

In questo caso, sì. –

2

Si potrebbe voler utilizzare un'istruzione case qui:

case (1'b1) 
    W[0]: Y=3'd0; 
    W[1]: Y=3'd1; 
    W[2]: Y=3'd2; 
    W[3]: Y=3'd3; 
    W[4]: Y=3'd4; 
    W[5]: Y=3'd5; 
    W[6]: Y=3'd6; 
    W[7]: Y=3'd7; 
    default: Y=3'd0; // to avoid inferring a latch when W==8'd0 
endcase 

questo rende la priorità più evidente per i lettori di codice.

+0

Questo è solo confuso e non scalabile. Non sarebbe passato attraverso una revisione del codice con me. –

+0

Sarei interessato a vedere qualunque approccio tu pensi sia meglio. Come ho detto, l'approccio "caso" che ho usato rende la priorità ovvia per i lettori, e IMO è molto più chiaro degli approcci del ciclo "for" sopra, ognuno dei quali potenzialmente rende molteplici assegnazioni a Y, con ogni incarico successivo che sovrascrive quelli precedenti. Questa è una cosa facile da trascurare durante una lettura casuale del codice, in particolare per gli ingegneri meno esperti. L'uso involontario di variabili non firmate in cicli con condizioni di uscita di 'i> = 0' è un altro errore comune con questo approccio. – jlf

+0

Per quanto riguarda la scalabilità, questo è solo un encoder di priorità a 3 bit; il design per la scalabilità appartiene solo a cose che potrebbero essere necessarie per ridimensionare e solo a discapito della chiarezza quando è assolutamente necessario, il che non è il caso qui. – jlf

0

Ho trovato che è meglio usare le macchine di stato per fare la routine "for-loop". Qualcosa di simile a questo:

module yourthing(clk, W, i, Y) 
input clk; 
input [7:0] W; 
output [2:0] Y; 
reg [2:0] i; 

[email protected](posedge clk) begin 
    if(reset) begin 
    i = 3'd7; 
    Y = 3'd0; 
    end 

    else begin 
    case(i) 
     3'd7 : begin 
       if(W[i]) Y = i; 
       i = 3'd6; 
      end 
     3'd6 : begin 
       if(W[i]) Y = i; 
       i = 3'd5; 
      end 
     3'd5 : begin 
       if(W[i]) Y = i; 
       i = 3'd4; 
      end 
     3'd4 : begin 
       if(W[i]) Y = i; 
       i = 3'd3; 
      end 
     3'd3 : begin 
       if(W[i]) Y = i; 
       i = 3'd2; 
      end 
     3'd2 : begin 
       if(W[i]) Y = i; 
       i = 3'd1; 
      end 
     3'd1 : begin 
       if(W[i]) Y = i; 
       i = 3'd0; 
      end 
     3'd0 : begin 
       if(W[i]) Y = i; 
       i = 3'd7; 
      end 
    endcase 
    end 
endmodule 

Spero che questo aiuti ...

+0

Non è la stessa cosa. Ciò richiederebbe più cicli di clock. –

Problemi correlati