Simulación del divisor de frecuencia de 1 segundo no funciona.
Estoy intentando crear un segundo contador clk utilizando una entrada de clk de 100 MHz, pero cuando simulo el divisor de clk, muestra la salida como una X aunque la entrada de clk sea correcta. ¿Qué podría estar haciendo mal?
Divisor de clk de 1 segundo:
module clkdiv(
input clk,
input [25:0] terminalcount,
output reg clk_div
);
reg [25:0] count;
wire tc;
assign tc = (count == terminalcount);
always @ (posedge(clk)) begin
if (tc) count <= 0;
else count <= count + 1;
end
always @ (posedge(clk)) begin
if (tc) clk_div = !clk_div;
end
endmodule
Banco de pruebas:
module clockdivTB;
// entradas
reg clk; // hacer 100 MHz -- T = 10 ns
// salidas
wire newclk;
// segundo reloj -- conectar señales de prueba a clkdiv
clkdiv slowclkCUT (
.clk(clk),
.terminalcount(50000000-1), // 1 Hz
.clk_div(newclk)
);
// inicializar entradas
initial begin
clk = 0;
// crear reloj de entrada de 100 MHz
forever #5 clk = ~clk;
end
endmodule
Resultado:
Imagen del resultado (Muestra clk de 100 MHz pero no hay salida de clk de 1 Hz)
davy.ai
Podría haber varias razones por las que la salida se muestra como “X”. Aquí hay algunas posibles razones y soluciones:
Asegúrese de que el valor de recuento del terminal sea correcto. En este caso, debería ser 50000000-1 para una salida de 1 Hz. Verifique este valor nuevamente para asegurarse de que sea correcto y coincida con la frecuencia de salida deseada.
El valor de recuento debe restablecerse cuando alcanza el valor de recuento del terminal. En este código, debería restablecerse a 0. Sin embargo, el código actual tiene un error en esta línea:
if (tc) count <= 0;
Esto debería cambiarse a:
if (tc) count <= 0;
Sin restablecer el valor de recuento, continuará aumentando y es posible que no vuelva a alcanzar el valor de recuento del terminal, lo que resultará en una salida “X”.
La salida de clk_div debe asignarse utilizando asignaciones no bloqueantes. En este código, se están utilizando asignaciones bloqueantes:
if (tc) clk_div = !clk_div;
Esto debería cambiarse a:
if (tc) clk_div <= !clk_div;
El uso de asignaciones bloqueantes para esta salida puede causar problemas con la simulación y la salida también puede mostrarse como “X”.
Realizando estos cambios y asegurándose de que las entradas y salidas estén correctamente conectadas en el banco de pruebas, la salida debería mostrar la señal de reloj esperada de 1 Hz.