¿Cómo funcionan los bucles en verilog? ¿Por qué no puedo lograr lo que quiero?

3

Este es mi código para un multiplexor simple de 2-1 8 bits, donde SW[17] es mi selector.

Si está activado, muestra Y = SW[15:8] , si está desactivado, muestra X = SW[7:0] .

module part2 (SW, LEDR, LEDG);

    input [17:0] SW; //inputs
    output [17:0] LEDR; //light every switch
    output [7:0] LEDG;  //byte desired

    //All switches to red leds.
    assign LEDR = SW;       

    //Green leds get the desired byte.
    assign LEDG[0] = (~SW[17] & SW[0]) | (SW[17] & SW[8]);
    assign LEDG[1] = (~SW[17] & SW[1]) | (SW[17] & SW[9]);
    assign LEDG[2] = (~SW[17] & SW[2]) | (SW[17] & SW[10]);
    assign LEDG[3] = (~SW[17] & SW[3]) | (SW[17] & SW[11]);
    assign LEDG[4] = (~SW[17] & SW[4]) | (SW[17] & SW[12]);
    assign LEDG[5] = (~SW[17] & SW[5]) | (SW[17] & SW[13]);
    assign LEDG[6] = (~SW[17] & SW[6]) | (SW[17] & SW[14]);
    assign LEDG[7] = (~SW[17] & SW[7]) | (SW[17] & SW[15]);

endmodule

Este código es simple, pero estoy tratando de optimizarlo y reemplazar las 8 líneas.

Quería usar algún tipo de bucle, pero fallé:

integer index;
initial
   begin
   for(index = 0; index < 8; index  = index+1)
       begin
       assign LEDG[index] = (~SW[17] & SW[index]) | (SW[17] & SW[index+8]);
       end
   end

También probé esto y fallé:

//Green leds get the desired byte.
always @(SW) begin
    if (~SW[17])
        assign LEDG = SW[7:0]; 
    else
        assign LEDG = SW[15:5];
end

Recibo un error que dice que la parte izquierda de la tarea debe tener un tipo de datos variable.

    
pregunta JOX

1 respuesta

6

Dentro de un bloque 'siempre' elimine la asignación, solo use LEDG [index] = ... Además, cambie la declaración de salida a 'output reg [7: 0] LEDG'. El tipo de datos reg es el tipo de datos variable al que hace referencia el mensaje de error.

    
respondido por el DJZygote

Lea otras preguntas en las etiquetas