divisor vhdl
Nombre de archivo:fq_divider.vhd
----Este módulo es un divisor de frecuencia, que divide la frecuencia del reloj de 1 KHZ en una frecuencia de reloj de una vez por minuto
----De hecho, este código fuente puede realizar la división de frecuencia de cualquier número entero, principalmente dejando que el valor de N establezca el número correspondiente
------------- -------------------------------------------------- -- ----------
BIBLIOTECA IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
p>USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fq_divider IS
generic(n:integer:=60000);
PORT( p>
CLK,restablecer: IN STD_LOGIC;
CLK_OUT:búfer STD_LOGIC
);
END;
ARQUITECTURA A DE fq_divider IS
SEÑAL CNT1,CNT2:integer:=0;
SEÑAL OUTTEMP:STD_LOGIC;
SEÑAL LOUT:STD_LOGIC; p>
SEÑAL DE SALIDA3:STD_LOGIC:='0';
COMENZAR
P1:PROCESO(CLK)
COMENZAR
SI CLK' EVENTO Y CLK='1' ENTONCES
SI CNT1=n-1 ENTONCES
CNT1<=0;
ELSE
CNT1 <=CNT1+1;
TERMINAR SI;
TERMINAR SI;
TERMINAR PROCESO P1;
P2: PROCESO(CLK)
COMENZAR
SI CLK'EVENT Y CLK='0' ENTONCES
SI CNT2=n-1 ENTONCES
CNT2<= 0;
ELSE
CNT2<=CNT2+1;
FINALIZAR SI;
TERMINAR SI; p>
FIN DEL PROCESO P2;
P3:PROCESO(CNT1,CNT2)
COMENZAR
si ((n mod 2)=1) entonces
SI CNT1=1 ENTONCES
SI CNT2=0 ENTONCES
OUTTEMP<='1';
ELSE
OUTTEMP <='0';
END IF
ELSIF CNT1=(n+1)/2 THEN
IF CNT2=(n +1)/ 2 ENTONCES
OUTTEMP<='1';
ELSE OUTTEMP<='0';
FINALIZAR SI;
p>
ELSE
OUTTEMP<='0';
END IF;
else
si cnt1=1 entonces
outtemp<='1';
elsif (cnt1=(n/2+1)) entonces
outtemp<='1'; p> p>
else
outtemp<='0';
finalizar si;
finalizar si;
END PROCESO P3 ;
P4:PROCESO(OUTTEMP,clk,reset)
COMENZAR
si reset='0' entonces
clk_out <= clk;
elsif ((n/=2) y (n/=1)) entonces
IF OUTTEMP'EVENT AND OUTTEMP='1' THEN
CLK_OUT<=NOT CLK_OUT;
END IF;
elsif (n=2) entonces
if(clk'event and clk='1 ') entonces
clk_out<=not clk_out;
terminar si;
else
clk_out<=clk;
terminar si;
TERMINAR PROCESO P4;
TERMINAR A;