Verilog Agregar valor en un bloque siempre. SENCILLO

1
module prizes(TESTSSD);
output reg [6:0]TESTSSD;
reg [1:0]equals; 

always @(*) begin
    equals = equals + 1;
    case (equals)
        0: TESTSSD = 7'b0000001;
        1: TESTSSD = 7'b1001111;
        2: TESTSSD = 7'b0010010;
        3: TESTSSD = 7'b0000110;
        4: TESTSSD = 7'b1001100;
        default:TESTSSD = 7'b0000000;
    endcase
end
endmodule

Cuando ejecuto el código anterior, aparece un error al buscar 2 en la pantalla de siete segmentos; Falta la parte media. ¿Qué estoy haciendo mal?

    
pregunta Milad Khakbazan

1 respuesta

6
always @(*) begin

Esto significa que cada vez que cambie una variable que aparece en el lado derecho del bloque, ejecute el bloque.

    equals = equals + 1;

Esto cambia la variable equals .

Entonces, cuando equals cambia, incrementas equals . Lo que significa que equals cambia, lo que significa que lo incrementas nuevamente, y así sucesivamente.

Básicamente, equals sigue aumentando tan rápido como el hardware puede hacer que suceda.

Si envías esto a una pantalla de 7 segmentos, solo verás la superposición de '0', '1', '2' y '3', parpadeando tan rápido como el hardware pueda funcionar. Esto será mucho más rápido de lo que su ojo puede seguir. No sé cómo se ve, pero si dices que parece un '2', te creo.

La forma habitual de hacer lo que parece querer es hacer equals de incremento solo cuando ocurre algo especial, como el borde de un reloj lento (como tal vez 5 Hz como máximo para que la pantalla sea significativa para el ojo humano); o solo cuando ocurre algún evento especial que estás tratando de contar.

Editar

También debo agregar que, debido a las condiciones de carrera, si implementa este diseño en hardware real, es probable que la salida no pase por todos los estados 0, 1, 2, 3, como se esperaba, o que No lo hace en el orden que esperas.

Por ejemplo, si está en el estado 2'b01, espera pasar a 2'b10. Pero la señal para cambiar el bit 0 podría propagarse más rápidamente que la señal para cambiar el bit 1, lo que provocaría una falla en el estado 2'b00. Si esa falla dura lo suficiente, el circuito podría ir de allí al estado 2'b01 nuevamente en lugar de a 2'b10. Pero eso es solo un ejemplo. Lo que realmente sucede depende de los detalles del nivel de transistor y de la geometría de los cables de cómo se construye el circuito.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas