Altera Quartus Design Assistant Advertencias críticas

0

Recibo varias advertencias críticas con respecto a lpm_ff y lpm_counter:

A continuación hay algunos:

Regla A102: la salida del registro no debe controlar su propia señal de control directamente oa través de la lógica combinacional - Estructura 1

App:inst1|Exp_Box:inst2|lpm_ff:ff_Last_Image|dffs[0]
App:inst1|Exp_Box:inst2|_~3
App:inst1|Exp_Box:inst2|lpm_ff:ff_event_HStrig|dffs[0]

App:inst1|Expe_Box:inst2|lpm_counter:cnt_ext_HStrig|cntr_6ik:auto_generated|cout_actual

¿Se pueden ignorar estas advertencias? Además estoy usando Altera Quartus 11.1 Edición web. ¿Podría ser debido a Open Core Plus?

ff_event_HStrig.clock       =   System_Clock;
ff_event_HStrig.data[]      =   B"1";
ff_event_HStrig.enable      =   (red_HS_trigger OR (dl_enabled AND HS_trig_deglitch)) AND (SW_Con_en OR
                                                    SW_KK_en     OR
                                                    SW_KK_ro_en OR
                                                    SW_Ser_en); 
ff_event_HStrig.aclr        =   !n_Reset OR !HS_trig_deglitch OR fed_gen_ready OR !HW_Con_en_LIHext;    -- reset HS trigger signal
HS_trigger                  =   ff_event_HStrig.q[0];   

cnt_ext_HStrig.clock            =   System_Clock;
cnt_ext_HStrig.cnt_en       =   10kHz_Pulse AND !cnt_ext_HStrig.cout;
cnt_ext_HStrig.aclr         =   !n_Reset OR !ff_ext_HStrig.q[0];
---------------------------------------------------------------------------
ff_ext_HStrig.clock         =   System_Clock;
ff_ext_HStrig.data[]        =   B"1";
ff_ext_HStrig.enable        =   red_HS_trigger; 
ff_ext_HStrig.aclr          =   !n_Reset OR cnt_ext_HStrig.cout;

HS_trig_activated               =   ff_ext_HStrig.q[0]; 
---------------------------------------------------------------------------
cnt_Last_Image.clock        =   System_Clock;
cnt_Last_Image.cnt_en       =   100Hz_Pulse AND ff_Last_Image.q[0] AND !cnt_Last_Image.cout;
cnt_Last_Image.aclr     =   !n_Reset OR HW_Con_en;  


ff_cnt_LIH_out.clock        =   System_Clock;
ff_cnt_LIH_out.data[0]      =   cnt_Last_Image.cout;
ff_cnt_LIH_out.enable       =   B"1";   
ff_cnt_LIH_out.aclr         =   !n_Reset OR HW_Con_en;

cnt_Last_Image_fix.clock        =   System_Clock;
cnt_Last_Image_fix.cnt_en   =   100Hz_Pulse AND ff_Last_Image.q[0] AND !cnt_Last_Image_fix.cout;
cnt_Last_Image_fix.aclr     =   !n_Reset OR HW_Con_en;

ff_Last_Image.clock         =   System_Clock;
ff_Last_Image.data[0]       =   B"1";
ff_Last_Image.enable        =   fed_HW_Con_en AND LIH_en;   
ff_Last_Image.aclr          =   !n_Reset OR (cnt_Last_Image.cout AND (!HS_trigger OR LIH_ro)) OR !LIH_en OR HW_Con_en OR cnt_Last_Image_fix.cout;

LIH_active                          =   ff_Last_Image.q[0];
LIH_activated                       =   LIH_active;

Saludos!

    
pregunta Alex Krish

1 respuesta

1

Se debe tener cuidado al usar la entrada clara asíncrona de los flip-flops:

  • El pulso de restablecimiento debe ser lo suficientemente largo como se define en la hoja de datos, para restablecer de manera confiable el flip-flop.

  • Los impulsos de restablecimiento más cortos que el ancho de impulso mínimo pueden llevar a un estado desconocido. Por lo tanto, las entradas asíncronas deben no ser controladas desde la lógica combinacional, ya que la salida de la lógica combinacional (que impulsa el borrado asíncrono) puede alternar varias veces hasta que se establezca en el valor final, también conocido como fallo técnico. / p>

  • El borrado asíncrono también debe estar no conectado a la salida Q del flip-flop porque cuando Q aumenta (después de un borde del reloj) y alcanza el umbral de lógica alta, un restablecimiento Se aplica y Q cae de nuevo. Esto lleva a pulsos de reinicio cortos que pueden violar el ancho de pulso mínimo.

Una buena práctica de diseño es conectar el borrado asíncrono solo a una señal de reinicio global que se anula sincrónicamente al borde activo del reloj. Luego, la liberación asincrónica de todos los flip-flops conectados se libera al mismo tiempo, y el tiempo suficiente antes del siguiente borde del reloj activo. Se requieren restricciones de tiempo para garantizar esto.

Para anular la confirmación del restablecimiento de forma síncrona, debe utilizar un sincronizador de restablecimiento que se compone de dos flip-flops conectados en serie:

signal reset_ff : std_logic_vector(1 downto 0) := "00"; -- low-active
signal reset_global : std_logic; -- high-active

process(n_Reset, System_Clock)
begin
  if n_Reset = '0' then
    reset_ff <= (others => '0');
  elsif rising_edge(System_Clock) then
    reset_ff <= reset_ff(0 downto 0) & '1'; -- release reset
 end if;
end process;

reset_global <= not reset_ff(1); -- high-active

Puede encontrar más información en el documento Asynchronous & Reinicio síncrono Técnicas de diseño - Part Deux de Cliff Cummings (Sunburst Design) et.al. .

El reinicio del sincronizador permitiría restablecer el diseño solo globalmente, por ejemplo, desde una entrada externa (botón). Para restablecer solo algunos flip-flops, uno debe usar el síncrono restablecer sclr en su lugar. El analizador de tiempo verificará que se cumplan todas las restricciones.

Pero, no se puede reemplazar fácilmente aclr por sclr porque el borrado síncrono no tendrá lugar hasta el próximo borde del reloj activo. Por lo tanto, es probable que tenga que emitir el claro síncrono en el período de reloj anterior.

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas