Implementando VHDL FSM en Quartus con "no se pudieron implementar registros para asignaciones en este borde del reloj"

0

Se supone que debo escribir código para un medidor de frecuencia simple. Lo que se supone que debe hacer es: cuando presiona el botón, debe medir la frecuencia de la señal de entrada basándose en la señal de reloj de 1Hz para que el resultado no necesite ninguna división para obtener la frecuencia. Básicamente, la medición de la señal de entrada "picos" en el período de 1 s. El resultado debe mostrarse en kHz en 2 pantallas de 7 dígitos (medición de 30-40 kHz).

Pensé que iba a usar el diagrama de la máquina de estados, pero incluso si se puede compilar en Active HDL, aparece un "Error (10822): error de HDL en Termometr_F.vhd (69): no se pudieron implementar registros para las asignaciones este borde del reloj "en Quartus ...

Aquí está mi diagrama de estado:

¿HayalgunaformadeimplementarestediagramaenelsoftwareQuartus?Heintentadootrométodo:dividirlaseñaldeentradapor2paraobtenerunaseñaldecompuertayluegocontarlospulsos,peroladivisióntampocosepuedecompilarsinusaroperacionesdepuntoflotanteparalasquenotengolibresiespara...

Aquíestáelcódigo:

libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;entityTermometr_Fisport(Clock:inSTD_LOGIC;input:inSTD_LOGIC;measure:inSTD_LOGIC;reset:inSTD_LOGIC;ok:outSTD_LOGIC;output:outINTEGER);endTermometr_F;architectureTermometr_F_archofTermometr_FissignalCount:INTEGER;typeTermometr_F_typeis(S1,S2,S3,S4);signalTermometr_F:Termometr_F_type;beginTermometr_F_machine:process(Clock)beginifClock'eventandClock='1'thencaseTermometr_FiswhenS1=>output<=0;Count<=0;ok<='0';ifmeasure='1'thenTermometr_F<=S2;endif;whenS2=>ifrising_edge(Clock)thenTermometr_F<=S3;endif;whenS3=>Count<=Count+1;ifrising_edge(input)thenTermometr_F<=S3;elsifrising_edge(Clock)thenTermometr_F<=S4;endif;whenS4=>output<=count-1;Count<=0;ok<='1';ifreset='1'thenTermometr_F<=S1;endif;whenothers=>null;endcase;endif;endprocess;endTermometr_F_arch;

Graciasdeantemano

EDITAR:Renunciéaladeteccióndebordesymodifiquéelcódigo:

libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;entityTermometrisport(divider:inoutSTD_LOGIC;----C:instd_logic;state:inoutINTEGER;---input:inoutSTD_LOGIC;pomiar:inSTD_LOGIC;reset:inSTD_LOGIC;ok:outSTD_LOGIC;output:inoutINTEGER;Y0,Y1,Y2,Y3:inoutstd_logic_vector(0to6));endTermometr;architectureTermometr_F_archofTermometrissignalCount:INTEGER;signalgate:STD_LOGIC;----signalKLOK:integer:=0;signalO,O1,O2,O3:integer;signalcounter:integer:=0;----typeTermometr_F_typeis(S1,S2,S3,S4);signalTermometr_F:Termometr_F_type;begin------------------------------------------------------------------------Machine:Termometr_F----------------------------------------------------------------------Termometr_F_machine:process(input)beginifinput'eventandinput='1'thenifreset='0'thenTermometr_F<=S1;output<=0;Count<=0;ok<='0';elsecaseTermometr_FiswhenS1=>output<=0;Count<=0;ok<='0';state<=1;ifpomiar='0'thenTermometr_F<=S2;endif;whenS2=>state<=2;gate<=inputanddivider;ifgate='1'thenTermometr_F<=S3;endif;whenS3=>state<=3;Count<=Count+1;gate<=inputanddivider;ifgate='1'thenTermometr_F<=S3;elsifgate='0'thenTermometr_F<=S4;endif;whenS4=>state<=4;output<=Count;ok<='1';gate<='0';ifreset='0'thenTermometr_F<=S1;endif;whenothers=>null;endcase;endif;endif;endprocess;*----------------------TESTINPUTSIGNAL------------------------*process(C,input)beginif(reset='0')thenKLOK<=0;input<='0';elsif(C'eventandC='1')thenKLOK<=KLOK+1;if(KLOK=5000)theninput<=NOTinput;KLOK<=0;endif;endif;endprocess;----------------------------GENERATING0.5HzSIGNAL-----------------------------process(C,divider)beginif(reset='0')thencounter<=0;divider<='0';elsif(C'eventandC='1')thencounter<=counter+1;if(counter=50000000)thendivider<=NOTdivider;counter<=0;endif;endif;endprocess;--------------------------------7digitconv------------------------------O<=output;O1<=((Omod1000)-(Omod100))/100;O2<=((Omod10000)-(Omod1000))/1000;O3<=state;withO1selectY1<="0000001" when 0,
    "1001111" when 1,
    "0010010" when 2,
    "0000110" when 3,
    "1001100" when 4,
    "0100100" when 5,
    "0100000" when 6,
    "0001111" when 7,
    "0000000" when 8,
    "0000100" when 9,
    "1111111" when others; 

    with O2 select 
    Y2 <= "0000001" when 0,
    "1001111" when 1,
    "0010010" when 2,
    "0000110" when 3,
    "1001100" when 4,
    "0100100" when 5,
    "0100000" when 6,
    "0001111" when 7,
    "0000000" when 8,
    "0000100" when 9,
    "1111111" when others;

    with O3 select 
    Y3 <= "0000001" when 0,
    "1001111" when 1,
    "0010010" when 2,
    "0000110" when 3,
    "1001100" when 4,
    "0100100" when 5,
    "0100000" when 6,
    "0001111" when 7,
    "0000000" when 8,
    "0000100" when 9,
    "1111111" when others;

end Termometr_F_arch;
    
pregunta Rafael

1 respuesta

2

El problema fundamental es que tienes sentencias condicionales como

if rising_edge(...) then

enterrado dentro de un proceso que ya está condicionado en un borde de reloj. No puede haber múltiples sensibilidades de borde que afecten a la misma señal, incluso si esas sensibilidades están realmente en el mismo Clock en un caso, pero definitivamente NO en una señal asíncrona separada ( input ).

Todas las entradas utilizadas en una máquina de estado ya deben estar sincronizadas con el mismo reloj que la máquina de estado. Esto puede requerir ajustar un poco la definición de la máquina de estado para satisfacer este requisito mientras se implementa la funcionalidad deseada.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas