2010-10-17 20 views
6

Tengo problemas con este código Verilog. Básicamente, no me deja hacer la declaración Y = 3'di. Básicamente, quiero que Y sea igual a i. Estoy bastante seguro de que el problema es el i. Entonces, ¿hay alguna manera de hacer esto en Verilog? Además, W es una entrada con 8 bits (en otras palabras, W[7:0]).Asignar número entero a reg en Verilog

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

Gracias.

+1

¿Cuál es la definición de '' W' y y'? – ChaosPandion

+1

entrada [7: 0] W, salida reg [2: 0] Y – DemonicImpact

Respuesta

9

Puede seleccionar bits utilizando corchetes.

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

Pero ni siquiera es necesario si i fue declarado ser un entero. Sin embargo, se necesitarán muchos bits en Y automáticamente y solo desea los LSB.

+0

¡Gracias! Además, solo para aclarar, i [2] es el bit más significativo, ¿no? – DemonicImpact

+0

En este caso, sí. –

2

Es posible que desee utilizar una declaración case aquí:

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 

Esto hace que la prioridad más obvio para los lectores del código.

+0

Eso es confuso y no escalable. No pasaría por una revisión de código conmigo. –

+0

Me interesaría ver cualquier enfoque que piense que es mejor. Como dije, el enfoque de 'caso' que utilicé hace que la prioridad sea obvia para los lectores, y la OMI es mucho más clara que los enfoques de bucle 'para' mencionados anteriormente, cada uno de los cuales hace múltiples asignaciones a Y, y cada tarea sucesiva reemplaza a las anteriores. Esto es algo fácil de pasar por alto durante una lectura casual del código, particularmente para ingenieros menos experimentados. El uso involuntario de variables sin signo en bucles que tienen condiciones de salida de 'i> = 0' es otro error común con este enfoque. – jlf

+0

En cuanto a la escalabilidad, esto es solo un codificador de prioridad de 3 bits; el diseño para la escalabilidad pertenece solo a cosas que pueden necesitar escalar y solo en detrimento de la claridad cuando es absolutamente necesario, que no es el caso aquí. – jlf

0

He encontrado que es mejor usar máquinas de estados para hacer la rutina "for-loop". Algo como esto:

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 

Espero que esto ayude ...

+0

No es lo mismo. Esto tomaría múltiples ciclos de reloj. –