Diseño de máquina de refrescos en Xilinx
Diseño de máquina de refrescos en Xilinx
1.1. Introducción
Por defecto, el WebPack abrirá el mismo proyecto utilizado en la última sesión, así como su
resumen (al cual haremos alusión seguiedamente).
Fuentes
Área de trabajo
Procesos
Mensajes de consola
(b)
proyecto con el menú File -> New Project. Esta opción nos llevará a la navegación a través de
una serie de ventanas en la que indicaremos las características del proyecto. En la primera ven-
tana nos pedirán el nombre, la ubicación (será un nuevo directorio en el camino indicado con el
mismo nombre que el proyecto) y la forma en la que introduciremos la descripción del sistema
principal (nosotros aquí siempre elegiremos HDL). Después se nos piden las características del
dispositivo en el que se implementará el proyecto (nosotros siempre vamos a elegir un disposi-
tivo FPGA como Virtex, por ejemplo; no obstante siguiendo los pasos de la figura 1.2b pode-
mos cambiar este dispositivo así como sus características). Seguidamente se nos dará la
posibilidad de incluir una nueva fuente (personalmente me gusta incluirlas después ya que sólo
se nos permite incluir una, además, a priori es muy difícil conocer el número de fuentes que
serán necesarias para el sistema final). En el siguiente paso, también se nos permite añadir
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 4
fuentes ya existentes (en este caso, a diferencia con el anterior es más cómodo añadirlas aquí,
aunque también es posible añadirlas una vez abierto el proyecto). Finalmente se nos mostrará
un resumen para comprobar los datos que hemos introducido.
Una vez abierto el proyecto, podemos crear nuevas fuentes, para lo cual debemos seguir
los pasos indicados en la figura 1.3. En primer lugar seleccionamos de los procesos disponibles
Create New Source (dicho proceso siempre estará accesible, siempre y cuando haya un pro-
yecto abierto). Seguidamente nos aparecerá una ventana para indicar el nómbre, tipo y ubica-
ción de la fuente; también nos aparece una pestaña para incluir dicha fuente en el proyecto (por
defecto o no). En la ventana siguiente se nos pide los terminales de dicho módulo (los cuales
pueden ser modificados en la edición si se estima oportuno), para después mostrarnos un resu-
men de la creación de la nueva fuente.
El primer módulo que se crea se toma como Top Module, y se mostrará un resumen del
diseño en el área de trabajo, como el mostrado en la figura 1.4. Este resumen irá cambiando a
medida de que el proyecto se vaya modificando y/o completando. Si hemos cerrado la ventana
de resumen y queremos verla otra vez deberemos seguir los siguientes pasos. En primer lugar,
seleccionaremos el Top Module (dicho modulo es identificado por tres cuadrados (uno de ellos
verdes, como se aprecia en la figura 1.4b). Uno de los procesos asociados a este módulo será
View Design Summary, que activándolo nos aparecerá nuevamente la ventana del resumen
actualizada..
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 5
(b)
También nos aparecerá el esqueleto del código VHDL del módulo creado en un editor de
textos. Dicho esqueleto se muestra a continuación.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 13:37:47 02/05/2000
-- Design Name:
-- Module Name: main - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity main is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
moneda : in STD_LOGIC_VECTOR (5 downto 0);
refresco : in STD_LOGIC_VECTOR (3 downto 0);
resto : out STD_LOGIC_VECTOR (7 downto 0);
expulsar : out STD_LOGIC;
existe : out STD_LOGIC_VECTOR (3 downto 0));
end main;
begin
end Behavioral;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 6
Podemos apreciar que la entidad ya estaría completa (si no queremos modificarla), y sólo
habría que implementar la arquitectura y las propiedades de edición del módulo (estas propie-
dades serán útiles para que otro diseñador sepa en quién ha diseñado el módulo, sobre qué dis-
positivo ha sido implementado y una breve descripción de su funcionamiento).
Como podemos apreciar de la figura 1.3, además de módulos podemos crear otro tipo de
fuentes, como Library (librerías), Package (paquetes) y Test Bench (patrones de test). Los
pasos para la creación de estos nuevos tipos de fuentes son similares a los de la creación de un
módulo, es decir, se pide una serie de información para finalmente dar un resumen, y son mos-
trados en la figura 1.5. Por lo tanto, únicamente vamos a comentar lo más destacado de ellos.
En el caso de las librerias, su principal misión es agrupar fuentes que se puedan utiliza rne dife-
rentes proyectos. Su creación no supondrá ninguna modificación aparente en la zona de fuen-
tes, ya que en esa zona únicamente se muestran las fuentes de la librería de trabajo, es decir,
work. Si queremos hacer uso de esa nueva librería debemos selecionar la pestaña Library en
dicha zona, y ahi podemos visualizar todas las fuentes (excepto las IEEE que siempre están
cargadas por defecto y no son, o deberían ser, modificadas) accesibles desde nuestro proyecto.
En dicho caso pulsando con el botón derecho sobre la librería seleccionaremos la opción
deseada, ya que en caso de utilizar la zona de procesos, todo lo que se haga estará almacenada
en la librería de trabajo. En este caso no se creqrá ningún tipo de código.
Fuente del tipo librería
En cuanto a los paquetes, su principal misión es agrupar definiciones que sean utilizadas
por las fuentes del mismo proyecto (supuestamente por más de una fuente, ya que en caso con-
trario, dichas definiciones podrían ser locales a cada fuente). Puede que no sen visibles en la
zona de fuentes (a pesar de que estén incluidos en la librería de trabajo), por lo que para hacer-
los accesible procederemos como si estuviésemos en una librería diferente, pero visualizando
la librería work. El código generado será de nuevo el esqueleto, mostrado a continuación:
-- Package File Template
--
-- Purpose: This package defines supplemental types, subtypes,
-- constants, and functions
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package <Package_Name> is
type <new_type> is
record
<type_name> : std_logic_vector( 7 downto 0);
<type_name> : std_logic;
end record;
-- Declare constants
end <Package_Name>;
-- Example 1
function <function_name> (signal <signal_name> : in <type_declaration> ) return
<type_declaration> is
variable <variable_name> : <type_declaration>;
begin
<variable_name> := <signal_name> xor <signal_name>;
return <variable_name>;
end <function_name>;
-- Example 2
function <function_name> (signal <signal_name> : in <type_declaration>;
signal <signal_name> : in <type_declaration> ) return <type_declaration> is
begin
if (<signal_name> = '1') then
return <signal_name>;
else
return 'Z';
end if;
end <function_name>;
-- Procedure Example
procedure <procedure_name> (<type_declaration> <constant_name> : in <type_declaration>) is
begin
end <procedure_name>;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 8
end <Package_Name>;
Podemos apreciar que aparecen los esqueletos de todas las posibles definiciones que pueden
aparecer, es decir, tipos, constantes, funciones y subrutinas (procedures); obviamente sólo se
utilizarán los que nos interese. También es de destacar que en el paquete hay dos partes:
• Definición del paquete (identificado por package), en el cual se llevará a cabo la
declaración de todo lo que incluya el paquete.
• Cuerpo del paquete (identificado por package body), en el cual se explicitarán los
cuerpos de las funciones y subrutinas, ya que los tipos y constantes sólo tienen su
declaración.
En cuanto a los patrones de test, su principal misión es indicar los valores de las señales
de entrada de un determinado sistema para su simulación y verificación. Una información que
hay que suministrar es la fuente para la cual vamos a crear los patrones de test para su posterior
simulación. El esqueleto de un patrón de test se muestra a continuación:
--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 10:04:42 02/07/2007
-- Design Name: main
-- Module Name: G:/fpga/tutorial/[Link]
-- Project Name: tutorial
-- Target Device:
-- Tool versions:
-- Description:
--
-- VHDL Test Bench Created by ISE for module: main
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
-- Notes:
-- This testbench has been automatically generated using types std_logic and
-- std_logic_vector for the ports of the unit under test. Xilinx recommends
-- that these types always be used for the top-level I/O of a design in order
-- to guarantee that the testbench will bind correctly to the post-implementation
-- simulation model.
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
ENTITY pp_vhd IS
END pp_vhd;
--Inputs
SIGNAL clk : std_logic := '0';
SIGNAL reset : std_logic := '0';
SIGNAL moneda : std_logic_vector(5 downto 0) := (others=>'0');
SIGNAL refresco : std_logic_vector(3 downto 0) := (others=>'0');
--Outputs
SIGNAL resto : std_logic_vector(7 downto 0);
SIGNAL existe : std_logic_vector(3 downto 0);
SIGNAL expulsar : std_logic;
BEGIN
tb : PROCESS
BEGIN
END;
En este caso, podemos destacar que la entidad está completa al ser un módulo especial puesto
que los patrones de test no disponen de puertos, únicamente de señales internas para poder ser
manipuladas. La declaración de la arquitectura también estaría completa ya que tenemos decla-
rado el componente que vamos a utilizar, así como sus respectivas señales (necesidad por lo
cual había que dar dicho dato). En principio, los patrones de test están pensados que se incor-
poren a un proceso (process) con la razón de que cuando el proceso termina vuelve a empezar
desde el principio y la simulación no tendrá un tiempo final, sino que será repetitiva; no obs-
tante, podesmo elegir cambiar este tipo de patrones, o lo que es más común, mezclar los esti-
los, es decir, poner asignamientos de señal fuera de procesos y uno o varios procesos. Así por
ejemplo, las señales de reset suelen ser definidas fuera de procesos para evitar que el sistema se
resetee antes de tiempo, mientras que las señales periódicas se suelen incluir en procesos para
implementar de forma implícita la periodicidad.
Otra opción que podemos elegir para incluir fuentes en nuestro proyecto es añadir fuen-
tes existentes (mostrada en la figura 1.6), con lo cual podemos reutilizar el trabajo de otros
diseñadores (con su permiso previo). En este caso, seleccionamos el proceso Add existing
source (que como en el caso anterior siempre aparecerá). Tras realizar dicho paso, aparecerá
un gestor de ficheros para indicar las fuentes que queremos incluir. Una vez que hayamos
seleccionado las fuentes en el gestor, dichas fuentes son compiladas para determinar el tipo de
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 10
aplicación para la que son válidas: imlpementación + simulación o sólo simulación. Una vez
hecho esto, nos aparecerán las fuentes seleccionadas en la zona de fuentes. Si algunas de las
fuentes incluidas son utilizadas en la jerarquía de algún módulo, dicha fuente aparecerá en su
orden de jerarquía (que se podrá alcanzar descendiendo en los niveles de la fuente de mayor
nivel, que aparecerá un signo +. En el caso de que el Top Module cambie, podemos reasignar
dicha fuente seleccionándola y en el menú desplegado al pulsar el botón derecho del ratón, ele-
giremos la opción Set as Top Module, por lo que el identificativo aparecerá en este módulo y
desparecerá del anterior.
(b)
El diseño que vamos a abordar es el de una máquina expendedora con las siguientes
características:
• Admite monedas de 5c, 10c, 20c, 50c, 1euro y 2 euros.
• Dispone de cuatro productos diferentes con los precios almacenados en una matriz
constante
• Devuelve cambio hasta llegar a 12euros con 75 céntimos.
• Dispone de un indicador de existencia de cada uno de los productos.
• Dispone de un pulsador de reset con el que se devuelve la cantidad almacenada.
El diagrama ASM de dicho sistema se muestra en la figura 1.7. En él podemos apreciar que
tenemos cinco cajas de estado, es decir, cinco estados del controlador, que llevarán a cabo
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 11
algún tipo de procesado o únicamente una función de espera de un ciclo de operación. No obs-
tante para la realización del modelo VHDL de esta máquina no necesitamos conocer la
implementación hardware de la misma, ya que VHDL nos permite modelar el comportamiento
algorítmico.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 19:50:59 02/03/2007
-- Design Name:
-- Module Name: maquina - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pack_maq.all;
entity maquina is
Port ( clk, reset : in STD_LOGIC;
moneda : in STD_LOGIC_VECTOR (3 downto 0);
refresco : in STD_LOGIC_VECTOR (2 downto 0);
resto: out std_logic_vector (7 downto 0);
existe: in std_logic_vector (3 downto 0);
desborde: out std_logic;
expulsar : out STD_LOGIC);
end maquina;
inicio
cantidad <= “0”
resto <= “0”
prec <= “0”
expulsar <= ‘0’
SI
reset ?
NO
suma
cantidad <= cantidad+moneda
NO
NO
reset ?
sel refresco SI
y existe
SI
elección
NO
expulsión
NO SI
reset ?
SI
refresco1
expulsar <= ‘1’
resto <= cantidad - prec
Para cumplir con las especificaciones de diseño hay que añadir una serie de módulos
extras. La razón de esta necesidad se encuentra en las decisiones tomadas a la hora de describir
el sistema anterior, como son las siguientes:
• Se han considerado una serie de constantes definidas en algún otro lugar, que será un
paquete. Estas constantes son los valores de valor (que se coresponde con la codifica-
ción de cada moneda) y precio (de cada uno de los productos).
• Se trabaja directamente con la codificación de las monedas y del refresco elegido.
• Se tiene en cuenta la existencia de productos pero no se actualiza.
• Por último, hay que unirlo todo en un sistema de jerarquía superior.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
package pack_maq is
-- Declare constants
type moneda_valor is array (integer range <>) of std_logic_vector(7 downto 0);
constant valor: moneda_valor (0 to 7) := (
x"01", x"02", x"04", x"0A", x"14", x"28", x"00", x"00");
constant precio: moneda_valor (0 to 3) := (
x"0A", x"28", x"A0", x"0B");
constant cantidad: moneda_valor (0 to 3) := (
x"0A", x"0A", x"0A", x"0A");
end pack_maq;
end pack_maq;
En este paquete se define una matriz sin rango definido de buses de 8 bits, denominado
moneda_valor, para determinar el valor de cada moneda, el precio de cada producto y el
número máximo de productos que puede albergar la máquina expendedora. También se han
definido una serie de constantes, como las anteriores y el tamaño del bus en el que se almace-
narán dichos valores para su posterio procesado. Por último se ha definido una función que
fuenciona como un codificador con prioridad devolviendo el índice del bit seleccionado.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:38:03 02/04/2007
-- Design Name:
-- Module Name: insertar_moneda - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pack_maq.all;
En este caso hacemos uso de la función definida en el paquete, cuyo resultado convertimos a
un bus con el tamaño definido anteriormente. Este bus tiene un bit más de lo necesario que será
utilizado para determinar si s ha echado alguna moneda (el bit adicional toma el valor ‘0’) o no
se ha echado ninguna (toma el valor ‘1’). Esta decisión se puede tomar gracias a que la función
cuando no se ha seleccionado ninguna moneda devuelve la longitud del bus de moneda, es
decir, un valor mayor al que puede codificar.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 16:01:17 02/04/2007
-- Design Name:
-- Module Name: elegir_refresco - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pack_maq.all;
entity elegir_refresco is
Port ( clk : in std_logic;
refresco : in STD_LOGIC_VECTOR (3 downto 0);
refresco_out : out STD_LOGIC_VECTOR (2 downto 0));
end elegir_refresco;
Este código realiza la misma función que el anterior, pero con la selección del producto. Debe-
mos utilizar un módulo diferente porque el tamaño de los datos de entrada y salida son diferen-
tes.
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 11:40:14 02/04/2007
-- Design Name:
-- Module Name: existencia - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pack_maq.all;
cantidad_maquina(CONV_INTEGER(refresco)) <=
cantidad_maquina(CONV_INTEGER(refresco))-1;
end if;
end if;
end process;
end Behavioral;
En este caso, vamos a actualizar la existencia de los productos de la máquina. Para lo cual,
cuando se detecta que se ha expulsado un deteminado producto, se reduce en uno la cantidad
de ese producto. Obviamente, para ser operativos, el usuario final únicamente verá si hay o no
hay existencia de un determinado producto.
Por último, la unión de todos estos códigos en el mayor nivel de la jerarquia se muestra a
continuación, denominado [Link]:
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:09:40 02/04/2007
-- Design Name:
-- Module Name: main - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity main is
Port ( clk, reset : in STD_LOGIC;
moneda : in STD_LOGIC_VECTOR (5 downto 0);
refresco : in STD_LOGIC_VECTOR (3 downto 0);
resto : out std_logic_vector (7 downto 0);
existe : out std_logic_vector (3 downto 0);
desborde : out std_logic;
expulsar : out STD_LOGIC);
end main;
end component;
component maquina
Port ( clk, reset : in STD_LOGIC;
moneda : in STD_LOGIC_VECTOR (3 downto 0);
refresco : in STD_LOGIC_VECTOR (2 downto 0);
resto: out std_logic_vector (7 downto 0);
existe: in std_logic_vector (3 downto 0);
desborde :out std_logic;
expulsar : out STD_LOGIC);
end component;
component existencia
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
expulsar: in std_logic;
refresco : in STD_LOGIC_VECTOR (1 downto 0);
existe : out STD_LOGIC_VECTOR (3 downto 0));
end component;
begin
C1: insertar_moneda port map (clk, moneda, moneda_out);
C2: elegir_refresco port map (clk, refresco, refresco_out);
C3: maquina port map (clk, reset, moneda_out, refresco_out,
resto, existe1, desborde, expulsar1);
C4: existencia port map (clk, reset, expulsar1,
refresco_out(1 downto 0), existe1);
end Behavioral;
En este caso únicamente hemos conectado los diferentes bloques siguiendo el esquemos mos-
trado en la figura 1.8.
Una vez que hemos descrito el sistema, debemos realizar una simulación para verificar el
comportamiento correcto. Aunque aquí sólo vamos a realizar la comprobación del nivel supe-
rior de la jerarquía, se debería realizar de cada módulo para verificar que posibles fallos no se
encuentran en el interior de los diferentes módulos.
A medida que la complejidad del sistema aumenta, es más dificil comprobar todo el
comportamiento con un solo fichero de patrones. En este caso particular vamos a considerar
dos ficheros de patrones de test diferentes, en el que estarán incluidos los principales compor-
tamientos que se deben verificar (si existe algún comportamiento no verificado, hay que gene-
rar más patrones de test para completar la comprobación, es más también habría que
comprobar situaciones anómalas como insertar moneda y elegir producto de forma simultá-
nea).
En el primer fichero de patrones vamos a considerar las operaciones más comunes que
deberá llevar a cabo la máquina expendedora. Dicho fichero (main_tb.vhd) se muestra a con-
tinuación:
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 20
refresco moneda
refresco moneda
ELEGIR_REFRESCO INSERTAR_MONEDA
refresco_out moneda_out
moneda refresco
reset resto
resto
reset
expulsar
MÁQUINA expulsar
clk
existe
refresco existe
reset existe
EXISTENCIA
expulsar
--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 21:35:49 02/03/2007
-- Design Name: maquina
-- Module Name: E:/fpga/tutorial1/maquina_tb.vhd
-- Project Name: tutorial1
-- Target Device:
-- Tool versions:
-- Description:
--
-- VHDL Test Bench Created by ISE for module: maquina
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
-- Notes:
-- This testbench has been automatically generated using types std_logic and
-- std_logic_vector for the ports of the unit under test. Xilinx recommends
-- that these types always be used for the top-level I/O of a design in order
-- to guarantee that the testbench will bind correctly to the post-implementation
-- simulation model.
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 21
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
use work.pack_maq.all;
ENTITY main_tb_vhd IS
END main_tb_vhd;
--Inputs
SIGNAL clk : std_logic := '0';
SIGNAL reset : std_logic := '0';
SIGNAL moneda : std_logic_vector(5 downto 0) := (others=>'0');
SIGNAL refresco : std_logic_vector(3 downto 0) := (others=>'0');
SIGNAL existe : std_logic_vector(3 downto 0) := (others=>'0');
--Outputs
SIGNAL resto : std_logic_vector(7 downto 0);
SIGNAL expulsar : std_logic;
signal desborde : std_logic;
BEGIN
tbreset : process
begin
reset <= '1';
wait for 3*td/2;
reset <= '0';
wait for 201*td/2;
end process;
tbclk : PROCESS
BEGIN
wait for td;
clk <= not clk;
END PROCESS;
tbmoneda: process
begin
moneda <= "000000";
wait for 10*td;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 22
tbrefresco: process
begin
refresco <= "0000";
wait for 18*td;
refresco <= "0001";
wait for 2*td;
refresco <= "0000";
wait for 18*td;
refresco <= "0010";
wait for 2*td;
refresco <= "0000";
wait for 18*td;
refresco <= "0100";
wait for 2*td;
refresco <= "0000";
wait for 18*td;
refresco <= "1000";
wait for 2*td;
end process;
END;
Con estos patrones de test obtenemos las formas de onda de la figura 1.10. En este caso
se comprobarán los siguientes casos:
• acumulación de monedas,
• elección de productos con los casos de no devolución (la cantidad almacenada es infe-
rior al precio) y de devolución (cantidad almacenada superior o igual al precio),
• reset, con devolución de lacantidad almacenada
--------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 10:02:30 02/09/2007
-- Design Name: main
-- Module Name: main_tb1.vhd
-- Project Name: tutorial1
-- Target Device:
-- Tool versions:
-- Description:
--
-- VHDL Test Bench Created by ISE for module: main
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
-- Notes:
-- This testbench has been automatically generated using types std_logic and
-- std_logic_vector for the ports of the unit under test. Xilinx recommends
-- that these types always be used for the top-level I/O of a design in order
-- to guarantee that the testbench will bind correctly to the post-implementation
-- simulation model.
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 24
use work.pack_maq.all;
ENTITY main_tb1_vhd IS
END main_tb1_vhd;
--Inputs
SIGNAL clk : std_logic := '0';
SIGNAL reset : std_logic := '0';
SIGNAL moneda : std_logic_vector(5 downto 0) := (others=>'0');
SIGNAL refresco : std_logic_vector(3 downto 0) := (others=>'0');
--Outputs
SIGNAL resto : std_logic_vector(7 downto 0);
SIGNAL existe : std_logic_vector(3 downto 0);
SIGNAL desborde : std_logic;
SIGNAL expulsar : std_logic;
BEGIN
tbreset : process
begin
reset <= '1';
wait for 3*td/2;
reset <= '0';
wait for 300*td;
end process;
tbclk : PROCESS
BEGIN
wait for td;
clk <= not clk;
END PROCESS;
tbmoneda: process
begin
moneda <= "000000";
wait for 10*td;
moneda <= "100000";
wait for 2*td;
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 25
end process;
tbrefresco: process
begin
refresco <= "0000";
wait for 18*td;
refresco <= "0001";
wait for 2*td;
end process;
END;
Las formas de onda relativas al fichero de patrones anterior se muestran en la figura 1.10. En
este caso, además de la acumulación, se comprueba la variación de la existencia de cada uno de
los productos y el límite máximo de acumulación que determinará un límite en la vuelta.
Una vez que se ha comprobado el comportamiento correcto del sistema diseñado, debe-
mos obtener una implementación física del sistema. Dicha implementación será llevada a cabo
en dos pasos:
• Síntesis, en el cual se pasará de una descripción de comportamiento a una descripción
de estructura. Por lo tanto, se determinarán los elementos necesarios para poder
implementar el comportamiento del sistema.
• Implementación, en el cual se mapearán los elementos anteriores con elementos del
dispositivo que se ha seleccionado para el proyecto.
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 26
Para llevar a cabo el proceso de síntesis e implementación, únicamente hay que ejecutar
los procesos correspondientes, mostrados en la figura 1.11 (hay que comentar que dichos pro-
cesos sólo estarán disponibles en el Top Module, que será el implementado). Los resultados de
dichos procesos se pueden visualizar a través de los visores/editores de las vistas correspon-
dientes.
Tanto en una visualización como en otra, se utiliza la propiedad de jerarquía para que los
esquemas sean manejables. Para viajar a través de la jerarquía, basta con hacer un doble click
en el módulo al cual se quiere descender; y únicamente se podrá descender en los bloques que
no sean primitivas.
En el caso de la implementación, veremos el interior del dispositivo, así como todos los
elementos utilizados. Si observamos el zoom, podemos distinguir los elementos utilizados
(rellenos de color azul) de los no utilizados (no rellenos). Si hacemos un doble click sobre uno
de ellos, podemos entrar en él y visualizar su contenido.
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 27
(a) (b)
Figura 1.12.- Sismulaciones post-rutado para el caso main_tb.vhd (a) y main_tb1.vhd (b).
Otra opción es imponer una serie de restricciones al diseño (dentro de la pestaña User
Constraints). Dichas restricciones pueden ser temporales (Create timing Constraints), rela-
tivas al área (Create Area Constraints) o relativas a la colocación de los pines(Assign
Package Pins), como se muestra en la FIGURA. Las restricciones más utilizadas suelen ser
la colocación de los pines, ya que afecta indirectamente a las otras dos restricciones:
(b)
Figura 1.14.- Restricciones del diseño. Colocación de los pines. (b) Implementación con la nueva colo-
cación.
• Si los pines son colocados en una misma región (todos cercanos entre sí), los módulos
se colocarán cerca de los pines, y por lo tanto cerca unos de otros.
• La colocación cercana de los pines, que implca la colocación cercana de los módulos,
provoca que las conexiones no sea excesivamente largas por lo que el retraso debido a
ellas será menor.
Por lo tanto, hemos optado en primer lugar por la asignación de pines. En este caso hemos
agrupado los pines en la esquina superior izquierda, por lo que la nueva implementación
(figura 1.14) ha resultado ser más compacta que la inicial (figura 1.11). Dicha restricción se
correspondería con el siguiente fichero, denominado [Link]:
#PACE: Start of Constraints generated by PACE
Por último podemos dar una descripción más orientada a la estructura, para que la herra-
mienta deba tomar las menos elecciones posibles.
use work.pack_maq.all;
entity maquina is
Port ( clk, reset : in STD_LOGIC;
moneda : in STD_LOGIC_VECTOR (3 downto 0);
refresco : in STD_LOGIC_VECTOR (2 downto 0);
resto: out std_logic_vector (7 downto 0);
existe: in std_logic_vector (3 downto 0);
desborde: out std_logic;
expulsar : out STD_LOGIC);
end maquina;
P1:process (clk)
begin
if (clk = '1' and clk'event) then
if (cantidad_tmp(8) = '0') then
cantidad <= cantidad_tmp;
end if;
if (reset = '1') then
estado <= "10000";
else estado <= estadop;
end if;
end if;
end process;
end flujo;
La nueva arquitectura ha sido denominada flujo. El único proceso existente será para la actua-
lización de las señales de estado y la cantidad almacenada.
Para que la unidad superior en jerarquía sepa qué arquitectura debe utilizar se debe utili-
zar una línea como la siguiente en la parte declarativa de su propia arquitectura.
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 32
Donde el nombre de la arquitectura a utilizar va entre paréntesis. Por lo tanto, la porción decla-
rativa del fichero [Link] quedaría de la siguiente forma.
component existencia
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
expulsar: in std_logic;
refresco : in STD_LOGIC_VECTOR (1 downto 0);
existe : out STD_LOGIC_VECTOR (3 downto 0));
end component;
begin
Tras esta comprobación, obtenemos la implementación del nuevo sistema. Para esta
implementación vamos a mantener las restricciones del apartado anterior y aprovechar, de este
modo, sus ventajas. Esta nueva implementación se muestra en la figura 1.16. En esta nueva
implementación podemos apreciar que la distribución de los diferentes módulos es similar a la
anterior. Esta situación es motivada por la utilización de la misma colocación de pines, como
se ha comentado previamente.
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 33
(b)
Figura 1.17.- Formas de onda de la simulación post-rutado de la arquitectura flujo. (b) Zoom de una de
las simulaciones.
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 34
Design Summary:
Number of errors: 0
Number of warnings: 2
Logic Utilization:
Total Number Slice Registers: 57 out of 1,536 3%
Number used as Flip Flops: 49
Number used as Latches: 8
Number of 4 input LUTs: 123 out of 1,536 8%
Logic Distribution:
Number of occupied Slices: 74 out of 768 9%
Number of Slices containing only related logic: 74 out of 74 100%
Number of Slices containing unrelated logic: 0 out of 74 0%
*See NOTES below for an explanation of the effects of unrelated logic
Total Number 4 input LUTs: 131 out of 1,536 8%
Number used as logic: 123
Number used as a route-thru: 8
Number of bonded IOBs: 25 out of 180 13%
IOB Latches: 1
Number of GCLKs: 1 out of 4 25%
Number of GCLKIOBs: 1 out of 4 25%
...
...
Departamento de Ingeniería Electrónica de Sistemas Informáticos y Automática 35
De esta información podemos identificar el número de puertas equivalentes del sistema imple-
mentado, en este caso particular es de 1511 puertas. También muestra el grado de ocupación de
los diferentes componentes del dispositivo seleccionado.
**************************
Generating Clock Report
**************************
* Net Skew is the difference between the minimum and maximum routing
only delays for the net. Note this is different from Clock Skew which
is reported in TRCE timing report. Clock Skew is the difference between
the minimum and maximum path delays which includes logic delays.
Timing Score: 0
-----------------------------------------------------------------------------------------------------------------------------------
Constraint | Requested | Actual| Logic | Absolute |Nº of
| | | Levels | Slack |errors
-----------------------------------------------------------------------------------------------------------------------------------
Autotimespec constraint for clock net clk | N/A | 7.431ns | 2 | N/A | N/A
_BUFGP | | ....| | |
-----------------------------------------------------------------------------------------------------------------------------------
Autotimespec constraint for clock net C4/ | N/A | 3.633ns | 1 | N/A | N/A
_not0001 | | .....| | |
-----------------------------------------------------------------------------------------------------------------------------------
...
En la figura 1.18 podemos apreciar donde se encuentran cada una de las palicaciones
para obtener una estimación de las prestaciones que tendría nuestro sistema.
--------------------------------------------------------------------------------
Release 8.2.03i Trace
Copyright (c) 1995-2006 Xilinx, Inc. All rights reserved.
------------+------------+------------------+--------+
| clk (edge) | | Clock |
Destination | to PAD |Internal Clock(s) | Phase |
------------+------------+------------------+--------+
desborde | 13.312(R)|clk_BUFGP | 0.000|
expulsar | 9.093(R)|clk_BUFGP | 0.000|
resto<0> | 14.009(R)|clk_BUFGP | 0.000|
resto<1> | 14.565(R)|clk_BUFGP | 0.000|
resto<2> | 14.390(R)|clk_BUFGP | 0.000|
resto<3> | 14.423(R)|clk_BUFGP | 0.000|
resto<4> | 14.212(R)|clk_BUFGP | 0.000|
resto<5> | 13.706(R)|clk_BUFGP | 0.000|
resto<6> | 14.388(R)|clk_BUFGP | 0.000|
resto<7> | 13.861(R)|clk_BUFGP | 0.000|
------------+------------+------------------+--------+
------------+------------+------------------+--------+
| clk (edge) | | Clock |
Destination | to PAD |Internal Clock(s) | Phase |
------------+------------+------------------+--------+
existe<0> | 18.885(R)|C4/_not0001 | 0.000|
existe<1> | 18.744(R)|C4/_not0001 | 0.000|
existe<2> | 17.414(R)|C4/_not0001 | 0.000|
existe<3> | 17.040(R)|C4/_not0001 | 0.000|
resto<0> | 22.097(F)|C3/ctrl<0> | 0.000|
resto<1> | 22.774(F)|C3/ctrl<0> | 0.000|
resto<2> | 23.290(F)|C3/ctrl<0> | 0.000|
resto<3> | 23.323(F)|C3/ctrl<0> | 0.000|
resto<4> | 23.112(F)|C3/ctrl<0> | 0.000|
resto<5> | 22.606(F)|C3/ctrl<0> | 0.000|
resto<6> | 23.288(F)|C3/ctrl<0> | 0.000|
resto<7> | 22.761(F)|C3/ctrl<0> | 0.000|
------------+------------+------------------+--------+
Para más información sobre los datos reportados, acudir a los manuales de la herra-
mienta.
----------------------------------------------------------------
Release 8.2.03i - XPower SoftwareVersion:I.34
Copyright (c) 1995-2006 Xilinx, Inc. All rights reserved.
Design: E:\DOCTORADO\disenos\tutorial1\[Link]
Preferences: [Link]
Part: v50bg256-6
Data version: PRODUCTION,v1.0,05-28-03
Thermal summary:
----------------------------------------------------------------
Estimated junction temperature: 26C
Ambient temp: 25C
Case temp: 26C
Theta J-A: 30C/W
Capacitor Recommendations:
Total for Vccint : 12
470.0 - 1000.0 : 1
0.470 - 2.200 : 1
0.0470 - 0.2200 : 2
0.0100 - 0.0470 : 3
0.0010 - 0.0047 : 5
---
Invalid Program Mode
Total for Vcco33 : 8
470.0 - 1000.0 : 1
0.0470 - 0.2200 : 1
0.0100 - 0.0470 : 2
0.0010 - 0.0047 : 4
Para más información sobre los datos reportados, acudir a los manuales de la herra-
mienta.