Estoy empezando a aprender la codificación Verilog en la universidad y no tuve tanto problema hasta ahora. Creo que tengo los conceptos básicos 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 D con reinicio activado por 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 activado por borde síncrono 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 que un nivel se active pero se reinicie de forma asíncrona? No puedo hacerlo
always @(posedge clk or clr)
porque eso sería orear dos tipos incompatibles, por lo que se generará un error al realizar la síntesis RTL. No puedo hacerlo
always @(posedge clk)
begin
q <= d;
end
always @(clr)
begin
q <= 1'b0;
end
ya que eso requeriría múltiples fuentes para impulsar q, nuevamente problema en la síntesis RTL.
Entonces, mi pregunta es, ¿es posible o no hacer un D-flip flop con reinicio activado por nivel asíncrono? Tanto en verilog como en lógica digital.
Aquí está 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)
Tenga en cuenta que esto es básicamente lo mismo que su segundo ejemplo (excepto que usa el borde del reloj opuesto). 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 cambia la entrada D.
No estoy muy familiarizado con Verilog, pero según tengo entendido, algunas herramientas de síntesis chillarán ante los intentos de generar lógica sintetizada 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 ocurran cerca de los bordes del reloj. Aquí hay un ejemplo. Sin embargo, una cosa importante a tener en cuenta con este circuito es que, si bien se garantiza que un reinicio asincrónico de hardware eliminará cualquier metaestabilidad, un circuito que simula uno no ofrece tal garantía.
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
1) Sin reinicio: siempre @(negedge C) comienzan Q <= D; fin
2) Reinicio síncrono siempre @(negedge C) comienza si (CLR) // Si C no se está ejecutando, un cambio en CLR no afecta a QQ <= 1'b0; si no Q <= D; fin
3) Reinicio asíncrono siempre @(negedge C o posedge CLR) comienzan si (CLR) Q <= 1'b0; si no Q <= D; fin
Super gato
el fotón
Super gato
Super gato
el fotón
el fotón
Super gato
Super gato
el fotón