Está en la página 1de 6

Prctica 6.

Divisor de frecuencia
Cdigo
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.all;
use IEEE.STD_LOGIC_unsigned.all;
use IEEE.numeric_std.all;
entity divider is
--Entradas y salidas del divisor
Port ( clock : in std_logic;
new_clock : out std_logic
);
end divider;
architecture Behavioral of divider is
signal cont_clock : integer := 0;
signal temp : std_logic := '0';
begin
process(clock)
begin
if(rising_edge(clock)) then
--temp (y cont_clock) cambian cuando el contador
--alcanza el valor
if(cont_clock = 12599999) then
cont_clock <= 0;
temp <= not(temp);
new_clock <= temp;
else
cont_clock <= cont_clock + 1;
end if;
end if;
end process;
end Behavioral;
-------------------library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.all;
use IEEE.STD_LOGIC_unsigned.all;
use IEEE.numeric_std.all;
entity P6 is
--Entradas y salidas

Port (

formato : in std_logic;
pausa : in std_logic;
suma : in std_logic;
clock : in std_logic;
num : out std_logic_vector (7 downto 0) :=
"00000000"
);

end P6;
architecture Behavioral of P6 is
component divider is
Port ( clock : in std_logic;
new_clock : out std_logic
);
end component;
--Reloj con menos frecuencia
signal new_clock : std_logic;
--Contador para incrementar/decrementar
signal cont : std_logic_vector (7 downto 0) := "00000000";
--Contador con corrimiento a la derecha
signal rcont : std_logic_vector (7 downto 0) := "00000000";
--Cuenta cuantos ciclos han pasado (para que T_Gray = 1 s)
signal check : integer := 0;
--Evitar que el compilador quite el latch que se forma porque
--rcont(7) siempre es '0'
attribute keep : string;
attribute keep of rcont : signal is "true";
attribute S : string;
attribute S of rcont : signal is "YES";
begin
nclock:

divider port map(clock, new_clock);

process(new_clock, suma, pausa, formato, cont, rcont)


begin
if(rising_edge(new_clock) and pausa /= '1') then
if(formato = '1') then
if (suma = '1') then
cont <= cont + 1;
else
cont <= cont - 1;
end if;
else
--Si el formato es Gray, el Contador cambia

--cuando han pasado dos perodos.


check <= check + 1;
if(check = 2) then
if(suma = '1') then
cont <= cont + 1;
else
cont <= cont - 1;
end if;
check <= 0;
else
cont <= cont;
end if;
end if;
else
null;
end if;
if(formato = '1') then
rcont <= cont;
num <= cont;
else
rcont <= '0' & cont(7 downto 1);
num <= cont xor rcont;
end if;
end process;
end Behavioral;
Simulacin

Esquema RTL

Al comparar el diagrama de bloques con el esquema RTL obtenido en el


software, se observa que en ambos se puede apreciar una compartimentacin
del modelo, sin embargo, en el esquema RTL se puede representar a un nivel
ms bajo que en el diagrama, permitiendo ver cmo se forma cada uno de los
componentes del circuito.

Ejecucin

Naturalmente, ya que se trata de fotos, no se puede observar el incremento y


decremento del contador ni el retraso de tiempo para cada formato. En las
imgenes se muestra el nmero 7, 111 en binario y 100 en cdigo Gray.
Problemas encontrados
No se encontr ningn problema durante esta prctica.
Conclusiones
En esta prctica tuvimos que hacer uso del reloj de forma similar a la prctica
pasada, pero ahora lo hicimos aprovechando las propiedades de los divisores
de frecuencia. Esta prctica se sinti como muchas en una porque fueron dos
contadores los que se tuvieron que implementar, pero fue una buena
oportunidad para pensar creativamente y as resolver el problema.