restricciones de reloj generadas en vivado

0

Creé mi propio reloj, ya que necesito un reloj de 2Mhz y el IP del generador del reloj no me deja pasar por debajo de los 6Mhz. Creé un módulo divisor de reloj.

module clock_divider#(parameter HALF_CYCLE_COUNT = 128, COUNT_BITS = 8)
(
    input clk_in,
    output reg clk_out = 1'b0
);

    reg [COUNT_BITS - 1:0] counter = 1'b0;
    always @(posedge clk_in) begin
        if(counter == HALF_CYCLE_COUNT - 1) begin
            counter <= 0;
            clk_out = ~clk_out;
        end else counter <= counter + 1;
    end
endmodule

Aquí está mi módulo de nivel superior.

module audio_visualizer
(
    input clk,
    input m_data,
    output m_clk,
    output reg m_lr = 1'b1
);

    wire pdm_clk;
    clock_divider#(.HALF_CYCLE_COUNT(100), .COUNT_BITS(7)) pdm_clk_div(clk, pdm_clk);
    assign m_clk = pdm_clk;

    wire [7:0] sample;
    wire sample_changed;
    sampler s(pdm_clk, m_data, 1'b0, sample, sample_changed);

    ila_0 i(clk, sample, sample_changed, pdm_clk);
endmodule

Quiero declarar una restricción para que vivado sepa la frecuencia de pdm_clk. Esto es lo que tengo ahora para restricciones de reloj.

set_property -dict { PACKAGE_PIN E3    IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name clk -period 10.00 -waveform {0 5} [get_ports {clk}];
create_generated_clock -name pdm_clk -source [get_ports clk] -divide_by 50 [get_ports pdm_clk]

Sigo recibiendo este error.

[Vivado 12-1387] No valid object(s) found for create_generated_clock constraint with option '-objects [get_ports pdm_clk]'. ["/home/chase/vivado-workspace/Sound/Sound.srcs/constrs_1/imports/Desktop/Nexys4DDR_Master.xdc":9]

No estoy seguro de cómo decirle a vivado cuál es la salida del reloj generado. También he probado [get_pins audio_visualizer/pdm_clk] .

    
pregunta chasep255

1 respuesta

2

El problema es que pdm_clk no es un puerto, es un cable y, por lo tanto, la búsqueda get_ports no lo encontrará.

Lo que debes hacer en cambio, es apuntar al registro real que conduce la señal. Puedes hacer esto con algo como (no verifiqué):

create_generated_clock ... {pdm_clk_div|clk_out}

Donde en este caso clk_out es el nombre del registro dentro de la instancia '' 'pdm_clk_div' que está impulsando la red del reloj.

Si lo anterior no funciona, puedes probar algo como [get_pins {pdm_clk_div|clk_out}] o [get_registers {pdm_clk_div|clk_out}]

Como nota al margen, si está generando sus propios relojes, también debe incluir un BUFG primitivo en la salida para que el reloj pueda ser promovido a la red de reloj global. Esto evitará advertencias de sesgo excesivas más adelante durante el ajuste.

Sin embargo, estoy de acuerdo con el comentario de @ johnnymopo de que el mejor enfoque es usar el reloj original para controlar sus registros y luego usar el divisor de reloj para generar un reloj habilitado. En lugar de las restricciones de reloj generadas en este caso, es posible que necesite que se declaren las rutas de varios ciclos si hay algún problema de tiempo.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas