Você está na página 1de 8

Introduccin.

Esta prctica da una introduccin a un contador de 8 bits. Con cuatro bits se


contara de 0 a 9 en las unidades, con otros cuatro bits se contaran las decenas,
los nmeros se mostraran en BCD por medio de leds. El contador es controlado
por una seal de reloj, un botn reset y un switch pause. El objetivo es
entender los segmentos del cdigo VHDL y los conceptos de contador.

Marco terico.
-

BCD (Decimal Codificado en Binario).


El BCD es un tipo de cdigo binario usado para representar un numero
decimal en su forma binaria equivalente.[1]

Contador BCD.
Un contador de dos dgitos BCD. Consta de dos contadores mdulo 10, uno
por cada dgito BCD, que se implementa usando el contador de cuatro bits
de carga en paralelo. [2]

Desarrollo
Se genero una descripcin mediante VHDL de un contador ascendente de 0 a 99
en BCD, para lo cual se utilizaron dos vectores de cuatro bits que representan a
las unidades y las decenas. Tambin se utilizo un vector Clock_divider que sirve
para hacer un reloj ms lento, que se implementara para permitir observar el
cambio en los leds que representan la cuenta, para el clculo de la frecuencia del
reloj implementado se utiliza la siguiente formula.

Donde
f= Frecuencia del reloj implementado
50 MHz= reloj interno de la tarjeta Spartan 3E
x= Tamao del vector Clock_divider

Resultados
Al simular la descripcin se tomaron unas consideraciones como aumentar la
frecuencia del reloj implementado, para as observar los cambios de una manera
ms clara en la simulacin, se obtuvo el siguiente resultado.

Como se observa en la simulacin, el funcionamiento es correcto, ya que se


observa como el contador va aumentando hasta llegar a noventa y nueve, luego
reinicia la cuenta en cero.

Conclusin.
Esta prctica sirvi para comprender la manera de realizar la descripcin en VHDL
de un contador, tambin la forma de hacer un reloj de menor frecuencia para
realizar operaciones ms lentas y poder visualizarlas.

Referencias de informacin:
[1] Anil K. Maini, Digital Electronics Principles, Devices and Appliations, Inglaterra,
Wiley, 2007, Pag. 19
[2] Stephen Brown- Zvonko Vranesic, Fundamentos de Lgica digital con diseo
VHDL, Mc Graw Hill, 2006, Pag. 412

Anexos
Esquemticos RTL

Este componente se encuentra descrito en el programa fuente counter.vhd

Programa fuente counter.vhd


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter is
port ( clk : in std_logic;
reset : in std_logic;
pause : in std_logic;
count_out : out std_logic_vector(3 downto 0);
count_out_d : out std_logic_vector(3 downto 0));
end counter;

architecture Behavioral of counter is


signal temp_count : std_logic_vector(3 downto 0) := x"0";
signal temp_count_d : std_logic_vector(3 downto 0) := x"0";
signal slow_clk : std_logic;
-- Clock divider can be changed to suit application.
-- Clock (clk) is normally 50 MHz, so each clock cycle
-- is 20 ns. A clock divider of 'n' bits will make 1
-- slow_clk cycle equal 2^n clk cycles.
signal clk_divider : std_logic_vector(23 downto 0) := x"000000";
begin
-- Process that makes slow clock go high only when MSB of
-- clk_divider goes high.
clk_division : process (clk, clk_divider)
begin
if (clk = '1' and clk'event) then
clk_divider <= clk_divider + 1;
end if;

slow_clk <= clk_divider(23);


end process;
counting : process(reset, pause, slow_clk, temp_count)
begin
if reset = '1' then
temp_count <= "0000"; -- Asynchronous reset.
temp_count_d <= "0000";
elsif pause = '1' then
temp_count <= temp_count; -- Asynchronous count pause.
else
if slow_clk'event and slow_clk ='1' then -- Counting state
if temp_count < 9 then
temp_count <= temp_count + 1; -- Counter ++
else
temp_count <= "0000"; -- Rollover to zero
if temp_count_d < 9 then
temp_count_d <= temp_count_d + 1;

else
temp_count_d <= "0000";
end if;

end if;
end if;
end if;
count_out <= temp_count; -- Output
count_out_d <= temp_count_d; -- Output
end process;
end Behavioral; -- End module.

Programa fuente counter_tb.vhd


ARCHITECTURE behavior OF counter_tb_vhd IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT counter
PORT(
clk : IN std_logic;
reset : IN std_logic;
pause : IN std_logic;
count_out : OUT std_logic_vector(3 downto 0);
count_out_d : OUT std_logic_vector(3 downto 0)
);
END COMPONENT;
--Inputs
SIGNAL clk : std_logic := '0';
SIGNAL reset : std_logic := '0';
SIGNAL pause : std_logic := '0';
--Outputs
SIGNAL count_out : std_logic_vector(3 downto 0);
SIGNAL count_out_d : std_logic_vector(3 downto 0);
constant clk_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: counter PORT MAP(
clk => clk,
reset => reset,
pause => pause,
count_out => count_out,
count_out_d => count_out_d
);
clock : PROCESS
BEGIN

clk <= NOT clk;


wait for clk_period;
END PROCESS;
pause_test : PROCESS
BEGIN
pause <= '0';
wait for clk_period*74;
pause <= '1';
wait for clk_period*6;
END PROCESS;
reset_test : PROCESS
BEGIN
reset <= '0';
wait for clk_period*1060;
reset <= '1';
wait for clk_period*2;
END PROCESS;
END;

Programa fuente counter.ucf


# UCF for the 8 bit counter
# Change "clk" pin assignment to "V4" (BTN_NORTH) to
# manually control the clock signal (don't forget "PULLDOWN")
# Change "clk" to "C9" (CLK_50MHz) to run counter off
# 50MHz clock
NET "clk" LOC = "C9" ;
NET "count_out<0>" LOC = "F12" ; # LED<0>
NET "count_out<1>" LOC = "E12" ; # LED<1>
NET "count_out<2>" LOC = "E11" ; # LED<2>
NET "count_out<3>" LOC = "F11" ; # LED<3>
NET "count_out_d<0>" LOC = "C11"; #LED<4>
NET "count_out_d<1>" LOC = "D11"; #LED<5>
NET "count_out_d<2>" LOC = "E9" ; #LED<6>
NET "count_out_d<3>" LOC = "F9" ; #LED<7>
NET "pause" LOC = "L13" ; # SW<0>
NET "reset" LOC = "K17" | PULLDOWN ;

Você também pode gostar