Vous êtes sur la page 1sur 7

Solucionario

Programación en FPGA

Problema 1: La figura muestra la estructura de un código en VHDL, indicar lo siguiente:

 Identificar las partes principales de la estructura de un código en VHDL. (1p)


 Describir brevemente las partes de la estructura de un código en VHDL. (1p)
 Indicar en donde se declaran usualmente las constantes, variables y señales. (1p)
 Describir brevemente las diferencias, usos de las variables y señales. (1p)

Solución

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
Librerías, paquetes

entity test is
Entidad
end test;

architecture Behavioral of test is


Declaración de constantes y
begin señales

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.

Arquitectura: Describimos nuestro circuito a diseñar de manera estructural o funcional.

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;

architecture Behavioral of prob2 is

signal s1, s2, s3 : std_logic;

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:

A partir de la configuración anterior, el código VHDL es el 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;

architecture Behavioral of sumador_4b is


signal c0,c1,c2:std_logic;
begin

suma(0) <= a(0) xor b(0) xor cin;


c0 <= (a(0) and b(0)) or ( (a(0) xor b(0)) and cin);

suma(1) <= a(1) xor b(1) xor c0;


c1 <= (a(1) and b(1)) or ( (a(1) xor b(1)) and c0);

suma(2) <= a(2) xor b(2) xor c1;


c2 <= (a(2) and b(2)) or ( (a(2) xor b(2)) and c1);

suma(3) <= a(3) xor b(3) xor c2;


cout <= (a(3) and b(3)) or ( (a(3) xor b(3)) and c2);

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;

architecture Behavioral of prob3 is


signal en : std_logic;

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.

La figura siguiente muestra la entidad del detector de secuencia:

El código VHDL es el siguiente:

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;

when B => if(x='1')then


es<= C;
z<='0';
else
es<= B;
z<='0';
end if;

when others=> if(x='1')then


es<= A;
z<='1';
else
es<= B;
z<='0';
end if;

end case;
end process;
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--

end Behavioral;

Vous aimerez peut-être aussi