@ 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.