cómo activar otro clk en mainclk (verilog)

0

Escribí a algún tipo de prescaler en verilog para hacer la señal sclk_adc desde clk_i. por ahora mi código se ve como:

always @(posedge clk_i)
begin
//generation of sclk_adc
end

ahora me pregunto ¿hay alguna probabilidad de cargar registros de turnos en pos / negedge del reloj generado en el bloque siempre @ (posedge clk_i)?

Cuando escribí esto fuera del bloque principal siempre

always @(negedge sclk_adc)
begin
    transdata = transtmp;
    dataInCh[ch_cnt][15:0] = transdata;
end 

always @(posedge sclk_adc)
begin
    dout = shiftOut [ch_cnt] [15];
    shiftOut [ch_cnt][15:0] = { shiftOut[ch_cnt] [14:0], 1'b0};
end 

Se simula bien en el GTKwave, pero el quartus comenzó a quejarse de la referencia múltiple a dout (mi salida), creo que, merecidamente. Así que parece que tengo que cargarlos en el bloque principal, pero cuando agrego esas líneas allí, los registros de desplazamiento comienzan a cargarse con clk_i, no con sclk_adc, ¿qué es lógico, pero cómo evitar esto? Por favor, dame alguna pista, gracias

    
pregunta dshee

2 respuestas

0

De los comentarios:

  

Casi consigo el enlace que quería. Necesitaba dout cargado CON posedge sclk_adc

Puedes actualizar dout en el borde de sclk_adc :

always @(posedge sclk_adc) 
    begin
    dout <= shiftOut [ch_cnt] [15];
    end

Pero si haces esto, solo puedes actualizar dout en este bloque siempre. Puede utilizar un restablecimiento asíncrono si le preocupa que su señal de restablecimiento no se confirmará lo suficiente como para ver un borde del reloj lento:

always @(posedge sclk_adc or posedge reset) begin
    if (reset) begin 
        dout <= 0;
    else begin
        dout <= shiftOut [ch_cnt] [15];
    end
end

No puedes restablecer dout en el bloque siempre cronometrado por clk_i si también lo vas a configurar en el bloque cronometrado por sclk_adc .

De manera alternativa, dado que está generando sclk_adc usando un contador cronometrado por clk_i , podría organizar un ejercicio de sclk_adc un ciclo antes de lo que está haciendo ahora. Es bastante común cuando se generan relojes lentos para generar varios relojes a la misma frecuencia, pero retrasados entre sí en 1 o más ciclos del reloj maestro, para permitir la sincronización de diferentes eventos en diferentes fases de la velocidad reloj.

    
respondido por el The Photon
0

Bueno, le gané a éste. Solo necesitaba construir un detector de borde ascendente y descendente

Todo lo que quiero decir es que pocas líneas

reg    main_reg;
wire    pos_sclk, neg_sclk; 
assign  pos_sclk = sclk_adc & ~main_reg;
assign  neg_sclk = ~sclk_adc & main_reg;

y en el bloque de clk principal

main_reg <= sclk_adc;
    
respondido por el dshee

Lea otras preguntas en las etiquetas