Sistemas Electrónicos y Automáticos DISEÑO DE CIRCUITOS

Anuncio
Sistemas Electrónicos y Automáticos
PRÁCTICA 3
DISEÑO DE CIRCUITOS SECUENCIALES
1. OBJETIVO DE LA PRÁCTICA.
El objetivo de la presente práctica consiste en modelar el comportamiento de un sistema
secuencial desde diferentes niveles de abstracción. Este modelado será utilizado para la verificación
de su comportamiento mediante simulación.
Para ello, el modelado será realizado utilizando el lenguaje VHDL. La simulación para la
verificación del sistema será realizada con el WebPack de Xilinx (www.xilinx.com). Un tutorial sobre
la utilización de dicho software se encuentra en la página web de la asignatura.
En el primer apartado se realizará una breve descripción a las sentencias VHDL utilizadas en
el desarrollo de la práctica. Seguidamente se planteará el problema a desarrollar.
2. INTRODUCCIÓN A VHDL.
En primer lugar VHDL es el acrónimo de VHSIC Hardware Description Language, y fue
basado en el lenguaje de programación ADA. Como su propio nombre indica, el VHDL va a ser
utilizado para la descripción de circuitos hardware. Seguidamente, se ha utilizado dicho lenguaje
como base de otras herramientas como simuladores y/o sintetizadores. A continuación vamos a
realizar una descripción del VHDL centrándonos en el problema que se va a plantear. Para una
profundización en el tema, existe gran multitud de información en internet (a parte de libros editados),
pero un buen punto de partida es el CookBook de VHDL (http://tams-www.informatik.unihamburg.de/vhdl/doc/cookbook/VHDL-Cookbook.pdf).
Un modelo en VHDL se divide en dos zonas bien diferenciadas: entidad y arquitectura. En la
entidad se muestra el sistema como una caja negra, y sólo se indicará el nombre del sistema y las
señales (puertos) de entrada y salida. Por contra, la arquitectura describirá el comportamiento del
sistema.
2.1.
Entidad
La sintaxis de la entidad sería la mostrada a continuación:
entity <nombre> is
port (
<nombre_puerto> : <sentido> <tipo>;
...
<nombre_puerto> : <sentido> <tipo>
1
Sistemas Electrónicos y Automáticos
Práctica 3
);
end entity;
En el caso de la declaración de los puertos, el sentido será entrada (in) o salida (out). Con el tipo se
considerará los posibles valores que pueden tomar dichos puertos. Los tipos más usuales son std_logic
(para los bits), std_logic_vector (para los buses; cuando el primer índice es mayor que el último se
utiliza la palabra clave downto, mientras que en el caso contrario se utiliza la palabra clave to) y time
(para valores de tiempo). Un ejemplo de entidad puede ser la siguiente:
entity ejemplo1 is
port(
clk : in std_logic;
A : in std_logic_vector (1 downto 0);
F : out std_logic;
);
end entity;
Como podemos apreciar, el fin de una declaración se indica con un ";". También conviene indicar que
el comentario será desde dos guiones ("--") hasta el final de la línea.
2.2.
Arquitectura
La sintaxis de la arquitectura será la siguiente:
architecture <nombre_arquitectura> of <nombre_entidad> is
<parte declarativa>
begin
<cuerpo de la arquitectura>
end <nombre_arquitectura>;
Debido al hecho de que podemos describir de diferentes formas un mismo comportamiento, hay que
indicar un nombre a la arquitectura, y obviamente, enlazarla con la entidad a la que va dirigida. Como
en muchos lenguajes de programación, todo elemento que se vaya a utilizar debe ser declarado
previamente; la parte declarativa debe su existencia a este fin. En cambio, en el cuerpo de la
arquitectura se específica el comportamiento propiamente dicho.
Los elementos más usuales en el parte declarativa son la declaración de señales internas,
declaración de componentes y definición de nuevos tipos:
signal <nombre_señal> : <tipo>;
En la declaración de una señal interna, únicamente hay que determinar es su nombre y su tipo.
component <nombre_componente>
port (
<nombre_puerto> : <sentido> <tipo>;
...
<nombre_puerto> : <sentido> <tipo>
);
end component;
Como podemos ver la declaración del componente es muy similar a la declaración de la entidad, por
lo tanto, puede ser útil copiar y pegar la entidad correspondiente, para después realizar los cambios
oportunos.
type <nombre_tipo> is (<valor1>, <valor2>, ..., <valorN>);
Esta es una forma de definir un nuevo tipo (no es la única), asignando los posibles valores que puede
tomar cualquier señal con dicho tipo.
2
Sistemas Electrónicos y Automáticos
Práctica 3
En el cuerpo de la arquitectura, se va a hacer referencia al comportamiento que tiene el
sistema. Debido a que el lenguaje VHDL va a describir hardware, debe posibilitar la operación
concurrente, en la que todos los bloques operan de forma simultánea (y no de forma secuencial
dependiendo de su posición en el código). Existen diferentes formas de indicar la operaciones a
realizar, como podemos apreciar a continuación:
• Mediante operadores: and, or, not, o una mezcla de ellos
<señal1> and <señal2> and ... and <señalN>;
<señal1> or <señal2> or ... or <señalN>;
not <señal1>;
not (<señal1> and (<señal2> or <señal3>) and not <señal4>);
• Mediante componentes
<etiqueta>:<nombre_componente> (
<nombre_puerto> => <nombre_señal>,
<nombre_puerto> => <nombre_señal>,
...
<nombre_puerto> => <nombre_señal>
);
No obstante, una de los comportamientos más usuales en Electrónica Digital es el
comportamiento secuencial. Para ello, se han habilitado una serie de sentencias secuenciales que
deben ser colocadas dentro de la sentencia definida como proceso.
<etiqueta>: process (<lista de sensibilidad>)
<parte declarativa>
begin
<cuerpo del proceso>
end process;
La lista de sensibilidad consiste en una lista de señales, de tal forma, que el proceso sólo se ejecutará
cuando una de dichas señales sufra un cambio de valor. El proceso también dispone de una parte
declarativa local (si es necesaria), y un cuerpo, que será donde se incorporen las sentencias
secuenciales. Las instrucciones secuenciales más usuales son las siguientes:
• wait, dicha sentencia sólo es válida en simulación, y goza de tres variantes:
wait for <tiempo>;
wait on <señal>;
wait until <condicion>;
-- espera una determinada cantidad de tiempo
-- espera hasta que haya un cambio en la señal
-- espera hasta que se cumpla la condición
• case, se ejecutarán diferentes porciones de código en función del valor de una señal
case <señal_seleccion> is
when <valor1> =>
<cuerpo de la opción del valor1>
when <valor2> =>
<cuerpo de la opción del valor2>
...
when others =>
<cuerpo correspondiente a que no se cumpla ninguna de las opciones anteriores>
end case;
• if -then -else, se ejecutarán porciones de código en función de determinadas condiciones
if (<condición1>) then
<cuerpo de la condición1>
elsif (<condición2>) then
3
Sistemas Electrónicos y Automáticos
Práctica 3
<cuerpo de la condición2>
...
else
<cuerpo correspondiente a que no se cumlpa ninguna de las condiciones anteriores>
end if;
A continuación mostramos un ejemplo de arquitectura de sistema que toma el valor de dos
señales cuando tienen el mismo valor; en caso contrario, mantiene el valor anterior. La entidad sería la
misma que la del ejemplo anterior.
architecture diagrama of ejemplo1 is
type estado is (valor0, valor1);
signal estado_maquina : estado
begin
P1:process (clk)
begin
if (clk='1' and clk'event) then
-- 'event es un atributo que es cierto cuando la señal sufre un cambio
case estado_maquina is
when valor0 =>
if (A(0)='1' and A(1)='1') then estado_maquina <= valor1;
else estado_maquina <= valor0;
end if;
F <= '0';
when valor1 =>
if (A(0)='0' and A(1)='0') then estado_maquina <= valor0;
else estado_maquina <= valor1;
end if;
F <= '1';
end case;
end if;
end process;
end diagrama;
2.3.
Testbench
Dicho código sirve únicamente para describir el comportamiento, pero no para la simulación,
ya que no se indican los posibles valores de las señales de entrada. Para ello debemos generar lo que
se conoce como testbench, que no es más que un nuevo modelo VHDL especial. Dicho testbench
tendrá la siguiente estructura.
entity <nombre_testbench> is
end <nombre_testbench>;
-- El test bench no tiene ningún puerto ya que no se va a conectar a nada.
architecture <nombre_arquitectura_test> of <nombre_testbench> is
component <nombre_sistema_a_simular>
<nombre_puerto> : <sentido> <tipo>;
<nombre_puerto> : <sentido> <tipo>;
...
<nombre_puerto> : <sentido> <tipo>
end component;
signal <nombre_puerto> : <tipo>;
signal <nombre_puerto> : <tipo>;
signal <nombre_puerto> : <tipo>;
4
Sistemas Electrónicos y Automáticos
Práctica 3
...
begin
<etiqueta>:<nombre_sistema_a_simular> (
<nombre_puerto> => <nombre_puerto>,
<nombre_puerto> => <nombre_puerto>,
...
<nombre_puerto> => <nombre_puerto>
);
-- Formas de onda de las señales de entrada
tb1:process
begin
<nombre_puerto> <= <valor>;
wait for <tiempo>;
...
end process;
-- Puede haber diferentes procesos.
-- Los procesos no tiene lista de sensibilidad para que se ejecuten siempre
-- En estos procesos puede aparecer una sola señal o varias
-- en función de su temporización
end <nombre_arquitectura_test>;
Un ejemplo de testbench para el ejemplo anterior podría ser el siguiente:
entity ejemplo1_tb is
end ejemlpo1_tb;
architecture tb1 of ejemplo_tb1 is
component ejemplo1
port (
clk
: in std_logic;
A : in std_logic_vector(1 downto 0);
F : out std_logic;
);
end component;
signal clk: std_logic;
signal A : std_logic_vector (1 downto 0);
signal F : std_logic;
begin
U_0: ejemplo1 (
clk => clk,
A => A,
F => F
);
tbclk:process
begin
clk <= '0';
wait for 20 ns;
clk <= '1'
wait for 20 ns;
end process;
tbdato:process
begin
A <= "00";
wait for 55 ns;
A(0) <= '1';
wait for 80 ns;
5
Sistemas Electrónicos y Automáticos
Práctica 3
A <= "10";
wait for 80 ns;
A <= "11";
wait for 80 ns;
A <= "01";
wait; -- espera para siempre
end process;
end tb1;
3. REALIZACIÓN PRÁCTICA.
Utilizar el WebPack de Xilinx para simular el ejemplo visto a lo largo de la introducción
teórica.
Mostrar las formas de onda de las señales de entrada, las señales de salida y la señal
estado_máquina.
4. PROBLEMA.
Modelar en VHDL un posible controlador para una máquina lavadora con posibilidad de
lavado y centrifugado. Dicha máquina dispondrá de sensores de humedad, limpieza y peso para
poder llevar a cabo su operación.
Se pide mostrar los códigos VHDL del sistema y de los posibles testbench para verificar su
comportamiento correcto. También mostrar las formas de onda con las diferentes señales.
6
Descargar