Dado Digital

Dado digital con programación de Verilog.

Numeros-del-dado.png

Integrantes

Niño Parra Felipe Armando - Diab Roldán Emil Eduardo - Gil Luis Angel

Descripción.

El dado es un objeto cúbico que contiene los números de uno al seis en sus distintas caras, este, es utilizado generalmente en juegos de azar ya que cuando es lanzado sobre una superficie horizontal este nos muestra un resultado aleatorio. Con este proyecto se va a crear un dado digital de dos salidas modelado a través del lenguaje Verilog, y simulado mediante una tarjeta FPGA.

Materiales para el diseño

Para realizar este proyector se utilizara:

  • Un Software llamado Ise Desing Suite, utilizado para realizar la programación en lenguaje de descripción de hardware (Verilog).
  • Tarjeta FPGA, para la simulación del proyecto.
  • Leds, para la fabricación del dado controlado por la FPGA.
NEXYS2high2.jpg

Desarrollo del proyecto

Para dar vida a este proyecto inicialmente se empezó a programar en el lenguaje Verilog, un lenguaje que se compone de módulos interconectados los cuales realizan la función que se les implemente, en este caso se creó un módulo que nos genera números aleatorios (Random number generator) a partir de un método numérico de potencias, el cual es fundamental para la simulación del dado digital.

asdfggbasd.jpg

Como se ve en el código se tienen variables de entrada y salida, que tienen un comportamiento que podemos apreciar a continuación:

comprtamiento.jpg

Como se puede apreciar variando las variables de entrada se generan números aleatorios los cuales cambian con cada iteración de las entradas.

Luego de se procedió a crear un multiplexor para simular en la tarjeta FPGA, el cual consta de un divisor de frecuencias que permite colocar numero en los displays 7 segmentos de dicha tarjeta.

multiplex.png

Codigo Verilog

Programación del código al azar

ENTITY TB_DADO IS
END TB_DADO;

ARCHITECTURE behavior OF TB_DADO IS

— Component Declaration for the Unit Under Test (UUT)

COMPONENT DADO
PORT(
CLK : IN std_logic;
RST : IN std_logic;
START : IN std_logic;
LEDS : OUT std_logic_vector(6 downto 0);
SEL : IN std_logic
);
END COMPONENT;

—Inputs
signal CLK : std_logic := '0';
signal RST : std_logic := '0';
signal START : std_logic := '0';
signal SEL : std_logic := '0';

—Outputs
signal LEDS : std_logic_vector(6 downto 0);

— Clock period definitions
constant CLK_period : time := 10 ns;

BEGIN

— Instantiate the Unit Under Test (UUT)
uut: DADO PORT MAP (
CLK => CLK,
RST => RST,
START => START,
LEDS => LEDS,
SEL => SEL
);

— Clock process definitions
CLK_process :process
begin
CLK <= '0';
wait for CLK_period/2;
CLK <= '1';
wait for CLK_period/2;
end process;

— Stimulus process
stim_proc: process
begin
— hold reset state for 100 ns.
wait for 100 ns;
— Señales de control son efecto mietras reset
wait for CLK_period*10;
RST <= '1';
START <= '0';
SEL <= '0';
wait for CLK_period*3;
RST <= '1';
START <= '1';
SEL <= '0';
wait for CLK_period*3;
RST <= '1';
START <= '1';
SEL <= '1';
wait for CLK_period*3;
RST <= '1';
START <= '0';
SEL <= '1';

— Modo contador
wait for CLK_period*5;
RST <= '0';
START <= '0';
SEL <= '0';
wait for CLK_period*30;
RST <= '0';
START <= '1';
SEL <= '0';

— Modo DADO
wait for CLK_period*5;
RST <= '0';
START <= '0';
SEL <= '1';
wait for CLK_period*10;
RST <= '0';
START <= '1';
SEL <= '1';
wait for CLK_period*5;
RST <= '0';
START <= '0';
SEL <= '1';
wait;
end process;
END;

Reloj del sistema

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;

entity DADO is
Port ( CLK : in STD_LOGIC; — Reloj del istema
RST : in STD_LOGIC; — Reset del sistema
START : in STD_LOGIC; — Generación de nuevo numero
LEDS : out STD_LOGIC_VECTOR (6 downto 0); — Salida de LEDs activos bajos
SEL : in STD_LOGIC); — 1 - dado 0 - contador

attribute pin_numbers of DADO:entity is
"CLK:1 RST:3 START:2 SEL:4 LEDS(6):15 LEDS(5):16 LEDS(4):17 LEDS(3):18 LEDS(2):19 LEDS(1):20 LEDS(0):21" ;
end DADO;

architecture Behavioral of DADO is signal estados : STD_LOGIC_VECTOR (6 downto 0);— := (others=>'0'); begin


— Transición entre estados —


estado:process (CLK)
begin
if (CLK'event and CLK = '1') then
if RST = '1' then
estados <= (others=>'0');
else
if SEL = '1' and START = '1' then
case (estados) is
when "0001000" => — 6
estados <= "0100010";
when "0100010" => — 5
estados <= "0101010";
when "0101010" => — 4.
estados <= "1100110";
when "1100110" => — 3
estados <= "1101110";
when "1101110" => — 2
estados <= "1110111";
when "1110111" => — 1
estados <= "0001000";
when others =>
estados <= "0001000";
end case;
elsif SEL = '0' and START = '1' then
estados <= estados + 1;
else
estados <= estados;
end if;
end if;
end if;
end process;

LEds <= estados ;
end Behavioral;

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License