Está en la página 1de 5

INSTITUCIÓN UNIVERSITARIA DE BARRANQUILLA

DISEÑO DE SISTEMAS ELECTRONICOS

PARCIAL FINAL

JUAN FERNANDEZ

PROF. DANIEL BARRIOS

TECNOLOGIA EN AUTOMATIZACION ELECTRONICA INDUSTRIAL

ABRIL 2023
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
↑ librerias estandar de IEEE y definicion de operaciones de la libreria IEEE.

entity init_prog is
Port ( clk_50MHz : in STD_LOGIC;
rst : in STD_LOGIC;
ini : in STD_LOGIC;
ram_addr : out std_logic_vector(5 downto 0);
ram_data : out std_logic_vector(2 downto 0);
ram_we : out std_logic;
fin : out STD_LOGIC
);
end init_prog;

↑ declaracion de la entidad, con tres entradas(reloj, inicio y reset), con tres salidas para la RAM(direccion, datos y
escritura) dos de estas de tipo vector, y una salida independiente llamada fin.

architecture arq of init_prog is

type t_st is (s0, s1, s2, s3);


signal current_state, next_state : t_st;
signal rom_out: std_logic_vector(2 downto 0);

signal cntr: std_logic_vector(7 downto 0);


signal cntr_add1: std_logic_vector(7 downto 0);
signal cntr_ld: std_logic;
↑ declaracion de la arquitectura, definicion de los estados como tipo enumerado, con distintas señales (para el estado
actual y el siguente, para salida de la ROM, para el Contador de las direcciones, contador incrementado en 1 y una para
cargar el Contador) 3 de estas de tipo vector(rom_out,cntr y cntr_add1).

COMPONENT tablero_rom
PORT(
clk : IN std_logic;
x : IN std_logic_vector(2 downto 0);
y : IN std_logic_vector(2 downto 0);
rgb : OUT std_logic_vector(2 downto 0)
);
END COMPONENT;

↑ declarando el componente ROM, con tres salidas(para reloj, para direccion en X y una para direccion en Y en la ROM),
dos de estas de tipo vector(x, y) y una salida de tipo vector para el contenido de la ROM

COMPONENT incrCuenta8bits_conFin
PORT(
num_in : IN std_logic_vector(7 downto 0);
num_out : OUT std_logic_vector(7 downto 0);
fin : OUT std_logic
);
END COMPONENT;

↑ declarando componente para el Contador con una entrada de tipo vector para el valor actual del Contador y dos
salidas para el valor incrementado en 1 y una salida de finalizacion del Contador, una de tipo vector que es la del valor
incrementado.

begin

Inst_tablero_rom: tablero_rom PORT MAP(


clk => clk_50MHz,
x => cntr(2 downto 0),
y => cntr(5 downto 3),
rgb => rom_out
);

Inst_incrCuenta8bits_conFin: incrCuenta8bits_conFin PORT MAP(


num_in => cntr,
num_out => cntr_add1,
fin => open
);
---------------------------------------------------

---------------------------------------------------
p_next_state : process (current_state, ini, cntr, cntr_add1) is
begin
case current_state is
when s0 =>
if ini = '1' then
next_state <= s1;
else
next_state <= s0;
end if;
when s1 =>
if cntr = "01000000" then
next_state <= s3;
else
next_state <= s2;
end if;
when s2 =>
next_state <= s1;
when s3 =>
next_state <= s3;
end case;
end process p_next_state;

---------------------------------------------------

---------------------------------------------------
p_outputs : process (current_state, cntr, rom_out)
begin
case current_state is
when s0 =>
ram_addr <= (others => '0');
ram_data <= (others => '0');
ram_we <= '0';
fin <= '0';
cntr_ld <= '0';
when s1 =>
ram_addr <= cntr(5 downto 0);
ram_data <= rom_out;
ram_we <= '0';
fin <= '0';
cntr_ld <= '0';
when s2 =>
ram_addr <= cntr(5 downto 0);
ram_data <= rom_out;
ram_we <= '1';
fin <= '0';
cntr_ld <= '1';
when s3 =>
ram_addr <= (others => '0');
ram_data <= (others => '0');
ram_we <= '0';
fin <= '1';
cntr_ld <= '0';
end case;
end process p_outputs;
---------------------------------------------------

---------------------------------------------------
p_cntr: process (rst, clk_50MHz, ini, cntr_ld, cntr)
begin
if rst = '1' then
cntr <= (others => '0');
elsif rising_edge(clk_50MHz) then
-- Si load = 1 y cntr != 64
--if cntr = "00111111" then
if cntr = "01000000" then
cntr <= (others => '0');
elsif cntr_ld = '1' then --and cntr /= "0111111" then
cntr <= cntr_add1;
else
cntr <= cntr;
end if;
end if;
end process p_cntr;
---------------------------------------------------

---------------------------------------------------
p_update_state: process (clk_50MHz, rst) is
begin
if rst = '1' then
current_state <= s0;
elsif rising_edge(clk_50MHz) then
current_state <= next_state;
end if;
end process p_update_state;

end arq;


1. Se instancia un componente llamado "tablero_rom" utilizando la declaración "Inst_tablero_rom". Se
establecen las conexiones de los puertos del componente utilizando la cláusula "PORT MAP". Los puertos
conectados son:
• "clk": señal de reloj de 50 MHz.
• "x": bits [2:0] del vector "cntr".
• "y": bits [5:3] del vector "cntr".
• "rgb": señal de salida "rom_out".

2. Se instancia otro componente llamado "incrCuenta8bits_conFin" utilizando la declaración


"Inst_incrCuenta8bits_conFin". También se utilizan cláusulas "PORT MAP" para establecer las conexiones de los
puertos del componente. Los puertos conectados son:
• "num_in": vector "cntr".
• "num_out": vector "cntr_add1".
• "fin": señal abierta ("open").

3. Se define un proceso llamado "p_next_state" con sensibilidad a las señales "current_state", "ini", "cntr" y
"cntr_add1". Este proceso utiliza una estructura de caso ("case") para determinar el siguiente estado del
sistema según el estado actual ("current_state") y los valores de las señales de entrada.
• En cada caso, se asigna un valor al siguiente estado ("next_state") según las condiciones especificadas.

4. Se define otro proceso llamado "p_outputs" con sensibilidad a las señales "current_state", "cntr" y "rom_out".
Este proceso también utiliza una estructura de caso para determinar las salidas del sistema según el estado
actual y las señales de entrada.
• En cada caso, se asignan valores a las señales "ram_addr", "ram_data", "ram_we", "fin" y "cntr_ld" según las
condiciones especificadas.

5. Se define un proceso llamado "p_cntr" con sensibilidad a las señales "rst", "clk_50MHz", "ini", "cntr_ld" y
"cntr". Este proceso controla el contador "cntr" en función de diferentes condiciones.
• Si "rst" es igual a '1', se inicializa el contador en cero.
• Si hay un flanco de subida en la señal "clk_50MHz":
• Si el contador alcanza el valor "01000000", se reinicia a cero.
• Si "cntr_ld" es igual a '1', se carga el valor del contador incrementado ("cntr_add1") en el contador.
• En otros casos, el contador se mantiene igual.

6. Se define un proceso llamado "p_update_state" con sensibilidad a las señales "clk_50MHz" y "rst". Este
proceso actualiza el estado actual ("current_state") según la señal de reloj y la señal de reinicio ("rst").
• Si "rst" es igual a '1', el estado actual se establece en "s0".
• Si hay un flanco de subida en la señal "clk_50MHz", el estado actual se actualiza al siguiente estado calculado.

El anterior código define un diseño digital que utiliza un contador, una memoria RAM y una ROM para controlar el flujo y
la operación del Sistema, El contador se incrementa y se carga en función de las señales de control y el estado actual del
sistema.

También podría gustarte