es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Podría haber varias razones por las que la salida se muestra como “X”. Aquí hay algunas posibles razones y soluciones:

    1. El valor de recuento del terminal es incorrecto:

    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.

    1. Restablecer el valor de recuento:

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

    1. Asignaciones no bloqueantes para la salida de clk_div:

    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.

Comments are closed.