¿Cómo cambiar reg en dos bloques siempre diferentes?

1

¿Cómo puedo cambiar / alterar el valor de un registro en dos bloques siempre diferentes para la capacidad de síntesis?

Por ejemplo:

reg temp;

always @(posedge clk1) begin
  if(...) temp = 0;
end

always @(posedge clk2) begin
  if(...) temp = 1;
end 
    
pregunta Anon

2 respuestas

2

Para la síntesis, cada bloque always @(posedge clk) debe seguir el patrón de un flip-flop D, de lo contrario, la herramienta de síntesis no lo reconocerá. Entonces, el problema es que tiene dos condiciones en las que necesita cambiar el valor del registro (temp), pero temp solo puede tener un controlador. Este problema empeora aún más cuando tiene dos dominios de reloj diferentes (como en su ejemplo, clk1 y clk2).

Fundamentalmente, no puede tener un flip-flop en dos dominios de reloj diferentes, por lo que la herramienta de síntesis no sabe si el flip-flop temp debe ser cronometrado por clk1 o clk2. Por eso este código no se puede sintetizar: no hay manera de implementar este diseño en hardware.

Cruzar dos dominios de reloj diferentes es complicado, en tu ejemplo tendrías que dividir temp en clk1_temp y clk2_temp,

// clock domain clk1
reg clk1_temp;
wire clk1_tempClear;
wire clk1_tempSet;

// clock domain clk2
reg clk2_temp;
wire clk2_tempClear;
wire clk2_tempSet;

// clock domain clk1
always @(posedge clk1) begin
    if (clk1_tempClear) begin
        clk1_temp <= 0; 
    end;
    if (clk1_tempSet) begin
        clk1_temp <= 1; 
    end;
end

// clock domain clk2
always @(posedge clk2) begin
    if (clk2_tempClear) begin
        clk2_temp <= 0; 
    end;
    if (clk2_tempSet) begin
        clk2_temp <= 1; 
    end;
end

Ahora tienes dos flip flops separados, uno está cronometrado por clk1 y las unidades clk1_temp, el otro flip-flop está cronometrado por clk2 y las unidades clk2_temp.

En el uso práctico, generalmente hay muchas señales que tienen que pasar de un dominio de reloj a otro. Ver mi respuesta sobre el cruce de dominios de reloj: fpga verilog dual access

    
respondido por el MarkU
0

No es posible controlar una salida desde dos bloques siempre, y especialmente no es posible generar una salida desde dos dominios de reloj diferentes.

Lo que sugeriría hacer es generar una señal de 'conjunto' en un dominio y una señal de 'reinicio' en el otro dominio, sincronizarlas en todos los dominios y luego crear instancias de lógica para controlar un flip-flop basado en estas señales. . Las señales 'set' y 'reset' podrían codificarse como un nivel en un pulso corto, o como una transición en una señal que se invierte en cada evento. La transición se puede extraer de nuevo como un pulso después de la sincronización.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas