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;