Está en la página 1de 6

Práctica 6.

Divisor de frecuencia
Código

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 períodos.
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;

Simulación

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 compartimentación
del modelo, sin embargo, en el esquema RTL se puede representar a un nivel
más bajo que en el diagrama, permitiendo ver cómo se forma cada uno de los
componentes del circuito.
Ejecución

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
imágenes se muestra el número 7, “111” en binario y “100” en código Gray.
Problemas encontrados

No se encontró ningún problema durante esta práctica.

Conclusiones

En esta práctica tuvimos que hacer uso del reloj de forma similar a la práctica
pasada, pero ahora lo hicimos aprovechando las propiedades de los divisores
de frecuencia. Esta práctica 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.

También podría gustarte