Académique Documents
Professionnel Documents
Culture Documents
Programación en FPGA
Solución
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Librerías, paquetes
entity test is
Entidad
end test;
process()
Declaración de variables Arquitectura
begin
end process;
end Behavioral;
Librerías, paquetes: Definimos las librerías, paquetes en el cual están contenidas funciones,
constantes, componentes predeterminados que vamos a utilizar en el código VHDL.
Entidad: Describimos las entradas y salidas de nuestro circuito “caja negra” que vamos a diseñar.
Las variables solo se pueden usar dentro de un “process”, se asignan valor con “:=” y su
actualización es inmediata (ejecución secuencial). No tienen una interpretación física en hardware.
Las señales se pueden usar dentro y fuera de un “process”, se asignan valor con “<=” y su
actualización no es inmediata (ejecución en paralelo). Dependiendo cómo se utilice las señales,
ésta puede implementarse como una conexión “cable” o como un registro.
Problema 2: Implementar en VHDL el circuito que se muestra a continuación:
Sugerencia:
Describir los circuitos combinacionales de manera estructural
Describir los circuitos secuenciales de manera funcional
Solución
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity prob2 is
port(
a, b, c, clk : in std_logic;
q : out std_logic
);
end prob2;
begin
--Circuito Combinacional
s1 <= a and b;
s2 <= s1 or (not c);
s3 <= a nand s2;
--Circuito Secuencial
process(clk)
begin
if rising_edge(clk) then
q <= s3;
end if;
end process;
end Behavioral;
Problema 3:
El sumador de 4 bits se implementa partiendo del sumador de un bit, la arquitectura interna del
sumador de 4 bits es la mostrada en la figura siguiente:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity sumador_4b is
port(cin:in std_logic;
a,b:in std_logic_vector(3 downto 0);
cout:out std_logic;
suma:out std_logic_vector(3 downto 0));
end sumador_4b;
end Behavioral;
Problema 4: Realizar un contador de 4 bits, el cual aumente la cuenta cada 0.5 segundos,
sabiendo que la frecuencia del reloj del Módulo FPGA es de 50 Mhz.
Entidad (1p)
Divisor de frecuencia (1.5p)
Contador (1.5p)
Solución
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity prob3 is
port(
clk, rst : in std_logic;
y : out std_logic_vector(3 downto 0)
);
end prob3;
begin
--Divisor de frecuencia
process(clk, rst)
variable contador : integer;
begin
if rst = '1' then
en <= '0';
contador := 0;
elsif rising_edge(clk) then
contador := contador + 1;
if contador = 12500000 then
en <= '1';
contador := 0;
else
en <= '0';
end if;
end if;
end process;
--Contador de 4 bits
process(clk, rst)
variable cuenta : std_logic_vector(3 downto 0);
begin
if rst = '1' then
y <= "0000";
cuenta := "0000";
elsif rising_edge(clk) then
if en = '1' then
cuenta := cuenta + "0001";
y <= cuenta;
end if;
end if;
end process;
end Behavioral;
Problema 5:
Solución:
EL diseño del circuito secuencial que detecte la secuencia “011” usando la máquina de Mealy
requiere de 3 estados, para la solución del problema se consideran los estados A, B y C. La figura
siguiente muestra los estados y las señales de entrada/salida para detectar la secuencia pedida; se
escoge al estado A como estado inicial es decir cuando el sistema altive la señal rst=1, el sistema
volverá al estado A.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mealy_011 is
port(x:in std_logic;
clk,rst:in std_logic;
z:out std_logic);
end mealy_011;
architecture Behavioral of mealy_011 is
type estados is (A,B,C);
signal ep,es: estados;
begin
-- MAQUINA DE MEALY --
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--
-- CIRCUITO SECUENCIAL
process(clk,rst)
begin
if(rst='1')then
ep <= A;
elsif(rising_edge(clk))then
ep <= es;
end if;
end process;
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--
--CIRCUITO COMBINACIONAL
process(ep,x)
begin
case ep is
when A => if(x='1')then
es<= A;
z<='0';
else
es<= B;
z<='0';
end if;
end case;
end process;
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--
end Behavioral;