La Red de Conocimientos Pedagógicos - Currículum vitae - divisor vhdl

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(

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;

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;

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>

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;