Mi profesor miró este código durante unos buenos 10 minutos, pero no pudo encontrar el problema. Entonces, espero que un par de ojos nuevos vean algo que ambos extrañamos. Como siempre, estaré agradecido por cualquier sugerencia que pueda proporcionar.
Contexto: un módulo que cuenta de FFF a 000 y luego se repite.
Problema: Solo las 2 más bajas muestran una disminución, saltándose varios números a la vez y luego saltan nuevamente a FF en un punto aparentemente aleatorio.
Supuestos: 1. El controlador SevenSegment funciona correctamente. Se ha verificado manualmente y mostrará el número hexadecimal que se le ha dado. 2. El módulo ClockDivider funciona según lo previsto. La cuenta regresiva disminuye cada 1 segundo como debería (CLOCK_50 = 50 MHz)
Posible sugerencia: Verilog advierte que "cd" es un retén inferido y retiene su valor a través de una o más rutas en el bloque "siempre"
module ClockDivider( input CLOCK_50, output reg[ 31:0] count );
parameter clockDivisor = 50_000_000;
always @( posedge CLOCK_50 )
if ( count == 0)
count <= clockDivisor;
else
count <= count - 1;
endmodule
module Test (
//////////// CLOCK //////////
input CLOCK_50,
//////////// SEG7 //////////
output [6:0] HEX0,
output [6:0] HEX1,
output [6:0] HEX2
);
//ClockDivider Output
wire [31:0] cout;
reg [11:0] cd;
ClockDivider a( CLOCK_50, cout);
always @(cout)
begin
if (cout == 32'h0)
if (cd == 12'h0)
cd <= 12'hFFF;
else
cd <= (cd - 12'h001);
end
SevenSegment C2( cd[11:8], 1'b0, HEX2 );
SevenSegment C1( cd[7:4], 1'b0, HEX1 );
SevenSegment C0( cd[3:0], 1'b0, HEX0 );
endmodule