Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3er ParcialJF
3er ParcialJF
PARCIAL FINAL
JUAN FERNANDEZ
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.
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
---------------------------------------------------
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".
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.