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