Vous êtes sur la page 1sur 9

9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica

Examen Parcial No 2 (VHDL).


Introducción

VHDL es un Lenguaje para Descripción de hardware de Circuitos Integrados de Muy Alta


Velocidad respaldado por el departamento de defensa de USA. Su uso está muy difundido a nivel
mundial ya que existe una gran cantidad de herramientas de síntesis que lo utilizan como medio
de desarrollo. En éste trabajo se presenta al estudiante una metodología para obtener una
descripción VHDL a partir de un diagrama de flujo. Pero antes debemos hacer referencia a
algunas características básicas del VHDL1. La figura 1 muestra el circuito lógico de un sumador
completo mientras que el listado 2 presenta una descripción de este sumador completo descrito
en VHDL.

a
b

sum
cin

cout

Figura 1 sumador completo

library IEEE;
use IEEE.std_logic_1164.all;
entity adder is
port (a : in std_logic;
b : in std_logic;
cin : in std_logic;
sum : out std_logic;
cout : out std_logic);
end adder;

-- description of adder using concurrent signal assignments


architecture behaviour of adder is
begin
sum <= (a xor b) xor cin;
cout <= (a and b) or (cin and a) or (cin and b);
end behaviour;
Listado 2 (Sumador completo en VHDL)

Toda descripción en VHDL consta de dos partes principales, un encabezado único identificado
con la clave entity y una realización de las que pueden ser varias, identificada con la clave
architecture.

Entity

1 Este laboratorio solo trata aquellas partes de VHDL que se consideran imprescindibles para la realización de una
secuencia básica. Recomendamos realizar una búsqueda en la red ya que existen una gran cantidad de tutoriales
sobre el tema.
Ing. Medardo Logreira V. A. 1
9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
Es el encabezado en el que se establece las entradas y salidas a través de las cuales el módulo
interactúa con el resto del sistema. Las señales se declaran y se dimensionan bajo la palabra
clave port ( nombre1: tipo <dim>; nombre2: tipo <dim>; ---; ); dondel nombre identifica la señal, el
tipo identifica si es entrada (in) o salida (out) así como la clase a la que pertenece (bit,
bit_vector(rango), std_logic “lógica estándar”, std_logic_vector(rango) “vector de lógica estándar”,
entre otras clases). Por ejemplo la expresión “a : in std_logic;” identifica a la señal de entrada ‘a’
del tipo std_logic de un bit, por otra parte la expresión “ar : out std_logic_vector(0 to 15);” identifica
al vector de salida ‘ar’ del tipo std_logic_vector de 16 bits. La dimensión del vector puede ser
especificado por al menos dos variantes: ( #1 to #2 ) o (#2 downto #1) siendo #1 y #2 dos
valores enteros donde #2 es mayor que #1. La utilización de la clase “standar lógic” está
condicionado a la utilización de la librería IEEE 1164 a través de la expresión “library IEEE; use
IEEE.std_logic_1164.all;”

VHDL no discrimina entre mayúsculas y minúsculas el listado 3 presenta un ejemplo mas


completo de una entity:

entity EJEMPLO is
Port
( X: in STD_LOGIC_VECTOR(0 to 7);
ready: in STD_LOGIC;
word: in STD_LOGIC;
clk: in STD_LOGIC;
reset: in STD_LOGIC;
accept: out STD_LOGIC;
wrt: out STD_LOGIC;
DBUS : inout STD_LOGIC_VECTOR(0 to 31);
ABUS : out STD_LOGIC_VECTOR(0 to 15));
end EJEMPLO;
Listado 3 (Encabezado VHDL)

En la sección entity no es necesario diferenciar entre registros y variables lógicas ya que estos se
infieren a partir de su descripción en la sección de architecture.

Architecture

En esta sección es en donde se describe la actividad de conexionado que constituirá la realización


electrónica de la entidad. Esta es la sección que corresponde con la secuencia de control.

Dos conceptos son necesarios entender al realizar la descripción en VHDL, el primero es el de


concurrencia, el segundo es el de secuencialidad. El concepto de concurrencia está implícito en
todas las actividades detalladas en la arquitectura, significa que independientemente del orden en
el que aparezcan las conexiones todas ellas se ejecutan a la vez. Este paralelismo hay que
tenerlo muy en cuenta ya que a diferencia de la programación normal las actividades descritas en
VHDL no están sujetas a ninguna sincronización ya que todas se realizan concurrentemente una
vez el circuito se halla sintetizado.

Ing. Medardo Logreira V. A. 2


9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
Existen sin embargo algunas construcciones que pueden utilizarse dentro de la arquitectura y que
permiten la especificación de actividades secuenciales. Entre estas están los “process” o proceso.
Un proceso está delimitado entre las palabras claves “process” y “end process” por ejemplo el
listado 4 presenta un ejemplo del uso de “process” (esta construcción será explicada mas
adelante) las conexiones que aparecen descritas dentro del proceso ocurren de manera
secuencial o sea dependen del orden en que aparezcan. Los procesos pueden ser utilizados tanto
para la descripción de circuitos lógicos combinatorios sofisticada tales como los multiplexores,
codificadores, etc., así como para la descripción de circuitos de lógica secuencial tales como flip-
flops, registros, etc. Una misma arquitectura VHDL puede contener varios procesos en tal caso
ambos conceptos se aplican, concurrencia dado que todos los procesos se ejecutan al mismo
tiempo y “secuencialidad” dentro de cada proceso descrito. Existen otras clases de construcciones
del VHDL pero escapan a los objetivos de este trabajo.

data_noreg: process(csl,dr,ar)

begin
accept <= csl(3) or csl(5) or csl(7);
wrt <= csl(8);
if csl(8)='1' then
DBUS<=dr;
ABUS<=ar;
else
DBUS<="00000000000000000000000000000000";
ABUS<="0000000000000000";
end if;
end process data_noreg;
Listado 4 (Ejemplo de “process”)

Dentro de la sección de la arquitectura es que se detallan las actividades relacionadas con las
conexiones que describen al circuito, estas actividades requieren de la utilización de operadores
de asignación, operadores lógicos y operadores relacionales.

Operador de asignación: “DBUS <= dr” asigna el vector “dr” al vector “DBUS” no requiere que el
miembro del lado izquierdo sea un registro, no obstante si requiere que ambos vectores sean del
mismo tamaño. La asignación se hace bit a bit así el bit 0 de DBUS obtiene lo que le envía el bit 0
de “dr” este ordenamiento bit a bit depende de la declaración de los vectores por ejemplo si ambos
vectores se declaran (0 to 31) la anterior se mantiene no obstante si uno de los vectores se
declara tal cual y el otro (31 downto 0) entonces la asignación del bit 0 de uno va al bit 31 del otro,
la del bit 1 va al bit 30, y así la del bit 31 va al bit 0.

Operadores lógicos: tales como not, and, or, xor, xnor, nand y nor, pueden ser utilizados para la
descripción de redes de lógica combinatoria. Así la operación
“cout <= (a and b) or (cin and a) or (cin and b);” detalla la conexión lógica del
acarreo de salida para un sumador completo donde las entradas son los bits a, b y cin y la salida
Ing. Medardo Logreira V. A. 3
9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
es cout. Los operadores lógicos se aplican por igual a vectores, en tales casos dan como
resultado otro vector que posee la misma cantidad de bits que los operandos de origen.

Operadores relacionales: son usados en los procesos, para especificar una condición lógica los
operadores relacionales válidos en VHDL son = (igual a) ; /= (diferente a); < (menor que); > (mayor
que); >= (mayor o igual que) y <= (menor o igual que). Estos operadores siempre aparecen como
parte de la condición de una estructura de conexión condicionada dentro de un proceso. El valor
que retorna una expresión que usa operadores lógicos es del tipo boolean o sea '1' si la relación
expresada es cierta o '0 si la relación expresada es falsa. En el proceso del listado 4 se usa la
condición “ csl(8) = '1' “ como la condición que define si ABUS y DBUS obtienen los valores en dr
y ar respectivamente o si por el contrario ambos obtienen “0” en este proceso se sintetizan dos
multiplexores, uno para el vector ABUS y el otro para el vector DBUS.

Declaración de señales: Dentro de la arquitectura también es posible declarar vectores que no son
ni entrada ni salida pero que son necesarios para el funcionamiento del sistema, en este caso la
palabra clave es “signal” por ejemplo para declarar los vectores ar y dr, que no se declararon en la
entidad del listado 3, se usa la siguiente expresión:

architecture Numero_1 of EJEMPLO is

signal csl: STD_LOGIC_VECTOR(1 to 8);


signal ct: STD_LOGIC_VECTOR (0 to 1);
signal dr: STD_LOGIC_VECTOR (0 to 31);
signal ar: STD_LOGIC_VECTOR (0 to 15);
begin

Note que estas declaraciones se ubican antes del begin, además se declaran otros registros que
son necesarios. Tal como csl de 8 bits y ct de 2bits.

Process

La estructura de un proceso es presentada en el listado 5:

etiqueta: process(csl,dr,ar)
begin
(listado de asignaciones;
estructuras IF (condición)
THEN asignaciones;
ELSE otras asignaciones;
END IF;
otras estructuras);
end process etiqueta
Listado 5 (Ejemplo de process)

La etiqueta es opcional la palabra clave process, que no debe faltar, es seguida de una lista de
las señales que son leídas en el proceso y asignadas a otras señales, esta se conoce como la
lista de sensibilidad dentro del concepto de concurrencia cualquier evento o cambio en las señales

Ing. Medardo Logreira V. A. 4


9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
contenidas en la lista de sensibilidad provocan que el proceso se ejecute. En la siguiente línea
aparece la palabra clave begin que señala el inicio de las actividades de conexión. Seguido a
begin viene el listado de asignaciones que el proceso describe, este listado puede incluir
conexiones condicionadas tales como la construcción IF THEN ELSE ENDIF; IF THEN ELSIF
ELSIF ELSIF ELSE END IF estas construcciones están condicionadas a expresiones relacionales
que usualmente incluyen señales dentro de la lista de sensibilidad. Con ayuda de esta instrucción
podemos describir , flip-flops, registros, cerrojos, máquinas de estado así como también nos
provee de un mecanismo para el uso de las transferencias condicionadas.

Especificando flip-flops y registros en VHDL: Los procesos son el recurso del que se dispone en
VHDL para especificar flip-flops y registros. El listado 6 a continuación presenta la especificación
de un flip-flop tipo D con entrada de reset asincrónica.

FFD: proocess (clk,D,reset)


begin
if reset='0' then
Q <='0'; nQ <= '1';
elsif (clk'event and clk='0') then
Q<= D; nQ <= not D;
end if;
end process FFD;
Listado 6 (Especificación de un flip-flop tipo d)

Cuando VHDL encuentra una construcción como la indicada en el listado 6, sintetiza un flip-flop
tipo D con entrada de reset asincrónica activado por el cambio de 1 a 0 de la entrada de reloj clk.
La condición “clk'event” se utiliza para detectar la condición de un evento en la entrada clk, este
evento puede ser un cambio de '0' a '1' o de '1' a '0'. la otra condición clk = '0' define entonces que
el cambio es de 1 a 0 lo que define el flanco de salida en la entrada clk. Note que antes de que se
detecte el evento en la entrada clk se revisa el estado de la entrada reset la cual si está en su
estado activo ('0') borra la salida del flip-flop y no asigna D a Q. VHDL automáticamente conecta
esta entrada al CLR del flip-flop.

Un proceso similar puede ser usado para la especificación de un registro, por ejemplo el que se
muestra en el listado 7
adreg: process (clk,X,csl,reset)
begin
if reset ='0' then
ar<="0000000000000000";
elsif(clk'event and clk = '0') then
if (csl(5)='1') then
ar(0 to 7)<=X;
elsif (csl(7)='1') then
ar(8 to 15) <=X;
end if;
end if;

Ing. Medardo Logreira V. A. 5


9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
end process adreg;
Listado 7 (proceso que sintetiza el registro ar)

El registro adreg es un registro de 16 bits los 8 bits menos significativos obtienen el valor de X en
el flanco de salida del reloj siempre que reset no sea cero y el bit 5 del vector csl sea 1 lógico, en
caso de que el bit 7 del vector csl sea 1 entonces los 8 bits mas significativos de adreg son los que
obtienen el valor de X. Note el uso delsif para definir diferentes opciones.

De Diagrama de Flujo a VHDL

VHDL no responde en forma implícita al concepto de una unidad de data y otra de control por lo
que es necesario realizar por separado ambas descripciones. Es necesario entonces la realización
independiente de la máquina de estados finitos que define la secuencia de control. Esta máquina
debe ser declarada como un registro de “n” bits donde n representa la cantidad de pasos en
nuestra secuencia de control. Esta máquina de estado será descrita usando la estructura “case”
que VHDL provee para la sintesis de FSM. Posteriormente se debe utilizar los bits individuales de
la MEF(máquina de estados finitos) para controlar las transferencias que se realizan en los
diferentes registros o flip-flops que integran la unidad de datos. El enfoque sistemático consiste en
tratar cada flip-flop y cada registro en sendos procesos que aparezcan solamente una vez en el
cuerpo de la arquitectura para así evitar que una señal posea dos o mas fuentes de asignaciones
que usualmente genera “fatal errors” a la hora de sintetizar.

AHPLMODULE: EJEMPLO43
MEMORY: AR[16];DR[32];CT[2].
EXINPUTS: X[8];READY;WORD.
OUTPUTS: WRITE;ACCEPT;DBUS[32];ADBUS[16].
1 =>(^READY&^WORD,READY&WORD,READY&^WORD)/(1,2,3).

2 CT<=2$0.

3 (DR[0:7]!DR[8:15]!DR[16:23]!DR[24:31])*(^CT[0]&^CT[1],
^CT[0]&CT[1],CT[0]&^CT[1],CT[0]&CT[1])<= X; ACCEPT=\1\;
CT <= (CT[0]@CT[1],^CT[1]);
=>(^(CT[0]&CT[1]))/(1).

4 =>(^READY&^WORD,READY&WORD,READY&^WORD)/(4,2,5).

5 AR[0:7]<= X; ACCEPT=\1\.

6 =>(^READY&^WORD,READY&WORD,READY&^WORD)/(6,2,7).

7 AR[8:15] <= X; ACCEPT=\1\.

8 WRITE=\1\;
=>(1).

ENDSEQUENCE
CONTROLRESET(1).
ADBUS = AR; DBUS = DR.
END.
Listado 8 (Secuencia de control del ejemplo 4.3)

Ing. Medardo Logreira V. A. 6


9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
Procedimiento

Dada la secuencia de control AHPL del listado 8 presente una descripción VHDL que realice el
mismo circuito para eso siga el siguiente procedimiento.

1. Extraiga de la sección de control. Y la sección de datos.

2. Para la sección de control incluya un nuevo tipo de señal, llamada estado asi:
type estado is (s1, s2, s3, … sn) ;
n es la cantidad de pasos que posea la secuencia.

3. Cree dos nuevas señales llamadas q y qnxt que sean de este tipo:
signal q, qnxt : estado ;
signal csl : std_logic_vector(1 to n)
Tanto 2 como 3 hay que hacerlo antes de que la architecture begin.

4. Cree un nuevo proceso que tenga como entradas clk, reset qnxt entre otras que se
pudieron quedar por fuera. Para ejemplo el listado 9

sinc: process(clk, rst, qnxt)


begin
if (rst = '1') then
q <= s1;
elsif (clk'event and clk = '0') then
q <= qnxt;
end if;
end process;
Listado 9

5. Cree un nuevo proceso que tenga como entradas q y las señales que usa la secuencia de
control para los saltos condicionados e incondicionados por ejemplo word, ready etc. este
proceso será un proceso lógico de acuerdo al siguiente inicio:
log: process(q, …)
begin
case q is
when s1 =>
if (word = ‘1’ and ready = ‘1’)
qnxt <= s2;
elsif (word = ‘0’ and ready = ‘1’)
qnxt <= s3;
else
qnxt <= s1;
Ing. Medardo Logreira V. A. 7
9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
end if;
csl <= (1 => ‘1’, others => ‘0’) ; -- activa csl(1)
when s2 =>
qnxt <= s3;
csl <= (2 => ‘1’, others => ‘0’) ; -- activa ahora csl(2)
.
:
end case
end process log;

5. Haga un listado de todos los registros usados en la sección de datos y de los vectores que
sirven como origen de datos para cada condición de sus entradas en función de los csl(x) y
de dichos vectores de entrada según la secuencia de control.

6. Describa cada registro del listado anterior en VHDL usando la siguiente plantilla.

REG_x: process ( clk,csl,reset, cualquier otra señal que afecte REG_x)


begin
if reset ='0' then
REG_x<= "vector 0s o 1s según condiciones deseadas en reset";
elsif(clk'event and clk = '0' ) then
if (“eq. logica_a” and csl(x) ='1') then REG_X<= REG_ORIGN_1;
elsif (“eq_logica_b and csl(x) ='1'”) then REG_X <= REC_ORIGN_2;
elsif (“eq_logica_c and csl(x) ='1'”) then REG_X <= REC_ORIGN_3;
:
. -- no hay else dado que es un registro.
end if;
end if;
end process REG_x;

7. Finalmente obtenga un listado de las conexiones que no involucran transferencias a


registros y plantee las ecuaciones lógicas que las definen. Ejemplo accept = csl(X) or csl(y)
or csl(z) y las asignaciones fuera de la secuencia de control que sintetizan conexiones fijas
tales como:
DBUS<=dr;
ABUS<=ar;
8 Con toda esta información, ensamble la descripción VHDL y simulela con ayuda del ISE y
presénte su rla en el informe. Posteriormente haremos la simulación usando herramientas
proporcionadas gratuitamente por Xilinx.

Ejercicio 2:
Traducir el siguiente Flujograma a VHDL.

1 R <= X;
=>(^A&^B,A,^A&B)/(1,2,4).

Ing. Medardo Logreira V. A. 8


9Universidad Tecnológica de Panamá/Facultad de Ingeniería Eléctrica
Examen Parcial No 2 (VHDL).
2 R <= R[2], R[0:1];
=>(^B)/(4).

3 R <= R[2], R[0:1].

4 READY = \1\ ; Z = R;
=>(1).
Cuestionario:
1. Que significan las siglas VHDL.
2. Que significa concurrencia en el contexto de VHDL.
3. Cree una descripción VHDL para el antirebote de la practica número 2.

Ing. Medardo Logreira V. A. 9

Vous aimerez peut-être aussi