pregunta del código Verilog

0

Soy nuevo en Verilog y necesito crear un módulo que cuando Entry = 1, se incremente en 5'b000100 en la salida de "Dinero".

Este es el código que hice, pero no funciona correctamente. El programa no almacena el total del dinero (eso es lo que quiero que haga mi programa).

Por ejemplo, Cada vez que una persona ingresa a un estadio de fútbol, paga el boleto y mi máquina almacenará el dinero total ganado. El máximo de personas que pueden ingresar al estadio es de 15 (por eso usé 6 bits, porque 4 * 15 = 60)

Mi "máquina" no almacena el total ganado.

Mi código

    module Machine_Money(Entry, Money);
         input Entry;
         output [5:0] Money;
         reg [5:0] Money;

            always@(Entry)

                begin
                Money = 6'b000000;
                    if (Entry)
                    Money = Money + 6'b000100;
                end
   endmodule

Gracias.

    
pregunta

2 respuestas

3
        always@(Entry)
                begin
                Money = 6'b000000;
                    if (Entry)
                    Money = Money + 6'b000100;
                end

Cada vez que la entrada de entrada cambia, establece Money en 0 y luego agrega 4. Así que Entry siempre será 0 o 4.

Es posible que desee colocar la línea Money = 6'b0 dentro de un if (reset) o puede moverla a un bloque initial o eliminar el altogeter, o lo que sea, dependiendo de la funcionalidad que realmente desee.

    
respondido por el The Photon
1

@ La respuesta de ThePhoton es correcta en cuanto a un problema menor con tu código que esencialmente hace que el bloque siempre infiera un multiplexor con 0 como una entrada y 4 como otra entrada (con Entrada como la señal de selección).

Sin embargo, la idea de recordar es la lógica sincrónica de FPGA. Su código como está escrito es completamente asíncrono, no hay lógica temporizada. Asumiendo que hizo las correcciones que sugirió @ThePhoton, todavía no funcionará correctamente. Mientras que Entry es alto, el valor de Money contaría rápidamente en cualquiera que sea el retardo de propagación del circuito. Entonces, a menos que su gente esté ingresando cada pocos cientos de picosegundos, eso no será significativo. Además de eso, cada bit en el conteo puede tener un retraso diferente, lo que significa que rápidamente terminará con un completo disparate en su contador.

La forma correcta de hacer esto es agregar un reloj al circuito que esencialmente permita que el valor que entra y sale del sumador se vuelva a sincronizar, lo que significa que cada bit tendrá efectivamente el mismo retardo que todos los que se enclavarán. el borde del reloj.

El código sería algo así como:

always @ (posedge clock) begin //-- New clock signal, we act on its rising edge
    if (reset) begin
        Money <= 6'd0; //-- Reset money when reset signal is high
    end else if (Entry) begin
        //-- Whenever Entry is high at a clock edge, we increment money
        Money <= Money + 6'd4; //-- Or 6'b000100;
    end
end

Con este nuevo código, necesitaría que su señal de Entrada también se sincronice con el reloj de tal manera que solo sea alta para un ciclo de reloj cada vez que alguien ingrese. Si el reloj fuera, digamos 20MHz, eso significaría que la señal se verifica una vez cada 50 ns, lo que es mucho más rápido de lo que cualquiera podría ingresar, por lo que el reloj no afectaría su capacidad para contar entradas.

Además, también le sugiero que utilice la declaración del módulo estándar ANSI, ya que es mucho más fácil hacer un seguimiento de qué puertos son de qué tipo. Su declaración es:

Machine_Money(Entry, Money);
         input Entry;
         output [5:0] Money;
         reg [5:0] Money;

Donde el equivalente ANSI sería:

Machine_Money (
         input            Entry,
         output reg [5:0] Money
);

Observe que está mucho más limpio y no necesita duplicar el nombre del puerto Money tres veces. Tenga en cuenta que los nombres no tienen que alinearse (agregué muchos espacios para que lo hagan), simplemente me parece que está más limpio.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas