Sei sulla pagina 1di 9
INSTITUTO TECNOLÓGICO DE CELAYA Ingeniería Mecatrónica Proyecto final "Programación en VHDL" Baeza Martínez,

INSTITUTO TECNOLÓGICO DE CELAYA

Ingeniería Mecatrónica

Proyecto final "Programación en VHDL"

Baeza Martínez, Jesús Daniel Nava Fausto, Luis Felipe

Baeza Martínez, Jesús Daniel Nava Fausto, Luis Felipe Resumen - En el presente texto se expone

Resumen - En el presente texto se expone el desarrollo de una serie de prácticas en lenguaje de VHDL diseñadas para introducir a los alumnos de la materia de Electrónica Digital al conocimiento y manejo de herramientas de programación de sistemas digitales programables, con el objetivo de propiciar el correcto desarrollo de las cualidades académico-laborales de los ingenieros en formación.

Palabras Clave Máquina de estados, programación de eventos, temporización.

I. MÉTODOS

Práctica #1. Agrupamiento y comportamiento de compuertas lógicas.

El programa consistía en listar cada una de las compuertas solicitadas y emplear adecuadamente los comandos de arquitectura para que la tarjera ejecutara las operaciones básicas de forma correcta en virtud de sus entradas.

Código de solución:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

-- Declaración de entidades

entity OPERACIONALES is Port ( a,b : in STD_LOGIC; r,s,t,u,v,w : out STD_LOGIC); end OPERACIONALES;

--Descripción de la arquitectura de la entidad.

w <= a xor b;

end Behavioral;

Práctica #2. Desarrollar códigos individuales para cada una de las compuertas lógicas básicas.

Para la práctica número dos, se trabajó con las mismas compuertas lógicas, pero definiendo entradas y salidas individuales para cada una, de manera que el uso de variables era exclusivo y no repetido.

Código de solución:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Declaración de entidad “OPERADORES”, en la cual se declaran entradas individuales para la ejecución de cada una de las compuertas solicitadas.

entity OPERADORES is Port ( a,b,c,d,e,f,g,h,i,j,k : in STD_LOGIC; r,s,t,u,v,w : out STD_LOGIC); end OPERADORES;

architecture Behavioral of OPERACIONALES is begin

v

<= a and b;

--Patrón de arquitectura que describe qué entradas trabajaran con cada una de las compuertas asignando

u

<= a or b;

a una variable los valores resultado de la operación.

t

<= not a;

s

<= a nand b;

architecture Behavioral of OPERADORES is

r

<= a nor b;

begin

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

v

<= a and b;

u

<= h or i;

--Arquitectura con la cual se demuestra el

t

<= not g;

comportamiento de los estados del semáforo.

s

<= c nand d;

r

<= e nor f;

architecture Behavioral of Secuencia is

v1<=(not a)and(not b);

Práctica #4. Impresión de mensaje en display de

w <= j xor k; end Behavioral;

Práctica #3. Lógica de secuencia de un semáforo a partir de reducción por álgebra de Boole.

begin

a1<=(not a)and b; r1<= a; v2<=a and b;

La lógica con la cual se trabajó el problema del semáforo fue establecer de manera separada cada uno de los pasos de las secuencias de éste, y establecer las condiciones con las cuales cada estado se activa.

a2<=a and (not b); r2<= not a; end Behavioral;

7 segmentos.

A

B

Verde

Amarillo

Rojo

0

0

1

0

0

0

1

0

1

0

1

1

0

0

1

1

0

0

0

1

 

Tabla. 1. Secuencia #1

 

A

B

Verde

Amarillo

Rojo

0

0

0

0

1

0

1

0

0

1

1

1

1

0

0

1

0

0

1

0

Tabla. 2. Secuencia #2

Resolviendo SOP para

Resolviendo SOP para

S1

S2

̅

1 = ̅

2 =

 

̅

1 = ̅

2 =

 

̅

1 =

2 =

Tabla 3. Solución a la reducción de ecuaciones por mapas de Karnaugh

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Declaración de la secuencia como entidad, declarando las entradas a y b de la tabla de verdad y las variables v, a y r como salidas.

entity Secuencia is Port ( a,b : in STD_LOGIC; v1,a1,r1,v2,a2,r2 : out STD_LOGIC); end Secuencia;

El mensaje que se decidió imprimir fue

“GOLINCESITCELAYA”

 

Q0

Q1

Q2

Q3

G

0

0

0

0

O

0

0

0

1

L

0

0

1

0

I

0

0

1

1

N

0

1

0

0

C

0

1

0

1

E

0

1

1

0

S

0

1

1

1

I

1

0

0

0

T

1

0

0

1

C

1

0

1

0

E

1

0

1

1

L

1

1

0

0

A

1

1

0

1

Y

1

1

1

0

A

1

1

1

1

Tabla 4. Tabla de verdad para establecimiento de variables.

La primera parte de las tablas de verdad, mostrada en la tabla 4 presentada previamente, nos permite visualizar la cantidad de variables que serán requeridas para la activación de los leds en la representar cada una de las letras. Posteriormente, en la tabla 5 presentada a continuación, se muestran las condiciones globales en las cuales determinados leds serán activados.

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

 

a

b

c

d

 

e f

g

G

1

0

1

1

 

1 1

1

O

1

1

1

1

 

1 1

0

L

0

0

0

1

1

1

0

I

0

0

0

0

1

1

0

N

1

1

1

0

 

1 1

0

C

1

0

0

1

 

1 1

0

E

1

0

0

1

1

1

1

S

1

0

1

1

0

1

1

I

 

0 0

0

0

1

1

0

T

 

1 0

0

0

1

1

0

C

1

0

0

1

1

1

0

E

1

0

0

1

1

1 1

 

L

0

0

0

1

1

 

1 0

A

1

1

1

0

1

1 1

 

Y

0

1

1

1

0

1

1

A

1

1

1

0

1

1

1

Tabla 5. Tabla para mostrar la secuencia de leds que necesita cada una de las letras para reflejarse en el display de siete segmentos.

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Definición

en

la

entidad

del

display

de

7

segmentos.

entity Display is Port ( Q0,Q1,Q2,Q3 : in STD_LOGIC; l,m,n,a,b,c,d,e,f,g : out STD_LOGIC); end Display;

--Desarrollo de las ecuaciones individuales para cada uno de los leds que conforman el display de 7 segmentos.

architecture Behavioral of Display is begin

a<= not (((not Q0) and (not Q1) and (not Q2) and (not Q3)) or ((not Q0) and (not Q1) and (not Q2) and (Q3)) or ((not Q0) and (Q1) and (not Q2) and (not Q3)) or ((not Q0) and (Q1) and (not Q2) and (Q3)) or ((not Q0) and (Q1) and (Q2) and (not Q3)) or ((not Q0) and (Q1) and (Q2) and (Q3)) or ((Q0) and (not Q1) and (not Q2) and (Q3)) or ((Q0) and (not Q1) and (Q2) and (not Q3)) or ((Q0) and (not Q1) and

(Q2) and (Q3)) or ((Q0) and (Q1) and (not Q2) and

(Q3)) or ((Q0) and (Q1) and (Q2) and (Q3)));

b<= not (((not Q0) and (not Q1) and (not Q2) and

(Q3)) or ((not Q0) and (Q1) and (not Q2) and (not

Q3)) or ((Q0) and (Q1) and (not Q2) and (Q3)) or

((Q0) and (Q1) and (Q2) and (not Q3)) or ((Q0) and

(Q1) and (Q2) and (Q3)));

c<= not (((not Q0) and (not Q1) and (not Q2) and

(not Q3)) or ((not Q0) and (not Q1) and (not Q2) and

(Q3)) or ((not Q0) and (Q1) and (not Q2) and (not Q3)) or ((not Q0) and (Q1) and (Q2) and (Q3)) or ((Q0) and (Q1) and (not Q2) and (Q3)) or ((Q0) and (Q1) and (Q2) and (not Q3)) or ((Q0) and (Q1) and (Q2) and (Q3)));

d<= not (((not Q0) and (not Q1) and (not Q2) and (not Q3)) or ((not Q0) and (not Q1) and (not Q2) and (Q3)) or ((not Q0) and (not Q1) and (Q2) and (not Q3)) or ((not Q0) and (Q1) and (not Q2) and (Q3)) or ((not Q0) and (Q1) and (Q2) and (not Q3)) or ((not Q0) and (Q1) and (Q2) and (Q3)) or ((Q0) and (not Q1) and (Q2) and (not Q3)) or ((Q0) and (not Q1) and (Q2) and (Q3)) or ((Q0) and (Q1) and (not Q2) and (not Q3)) or ((Q0) and (Q1) and (Q2) and (not

Q3)));

e<= not (((not Q0) and (not Q1) and (not Q2) and (not Q3)) or ((not Q0) and (not Q1) and (not Q2) and (Q3)) or ((not Q0) and (not Q1) and (Q2) and (not Q3)) or ((not Q0) and (not Q1) and (Q2) and (Q3)) or ((not Q0) and (Q1) and (not Q2) and (not Q3)) or ((not Q0) and (Q1) and (not Q2) and (Q3)) or ((not Q0) and (Q1) and (Q2) and (not Q3)) or ((Q0) and (not Q1) and (not Q2) and (not Q3)) or ((Q0) and (not Q1) and (not Q2) and (Q3)) or ((Q0) and (not Q1) and (Q2) and (not Q3)) or ((Q0) and (not Q1) and (Q2) and (Q3)) or ((Q0) and (Q1) and (not Q2) and (not Q3)) or ((Q0) and (Q1) and (not Q2) and (Q3)) or ((Q0) and (Q1) and (Q2) and (Q3)));

f<= '0';

g<= not (((not Q0) and (not Q1) and (not Q2) and (not Q3)) or ((not Q0) and (Q1) and (Q2) and (not Q3)) or ((not Q0) and (Q1) and (Q2) and (Q3)) or ((Q0) and (not Q1) and (Q2) and (Q3)) or ((Q0) and (Q1) and (not Q2) and (Q3)) or ((Q0) and (Q1) and

(Q2) and (not Q3)) or ((Q0) and (Q1) and (Q2) and

(Q3)));

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

c <= not(((((not q2) and (not q4)) or (q1 and

l<= '1';

(not q4))) or (q3 and (not q4))) or (((not q2) and (not

q3)) and q4));

m<= '1';

 

d

<= not(((((((not q1) and (not q2)) and (not

n<= '1';

q3)) or (((q1 and (not q2))and q3) and (not q4))) or

end Behavioral;

((q2 and (not q3)) and (not q4))) or (((not q1) and q2) and (not q4))) or (((not q2) and (not q3)) and q4));

Práctica #5a. Codificador BCD mediante mapas de Karnaugh.

Para desarrollar la secuencia presentada, se empleó como estrategia de diseño los mapas de Karnaugh, ya que al analizarlos correctamente, la expresión lógica aparece en su forma más simplificada. De acuerdo con los resultados obtenidos, el resultado procede de la siguiente forma:

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Definición de la entidad para mapas de Karnaguh

entity Práctica5_a_is Port ( q1,q2,q3,q4 : in STD_LOGIC; z : out STD_LOGIC_VECTOR (3 downto 0); a,b,c,d,e,f,g : out STD_LOGIC); end Práctica5_b_;

-- Diseño de arquitectura con base en las ecuaciones reducidas obtenidas por medio de los mapas de Karnaugh.

architecture Behavioral of Práctica5_b_ is

begin

z <= "0111";

a <= not((((((not q4) and q2))or(((not q2) and

(not q3)) and q4)) or (((not q4) and q1) and q3)) or (((not q1) and (not q3)) and (not q4)));

b <= not(((((not q2) and (not q3)) or ((not q3) and (not q4))) or ((q1 and q2) and (not q4))) or (((not q1) and (not q2)) and (not q4)));

e <= not((((not q1)and (not q2)) and (not q3)) or (((not q1) and q2) and (not q4)));

f <= not((((((not q1) and (not q2)) and (not q3)) or (((not q2) and q3) and (not q4))) or (((not q1) and q3) and (not q4))) or (((not q2) and (not q3)) and q4));

g <= not((((((not q2) and q3) and (not q4)) or

(((not q2) and (not q3)) and q4)) or (((not q1) and q2) and (not q4))) or ((q2 and (not q3)) and (not q4)));

end Behavioral;

Práctica

#5b.

secuencia case.

Codificador

BCD

utilizando

Para desarrollar el codificador de BCD empleando la sentencia case es necesario, como principal elemento, definir cada uno de los casos planteados, como se muestra a continuación en la tabla 7.

Caso

BCD

Display

1

0000

a,b,c,d,e,f

2

0001

b,c

3

0010

a,b,d,e,g

4

0011

a,b,c,d,g

5

0100

b,c,f,g

6

0101

a,c,d,f,g

7

0110

a,c,d,e,f,g

8

0111

a,b,c

9

1000

a,b,c,d,e,f,g

10

Otro caso

a,b,c,d,f,g

Tabla 7. Estructura de la sentencia case

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Declaración del decodificador en la entidad a través del uso de vectores

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

entity Práctica5_b is Port ( x : in STD_LOGIC_VECTOR (3 downto 0);

entity Multiplexor is Port ( a,b,c,d,e,f,g,h : in STD_LOGIC; sel : in STD_LOGIC_VECTOR(2 downto

0);

0);

z

: out STD_LOGIC_VECTOR (3 downto

sal : out STD_LOGIC); end Multiplexor;

d

: out STD_LOGIC_VECTOR (6 downto

0));

--Descripción de la arquitectura de operación del

end Práctica5_b;

multiplexor mediante una estructura de casos.

architecture Behavioral of Práctica5_b is begin

z<="0111";

--Desarrollo de la secuencia de casos process(x) begin case x is when "0000" => d <= "0000001"; when "0001" => d <= "1001111"; when "0010" => d <= "0010010"; when "0011" => d <= "0000110"; when "0100" => d <= "1001100"; when "0101" => d <= "0100100"; when "0110" => d <= "0100000"; when "0111" => d <= "0001111"; when "1000" => d <= "0000000"; when others => d <= "0000100";

architecture Behavioral of Multiplexor is begin process(sel, a, b, c, d, e, f, g, h) begin

case sel is when "000"=>sal<=a; when "001"=>sal<=b; when "010"=>sal<=c; when "011"=>sal<=d; when "100"=>sal<=e; when "101"=>sal<=f; when "110"=>sal<=g; when others =>sal<=h; end case;

Práctica #7. Demultiplexor.

end case;

end process;

Partiendo del hecho que un demultiplexor convierte una señal serial de datos en su entrada en una señal de datos paralelos a su salida, es que se diseñó este programa.

una señal serial de datos en su entrada en una señal de datos paralelos a su

end Behavioral;

Práctica #6. Multiplexor.

Como el multiplexor es un dispositivo que recibe varias líneas de entradas, y otorga una sola salida, se expresa su comportamiento como un switch multiple, y ese comportamiento, a través de nuestras entradas definidas por las letras a-g, lo intentamos replicar.

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

--Definición del multiplexor en la entidad con ayuda de caracterización vectorial.

Configuramos primeramente una entrada a la cual llamamos Y, y la definimos como un vector de magnitud 7 para representar el bus de datos seriales que menciona el problema. Posteriormente, se establecieron dos variables de salida, las cuales fueron llamadas X1 y X2. Dentro de la sección de arquitectura del problema, definimos un if con el cual asignabamos los valores de cambio de acuerdo al estado seleccionado, es decir, si la selección asignada era 0, X1 conservaría el valor del bus de datos, mientras que X2 recibiría un valor de 0 para cada elemento en su vector; o bien, si la selección era denotada por un 1, el vector de salida X1 se mantendría en cero para cada uno de sus valores individuales, mientras que el vector X2 asumiría el valor del vector Y de entrada.

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

Fig. 1. Diagrama de bloques de un demultiplexor Código: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity

Fig. 1. Diagrama de bloques de un demultiplexor

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

entity Demultiplexor is Port ( Y : in STD_LOGIC_VECTOR (6 downto 0); X1,X2 : out STD_LOGIC_VECTOR (6 downto 0); se1 : in STD_LOGIC); end Demultiplexor;

architecture Behavioral of Demultiplexor is

begin

process(Y, se1) begin if se1<='0' then X1 <= Y;

X2<="0000000";

else

X2<=Y;

X1<="0000000";

end if;

end process;

end Behavioral;

Práctica #8. Sumador-restador.

Código:

architecture Behavioral of Sumador_restador is

signal cnt: STD_LOGIC_VECTOR(2 downto 0); begin

z<="0111";

process(a,b,se)

begin

if (se<='0') then cnt <= a + b; else cnt <= a-b; end if; end process;

process(cnt) begin case cnt is when "0000" => r <= "0000001"; when "0001" => r <= "1001111"; when "0010" => r <= "0010010"; when "0011" => r <= "0000110"; when "0100" => r <= "1001100"; when "0101" => r <= "0100100"; when "0110" => r <= "0100000"; when "0111" => r <= "0001111"; when "1000" => r <= "0000000"; when others => r <= "0000100";

end case;

end process;

end Behavioral;

Práctica #9. Flip-flop JK.

El objetivo en el desarrollo de esta práctica era expresar a través de salidas adecuadamente ordenadas la tabla de verdad con la cual opera el flip- flop JK.

entity Sumador_restador is

Port ( a,b : in STD_LOGIC_VECTOR (2 downto 0); se : in STD_LOGIC;

 

r

: out STD_LOGIC_VECTOR (6 downto

0);

 

z

: out STD_LOGIC_VECTOR (3 downto

0));

Código library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

entity Jkf is

Port ( clk,j,k,pre,clr : in STD_LOGIC;

end Sumador_restador; Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

q,qn : out STD_LOGIC);

end Jkf;

architecture Behavioral of Jkf is signal cnt: integer range 0 to 49999999 :=0; signal pulso: STD_LOGIC;

begin process(clk, pulso) begin if clk'event and clk = '1' then if cnt < 49999999 then cnt <= cnt+1;

else

cnt <= 0; pulso <= not pulso;

end if;

<='0'; qn<='1';

=> q<='1'; qn<='0';

then

pulso is

when '0' => q <='0'; qn<='0';

when '0' => q

when

end case;

end if;

others

if clr='0' and pre='0'

case

when others => q<='1'; qn<='1';

case;

end

end if;

 

end if;

if pre='1' then

end process;

q<='1';

end Behavioral

qn <= '0';

end if;

Práctica #10. Contador de 0 a 25.

if clr = '1' then q <='0'; qn <='1';

end if;

Para el desarrollo de este programa lo que se hizo fue planear una estrategia mediante la cual el botón seleccionado permitiera el cambio del valor presentado en el display de siete segmentos, y para logarlo, la herramienta utilizada fue una máquina de estados con la cual pudiera definirse la secuencia sin generar errores.

la herramienta utilizada fue una máquina de estados con la cual pudiera definirse la secuencia sin

if clr='1' and pre='1' then case pulso is when '0' => q <='0'; qn<='1'; when others => q<='1'; qn<='0'; end case; end if;

if clr='0' and pre='1' then case pulso is

Código:

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

 

when

'0'

=>

q

<='0';

entity Contador_0_25 is

qn<='0';

Port ( boton,rst,clk : in STD_LOGIC;

 

when others => q<='1';

seg : out STD_LOGIC_VECTOR (6

qn<='1';

downto 0);

 

end case;

an: out STD_LOGIC_VECTOR (3 downto

end if;

if clr='1' and pre='0' then case pulso is

0));

end Contador_0_25;

architecture Behavioral of Contador_0_25 is

signal ant, ant2, i,j: STD_LOGIC:='0'; Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

signal u,d: integer:=0; signal cntf: integer range 0 to 19999999:=0; signal pulso, pulso1: STD_LOGIC; signal mux: integer range 0 to 9999:=0; signal sum: integer; signal t: STD_LOGIC;

begin

process (boton, rst, clk)

begin if clk'event and clk='1' then if cntf<19999999 then

cntf<=cntf+1;

else

cntf<=0;

pulso

<=

pulso1<=not pulso1; end if;

if mux<9999 then

mux<=mux+1;

else mux<=0; t<=not t; end if;

if pulso='1' then ant<=boton;

not

pulso;

if boton='1' and ant='0' then i<='1'; else i<='0'; end if; end if;

end if;

if j='1' then u<=0; d<=0; end if;

case t is when '0' => sum <=u; an<="1110"; when others => sum<=d; an <="1101"; end case;

case sum is when 0 => seg <= "0000001"; when 1 => seg <= "1001111"; when 2 => seg <= "0010010"; when 3 => seg <= "0000110"; when 4 => seg <= "1001100"; when 5 => seg <= "0100100"; when 6 => seg <= "0100000"; when 7 => seg <= "0001111"; when 8 => seg <= "0000000"; when others => seg <= "0001100"; end case; end if;

II. RESULTADOS

Reporte

Reporte . Prácticas VHDL

.

Prácticas VHDL

Reporte . Prácticas VHDL

III. CONCLUSIONES

if pulso1='1' then

ant2<=rst;

if rst='1' and ant2='0' then j<='1'; else j<='0'; end if; end if;

En la actualidad, el nivel de desarrollo de los sistemas lógico-programables permite la elaboración de sistemas funcionales en espacios reducidos dentro del campo industrial, militar y de consumo, permitiendo así el acceso a un número casi infinito de procesos que faciliten las tareas cotidianas, o permitan a los usuarios de estos sistemas la implementación de procesos de gran escala a costos relativamente bajos en comparación con programas y dispositivos ASCI, que son desarrollados para cumplir con tareas específicas.

Gracias a este amplio avance tecnológico, es necesario el crecimiento formativo de un ingeniero en el ámbito de los sistemas digitales, ya que las competencias actuales laborales exigen altos rendimientos y bajo uso de recursos.

if i='1' then u<=u+1; end if;

if u>9 then

d<=d+1;

u<=0;

end if;

if u>5 and d=2 then

u<=0; d<=0; Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016

Como proceso de introducción al diseño e implementación de los sistemas mencionados anteriormente, fueron elaboradas las prácticas en lenguaje VHDL presentadas durante el desarrollo de este escrito, con las cuales cada integrante se familiarizó con conceptos tales como declaración de entidades, diseño de arquitectura y establecimiento de patrones de reloj, los cuales, en materias y proyectos posteriores dentro de la carrera, serán de esencial importancia como fundamento de desarrollo.

REFERENCIAS

[1] Maxinez, David; Alcalá, Jessica. VHDL, El arte de programar sistemas digitales. Grupo editorial Patria, 6 ta edición. Ciudad de México. 2008.

Ingeniería Mecatrónica; Electrónica Digital A; Diciembre 8, 2016