Académique Documents
Professionnel Documents
Culture Documents
a
b
sum
cin
cout
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;
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;”
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
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:
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
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
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.
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;
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.
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).
8 WRITE=\1\;
=>(1).
ENDSEQUENCE
CONTROLRESET(1).
ADBUS = AR; DBUS = DR.
END.
Listado 8 (Secuencia de control del ejemplo 4.3)
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.
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
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.
Ejercicio 2:
Traducir el siguiente Flujograma a VHDL.
1 R <= X;
=>(^A&^B,A,^A&B)/(1,2,4).
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.