¿Es posible hacer un flip flop D con reinicio desencadenado de nivel asíncrono?

2

Estoy empezando a aprender la codificación verilog en la universidad y hasta ahora no tuve tantos problemas. Creo que tengo lo básico a la perfección. Pero acabo de golpear una pared de ladrillos con este. Estaba experimentando con modelos de comportamiento y terminé teniendo este problema.

Es fácil hacer un flip flop en D con un reinicio desencadenado de nivel síncrono como este

always @(posedge clk)
begin
    if(clr) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end

O hacer un flip flop D con reinicio síncrono desencadenado como este

always @(posedge clk or posedge clr)
begin
    if(clr) begin
        q <= 1'b0;
    end
    else begin
        q <= d;
    end
end

¿Pero cómo puedo hacer un nivel desencadenado pero reinicio asíncrono? No puedo hacer

always @(posedge clk or clr)

porque eso sería oring dos tipos incompatibles, por lo que se producirá un error al realizar la síntesis RTL. No puedo hacer

always @(posedge clk)
begin
    q <= d;
end

always @(clr)
begin
    q <= 1'b0;
end

ya que eso requeriría múltiples fuentes para manejar q, nuevamente un problema en la síntesis de RTL.

Entonces, mi pregunta es, ¿es posible o no un reinicio D-flip con reinicio desencadenado asíncrono? Tanto en verilog como en lógica digital.

    
pregunta Rick_2047

4 respuestas

7

Este es el ejemplo de Xilinx de un "Flip-flop con reloj de borde negativo y reinicio asíncrono":

always @(negedge C or posedge CLR)
    begin
        if (CLR)
            Q <= 1’b0;
        else
            Q <= D;
    end

(Fuente: Guía de diseño de síntesis y simulación, UG626, 19 de octubre de 2011)

Observe que esto es básicamente lo mismo que su segundo ejemplo (excepto que usa el borde opuesto del reloj). Y, de hecho, este es un borrado sensible al nivel, no un borrado sensible al borde, porque si el borrado se mantiene alto, la salida continuará manteniéndose baja, incluso si llegan nuevos bordes de reloj y / o la entrada D cambia. p>     

respondido por el The Photon
1

No estoy terriblemente familiarizado con Verilog, pero, según tengo entendido, algunas herramientas de síntesis emitirán un chillido en los intentos de generar sintetizar lógica síncrona y asíncrona en plataformas de hardware cuyas primitivas no admiten tales cosas. Es posible producir un circuito que se comporte como un flip-flop de reinicio asíncrono, siempre que los bordes de reinicio no se produzcan cerca de los bordes del reloj. Este es un ejemplo. Sin embargo, una cosa importante a tener en cuenta con este circuito es que, aunque es un hardware asíncrono. el reinicio está garantizado para eliminar cualquier metastabilidad, un circuito que simula uno no ofrece dicha garantía.

    
respondido por el supercat
0

No estoy seguro de verilog pero en VHDL pensé que sería algo como esto:

ARCHITECTURE behavioral OF dff_asynch IS 
BEGIN  
 PROCESS(D, Clk, Clr, Pre) 
 BEGIN 
  IF Clr = '0' THEN  -- Don’t wait for clock 
   Q <= '0'; 
   Qbar <= '1'; 
  ELSIF Pre = '0' THEN 
   Q <= '1'; 
   Qbar <= '0'; 
  ELSIF (Clk'event) AND (Clk='1') THEN   -- Positive Edge 
   Q <= D; 
   Qbar <= not D; 
  END IF; 
 END PROCES
    
respondido por el smashtastic
0

1) Sin reinicio: siempre @ (negedge C)     empezar             Q < = D;     fin

2) Reinicio síncrono siempre @ (negedge C)     empezar         if (CLR) // Si C no se está ejecutando, un cambio en CLR no afecta a Q             Q < = 1’b0;         más             Q < = D;     fin

3) reinicio asíncrono siempre @ (negedge C o posedge CLR)     empezar         si (CLR)             Q < = 1’b0;         más             Q < = D;     fin

    
respondido por el Salih

Lea otras preguntas en las etiquetas