DSH_-_CR_-_Practica_Tutorial_ISE

26
PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA usando Xilinx ISE 9.2i y Digilent Nexys Juan Antonio Gómez Pulido . Universidad de Extremadura . 2010 Objetivos: Esta práctica introduce al alumno en el uso de herramientas y plataformas de prototipado para la computación reconfigurable. El recorrido de esta práctica desarrolla mínimamente las etapas típicas del ciclo de diseño: planteamiento, modelación, simulación, síntesis e implementación, análisis de tiempos, prototipado y verificación. Consideraciones: Todas las expresiones inglesas, nombres de variables, etc., aparecerán entrecomilladas. Requisitos: Software de prototipado Xilinx ISE 9.2i con soporte para familia Spartan. Librerias y software Xilinx PicoBlaze para Spartan3. Tarjeta de prototipado Xess Digilent Nexys. Cable USB. Utilización de otras tarjetas de prototipado: Esta práctica puede adaptarse fácilmente para ser utilizada con otras tarjetas de prototipado, si se tienen en cuenta los siguientes aspectos: Deben adecuarse los pines de E/S a los dispositivos DIP y LED de cada tarjeta. La FPGA debe tener unas librerías con los elementos comunes a esta práctica. Tutorial, materiales y documentación: Todos los materiales y documentos necesarios para la realización de esta práctica se pueden encontrar en:

Transcript of DSH_-_CR_-_Practica_Tutorial_ISE

Page 1: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

usando Xilinx ISE 9.2i y Digilent Nexys

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

Objetivos:

Esta práctica introduce al alumno en el uso de herramientas y plataformas de prototipado para la computación reconfigurable. Elrecorrido de esta práctica desarrolla mínimamente las etapas típicas del ciclo de diseño: planteamiento, modelación, simulación,síntesis e implementación, análisis de tiempos, prototipado y verificación.

Consideraciones:

Todas las expresiones inglesas, nombres de variables, etc., aparecerán entrecomilladas.

Requisitos:

Software de prototipado Xilinx ISE 9.2i con soporte para familia Spartan.Librerias y software Xilinx PicoBlaze para Spartan3.Tarjeta de prototipado Xess Digilent Nexys.Cable USB.

Utilización de otras tarjetas de prototipado:

Esta práctica puede adaptarse fácilmente para ser utilizada con otras tarjetas de prototipado, si se tienen en cuenta lossiguientes aspectos:

Deben adecuarse los pines de E/S a los dispositivos DIP y LED de cada tarjeta.La FPGA debe tener unas librerías con los elementos comunes a esta práctica.

Tutorial, materiales y documentación:

Todos los materiales y documentos necesarios para la realización de esta práctica se pueden encontrar en:

Page 2: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

1.1. Modelación y simulación de un sumador de 8 bit

Introducción.

Esta primera parte del tutorial ilustra inicia al alumno en el software Xilinx ISE 9. Consta de varios apartados en los que, de formasucesiva, se va modelando y simulando un sumador de 8 bits.

Modelación de un sumador de 1 bit.

Un sumador completo de 1 bit (que denominaremos "sum1") es un circuito lógico que suma tres bits ("A", "B" y "Ci", en el que "A" y"B" son los bits sumandos, y "Ci" ("i" de "input") es el bit de acarreo de entrada proveniente de una suma previa), y produce un bitde suma "S" y un bit de acarreo a la salida "Co" ("o" de "out") . La tabla de la verdad de los bits "S" y "Co" del sumador de 1 bit es:

A B Ci S Co0 0 0 0 00 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1

"S" y "Co" se puede expresar como la siguiente suma de minterms:

S = !A·!B·Ci + !A·B·!Ci + A·!B·!Ci + A·B·Ci Co = !A·B·Ci+A·!B·Ci+A·B·!Ci+A·B·Ci

Las funciones "S" y "Co" pueden simplificarse a:

S = A $ B $ Ci Co = A·B + B·Ci + A·Ci

donde $ significa OR-exclusiva (XOR). La explicación es la siguiente:

S = !A·!B·Ci + !A·B·!Ci + A·!B·!Ci + A·B·Ci = Ci·(!A·!B + A·B) + !Ci·(!A·B + A·!B) = = Ci·(A xnor B) + !Ci·(A xor B) = Ci·!(A xor B) +!Ci·(A xor B) = (A xor B) xor Ci

Co es irreductible por Karnaugh: Co = A·B + B·Ci + A·Ci

También, se demuestra que: Co = !A·B·Ci+A·!B·Ci+A·B·!Ci+A·B·Ci =....= A·B+B·Ci+A·Ci

Creación del proyecto sumacon8 en Xilinx ISE 6.

Iniciamos Xilinx ISE mediante el icono "project navigator".En "File" -> "New project" especificamos el nombre del proyecto, "sumacon8", el directorio de trabajo, por ejemplo"c:\sumacon8" (el "path" no debe tener espacios en blanco) y el tipo de diseño del nivel alto del ("schematic"). Esto quieredecir que la visión en más alto nivel del diseño será una hoja de esquemas mostrando los distintos módulos y componentes,algunos de los cuales encierran otros diseños (niveles inferiores).A continuación especificamos la FPGA Spartan3-xc3s1000-ft256-4 y comprobamos que las demás selecciones sean"Schematic - XST - ISE simulator - VHDL" . Después se nos pide crear un nuevo archivo fuente: Seleccionamos "NewSource" y creamos un archivo de tipo esquemático de nombre "top_ip". Accionamos "Siguiente", "Finalizar", "Siguiente". En"Add existing sources" no seleccionamos nada, damos a "Siguiente" y "Finalizar". Se abre una nueva ventana con laherramienta de diseño esquemático, mostrando la hoja de esquemas "top_ip.sch", en la cual estará definido el sistema en suvisión jerárquica más alta. Como ahora no vamos a hacer nada en esta hoja, la cerramos.

Page 3: DSH_-_CR_-_Practica_Tutorial_ISE

Creación del objeto sum1 mediante esquema.

En este apartado modelamos un sumador de 1 bit mediante hoja o captura de esquemas. En la pestaña "Sources" accionando elbotón derecho del ratón, o en el menú "Project" -> "New source" creamos una hoja de esquemas llamada "sum1". Esta hoja seincorpora al proyecto, y se abre el editor de esquemas.

Page 4: DSH_-_CR_-_Practica_Tutorial_ISE

Para crear el circuito, guiarse por la anterior figura, emplazando 3 puertas "AND2", 2 "OR2", 2 "XOR2", 3 marcadores de terminalesde entrada de 1 bit (para las señales "a", "b" y "ci") y 2 marcadores de terminales de salida de 1 bit (para las señales "s" y "co").Utilizar el menú "Add" o los iconos con las herramientas de dibujo. Consultar la ayuda integrada para ver los procedimientos dedibujo del esquema.

Una vez creado el circuito,comprobamos que no tiene errores mediante "Tools" -> "Check Schematic". Si no hay errores,guardamos la hoja y cerramos el editor de esquemas.

Page 5: DSH_-_CR_-_Practica_Tutorial_ISE

Simulación funcional de "sum1".

Antes de crear el símbolo "sum1", tenemos que comprobar que su comportamiento es el requerido.

"Project" -> "New source" -> creamos el archivo "test_sum1" de tipo "Test Bench Waveform" -> "Siguiente" ->Seleccionamos la hoja de esquemas "sum1" para indicar que la simulación que vamos a realizar se refiere al modelodescrito en dicha hoja -> "Siguiente" -> "Finalizar".Aparece la ventana "Initialize Timing" en la que seleccionaremos "Combinatorial" -> "OK" -> Aparece una ventana con lasseñales E/S del sumador de 1 bit, y espacio para observar las correspondientes formas de onda. Sobre el color azul, ymediante el ratón, podemos asignar valores a las señales de entrada. Sobre el color amarillo se verán los resultados de lasseñales de salida.Seleccionar los valores de entrada para "a", "b" y "ci" tal como se indica en la figura. Guardar el archivo. En la ventana"Sources" seleccionar "Sources for: Behavioral Simulation". En la ventana de fuentes del proyecto aparecerá el archivo deprueba. Seleccionándolo, vamos a la ventana "Processes", y bajo la categoría "Xilinx ISE Simulator" accionamos el proceso"Simulate Behavioral Model" (o con el botón derecho del ratón, "Run") . Comprobar que los resultados simulados para lasseñales de salida (en amarillo) se corresponden con los de un sumador de 1 bit.

Creación del símbolo "sum1".

Ahora, nuestro propósito es crear un símbolo (un objeto hardware), de nombre "sum1", para que se incluya en la librería delproyecto. De esta forma podemos, por ejemplo, utilizar varios sumadores de 1 bit en otra hoja de esquemas, sin tener que repetirvarias veces el diseño del circuito anterior; bastaría acudir a la librería del proyecto y traer a la hoja el símbolo "sum1" que actúacomo sumador de 1 bit.

Para crear el símbolo "sum1" y almacenarlo en la biblioteca de símbolos, seleccionamos en "Sources for Synthesis /Implementation" la hoja "sum1.sch", y en la ventana "Processes for: sum1", bajo la categoría de "Design Utilities", accionamos"Create Schematic Symbol", ejecutándose entonces un proceso que crea el símbolo "sum1".

Modelación y simulación funcional de un sumador de 8 bits.

Queremos ahora modelar un sumador que sume dos señales de 8 bits (sumandos A y B, que son buses), que tenga en cuenta la

Page 6: DSH_-_CR_-_Practica_Tutorial_ISE

señal de acarreo de entrada, y que produzca una salida de suma de 8 bit y otra de acarreo de salida (utilizar la ayuda integradapara cualquier duda sobre cómo dibujar los elementos del circuito).

Creamos una nueva hoja de esquemas llamada "sum8.sch".En la ventana "Symbols" seleccionamos el símbolo "sum1", accesible desde la categoría "<c:\...>" (es decir, símbolos queresiden en esa carpeta).Emplazamos 8 de estos símbolos en serie, dispuestos verticalmente para que quepan en la hoja. Si no cabe en la hoja, sepuede cambiar el tamaño de la misma, o también editar el dibujo del símbolo (sobre el símbolo, accionar el botón derechodel ratón -> "Symbol" -> "Edit Symbol") para hacerlo más estrecho y con una fuente de letra más pequeña.Mediante "Add Wire" conectamos la salida de acarreo del primer sumador a la entrada de acarreo del siguiente, y asísucesivamente.La hoja debe tener terminales de E/S para las señales "A(7:0)" ,"B(7:0)", "S(7:0)", "Cin" y "Cout". Para ello, dibujaremosbuses para los sumandos y la suma, y conexiones para los acarreos.Para, por ejemplo, dibujar el bus de la suma, dibujamos mediante "Add Wire" una conexión vertical larga que quede cercanaa las señales de salida de la suma, pero sin conectarlas. Mediante "Add I/O Marker" le conectamos a un extremo el terminal,que tendrá asignado un nombre por defecto. Accionando sobre este nombre, lo cambiamos para poner "S(7:0)", de formaque esta conexión de 1 bit se convierte en el bus "S" de 8 bits. Nos aseguramos que este bus tenga polaridad de salida.Repetimos esta operación para crear los buses "A(7:0)" y "B(7:0)", con polaridades de entrada. También conectamos aterminales los acarreos de entrada "Ci" (polaridad de entrada) y de salida "Co" (polaridad de salida).Ahora nos falta conectar las señales de los sumadores de 1 bit con los buses correspondientes. Por ejemplo, para conectarlas salidas:

"Add Wire" -> en la ventana "Options", seleccionar "Use the autorouter to add...." y "automatically add a bus tap...."-> conectar la salida de un sumador de 1 bit con el bus.Repetir para todas las señales de salida de los sumadores.Para nombrar las conexiones: "Add Net Name" -> en la ventana "Options", seleccionar "Name the branch", poner en"Name" el valor "S(0)", activar "Display the name ...", y seleccionar "Increment the name..." -> Aparece el cursor conla leyenda "S(0)", y lo posicionamos sobre la conexión entre el primer sumador de 1 bit (el que está arriba) y el bus-> Hacemos click y observamos que la conexión ha cogido el nombre "S(0)", y que el cursor señala ahora "S(1)",para que lo señalemos sobre la siguiente conexión, y así sucesivamente.

Finalmente, comprobamos que no hay errores en el dibujo accionando "Check Schematic". Aparece una ventantainformativa con los posibles errores. Si todo está correcto, aparece el mensaje "No errors detected".Generamos el símbolo "sum8" para usarlo posteriormente en la hoja de esquemas "top_ip.sch".

Page 7: DSH_-_CR_-_Practica_Tutorial_ISE

Finalmente, para comprobar el correcto funcionamiento del circuito, procederemos a su simulación funcional:

Page 8: DSH_-_CR_-_Practica_Tutorial_ISE

"Project" -> "New source" -> creamos el archivo "test_sum8" de tipo "Test Bench Waveform" -> "Siguiente" ->Seleccionamos la hoja de esquemas "sum8" para indicar que la simulación que vamos a realizar se refiere al modelodescrito en dicha hoja -> "Siguiente" -> "Finalizar". Aparece la ventana "Initialize Timing" en la que especificamos"combinatorial"-> "OK" -> Aparece la ventana con las señales E/S del sumador de 8 bit.Dejamos el valor 0 para "Cin", y ponemos los valores en hexadecimal "1A" y "F2", por ejemplo, a los buses "A" y "B"respectivamente. Guardamos el archivo. VAmos a "Sources for: Behavioral Simulation", seleccionamos "test_sum8", vamosa "Processes" y bajo "Xilinx ISE Simulator" accionamos "Simulate Behavioral Model". Se recomienda que se pruebendistintas formas de asignar valores y visualizar resultados, para comprobar el correcto funcionamiento del sumador.

Page 9: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

1.2. Sistema final con un contador modelado mediante Core Generator

Vamos a suministrar los sumandos al sumador con un contador generado mediante la herramienta Xilinx Core Generator. Esta es una herramientaque genera determinados componentes configurables por el usuario mediante un asistente. Estos componentes también suelen denominarse "IPcores" (IP de "Intelectual Property") .

Con vistas a una futura síntesis del circuito, hemos de tener en cuenta que este contador que vamos a crear recorrerá cíclicamente las 16direcciones de dos memorias que contienen los sumandos del sumador. Las sumas producidas serán visualizadas en displays de 7-segmentos. Elcontador producirá sus salidas a cada ciclo de reloj (a unos 100 MHz con el reloj de la tarjeta), por lo que es imposible visualizar los resultadossucesivos a esta velocidad. Por tanto, en lugar de crear un contador de 4 bit (que generaría las 16 direcciones), crearemos un contador de 30 bits(que genera 2^30 = 1 Giga de salidas), de los cuales usaremos los 4 bits más significativos ("4 msb") para generar las 16 direcciones, de formaque:

100 MHz --> 1 ciclo = 10 -̂8 s2^30 = 1 Gciclos --> 1 G * 10 -̂8 seg = 10,7 seg = tiempo en recorrer las 16 direcciones de las memorias usando los 4 msb.

Para crear el contador, procederemos de la siguiente manera:

"Project" -> "New Source" -> Seleccionamos del tipo "IP (CoreGen)" con el nombre "contador30" -> "Basic Elements" -> "Counters" ->"Binary Counter".Aparece un asistente, en el cual vamos a seleccionar nombre "contador30", ancho de salida de 30 bits y con modo de operación "up/down".Mediante el botón "Generate" generamos el símbolo.

Abrimos la hoja de esquemas "top_ip.sch".Emplazamos el símbolo"contador30" y los correspondientes terminales E/S. Comprobamos con "Check Schematic" que está todo correcto ysalimos del editor de esquemas."Project" -> "New Source" -> creamos "test_top_ip" como "Test Bench Waveform" -> lo asignamos a la hoja "top_ip". Aparece una ventanade selecciones para la simulación, y comprobamos que la señal de reloj es asignada a la señal de entrada "clk", además de asignar comofinal de la simulación 4000 ns -> asignamos valores de entrada a las señales (como por ejemplo el que se ve en la figura), guardamos elarchivo de ondas generado.Seleccionamos el módulo "test_top_ip" en "Sources for: Behavioral Simulation", vamos a la ventana "Processes", seleccionamos "SimulateBehavioral Model", con el botón derecho del ratón seleccionamos "Properties" y cambiamos "Simulation Run Time" a 4000 ns. Acontinuación volvemos al botón derecho del ratón -> "Run".Comprobar mediante simulación el correcto funcionamiento del sistema. Seleccionar formato de entero sin signo para la señal de salida.Observar que desde que se selecciona que cuente hacia delante ("up") el circuito tarda tres ciclos de reloj en ejecutar esta tarea.

Page 10: DSH_-_CR_-_Practica_Tutorial_ISE
Page 11: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

2.1. Preparación del circuito para su síntesis y prototipado en tarjeta Digilent Nexys

Introducción.

En esta parte de la práctica vamos a proceder a la implementación del circuito sobre una FPGA. El circuito necesita ser adaptado para laimplementación, pues las señales de entrada y las de salida deben adecuarse a las características de la tarjeta de prototipado donde vamontada la FPGA.

Planteamiento del sistema.

El sistema final va a suministrar los operandos al sumador mediante los contenidos de dos memoria ROM cuyas direcciones son recorridaspor el contador implementado con "Core Generator".

Necesitamos, además de construir las dos memorias, construir un dispositivo que conecte el bus de 30 bits a la salida del contador con losbuses de 4 bit a la entrada de las memorias.

Conector de buses.

"Project" -> "New Source" -> módulo VHDL de nombre "contador30_4msb" -> entrada "Qin" de 30 bits, salida"Qout" de 4 bits -> Secrea el archivo "contador30_4msb.vhd".Copiamos en la arquitectura el código mostrado en la figura.Creamos el símbolo "contador30_4msb" y lo emplazamos en la hoja de esquemas, conectando su entrada a la salida del contador.

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-------------entity contador30_4msb is Port ( Qin : in std_logic_vector(29 downto0); Qout : out std_logic_vector(3 downto 0));end contador30_4msb;-------------architecture Behavioral of contador30_4msb isbegin process(Qin) begin Qout(3 downto 0) <= Qin(29 downto 26); end process;end Behavioral;

Creación de las memorias.

Las memorias ROM tendrán 16 palabras de 8 bits, por lo que podremos suministrar cualquiera de ellas como operandos del sumador,seleccionando las direcciones de forma cíclica. Comenzaremos creando la memoria que suministra valores al primer sumando "A" delsumador.

"Project" -> "New source" -> archivo "rom_a" de tipo "IP (CoreGen)" -> "Memories" -> "RAMs & ROMs" -> "Single Port BlockMemory" -> "Finalizar".Se abre la aplicación "Core Generator" -> Seleccionamos los parámetros tal como se indican en la figura, y accionamos el botón"Generate".

Page 12: DSH_-_CR_-_Practica_Tutorial_ISE

De esta forma se crea el símbolo " rom_a" que podemos utilizar en la hoja de esquemas "top_ip". Ahora necesitamos definir el contenido deesta memoria ROM. Para ello:

Seleccionar "rom_a" en la ventana "Sources in project".Ir a la ventana "Processes" -> "Coregen" -> "Manage Cores".Se abre la aplicación "Core Generator" -> "Tools" -> "Memory editor"Botón "Add block" -> introducir nombre "rom_a" -> seleccionar los parámetros tal como se ven en la figura. Se trata de que elcontenido de la memoria sean las palabras, de menor a mayor dirección: {0, 2, 3, 8, 116, 255, 155, 255, 0, 1, 2, 3, 1, 2, 3, 4} -> "File"-> "Generate" -> seleccionar opción "COE file" -> "Ok" -> cerrar de la aplicación. El resultado final debe ser la generación delarchivo "definition1_rom_a.coe". Este archivo lo encontraremos en la carpeta del proyecto. Una vez localizado, lo renombramoscomo "rom_a.coe" para que no tenga más de 8 caracteres (requisito de la herramienta CoreGen).Seleccionar "rom_a" en la ventana "Sources" y accionarlo para abrirlo en la herramienta "LogiCore" .Accionar "Next" hasta ir a la página 4, accionar "Load Init File" y seleccionar "Load File" para seleccionar el archivo de extensión"coe" antes generado, tal como se ve en la figura. Volver a accionar el botón "Generate" para que el dispositivo tome estas nuevasselecciones.

Page 13: DSH_-_CR_-_Practica_Tutorial_ISE
Page 14: DSH_-_CR_-_Practica_Tutorial_ISE

Repetimos todo el procedimiento para crear una nueva memoria, que llamaremos "rom_b", y cuyo contenido serán las palabras (demenor a mayor dirección): {0, 3, 7, 102, 94, 55, 255, 255, 1, 2, 3, 4, 0, 1, 2, 3}.A continuación emplazamos en la hoja "top_ip" las memorias, conectamos la señal de reloj (a la entrada del contador) con lasentradas de reloj de las memorias y conectamos la salida de "contador30_4msb" con las entradas de direcciones de las memorias.Marcamos los terminales de E/S y verificamos que no existan errores.

Decodificación de la suma.

Hemos de tener en cuenta que el resultado del sumador será de 0 a 255, con acarreo 0 o 1, de forma que:

Si Co = 0 entonces 0 <= S <= 255Si Co = 1 entonces 256 <= S <= 510

Por tanto, en primer lugar creamos un decodificador BCD que convierta el resultado del sumador (vector de 8 bits junto con el acarreo desalida) en los correspondientes números de centena, decena y unidad, separados para mostrarse en los displays de la tarjeta Nexys:

Page 15: DSH_-_CR_-_Practica_Tutorial_ISE

"Project" -> "New Source" -> módulo VHDL de nombre "dec9_bcd" -> entrada "Co" de 1 bit, entrada "binario" de 8 bits, salidas"unidad", "decena" y "centena" de 4 bits y salida, ponemos "COMB" como el nombre de la arquitectura (en lugar de "Behavioral") ->Se crea el archivo "dec9_bcd.vhd".Copiamos en la arquitectura el código mostrado en la figura.Creamos el símbolo "dec9_bcd".

library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;--=====================================================entity dec9_bcd isport ( Co : in std_logic; binario : in std_logic_vector(7 downto 0); -- rango de 0 a 255 unidad : out std_logic_vector(3 downto 0); decena : out std_logic_vector(3 downto 0); centena : out std_logic_vector(3 downto 0));end dec9_bcd;--=====================================================architecture COMB of dec9_bcd is

signal BIN2INT : integer range 0 to 511;signal CENTENAS : integer range 0 to 5;signal DECENAS : integer range 0 to 9;signal UNIDADES : integer range 0 to 9;

begin

-- sentencias concurrentesBIN2INT <= conv_integer(unsigned(Co&binario(7 downto 0))); -- convierte a enterounidad <= conv_std_logic_vector(UNIDADES,4);decena <= conv_std_logic_vector(DECENAS,4);centena <= conv_std_logic_vector(CENTENAS,3);

--------------------------------------- proceso combinacional usando variablesCONVERSION : process (BIN2INT)

variable RES99_VAR : integer range 0 to 99; -- resto después de las centenasvariable VAR_CENTENAS : integer range 0 to 5;variable VAR_DECENAS : integer range 0 to 9;variable VAR_UNIDADES : integer range 0 to 9;

begin

if BIN2INT > 499 then VAR_CENTENAS := 5; elsif BIN2INT > 399 then VAR_CENTENAS := 4; elsif BIN2INT > 299 then VAR_CENTENAS := 3; elsif BIN2INT > 199 then VAR_CENTENAS := 2; elsif BIN2INT > 99 then VAR_CENTENAS := 1; else VAR_CENTENAS := 0; end if;

RES99_VAR := BIN2INT - (VAR_CENTENAS * 100);

if RES99_VAR > 89 then VAR_DECENAS := 9; elsif RES99_VAR > 79 then VAR_DECENAS := 8; elsif RES99_VAR > 69 then VAR_DECENAS := 7; elsif RES99_VAR > 59 then VAR_DECENAS := 6; elsif RES99_VAR > 49 then VAR_DECENAS := 5; elsif RES99_VAR > 39 then VAR_DECENAS := 4; elsif RES99_VAR > 29 then VAR_DECENAS := 3; elsif RES99_VAR > 19 then VAR_DECENAS := 2; elsif RES99_VAR > 9 then VAR_DECENAS := 1; else VAR_DECENAS := 0; end if;

VAR_UNIDADES := RES99_VAR - (VAR_DECENAS * 10);

-- asigna variables a señales CENTENAS <= VAR_CENTENAS; DECENAS <= VAR_DECENAS; UNIDADES <= VAR_UNIDADES;

end process CONVERSION;-------------------------------------end COMB;

Las salidas del decodificador BCD representan en código binario el número de centena, decena y unidad, números que vamos a mostrar endisplays de 7 segmentos. Los segmentos de estos displays se iluminan según el valor de las señales que le llegan. Por esta razón hemosde decodificar adecuadamente las salidas de "dec9_bcd" para poder ser mostradas como dígitos en los displays de 7 segmentos.

Page 16: DSH_-_CR_-_Practica_Tutorial_ISE

Utilización del display de 7 segmentos.

Para decodificar la centena, decena y unidad y mostrarla en los displays de 7 segmentos, necesitaremos dos módulos:

Módulo "displays_controller":"Project" -> "New Source" -> módulo VHDL de nombre "displays_controller" -> entradas "mclk" de 1 bit y "digitU", "digitD" y"digitC" de 4 bits; salidas "digit" y "display_enable" de 4 bits -> Se crea el archivo "displays_controller.vhd".Copiamos en la arquitectura el código mostrado en la figura. Este código tiene en cuenta cómo se debe producir lasecuencia de señales que activan los cuatro displays, según se indica en el manual de la tarjeta Nexys.Creamos el símbolo "displays_controller".

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;--=================================================entity displays_controller isPort ( mclk : in STD_LOGIC; digitU : in STD_LOGIC_VECTOR (3 downto 0); digitD : in STD_LOGIC_VECTOR (3 downto 0); digitC : in STD_LOGIC_VECTOR (3 downto 0); digit : out STD_LOGIC_VECTOR (3 downto 0); display_enable : out STD_LOGIC_VECTOR (3 downto 0));end displays_controller;

--=================================================architecture Behavioral of displays_controller is

signal cont : integer range 0 to 4 := 0;signal clkdiv : std_logic_vector(10 downto 0);signal clk : std_logic;

begin

display_enable <= "1110" when cont = 0 else "1101" when cont = 1 else "1011" when cont = 2 else "1111" when cont = 3 else "1111";

digit <= digitU when cont = 0 else digitD when cont = 1 else digitC when cont = 2 else "0000";

-- Divido la frequencia de reloj para obtener una más bajaprocess (mclk)begin if mclk = '1' and mclk'Event then clkdiv <= clkdiv + 1; end if;end process;

clk <= clkdiv(10);

process(clk)begin if clk = '1' and clk'Event then if cont >= 3 then cont <= 0; else cont <= cont+1; end if; end if;end process;

end Behavioral;

Módulo "decbcd":"Project" -> "New Source" -> módulo VHDL de nombre "decbcd" -> entrada "HEX" de 4 bits y salida "LED" de 7 bits -> Secrea el archivo "decbcd.vhd".Copiamos en la arquitectura el código mostrado en la figura. Este código tiene en cuenta el orden de numeración de lossegmentos del display, según se indica en el manual de la tarjeta Nexys.Creamos el símbolo "decled".

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;

Page 17: DSH_-_CR_-_Practica_Tutorial_ISE

use IEEE.STD_LOGIC_UNSIGNED.ALL;--=================================================entity decbcd isPort( HEX : in std_logic_vector(3 downto 0); LED : out std_logic_vector(6 downto 0));end decbcd;--=================================================architecture Behavioral of decbcd is

signal segs : std_logic_vector(6 downto 0);

begin

-- 0-- ----- 5 | | 1-- --- <- 6-- 4 | | 2-- ----- 3

with HEX SELect segs <= "0111111" when "0000", --0 "0000110" when "0001", --1 "1011011" when "0010", --2 "1001111" when "0011", --3 "1100110" when "0100", --4 "1101101" when "0101", --5 "1111101" when "0110", --6 "0000111" when "0111", --7 "1111111" when "1000", --8 "1101111" when "1001", --9 "1110111" when "1010", --A "1111100" when "1011", --b "0111001" when "1100", --C "1011110" when "1101", --d "1111001" when "1110", --E "1110011" when "1111", --F "0000000" when others; --(nada)

LED <= not segs;

end Behavioral;

Sistema final.

Emplazamos los símbolos "sum8", "dec9_bcd", "displays_controller" y "decbcd" en la hoja de esquemas "top_ip", tal como se indicaen la figura.Colocamos una toma de tierra a la señal de entrada "ci" del símbolo "sum8".La salida LED del símbolos "decbcd" la marcamos con el terminal de salida "ssg(6:0)" y la salida "display_enable(3:0)" del símbolo"displays_controller" la marcamos con el terminal de salida "an(3:0)".Comprobamos que la hoja no contiene errores.

Page 18: DSH_-_CR_-_Practica_Tutorial_ISE
Page 19: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

2.2. Síntesis y prototipado en tarjeta Digilent Nexys

Introducción.

Los marcadores de E/S utilizados en la hoja de esquemas nos permitirán definir las conexiones de la FPGA con el exterior. La hoja de esquemas esconvertida a VHDL para ser sintetizado por las herramientas adecuadas. En este proceso de síntesis, los marcadores de E/S son reemplazados porlos "pads" y "buffers" adecuados.

Asignación de pines.

El siguiente paso que hemos de realizar es asignar a los marcadores de E/S a qué pines de la FPGA van a conectarse. Cuando no tenemos ningunarestricción "a priori" sobre la asignación de pines, Xilinx recomienda que dejemos que sea el programa de emplazamiento y encaminado automático("placement and routing", PAR) quien determine dicha asignación, pues así aumenta el rendimiento del diseño. Pero en algunos casos (como ahora),en el que ciertos elementos de la tarjeta (como los leds de los displays, etc) deben conectarse con pines específicos de la FPGA, hay que especificarlas conexiones.

Para saber qué pines de la FPGA hemos de conectar a los marcadores del circuito, hemos de consultar el manual de la tarjeta para ver los pines dela FPGA que están conectados a los displays, reloj de la tarjeta y conmutadores. Esto también lo podemos ver en la sección "Preparación de latarjeta". Tengamos en cuenta que:

Usamos los tres displays más a la derecha para representar las centenas, decenas y unidades (señales "led_C", "led_D" y "led_U", deizquierda a derecha).Usamos el reloj de la tarjeta (100 MHz) para suministrar a la FPGA (a nuestro circuito) la señal de reloj "clk".Usamos el conmutador SW0 para activar/desactivar la señal "up".

Para especificar la asignación de pines, hay que asignar el parámetro LOC a un componente de tipo buffer (a un marcador de E/S, pues el buffer esasignado al marcador de E/S automáticamente durante la síntesis). Para ello hay dos formas: mediante la asignación directa en la hoja de esquemas,o mediante un archivo de restricciones (UCF).

Asignación directa de pines en la hoja de esquemas.

Mediante este sistema se puede asignar la localización del pin desde la hoja de esquemas a un marcador, asignándole el atributo LOC. En estapráctica vamos a seguir el segundo método (archivo de restricciones), más versátil.

Asignación de pines mediante archivo de restricciones UCF.

Mediante este sistema vamos a asignar las entradas "clk", "up", y las salidas "an" y "ssg".

Crear el archivo UCF: "Project" -> "New Source" -> "Implementation Constraints File", tecleamos "sumacon8_ip", por ejemplo -> "Next" ->seleccionamos "top_ip" -> "Next" -> "Finalizar". Se ha creado el archivo de texto "sumacon8_ip.ucf".

Seleccionando "sumacon8_ip.ucf" en la ventana "Sources" -> Accionamos "Edit Constraints (Text)" bajo la categoría "User Constraints" en la ventana"Processes" -> Se abre el archivo (de formato texto ASCII), en el que escribiremos el siguiente contenido:

NET "up" LOC = "N15";

NET "an<0>" LOC = "G14";NET "an<1>" LOC = "G12";NET "an<2>" LOC = "G13";NET "an<3>" LOC = "F12";

NET "ssg<0>" LOC = "F13";NET "ssg<1>" LOC = "E13";NET "ssg<2>" LOC = "G15";NET "ssg<3>" LOC = "H13";NET "ssg<4>" LOC = "J14";NET "ssg<5>" LOC = "E14";NET "ssg<6>" LOC = "G16";

NET "clk" LOC = "A8";

Implementación.

Comprobamos que el árbol del proyecto es el siguiente:

Page 20: DSH_-_CR_-_Practica_Tutorial_ISE

Procedemos a realizar la implementación completa :

Seleccionar "top_ip" en "Sources".Ir a la ventana "Processes" -> seleccionar "Implement Design" -> botón derecho del ratón -> "Properties" -> Activar la casilla "PerformAdvanced Analysis" en la categoría "Post-Place & Route Static Timing Report Properties" -> OK.Seleccionar "Generate Programming File" -> "Properties" -> Activar "JTAG Clock" en el campo "FPGA Start-Up Clock" en la categoría "StartupOptions" -> OK.Seleccionando "Generate Programming File" -> "Run".Tras unos minutos, se completan los distintos procesos que forman la implementación: "Synthesize", "Translate", "Map", "Place" and"Route". Finalmente se genera el archivo "top_ip.bit", que contiene la programación de la FPGA.

"Layout" de la FPGA.

Podemos ver el "layout" o aspecto del diseño sobre la FPGA utilizando la herramienta "FPGA Editor":En la ventana de procesos, ejecutar "View/Edit Routed Design (FPGA Editor)" bajo la categoría "Place & Route" en el proceso "ImplementDesign".En "FPGA Editor", en la ventana "List" seleccionar "All Nets" para poder ver cualquier conexión del diseño. Seleccionar la señal "clk" yobservar cómo es su recorrido en la FPGA.

Informes de implementación.

Durante la implementación se genera información que es interesante observar. Un resumen de algunos resultados es mostrado en la ventana "DesignSummary".

Page 21: DSH_-_CR_-_Practica_Tutorial_ISE

Abrimos la ventana "Design Summary" accionando "View Design Summary" en la ventana "Processes".Ver que solamente un 1% de los recursos lógicos (occupied slices) de la FPGA es utilizado.En la sub-ventana "FPGA Sesign Summary" ir a "Detailed Reports" -> "Static Timing Reports" -> Ver hacia el final de este archivo que lafrecuencia máxima a la que puede operar correctamente este circuito es de 206 MHz.

Prueba.

Conectar la tarjeta Nexys al PC mediante el cable USB.Asegurar que J4 está en posición USB, JP3 en JTAG, JP4 en 100 MHz y J6 está cortocircuitando TDI y TDO.Encender la tarjeta mediante el conmutador POWER.Ejecutar el programa "ExPort" bajo la categoría "Adept" en el grupo de programas "Digilent".Accionar el botón "Initialize Chain".La herramienta ha detectado dos dispositivos programables en la tarjeta: la FPGA XC3S1000 y la memoria ROM XCF04S.Activamos la casilla de la memoria ROM para evitar su programación.Seleccionamos el archivo "top_ip.bit" para la configuración de la FPGA.Accionamos el botón "Program Chain".Observar, tras la configuración de la FPGA (cuando se completa la carga del archivo), que se iluminan los leds de la tarjeta siguiendocíclicamente la secuencia indicada en la figura.Accionar el conmutador SW0 de la tarjeta y observar que se invierte la dirección de la secuencia.No olvidar apagar la tarjeta con el conmutador POWER cuando hayamos verificado el funcionamiento del circuito.

Page 22: DSH_-_CR_-_Practica_Tutorial_ISE
Page 23: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

Solución de problemas y consideraciones generales

Errores durante la síntesis e implementación. Generalmente, los informes de errores y avisos durante este proceso nospueden dar una pista de la causa del error. No obstante, estas son las causas más habituales:

A veces se producen errores durante la síntesis e implementación debido a la no actualización de los componentesdel diseño (hojas de esquemas, símbolos, códigos VHDL e IP cores). Esto suele suceder habitualmente cuandoguardamos todo el proyecto en un medio extraible para volver a grabarlo posteriormente en cualquier equipo. Lasolución es:

En la ventana "Sources" , seleccionamos con el ratón la parte más superior del árblo del diseño, donde apareceel nombre del mismo (por encima del tipo de FPGA seleccionado).En la ventana "Processes", expandimos la categoría "Design Utilities".Ejecutamos "Regenerate All Coress".Ejecutamos "Update All Schematic Files".

Las señales en el diseño no se corresponden con las señales en el archivo UCF.

El diseño es demasiado grande para la FPGA seleccionada.

Errores en el diseño del proyecto:

En el árbol del proyecto no aparece un elemento, o aparece con una interrogación. Si lo añadimos, sale un mensaje deerror avisando que ya está en el proyecto:

En la ventana "Sources", ir a la pestaña "Libraries".Expandir la categoría "Work".Localizar el elemento en cuestión, y borrarlo (botón derecho del ratón, y "Remove").Volver a la ventana "Sources", volver a añadir el elemento mediante "Add Source".

Para hacer una limpieza de archivos no necesarios que pueden provocar algún problema: "Project" -> "Cleanup ProjectFiles".

Page 24: DSH_-_CR_-_Practica_Tutorial_ISE

PRÁCTICA DE DISEÑO Y PROTOTIPADO SOBRE CIRCUITO FPGA

Juan Antonio Gómez Pulido. Universidad de Extremadura. 2010

Información de la tarjeta de prototipado Digilent Nexys

Pasos previos Pines Reloj Tarjeta Documentación

Pasos previos.

Asegurar que lla tarjeta está configurada con los cortocircuitos (azules) en las siguientes posiciones:JP3 en posición JTAG.J4 en posición USB.JP4 en posición 100 MHz..JPA, JPB, JPC, JPD en posición 3V3.J6 en posición TDI-TDO.Selector POWER en posición OFF.

Alimentación eléctrica:Conectar a J2 el cable USB.Conectar el cable USB al PC (cancelar el asistente para nuevo hardware encontrado, si aparece).

Software:Digilent Adept software instalado.

Información sobre los pines.

(*) FPGA Xilinx Spartan xc3s1000-5ft256

Dispositivo de la tarjeta Pin FPGA Dispositivo de la tarjeta Pin FPGA Dispositivo de la tarjeta Pin FPGA

LED - LD0 L14 DIP Switch - SW0 N15 BTN0 J13

LED - LD1 L13 DIP Switch - SW1 J16 BTN1 K14

LED - LD2 M14 DIP Switch - SW2 K16 BTN2 K13

LED - LD3 L12 DIP Switch - SW3 K15 BTN3 K12

LED - LD4 N14 DIP Switch - SW4 L15

LED - LD5 M13 DIP Switch - SW5 M16 Reloj (oscilador) A8

LED - LD6 P14 DIP Switch - SW6 M15

LED - LD7 R16 DIP Switch - SW7 N16 CA F13

CB E13

AN0 G14 CC G15

AN1 G12 CD H13

AN2 G13 CE J14

AN3 F12 CF E14

CG G16

DP H14

Page 25: DSH_-_CR_-_Practica_Tutorial_ISE

Reloj.

25MHz: 50MHz: 100MHz:

Tarjeta.

Page 26: DSH_-_CR_-_Practica_Tutorial_ISE

Documentación.

Manual de usuario.

Esquemas de la tarjeta.