vhdl_proyectos

Embed Size (px)

DESCRIPTION

proyectos con circuitos vhdl

Citation preview

  • CAPITULO V: Ejemplos y aplicaciones prcticas.

    En este capitulo demostrara la utilizacin del lenguaje Verilog en sntesis

    lgica para la implementacin de circuitos prcticos a travs de una placa

    de pruebas, el software de desarrollo ISE de XILINX. Se mostrara los pasos

    necesarios para crear un proyecto, escribir el cdigo, herramientas de

    sntesis, comprobacin y finalmente implementacin en circuito.

    5.1

    5.1.1

    Descripcin del hardware utilizado.

    Para el desarrollo de los ejemplos prcticos se utilizaron 2 placas

    electrnicas, la primera, el KIT de desarrollo XC2-XL de la empresa

    DIGILENT que posee dos

    CPLDs y una placa creada para interfase y manejo de algunos perifricos

    que se conecta directamente al kit de desarrollo XC2-XL.

    Descripcin del KIT XC2-XL.

    El KIT XC2-XL es un a placa de desarrollo para CPLDs que incluye 2 CPLDs,

    XC2C256-TQ144 Y XC9572XL-VQ44 de la empresa XILINX

    mayores fabricantes de CPLDs y FPGAs del mundo.

    uno de los

    Esta placa constituye una herramienta muy verstil para el desarrollo y

    aprendizaje de CPLDs utilizando las herramientas de desarrollo,

    programacin a travs de un puerto JTAG. Todos los puertos de los 2

    CPLDs estn disponibles para su uso en conectores externos

    Figura 5.1: Diagrama de bloques de XC2-XL

    Entre las caractersticas mas destacadas de este sistema son las siguientes:

    1 CPLD XC2C256-TQ144

    111

  • 1 CPLD XC9572XL-VQ44

    1 puerto JTAG para programacin de los dos CPLDs.

    1 oscilador en placa de 1.8432 MHz que puede ser cambiado.

    Conectores externos disponibles para todos los pines de los 2 CPLDs.

    1 pulsante nico conectado a 1 entrada de cada CPLD.

    1 LED para cada uno de los CPLD

    5.1.2

    Mas detalles de la placa XC2-XL y sus esquemas se pueden encontrar en el

    apndice C.

    Placa de interfase.

    La placa de interfase esta diseada para proveer de varios dispositivos de

    interfase y circuitos lgicos adecuados para acoplar los diferentes niveles

    de voltaje soportados por los CPLDs. Cave resaltar que los voltajes de

    alimentacin del XC2C256 y el XC9572XL son diferentes y se tendr que

    tener precaucin al momento de configurar las lneas de i/o de los CPLD.

    Se ha provisto de circuitos lgicos 74LV541 y 74HC541 para poder convertir

    los niveles de tensin y prestar cierto nivel de proteccin a las lneas de los

    CPLDs.

    La placa de Interfase cuenta con los siguientes dispositivos:

    Teclado matricial de 3x4 teclas

    3 pulsantes N.O.

    3 interruptores N.O.

    1 display de 4 dgitos a 7 segmentos multiplexado

    8 LEDs de nodo comn

    1 Driver de potencia ULN2803 con fuente variable

    1 Interfase serial RS232 con su respectivo conector DB9F

    Conectores individuales para perifricos, salidas de las lneas de los CPLDs y entradas y salidas de los circuitos 74xx541.

    Leds Teclado

    m atriz

    D isplay

    7 seg

    4 digitos

    Fuente

    fija

    R S232 Pulsantes y

    sw itches

    O .C .

    D rivers

    Fuente

    variable

    C onectores SIP

    Figura 5.2: Esquema de bloques de la placa de pruebas.

    112

    C o n e cto

    r He ad

    er (kit X

    C2- X

    L )

    7 4L

    V y

    7 4 H C

    B l o qu

    e

  • 5.2 Breve Introduccin al programa de desarrollo Xilinx ISE.

    El KIT de desarrollo XC2-XL incluye 2 CPLDs de XILINX, para poder utilizar estos chips se utiliza el sistema de desarrollo integrado de XILINX llamado ISE. La versin utilizada es la 8.1.

    Este sistema permite varios mtodos de desarrollo de un sistema basado ya sea en FPGA o CPLDs, estos mtodos son: lenguajes descriptivos, mediante el uso del editor grafico o una combinacin de los 2.

    ISE provee la facilidad de trabajar con lenguajes descriptivos tales como ABEL, VHDL y Verilog el cual ser objetos de nuestro estudio. Los mtodos grficos de diseo digital no sern abordados.

    ISE es un poderoso sistema integrado de desarrollo, abarca todas las herramientas necesarias para realizar un diseo completo digital. Estas herramientas comprenden, un editor grafico, un editor de texto, programa de sntesis lgica, un simulador, editores de pines y restricciones, programa de programacin y algunas herramientas adicionales.

    Xilinx ofrece una muy amplia variedad de documentos referentes a sus productos y aplicaciones, manuales tcnicos, notas de aplicacin y ejemplos todos ellos disponibles a travs de su direccin de Internet.

    En este numeral describiremos los pasos bsicos para crear un diseo utilizando un dispositivo digital, generar un proyecto, correr el programa de sntesis, simulacin y por ultimo la programacin del dispositivo.

    Antes comenzar con lo antes indicado, citaremos algunas recomendaciones las cuales seguiremos como guas para el diseo de un sistema digital utilizando un lenguaje HDL.

    Cuando se va a disear un sistema digital necesitamos como primer paso antes de comenzar a escribir el cdigo ya sea en cualquier

    lenguaje HDL es el de tener una idea clara de lo que queremos que

    nuestro diseo haga. Es importante definir claramente un diagrama

    de bloques, en el cual podamos incluir los mdulos que formaran

    parte de nuestro circuito.

    Ya sea que utilicemos diseo de arriba abajo o abajo arriba es necesario definir las lneas necesarias de entrada, salida, seales de

    reloj etc.

    Otra consideracin muy importante es el de tratar de describir mdulos pequeos e integrarlos en porciones de cdigo mas

    complejas.

    113

  • Al escribir mdulos tratar de que estos sean lo mas genricos posibles, esto se consigue con la utilizacin de parmetros en los

    mdulos de esta forma si por ejemplo describimos un comparador de

    8 bits parametrizando la longitud del comparador necesitaramos

    nicamente cambiar el parmetro de 8 a 16 para conseguir un

    comparador de 16 bits.

    Es recomendable verificar el funcionamiento de los mdulos descritos, para esto se recomienda utilizar archivos de comprobacin

    los cuales se pueden generar automticamente definiendo seales

    lgicas o escribiendo el cdigo en el mismo lenguaje HDL.

    El modulo TOP o el que contiene a los otros mdulos se recomienda mantenerlo lo ms pequeo como posible, es decir que contenga las

    instancias de los mdulos y las entradas y salidas necesarias.

    Por ultimo es bueno revisar despus del proceso de sntesis de los mdulos el esquema generados para verificar que lo que hemos

    descrito en HDL sea lo que habamos pretendido. Para esto ISE

    provee 2 opciones de visualizacin del esquema, el primero a nivel

    RTL el cual es genrico de acuerdo a la sntesis lgica y el segundo

    mas especifico de acuerdo a las tecnologas utilizadas de acuerdo a

    los dispositivos y libreras que utiliza la herramienta de sntesis

    lgica.

    5.2.1 Crear un nuevo proyecto.

    Se asume que el programa ISE se encuentra instalado y listo para ser

    utilizado. Con este antecedente en el men de programas buscamos la

    carpeta de xilinx ISE 8.x y buscamos Project Navigator este enlace abre el

    sistema de desarrollo ISE.

    La pantalla principal del ISE aparecer como se muestra en la figura 5.3.

    Indicados con nmeros se encuentran:

    (1). Barra de herramientas

    (2). Ventana de archivos fuentes

    (3). Ventana de procesos

    (4). rea de trabajo, reportes, simulacin, etc.

    (5). Ventana de actividades.

    114

  • Figura 5.3: Ventana principal de ISE.

    1. Vamos a File > New Project, aparecer la ventana de Project

    Wizard- Create New Project. En este cuadro introduciremos el

    nombre del proyecto que vamos a crear, la carpeta donde se alojara

    el proyecto y en el men de tipo de fuente para Top

    level,

    elegiremos HDL.

    2. El siguiente cuadro es el de las propiedades del dispositivo que

    vamos a utilizar para el diseo, sea este un FPGA o un CPLD.

    Escogemos de la lista la pieza adecuada, es recomendable revisar las

    hojas tcnicas de la pieza para poder seleccionar correctamente los

    parmetros de velocidad, empaquetaduras y categoras. Elegimos la

    herramienta de sntesis a XST (VHDL/Verilog) al igual que el

    simulador de acuerdo al que se tenga disponible. ISE Simulator

    (VHDL/Verilog) viene de paquete con el programa ISE. Tambin es

    posible obtener una versin compacta de ModelSim de Mentor

    Graphics llamada ModelSimXE que tiene muy buenas caractersticas.

    3. En la opcin para crear una nueva fuente seleccionamos nueva

    fuente (new source), de inmediato aparece una ventana con varias

    opciones, escogemos verilog Module y le asignamos un nombre. Al

    pulsar el botn de siguiente aparece un cuadro para definir los

    puertos de nuestro modulo, ah se deber escribir el nombre de las

    lneas de entrada y salida, as mismo definir la longitud de los

    vectores o si son escalares.

    115

  • 4. La siguiente ventana nos muestra un resumen de los parmetros

    definidos para nuestro modulo, si algo esta incorrecto se puede

    regresar para redefinir los parmetros.

    5. A continuacin se nos presenta una vez mas la ventana de creacin

    de nueva fuente, ah podremos ver el nombre de nuestro modulo

    recin definido. Si se desea incluir mas mdulos se debe repetir el

    proceso o tambin es factible aadir ms mdulos posteriormente.

    6. Por ultimo tenemos una ventana final de resumen donde se

    encuentran los mdulos y el detalle de parmetros para su revisin.

    Al pulsar el botn de finish, aparecer en la ventana de trabajo en

    cdigo Verilog la definicin del modulo recin creado con la

    descripcin de ingresos y salidas. Desde este punto podemos

    empezar a escribir el cdigo para nuestro sistema.

    En la ventana de archivos fuentes se podr ver tambin el modulo recin

    creado bajo el dispositivo que hemos escogido para el diseo.

    Si se requiere adicionar un nuevo modulo al sistema basta con posicionarse

    en la ventana de fuentes y con el botn derecho del ratn escogemos Add

    New Source o si ya tenemos un modulo creado la opcin Add Source, y

    seguimos los pasos ya antes vistos.

    Una vez definido y descrito el cdigo de nuestro modulo debemos primero

    verificar si tenemos errores de sintaxis, para ello usamos en la ventana de

    procesos la opcin implement design, extendemos las opciones y buscamos

    sinthesize > check syntax, mediante el uso del botn derecho del ratn

    corremos el proceso con run o Rerun.

    Es importante que en la ventana de archivos fuentes en la lista desplegable

    que esta en la parte superior se escoja la opcion Sntesis - Implementation.

    En la ventana de actividades en la pestaa console se podr ver los

    distintos procesos cuando son ejecutados, as mismo en caso de errores o

    mensajes de advertencia se pudran ver los detalles en las respectivas

    pestaas.

    Una vez corrido el proceso de verificacin de sintaxis, estamos listos para

    ejecutar la herramienta sntesis, que es el proceso de transformar el cdigo

    HDL en registros de transferencia de nivel o RTL, en este nivel el cdigo se

    convierte en elementos regidos por ecuaciones lgicas. Para correr el

    proceso de sntesis usamos botn derecho del ratn sobre Sinthesize- XST y

    seleccionamos Run o Rerun. De la misma manera los mensajes del proceso

    de sntesis y sus errores o advertencias pueden ser observados en la

    ventana de Consola y las respectivas especficas.

    116

  • Si el proceso de sntesis ha sido correcto se podr verificar el esquema

    generado por nuestro cdigo usando las opciones view RTL schematic o

    view Technology schematic. La primera opcin como ya se menciono nos

    muestra el circuito de forma general como se ve a nivel de RTL en forma de

    compuertas, registros etc. La otra opcin es mas especifica, muestra la

    forma de cmo se implementara fsicamente de acuerdo a los recursos del

    dispositivo que se utilice, a las libreras del sistema, etc. Este proceso es

    una forma mas especifica del dispositivo a usarse.

    Para simular nuestro sistema debemos contar con un archivo de pruebas,

    para esto se puede crear de 2 formas. La primera mas sencilla y

    recomendada para sistemas pequeos y personas menos diestras en el

    lenguaje HDL es utilizar la herramienta para crear formas de onda provista

    por ISE y la segunda crear un archivo de pruebas descrito en un lenguaje

    HDL, esta opcin da la facilidad al diseador de realizar las pruebas que el

    requiera y de la manera mas conveniente para el, pero se requiere de una

    mayor destreza y un manejo mas avanzado del lenguaje. En este caso se

    trabajara con la primera opcin.

    Para esto, en la ventana de archivos fuentes, seleccionamos del men

    desplegable behavioral simulation, sobre esta misma ventana mediante el

    botn derecho adicionamos una nueva fuente, la ventana de tipo de fuente

    aparecer y seleccionaremos Test Bench WaveForm, le asignaremos un

    nombre. A continuacin se nos preguntara a que modulo se desea

    relacionar estas formas de onda, seleccionaremos el modulo que deseamos

    en caso de existir mas. Por ultimo aparecer una ventana de sumario con

    los detalles.

    Una vez aceptado aparecer una ventana de configuracin de la forma de

    onda, parmetros para definicin de los periodos de reloj en caso de contar

    con uno o tiempos de respuesta pueden ser definidos en esta ventan,

    adems longitud de la prueba, entre otros parmetros. Una vez definido

    esto esta ventana cerrara y en el rea de trabajo aparecer un grafico de

    tiempos con las ondas definidas, al igual con las lneas de entrada y salidas

    especificadas en nuestro modulo. Mediante el uso del ratn se puede

    modificar niveles en entradas al modulo para acondicionar la prueba a

    nuestros requerimientos. Una vez terminado este proceso cerraremos la

    ventana de formas de onda y aceptaremos cuando se pregunte si

    deseamos grabar los cambios.

    Al cerrarse esta ventana notaremos que en la ventana de archivos fuentes

    se creo el archivo que definimos para la prueba y debajo de este se

    encuentra nuestro modulo el cual vamos a probar. En la ventana de

    procesos veremos una opcin llamado Xilinx ISE Simulator con 2 procesos,

    Generate expected simulation results, y simulate Behavioral model. Si

    corremos el primer proceso en la ventana de trabajo aparecer la forma de

    onda especificada por nosotros y veremos las salidas de nuestro modulo

    como se comportan ante las entradas definidas. La segunda opcin se

    117

  • utiliza para poder hacer un seguimiento paso a paso o continuo por las

    definiciones en nuestro cdigo HDL, tambin se presentara un diagrama de

    tiempos para su anlisis.

    Despus de haber realizado las pruebas necesarias para nuestro modulo y

    realizado las correcciones requeridas, el prximo paso seria implementar

    nuestro diseo en el dispositivo que se eligi usar. Para esto debemos

    definir las restricciones primero, para esto utilizamos la opcin User

    Constraints y corremos el proceso Assign package pins este abrir un

    programa llamado PACE en donde podemos asignar los pines a nuestras

    entradas y salidas de nuestro modulo, tambin podremos definir los niveles

    de voltaje y tipos como LVTTL, CMOS3.3, CMOS2.5 etc. Si requerimos tener

    colectores abiertos en las salidas entre otras opciones. Las restricciones

    abarcan una gran cantidad de propiedades que se pueden definir, mediante

    PACE nicamente seleccionamos las restricciones de emplazamiento en el

    chip. Restricciones de tiempos u otras ms avanzadas se las puede definir

    utilizando el editor de restricciones o describiendo en un archivo de texto

    las restricciones. Xilinx provee todo un manual completo sobre el uso y

    propiedades de las restricciones para usarlas tanto en FPGAs y CPLDs. Para

    nuestro propsito utilizaremos nicamente restricciones asignadas por

    PACE.

    Una vez definido nuestras restricciones, buscamos el proceso Implement

    Design, que abarca algunos procesos ya utilizados antes y algunos nuevos

    que nicamente se pueden correr si tenemos definidas nuestras

    restricciones, tales como Fit y Translate. El primero se encarga de encajar

    nuestro diseo en el dispositivo seleccionado utilizando las restricciones

    definidas y los archivos generados por Translate.

    Tambin se corre el proceso que genera los archivos de programacin para

    ser implementados en el CPLD o FPGA a travs del programa IMPACT. y el

    programa Impact y el respectivo cable de programacin JTAG.

    Esta breve explicacin constituye una pequea introduccin al uso del

    programa ISE y la implementacin de un diseo a travs de este programa.

    La documentacin existente para cada proceso y algunos no citados aqu es

    muy extensa. Es recomendable revisar esta informacin para obtener

    mayores detalles y caractersticas operativas de ISE.

    5.3 Ejemplos Prcticos.

    En este numeral se vern algunos ejemplos prcticos a manera didctica de

    tal forma que se pueda comprender mejor el proceso de diseo digital

    utilizando lenguaje HDL Verilog y el programa de desarrollo ISE.

    Los primeros ejemplos demostraran mdulos muy generales y tiles que

    sern posteriormente utilizados en otros ejemplos mas complejos.

    118

  • 5.3.1 Diseo de un decodificador de BCD a 7 Segmentos multiplexado

    para display de LED.

    Descripcin:

    Se requiere disear un decodificador - manejador para display de 7

    segmentos con entrada de BCD y salida de 7 segmentos multiplexados para

    cuatro digitos.

    Requerimientos:

    Ingreso formato BCD Salida 7 segmentos Activos a nivel lgico 0. Display nodo Comn.

    Salida de 4 bits para manejo de transistores PNP comunes.

    Diseo:

    para nodos

    Para lograr este diseo se ha dividido en partes al sistema, primeramente

    se ha creado un modulo llamado BCD7SEG que se encarga de codificar la

    entrada de BCD en cdigo 7 segmentos activo a nivel lgico 0. La tabla 5.1

    muestra el contenido de la tabla creada para la decodificacin.

    CODIGO BCD

    0000

    0001

    0010

    0011

    0100

    0101

    0110

    0111

    1000

    1001

    1010

    1011

    1100

    1101

    1110

    1111

    CODIGO 7 SEGMENTOS

    0000001

    1001111

    0010010

    0000110

    1001100

    0100100

    0100000

    0001111

    0000000

    0001100

    0001000

    1100000

    1110010

    1000010

    0110000

    0111000

    CARCTER

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    A

    B

    C

    D

    E

    F

    TABLA 5.1: Decodificador de BCD-7SEG para display

    El modulo de BCD7SEG utiliza una salida a tres estados que se logra con la

    seal de entrada de habilitacin "enable", cuando esta lnea se encuentra a

    nivel lgico 0 las salidas del decodificador se activan caso contrario

    permanecen en alta impedancia. El propsito de esto es de poder unir mas

    mdulos de este tipo de acuerdo al numero de displays que tenga el

    sistema y controlar mediante la activacin de "enable" cual de los mdulos

    ser activo.

    119

  • El modulo principal se lo ha denominado Display4BCD, este es nuestro

    modulo Top. El el se han creado los siguientes componentes: un divisor de

    frecuencia que divide la frecuencia del reloj de 1.8432 Mhz para 2048 es

    decir baja a una frecuencia de 900Hz que se utilizara para el refresco de los

    displays. Un registro de desplazamiento de 4 bits y un contador de 4

    estados que se encargan de la activacin de los transistores y 4 instancias

    del modulo BCD7SEG para manejo de cada uno de los dgitos.

    Se ha definido un vector de 16 bits que lleva la informacin de los datos

    BCD a cada uno de los displays, cada cuatro bits forman un dato, es decir

    para el decodificador 1 la informacin esta comprendida por el vector [0:3],

    para decodificador 2: [7:4], decodificador 3: [11:8] y para el decodificador

    4 : [15:11].

    Esquema de Bloques:

    16

    BCD[15:0] 7 7 7SEG

    BCD[3:0]

    BCD7SEG

    En

    CLK

    Divisor

    Cont

    /

    mux

    7 BCD[7:4]

    BCD7SEG

    En

    7 BCD[11:8]

    BCD7SEG

    En

    7

    BCD[15:12] BCD7SEG

    En

    D1

    D2

    D3

    D4

    Display4BCD

    FIGURA 5.4: Modulo Display4BCD

    Implementacin del cdigo Verilog HDL:

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    //Modulo Display 4 digitos, toma una entrada de 4 digitos en BDC

    //que ingresa por InBCD y la convierte en 7 segmentos para display

    //de cuatro digitos multiplexados el vector Data7Seg contiene la

    //informacion decodificada, el vector OutEnables contiene las lineas

    //de activacion para transistores en los displays. La frecuencia de

    //refresco viene dada por CLOCK y el registro divisor. Reset entrada

    //general de reset. Se crean 4 instancias de BCD a 7 Segmentos.

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    module Display4BCD(CLK, InBCD, OutEnables, Data7seg);

    parameter VALOR_DIVISOR = 12'd2048;

    input CLK;

    120

  • input [15:0]InBCD;

    output [3:0]OutEnables;

    output [6:0]Data7seg;

    reg [3:0]OutEnables = 4'b1110;

    reg [11:0]Divisor = 12'b0;

    reg [3:0]Auxiliar=4'b0001;

    BCD7SEG Digito1(OutEnables[0], InBCD[3:0], Data7seg);

    BCD7SEG Digito2(OutEnables[1], InBCD[7:4], Data7seg);

    BCD7SEG Digito3(OutEnables[2], InBCD[11:8], Data7seg);

    BCD7SEG Digito4(OutEnables[3], InBCD[15:12], Data7seg);

    always@(posedge CLK)

    if(Divisor == VALOR_DIVISOR-1)

    begin

    Divisor

  • 4'b0001 : Out7Seg
  • Simulaciones y pruebas:

    Para las simulaciones del sistema se defini un archivo tipo Test Bench

    utilizando el asistente que proporciona el programa ISE. En este archivo se

    defini el valor del reloj, y las entradas de comprobacin que en este caso

    es el patrn en BCD 16'h1234.

    FIGURA 5.7: Simulacin para mdulo Display4BCD

    Los resultados de las simulaciones se los pueden observar en la figura 5.7.

    Podemos ver que para cada valor de la habilitacin de las salidas o

    activacin de nodos comunes tenemos un valor del cdigo en BCD

    cumpliendo los requerimientos que tenamos.

    Hay que resaltar que el valor del divisor se redujo de tal forma que se

    facilite la simulacin del sistema. Esto se debe tener en cuenta el momento

    de realizar las pruebas en circuito real y colocar el valor correcto ya que al

    dejar el valor de pruebas el funcionamiento del display no ser

    el

    adecuado.

    Implementacin Fsica:

    Seal

    (Salida7Seg_6) A B

    C

    D

    E

    F

    G

    (Salida7Seg_0)

    Dir

    O

    O

    O

    O

    O

    O

    O

    Con A

    33

    34

    35

    36

    37

    38

    39

    Con B Con D CoolRunner II pin

    10

    9

    7

    6

    5

    4

    3

    123

  • OUT0

    OUT1

    OUT2

    OUT3

    CLK

    O

    O

    O

    O

    I

    19

    20

    21

    22

    -

    21

    22

    23

    24

    TABLA 5.2: Distribucin de pines y conectores Proyecto Display4BCD

    La implementacin fsica se la realizo de acuerdo a la tabla 5.2. El modulo

    Display4BDC necesita una seal de 16 bits en formato BCD como ingreso al

    modulo, lo que se hizo para efectos de prueba es definir internamente un

    vector de 16 bits al cual se le dio el valor de prueba 16'h0235 y se lo

    verifico en el kit de desarrollo y la placa de interfase, obtenindose los

    resultados esperados.

    5.3.2 Diseo de un decodificador de teclado de matriz de 3x4 teclas.

    Descripcin.

    Este diseo propone la implementacin de un decodificador para teclado de

    matriz de 3x4 teclas.

    Requerimientos.

    Manejo de teclado matriz de 4 filas por 3 columnas. Eliminacin del rebote de las teclas pulsadas. Almacenamiento de 4 cdigos en 4 registros. Seal de indicacin de tecla pulsada.

    Diseo.

    Para la implementacin del manejador de teclado matriz se ha dispuesto

    un modulo principal al cual se lo denomin KeyScan. Este modulo esta

    conformado por varios sub-modulos los cuales iremos detallando a

    continuacin.

    MTXdecoder, que realiza la funcin de generar un pulso en cada fila para el

    muestreo. Las lineas de las columnas del teclado son usadas como

    ingresos, cuando una tecla es pulsada este bloque recibe la informacin de

    la columna y verifica con la fila para establecer el valor de la tecla pulsada.

    Una compuerta OR recoge cualquiera de las seales de las columnas y

    activan la seal de Triegger del modulo monoestable que realiza la funcion

    de antirebotes, al recibir una seal activa a uno dispara un pulso que a su

    vez sirve como seal de entrada para un contador decodificador de 2 a 4 el

    cual habilita los slip-flop tipo D que capturan el valor del codigo. El modulo

    divisor divide la seal de reloj principal en 2 frecuencias F2 y F1 que es =

    F2/2 F2 es mas lenta y se usa para generar la base de tiempo del

    muestreo.

    124

  • En la figura 5.6 podemos observar el diagrama de bloques del modulo

    decodificador de teclado matriz.

    Esquema de Bloques:

    1

    4

    7

    A

    2

    5

    8

    0

    3

    6

    9

    C

    F1 F2 F3 F4

    C1 C2 C3

    MTXDecoder

    F1

    F2

    F3

    F4

    Q0

    Q1

    Q2

    Q3

    Registro

    C1

    C2

    C3

    CLK

    D0

    D1

    D2

    D3

    En

    Q0

    Q1

    Q2

    Q3

    Q0

    Q1

    Q2

    Q3

    Contador - Decoder

    Registro

    O_1

    O_2

    O_3

    O_4

    D0

    D1

    D2

    D3

    Q0

    Q1

    Q2

    Q3

    Q4

    Q5

    Q6

    Q7

    CLK

    En

    Divisor

    CLKO_2 Registro

    CLK CLK

    CLKO_1

    D0

    D1

    D2

    D3

    En

    Q0

    Q1

    Q2

    Q3

    Q8 Q9

    Q10

    Q11

    Monoestable

    CLK

    Pulso

    Trigger

    Registro

    D0

    D1

    D2

    D3

    En

    Q 0

    Q1

    Q2

    Q3

    Q12

    Q13

    Q14

    Q15

    KEYSCAN RDY

    FIGURA 5.6: Modulo KeyScan, manejador de teclado matriz.

    Implementacin del cdigo Verilog HDL:

    module KeyScan(CLK, FILAS, COLUMNAS, Q, PULSEOUT);

    input CLK;

    output PULSEOUT;

    output [15:0]Q;

    wire [3:0]Q1;

    wire [3:0]Q2;

    wire [3:0]Q3;

    wire [3:0]Q4;

    wire CLK2;

    wire CLK1;

    output [3:0]FILAS;

    input [2:0] COLUMNAS;

    wire [3:0] OUTCODE;

    //Frecuencia / para h4000

    //Frecuencia / para h2000

    125

  • wire TRIGGER;

    wire [3:0] EnFFD;

    wire RDY;

    wire Disable;

    assign TRIGGER = |COLUMNAS;

    assign Q[3:0] = Q1;

    assign Q[7:4] = Q2;

    assign Q[11:8] = Q3;

    assign Q[15:12] = Q4;

    PulseGen PULSE(CLK1, TRIGGER, PULSEOUT);

    MTXDecoder MTX(CLK2, FILAS, COLUMNAS, OUTCODE);

    Divisor DIV(CLK, CLK1, CLK2);

    Habilitador SHIFT2(PULSEOUT, EnFFD);

    FFD FF1(OUTCODE, EnFFD[0], Q1);

    FFD FF2(OUTCODE, EnFFD[1], Q2);

    FFD FF3(OUTCODE, EnFFD[2], Q3);

    FFD FF4(OUTCODE, EnFFD[3], Q4);

    endmodule

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // Modulo decodificador de teclado, utiliza un contador de 4 estados y un

    // decodificador de 2 a 4 para generar el pulso de salida para las filas. En

    // las columnas recibe la informacin si una tecla ha sido pulsada y la decodifica

    //colocando el valor del codigo en OUTCODE

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    module MTXDecoder(CLK ,FILAS, COLUMNAS, OUTCODE);

    input CLK;

    output [3:0]FILAS;

    input [2:0]COLUMNAS;

    output reg [3:0]OUTCODE = 4'b0;

    reg [1:0]Contador = 2'b0;

    Selector2a4 LS139(Contador, FILAS);

    always @(posedge CLK)

    begin

    if(Contador==2'd3)

    Contador

  • always @(negedge CLK)

    begin

    case(Contador)

    0: begin

    case(COLUMNAS)

    1: OUTCODE

  • 2:

    3:

    endcase

    endmodule

    Salida

  • input CLK;

    output reg CLKOUT1=1;

    output reg CLKOUT2=1;

    reg [17:0]Cont = 18'b0;

    parameter VALORDIVISOR2 = 15'h4000;//16384;//1KHz fecuencia de muestreo

    parameter VALORDIVISOR1 = VALORDIVISOR2/2;//15'h2;

    always @(posedge CLK)

    begin

    if(Cont == (VALORDIVISOR1-1))

    begin

    CLKOUT1

  • endmodule

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // Modulo que sintetiza un FLIP-FLOP tipo D de cuatro canales.

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    module FFD(D, Enable, Q);

    input [3:0]D;

    input Enable;

    output reg [3:0]Q = 4'b0;

    always @(Enable)

    if(Enable)

    Q

  • correcto funcionamiento de cada parte se realizo un archivo Test Bench del

    modulo KeyScan. Para la simulacin se bajaron los tiempos del divisor de

    4'h4000 a 4'h4. El estimulo en las columnas se lo realizo para el codigo "A"

    y el codigo 0, los resultados podemos observarlos

    cumpliendo con los requerimientos impuestos.

    en la figura 5.10,

    FIGURA 5.10: Simulacin modulo KeyScan, manejador de teclado matriz.

    Implementacin Fsica:

    Seal

    A (Salida7Seg_6)

    B

    C

    D

    E

    F

    G (Salida7Seg_0)

    OUT0

    OUT1

    OUT2

    OUT3

    CLK

    COLUMNAS0

    COLUMNAS1

    COLUMNAS2

    FILAS0

    FILAS1

    FILAS2

    FILAS3

    PULSEOUT

    Dir

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    I

    I

    I

    I

    O

    O

    O

    O

    O

    Con A

    33

    34

    35

    36

    37

    38

    39

    19

    20

    21

    22

    -

    Con B Con D

    5

    6

    7

    10

    11

    12

    13

    14

    CoolRunner pin

    10

    9

    7

    6

    5

    4

    3

    21

    22

    23

    24

    142

    140

    139

    136

    135

    134

    133

    132

    TABLA 5.3: Distribucin de pines y conectores proyecto KeyScan

    Para poder verificar el funcionamiento fsico del sistema se utiliz una

    instancia del modulo Display4BCD conectado a la salida del modulo

    KeyScan, los pines del CPLD y los respectivos conectores y seales se

    131

  • muestran en la tabla 5.3, El resultado de la prueba fue acorde a lo

    esperado.

    5.3.3 Diseo de un contador sncrono visualizado, pulsante de

    inicio/paro, reset, selector de arriba/abajo, selector de conteo

    Lento/Rpido y carga por teclado.

    Descripcin.

    Se requiere disear un contador sncrono MOD1000 con entrada para un

    pulsante de inicio/paro, entrada de reset y salida para visualizacin en un

    display de 4 dgitos a 7 segmentos, tambin debe poseer una entrada de

    selector de conteo arriba/abajo y capacidad de carga por teclado.

    Requerimientos.

    Selector de Inicio/Paro Selector de conteo Rpido/Lento Selector de conteo Arriba/Abajo Entrada de Reset. Numero MOD 10000 Posibilidad de carga por teclado Visualizacin en display de LED 7 segmentos.

    Diseo.

    Para lograr el diseo se ha dividido al circuito en 4 partes, modulo GenCLK,

    que se encarga de dividir la frecuencia de acuerdo a la entrada R/L

    (Rapido/Lento), modulo Display4BCD, que es el encargado de realizar el

    manejo del display de 7 segmentos, modulo KeyScan que maneja el teclado

    matricial de 3x4 y modulo contador que es el encargado de realizar el

    conteo, este modulo trabaja en BCD directamente, realiza conteo

    arriba/debajo de acuerdo a la seal Ar/Ab.

    La salida del modulo contador va directamente al modulo Display4BCD para

    la visualizacin. Este modulo tambin recibe la informacin del modulo

    KeyScan que modifica directamente el valor de los contadores para realizar

    la carga por teclado.

    132

  • Esquema de Bloques:

    DISPLAY 7 segmentos CLK 1

    7

    GenCLK R/L 1

    Display4BCD

    4

    1

    RST 1 16

    Hab 1 Contador BCD

    MOD 1000 CLK

    4 Ar/Ab 1 16

    KeyScan

    1

    4

    7

    A

    2

    5

    8

    3

    6

    9

    0 C 3

    Contador

    FIGURA 5.11: Esquema en bloques Modulo Contador.

    Implementacin:

    En el codigo descrito a continuacin no se ha incluido el cdigo de los

    mdulos Display4BCD y KeyScan ya que estos ya fueron descritos

    anteriormente, solamente se encuentra las instancias de estos.

    Cdigo Verilog.

    //////////////////////////////////////////////////////////////////////////////

    //Modulo principal del sistema, incluye el contador,

    //el modulo de visualizacion, control de teclado matriz

    // y generador de frecuencias de conteo que es un divisor

    // de la frecuencia del reloj en 2 frecuencias para alimentar

    // al contador

    //////////////////////////////////////////////////////////////////////////////

    module TOP(CLK, UpDn, ResetG, Enable, SlowFast, OutEnab, Salida7seg,

    FILAS, COLUMNAS, PULSEOUT, Carga);

    input CLK;

    input ResetG;

    input UpDn;

    input Enable;

    input SlowFast;

    133

  • output [3:0] OutEnab;

    output [6:0] Salida7seg;

    wire [15:0] Salida;

    wire InCONT;

    wire ResetG;

    wire OUTCLK;

    output [3:0]FILAS;

    input [2:0]COLUMNAS;

    wire [15:0]Q;

    output PULSEOUT;

    wire PULSEOUT;

    input Carga;

    assign InCONT = OUTCLK;

    Contador CONT(InCONT, UpDn, ResetG, Enable, Salida, Q, PULSEOUT);

    Display4BCD Display(CLK, Salida, OutEnab, Salida7seg);

    GenFrec GENCLOCK(CLK, SlowFast, OUTCLK);

    KeyScan KEYPAD(CLK, FILAS, COLUMNAS, Q, PULSEOUT);

    Endmodule

    //////////////////////////////////////////////////////////////////////////////////////////

    //Contador sincrono con entrada Habilitacion, reset,

    //cuenta mientras la habilitacion este en estado 1 y hasta un

    //maximo definido en el parametro MAX_CONTEO.

    //Cuenta en BCD en vector Contador de 16 bits

    /////////////////////////////////////////////////////////////////////////////////////////

    module Contador(InCONT, UpDn, Reset, Enable, Contador, Q, Carga);

    parameter MAX_CONTEO = 16'b1001_1001_1001_1001;

    input InCONT;

    input Reset;

    input UpDn;

    input Enable;

    output [15:0] Contador;

    reg [15:0] Contador;

    input [15:0]Q;

    input Carga;

    initial

    Contador[15:0]=16'b0000_0010_0011_0101;

    134

  • always@(posedge InCONT or posedge Reset or posedge Carga)

    begin

    if(Reset)

    Contador [15:0]

  • begin

    if(Contador == 0)

    Contador

  • parameter DIVISOR_SLOW = 20'd230400;

    parameter DIVISOR_FAST = DIVISOR_SLOW / 4;

    input CLK;

    input SlowFast;

    output reg OUTCLK;

    reg [19:0]Divisor = 20'b0;

    always@(posedge CLK)

    if(SlowFast)

    begin

    if(Divisor == DIVISOR_SLOW)

    begin

    OUTCLK

  • FIGURA 5.13a: Esquema esquemtico Modulo Contador generado por XST.

    Simulaciones y pruebas:

    En las figuras 5.14 a y 5.14b se muestran los diagramas de tiempos para el

    contador. Ntese que el valor de Q posee el valor para la carga del

    contador. El valor inicial del contador se lo a fijado en 16'd565 y al valor de

    la carga en 16'd4660, equivalente a 16'h1234.

    FIGURA 5.14a: Esquema esquemtico Modulo Contador generado por XST

    FIGURA 5.14b: Esquema esquemtico Modulo Contador generado por XST

    Este diagrama de tiempos solo refleja el comportamiento del contador

    como tal, no estn considerados los diagramas para los mdulos de display,

    138

  • teclado y divisor ya que estos ya se han probado en funcionamiento

    anteriormente.

    Implementacin Fsica:

    Seal

    A (Salida7Seg_6)

    B

    C

    D

    E

    F

    G (Salida7Seg_0)

    OUT0

    OUT1

    OUT2

    OUT3

    CLK

    Carga

    ResetG

    UpDn

    Enable

    SlowFast

    OutCLK

    COLUMNAS0

    COLUMNAS1

    COLUMNAS2

    FILAS0

    FILAS1

    FILAS2

    FILAS3

    PULSEOUT

    Dir

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    I

    I

    I

    I

    I

    I

    O

    I

    I

    I

    O

    O

    O

    O

    O

    Con A

    33

    34

    35

    36

    37

    38

    39

    19

    20

    21

    22

    -

    6

    7

    8

    11

    10

    40

    Con B Con D

    5

    6

    7

    10

    11

    12

    13

    14

    CoolRunner pin

    10

    9

    7

    6

    5

    4

    3

    21

    22

    23

    24

    41

    39

    40

    35

    34

    2

    142

    140

    139

    136

    135

    134

    133

    132

    TABLA 5.4: Distribucin de pines y conectores proyecto Contador

    En la tabla 5.4 podemos observar en los pines utilizados para la

    implementacin del contador, ntese que se ha implementado restricciones

    en el posicionamiento de los pines, es decir se ha asignado para cada

    modulo que hemos venido creando pines del CPLD y acorde a nuestros

    nuevos requerimientos hemos adicionado diferentes entradas o salidas al

    sistema.

    En las pruebas fsicas implementadas en el kit de desarrollo XC2-XL y la

    placa de interfase se pudo comprobar el correcto funcionamiento del

    sistema implementado.

    5.3.4 Diseo de un controlador para motor de pasos.

    139

  • Descripcin.

    En esta aplicacin se disear un controlador simple para un motor de

    pasos de 4 fases unipolar. Este controlador realizara funciones simples

    como generacin de las seales para las bobinas, movimiento adelante,

    atrs y habilitacin y des-habilitacin de las salidas al modulo de potencia.

    Todas estas funciones se realizaran en modo "FULL-STEP" o de paso

    completo.

    Para efectos de prueba del controlador de motor de pasos se creara un

    modulo de pruebas el cual realizar las funcion siguiente:

    Arranque adelante del motor en velocidad lenta, llegado a los h500 pulsos

    el motor se acelera al doble de la velocidad de arranque hasta llegar a los

    h999, momento en el cual cambia de direccin, llega nuevamente a los 500

    pulsos y desacelera hasta llegar a 0 donde comienza nuevamente la

    secuencia. Para visualizar el proceso se utilizara una instancia del modulo

    Display4BCD y se creara un contador Up/Dn.

    Requerimientos.

    Manejo de Motor pasos unipolar de 4 fases. Generacin de secuencias para desplazamiento adelante y atrs en

    paso completo.

    Ingreso de una sola seal de reloj o pulsos. Seal de habilitacin de las salidas. Modulo de prueba para el motor Visualizacin del modulo de prueba en display 4 dgitos LED.

    Diseo.

    Los motores de pasos unipolares de 4 fases poseen 2 bobinados con

    una

    toma central que comnmente es alimentada con una tensin positiva.

    B B

    A

    A

    FIGURA 5.15: Motor De pasos Unipolar de 4 fases

    140

  • La figura 5.15 muestra el diagrama de un motor de pasos unipololar de 4

    fases.

    Para el manejo de este tipo de motores utilizaremos un driver de potencia

    ULN2803 el cual posee 8 salidas tipo colector abierto de 0.5A cada una a 40

    VDC.

    El esquema reducido de conexin para el driver y el motor se muestra en la

    figura 5.16. Vm

    Drv Motor Pasos

    CLK A/R Hab.

    A

    A

    B

    B

    FIGURA 5.16: Motor De pasos Unipolar de 4 fases

    El modulo que se ha creado para manejar el motor de pasos se lo a

    denominado MotorDriver , este modulo recibe la entrada de los pulsos a

    travs de una seal denominada CLK, el modulo realiza la secuencia de que

    alimentar a los drivers de cada fase, que para paso completo o Full-Step

    se logra alimentando cada bobina contigua a la vez por un periodo de

    tiempo que en este caso vendr dada por el tiempo en alto del pulso de

    CLK. Si la seal de A/R esta en 1 la secuencia ser en sentido horario, y si

    es 0 la secuencia ser en sentido anti-horario esto determinara el giro del

    motor adelante o atrs.

    Si la seal de Enable esta habilitada siempre existir una bobina del motor

    alimentada manteniendo la posicin, si Enable va a 0 todas las bobinas del

    motor sern deshabilitadas.

    Esquema de Bloques.

    141

  • DISPLAY 7 segmentos

    1 CLK

    7Seg

    Display4BCD

    Enb

    InBCD

    Divisor

    CLK

    7

    4

    SloFst CLK2

    16

    1

    1

    Contador

    Pulsos

    SloFst U/D

    Contador Drv Motor Pasos

    CLK

    A/R Hab.

    A

    A

    B

    B

    U/D 1

    Comparadores M

    ModuloTOP

    FIGURA 5.17: Esquema de Bloques para modulo prueba de Motor Pasos

    Implementacin:

    //////////////////////////////////////////////////////////////////////////////////

    // Modulo de Prueba para modulo control de motor de pasos

    // genera 2 frecuencias a partir de la frecuencia del

    // reloj del sistema, se escoge la frecuencia con la seal

    // SloFast. Se utiliza modulos de display, contadores sincronos

    // y el divisor de frecuencia, y el modulo de prueba MotorDriver

    //////////////////////////////////////////////////////////////////////////////////

    module ModuloTOP(CLK, OutEnab, Data7seg, OUTREG, Reset, CLK2);

    input CLK, Reset;

    output [3:0]OutEnab;

    output [6:0]Data7seg;

    output CLK2;

    wire [15:0] Contador;

    wire CLK;

    wire CLK2;

    reg SloFast=0;

    reg Enable=1;

    reg F_R=1 ;

    output [3:0]OUTREG;

    reg [15:0] ValorMAX =16'd16;

    reg [15:0] ValorMED =16'd8;

    reg Top=0;

    142

    r

    Drive

  • Display4BCD DISP1(CLK, Contador, OutEnab, Data7seg);

    DivisorFrec DIV1(CLK, SloFast, CLK2);

    MotorDriver MOT1(CLK2, Enable, OUTREG, F_R);

    ContadorSinc CONT1(CLK2, Enable, Reset, F_R, Contador);

    always @*

    if(Reset)

    begin

    SloFast

  • always@(posedge CLK)

    begin

    if(SloFast)

    begin

    if(Divisor >= SLO_PARAM1-1)

    begin

    Divisor = SLO_PARAM2-1)

    begin

    Divisor

  • wire [3:0]OUTR;

    reg [1:0] aux_cont = 2'b0;

    Selector2a4 LS139(aux_cont, OUTR);

    assign OUTREG[0] = (Enable)?(OUTR[2] & CLK):0;

    assign OUTREG[1] = (Enable)?(OUTR[3] & CLK):0;

    assign OUTREG[2] = (Enable)?(OUTR[0] & CLK):0;

    assign OUTREG[3] = (Enable)?(OUTR[1] & CLK):0;

    always @(posedge CLK)

    if(F_R)

    aux_cont

  • else

    begin

    if(Contador[3:0]== 9)

    begin

    Contador[3:0]

  • begin

    Contador[11:8]

  • Implementacin Fsica:

    Seal

    A (Salida7Seg_6)

    B

    C

    D

    E

    F

    G (Salida7Seg_0)

    OUT0

    OUT1

    OUT2

    OUT3

    CLK

    Reset

    OUTREG0

    OUTREG1

    OUTREG2

    OUTREG3

    CLK2

    Dir

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    O

    I

    I

    O

    O

    O

    O

    O

    Con A

    33

    34

    35

    36

    37

    38

    39

    19

    20

    21

    22

    -

    7

    Con B Con D

    36

    37

    38

    39

    40

    CoolRunner pin

    10

    9

    7

    6

    5

    4

    3

    21

    22

    23

    24

    39

    105

    104

    103

    102

    101

    TABLA 5.5: Distribucin de pines y conectores proyecto Motor Pasos

    5.4 Aplicacin Global: Manejo de un panel de LEDs. 5.4.1 Introduccin.

    En los numerales anteriores se revisaron algunos ejemplos prcticos de diseo digital de hardware. En este numeral se plantea el diseo de un controlador para un panel de LEDs. bsicamente, esta fu la razn que motiv el desarrollo del tema del diseo de hardware utilizando el lenguaje descriptivo Verilog como tema de esta tesis.

    Paneles de mensaje variable y paneles grficos basados en diodos emisores de luz (LEDs), en la actualidad son muy populares. Uno de los mtodos mas comunes para manejo de tableros de mensajes variables o paneles grficos es el esquema de multiplexaje de matrices de leds dispuestos en paneles.

    El multiplexaje puede tener algunas variantes, entre los mas utilizados estn multiplexaje a 2, 4, 8 y algunos ingenieros utilizan valores superiores.

    El manejo de paneles multiplexados tiene algunas ventajas en contraste con los sistemas de manejo directo, entre algunas de estas ventajas podemos citar: reduccin del consumo de potencia, por lo tanto reduccin

    148

  • del tamao de las fuentes de alimentacin, reduccin del numero de

    manejadores o drivers para los LEDs, reduccin de los tamaos de los

    circuitos Impresos etc.

    As como presenta ventajas, estas no vienen gratis, un sistema

    multiplexado compromete en algo el brillo del panel, adems demanda una

    velocidad de procesamiento mucho mayor, especialmente en paneles

    grandes en los cuales las ratas de refresco de la pantalla son elevadas.

    Entonces, uno de los principales problemas, se convierte la velocidad de

    procesamiento del sistema, el cual generalmente posee un procesador

    central que se encarga de leer los datos de una memoria, procesar la

    informacin y enviarla a los respectivos manejadores de cada panel. En

    cada panel debe existir un manejador que pueda tomar la informacin y

    realizar el multiplexaje de la informacin. En controles mas precisos estos

    manejadores tambin controlan la iluminacin del panel y algunos casos

    realizan controles de escalas de grises o controles RGB.

    Los manejadores comerciales existen de muchos tipos, de interfase serial,

    paralela, con control de intensidad de corriente, iluminacin etc. Pero cada

    uno de ellos esta diseado para trabajar con un procesador o dispositivo

    principal, que controle la operacin de estos y si se requiere multiplexaje el

    uso de un procesador adicional es prcticamente obligatorio.

    Es por eso que se plantea el diseo de un controlador autnomo para un

    panel multiplexado. El diseo aqu expuesto sirve como gua para desarrollo

    de futuros controladores mas complejos que puedan incluso realizar el

    manejo de escalas de grises mediante el uso de modulacin del ancho de

    pulso o PWM.

    5.4.2 Descripcin.

    Antes de explicar el diseo del controlador es necesario dejar algunos

    conceptos en claro. Un tablero de LEDs esta formado por varios mdulos, y

    estos mdulos a su vez por varios paneles. Cada panel es un arreglo de n x

    m LEDs de acuerdo al criterio de cada diseador. De acuerdo al esquema

    de manejo del panel puede un tablero poseer uno o varios procesadores.

    El controlador del panel de LEDs multiplexado se ha diseado para

    controlar un panel formado por una matriz de 6 x 8 LEDs, el diseo puede

    ser acoplado para matrices mas grandes de acuerdo a las necesidades y

    capacidades del hardware utilizado.

    El concepto para el desarrollo de este manejador es el de eliminar el

    procesador de cada panel encargado de realizar las funciones de

    comunicacin y manejo de la matriz de leds, y reemplazar por

    un

    controlador que se interfase directamente al procesador principal de

    149

  • manera paralela (o serial si se quisiera), en las que la tasa de transferencia

    es muy elevada, realizar el multiplexaje de los leds manejando los circuitos

    drivers para las fuentes y colocando los datos correspondientes a la

    informacin enviada en los drenadores.

    En la figura 5.19 se muestra un diagrama de bloques del manejador de

    panel. El controlador se lo ha diseado con una interfase paralela de 8 bits.

    Posee 2 seales de control WR y Stb que se utiliza para almacenar y

    actualizar la informacin del panel.

    El controlador del panel esta formado por las siguientes partes:

    Interfase de comunicacin paralela de 8 bits Memoria (buffer In) de 8 bits x 6 para recepcin de la informacin

    del panel desde el dispositivo master.

    Memoria de actualizacin (buffer Out) de 8 bits x 6 de donde se toma la informacin para ser desplegada en el panel de acuerdo a

    un contador de 6+ estados. Esta informacin maneja los drivers

    para las columnas del panel.

    Divisor de frecuencia de reloj que trabaja a 1Khz, que alimenta a un registro de desplazamiento que maneja los drivers para las filas del

    panel y as realizar el muestreo.

    5.4.2 Descripcin de los pines.

    Datos (d0..d7)

    Bus de datos por donde el controlador recibe la informacin del procesador

    principal.

    WR.

    Seal de escritura sensible al flanco de subida, mediante un pulso positivo

    la informacin presente en las lneas de d0..d7 se almacenan en la memoria

    de ingreso BufferIn. El puntero de la memoria de ingreso se incrementa con

    cada flanco de subida y se restablece a 0 al recibir un pulso extra en esta

    lnea.

    Stb.

    Seal de actualizacin de la memoria, un pulso positivo en esta lnea causa

    que la informacin que se encuentra en la memoria de ingreso Buffer in sea

    copiada a la memoria de actualizacin BufferOut.

    Es importante que toda la informacin correspondiente a todo el panel sea

    cargada en la memoria de ingreso ya que de otra manera se podra

    mostrar informacin errnea.

    150

  • VLED

    F1

    F2

    F3

    F4

    F5

    F6

    DRV FILAS

    C7 C6 C5 C4 C3 C2 C1 C0

    Manejador Columnas

    Buffer Out (8 bits)

    F1 F2 F3 F4 F5

    F6

    DatoOut 0 DatoOut 1 DatoOut 2

    DatoOut 3

    DatoOut 4

    DatoOut 5

    Divisor /

    selector 0 1 2 3 4

    5

    Buffer In (8 bits)

    DatoIn 0

    DatoIn 1

    DatoIn 2

    DatoIn 3

    DatoIn 4

    DatoIn 5

    Cristal

    1.832Mhz Interfase Com.

    Controlador de panel

    FIGURA 5.19: Controlador de panel de LEDs

    5.4.3

    F1-F6

    Lneas de salida, activas a nivel bajo, estas lneas se conectan a los drivers

    de fuente que alimentan a los nodos de los LEDs.

    C1-C8

    Lneas de salida, activas a nivel lgico bajo, estas lneas se conectan a los

    drivers drenadores. Los ctodos de los LEDs deben conectarse a los

    drenadores.

    Funcionamiento.

    El controlador de panel debe ser controlado por el procesador principal

    mediante 10 lneas, 8 de datos y 2 de control la operacin del controlador

    151

    s

    a

    Fil

    r

    d

    o

    ja

    Ma

    ne

    as

    V

    mn

    u

    DR

    Co

    l

    d7

    d0

    Stb

    WR

  • se realiza de acuerdo a la tabla 5.6. Los estados indicados con una flecha

    ascendente indican que la seal es sensible al flanco.

    ESTADO

    Inactivo

    Escribir Dato

    Actualizar Datos

    Reset Dispositivo

    WR

    L

    H

    L

    H

    Stb

    L

    L

    H

    H

    Notas

    Realiza operacin de actualizacin de pantalla

    Debe recibir 6 pulsos/dato + 1 de actualizacin

    Actualiza Buffer Out con datos de Buffer In

    Reinicia al dispositivo

    TABLA 5.6: Operacin del controlador de panel de LEDs

    En operacin normal el dispositivo debe ser colocado en estado inactivo, en

    este estado el controlador realiza operaciones de actualizacin de la

    pantalla, tomando la informacin de la memoria BufferOut y colocndola en

    el puerto de salida del manejador de columnas. La informacin en el puerto

    es invertida. Un contador de 6 estados se encarga de sincronizar los datos

    de la memoria de salida hacia los drivers de columnas y el registro de

    desplazamiento que maneja los drivers de filas.

    D7 D0

    Byte 0

    Byte 1

    Byte 2

    Byte 3

    Byte 4

    Byte 5

    FIGURA 5.20: Disposicin memoria de ingreso y salida con respecto a la matriz de LEDS

    La actualizacin de los dato se realiza mediante el contador de 6 estados de

    acuerdo a la tabla 5.7.

    Contador Estados

    0

    1

    2

    3

    4

    5

    Posicin Memoria

    (Columnas)

    ~Byte 0

    ~Byte 1

    ~Byte 2

    ~Byte 3

    ~Byte 4

    ~Byte 5

    Reg. Desplazamiento

    F1 (111110)

    F2 (111101)

    F3 (111011)

    F5 (110111)

    F5 (101111)

    F6 (011111)

    TABLA 5.7: Operacin del controlador de panel de LEDs

    En la figura 5.21 podemos ver el diagrama de tiempos para los ciclos de

    escritura en la memoria de ingreso, actualizacin de la memoria de salida

    con los datos escritos en la memoria de ingreso y los ciclos de actualizacin

    o el barrido de la pantalla con los datos de la memoria BufferOut.

    152

  • WR

    D7-D0

    Str

    C. Est.

    B.Out

    F1

    F2

    F3

    F4

    F5

    F6

    X0 X1 X2 X3 X4 X5 X6

    B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B

    0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1

    2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0

    B B X X X

    1 2 3

    4 5

    X X X X X X

    0 1 2

    3 4 5

    B

    0

    B B

    1

    2

    FIGURA 5.21: Ciclos de escritura, actualizacin y barrido para controlador de panel

    5.4.4 Implementacin del controlador.

    Para implementar el controlador para manejo del panel de LEDs

    multiplexado se utiliz el kit de desarrollo XC2-XL con el CPLD XC2C256-144

    y la placa de interfase. Adicionalmente se implemento mediante el uso de

    una baseta de pruebas un circuito de interfase de potencia para

    interconexin con el panel de LEDs. A continuacin se muestra las

    diferentes partes del diseo.

    Codigo Verilog.

    ///////////////////////////////////////////////////////////////////////////////////////////////////

    // Modulo Top controlador de panel de 6x8 para panel multiplexado

    // de LEDs.

    // ////////////////////////////////////////////////////////////////////////////////////////////////

    module TopLedDrv(CLK, RESET, DataIn, WR, Stb, DataOut, OutSources);

    input CLK, RESET;

    input [7:0] DataIn;

    input WR, Stb;

    //PC

    //PC

    output [7:0] DataOut; //LED

    output [5:0] OutSources;

    wire [5:0] OutN;

    assign OutSources = ~OutN;

    //LED

    153

  • Divisor DIV1(CLK, CLKOUT);

    Refresco REF1(CLKOUT, RESET, DataIn, WR, Stb, DataOut, OutN);

    endmodule

    ///////////////////////////////////////////////////////////////////////////////////////////////////

    // Modulo Divisor

    // Divide la frecuencia de entrada para obtener frecuencia de muestreo

    // cristal utilizado 1.8432 Mhz.

    // Frecuencia de muestreo 1KHz.

    // ////////////////////////////////////////////////////////////////////////////////////////////////

    module Divisor(CLK, CLKOUT);

    input CLK;

    output reg CLKOUT=0;

    reg [17:0]Cont = 18'b0;

    parameter VALORDIVISOR = 16'd1843; //1843

    always @(posedge CLK)

    begin

    if(Cont == (VALORDIVISOR-1))

    begin

    CLKOUT

  • output reg [MEMLONG-1:0]OutSources=6'b1000;

    reg [ADDRZISE-1:0] AddrIn = 0;

    reg [ADDRZISE-1:0] AddrOut = 0;

    //2:0

    reg [WORDSIZE-1:0] RegistroIn [0:MEMLONG-1];

    reg [WORDSIZE-1:0] RegOut [0:MEMLONG-1];

    initial

    begin

    RegOut[0]=1;

    RegOut[1]=2;

    RegOut[2]=3;

    RegOut[3]=4;

    RegOut[4]=5;

    RegOut[5]=6;

    RegistroIn[0]=0;

    RegistroIn[1]=0;

    RegistroIn[2]=0;

    RegistroIn[3]=0;

    RegistroIn[4]=0;

    RegistroIn[5]=0;

    OutSources=6'b1000;

    AddrIn = 0;

    end

    //7:0

    //7:0

    /*********** Carga de Datos **************************/

    always@(posedge WR)

    if(Stb==0)

    begin

    if(AddrIn >= MEMLONG)

    AddrIn

  • AddrOut = MEMLONG-1)

    begin

    AddrOut

  • Asignacin de pines

    La lista siguiente muestra el detalle de las lneas utilizadas en el diseo, se

    puede observar el nombre de la lnea, el estndar utilizado, el numero de

    pin asignado y el numero de conector del puerto "D" del Kit de desarrollo

    que se utiliz para la implementacin.

    NET "CLK" LOC = "P38" | IOSTANDARD = LVTTL | SCHMITT_TRIGGER ; NET "DataIn" LOC = "P53" | IOSTANDARD = LVTTL ;#D32 NET "DataIn" LOC = "P52" | IOSTANDARD = LVTTL ;#D33 NET "DataIn" LOC = "P51" | IOSTANDARD = LVTTL ;#D34 NET "DataIn" LOC = "P50" | IOSTANDARD = LVTTL ;#D35 NET "DataIn" LOC = "P49" | IOSTANDARD = LVTTL ;#D36 NET "DataIn" LOC = "P48" | IOSTANDARD = LVTTL ;#D37 NET "DataIn" LOC = "P46" | IOSTANDARD = LVTTL ;#D38 NET "DataIn" LOC = "P45" | IOSTANDARD = LVTTL ;#D39 NET "DataOut" LOC = "P68" | IOSTANDARD = LVTTL ;#D22 NET "DataOut" LOC = "P66" | IOSTANDARD = LVTTL ;#D23 NET "DataOut" LOC = "P64" | IOSTANDARD = LVTTL ;#D24 NET "DataOut" LOC = "P61" | IOSTANDARD = LVTTL ;#D25 NET "DataOut" LOC = "P60" | IOSTANDARD = LVTTL ;#D26 NET "DataOut" LOC = "P59" | IOSTANDARD = LVTTL ;#D27 NET "DataOut" LOC = "P58" | IOSTANDARD = LVTTL ;#D28 NET "DataOut" LOC = "P57" | IOSTANDARD = LVTTL ;#D29 NET "OutSources" LOC = "P76" | IOSTANDARD = LVTTL ;#D16 NET "OutSources" LOC = "P75" | IOSTANDARD = LVTTL ;#D17 NET "OutSources" LOC = "P74" | IOSTANDARD = LVTTL ;#D18 NET "OutSources" LOC = "P71" | IOSTANDARD = LVTTL ;#D19 NET "OutSources" LOC = "P70" | IOSTANDARD = LVTTL ;#D20 NET "OutSources" LOC = "P69" | IOSTANDARD = LVTTL ;#D21 NET "Stb" LOC = "P56" | IOSTANDARD = LVTTL ;#D30 NET "WR" LOC = "P54" | IOSTANDARD = LVTTL ;#D31 NET "RESET" LOC = "P77" | IOSTANDARD = LVTTL ; #D15

    Modulo de Interfase

    Para realizar las pruebas fsicas del sistema se utiliz una baseta de pruebas

    para implementar la parte de potencia del controlador. En la figura 5.22 se

    muestra el esquema utilizado para el propsito. Se puede observar que

    para el manejo de las filas del panel, donde se encuentran dispuestos los

    nodos de los LEDs de la matriz, se utilizaron transistores PNP 2N3906, las

    bases de estros transistores se manejan con las lneas F1..F6 a travs de un

    driver 74HCT541. para el manejo de los ctodos de los LEDs del panel se

    utiliz otro driver 74HCT541, el cual es activa los LEDs cuando va a un nivel

    lgico bajo.

    El panel utilizado para las pruebas es una matriz compuesto por 1 LED por

    cada pxel, en el que se encuentra un conector tipo "header" de 6

    posiciones para manejo de los nodos de la matriz y otro conector del

    mismo tipo de 8 posiciones para el manejo de los ctodos de la matriz del

    panel.

    157

  • FIGURA 5.22: Esquema del circuito de driver para matriz de LEDs.

    5.4.5 Pruebas de funcionamiento.

    Como se mencion anteriormente, el controlador realiza las funciones de

    barrido de la pantalla con los datos que se encuentran almacenados en la

    memoria de actualizacin, esta operacin la realiza de forma automtica.

    Para poder comprobar fsicamente el funcionamiento del controlador se

    desarrollo un programa de prueba utilizando el lenguaje de programacin

    Visual Basic y un puerto paralelo que se conecta a travs de la placa

    de

    interfase al controlador (CPLD).

    Interfase Puerto paralelo.

    Se utiliz el puerto paralelo con direccin 0x378 que posee 8 bits de salida

    para los datos d0 .. d7 del controlador, en el puerto bi-direccional con

    direccin de hardware 0x37A se utilizaron 2 lneas para el manejo de las

    seales WR y Str. La conexin de las lneas se muestra en la figura 5.23.

    158

  • GND

    GND

    GND

    GND

    Str

    d7

    d6

    d5

    d4

    d3

    d2

    d1

    d0

    W R

    FIGURA 5.23: Conector DB25 para puerto paralelo.

    Software de prueba.

    El software para la prueba se escribi utilizando Microsoft Visual Basic 6.

    El propsito de este programa es el de probar la comunicacin con el

    modulo de control para el panel.

    En el software se generaron tablas de cdigo correspondientes a los

    caracteres numricos del 0 a 9.

    Con este criterio se puede generar cualquier tipo de carcter que se desee

    desplegar en la pantalla. Para la prueba de comunicacin con el modulo es

    suficiente desplegar caracteres numricos.

    La pantalla de interfase se muestra en la figura 5.24. el programa de

    prueba decodifica la informacin de un temporizador y enva de acuerdo a

    la tabla 5.8 la informacin del numero a desplegar en la pantalla. La

    velocidad de transmisin de los datos puede ser cambiada moviendo el

    control de ajuste.

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    1

    1

    1

    b1

    1

    1

    b0

    1

    1

    1

    1

    1

    1

    VALOR

    7

    5

    5

    5

    5

    7

    b7 b6 b5 b4 b3 b2 b1

    B0

    B1

    B2

    B3

    1

    b0

    1

    1

    1

    1

    VALOR

    1

    3

    1

    1

    159

    13

    25

    1

    4

    1

  • B4

    B5

    1

    1

    1

    1

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    b1

    1

    1

    1

    1

    1

    1

    b0

    1

    1

    1

    1 1

    VALOR

    7

    1

    7

    4

    4

    7

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    b1

    1

    1

    1 1

    b0

    1

    1

    1

    1

    1

    1

    VALOR

    7

    1

    3

    1

    1

    7

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    b1

    1

    b0

    1

    1

    1

    1

    1

    1

    VALOR

    5

    5

    7

    1

    1

    1

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    b1

    1

    b0

    1

    1

    1 1

    1

    1

    1

    1

    VALOR

    7

    4

    7

    1

    1

    7

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    1

    1

    1

    b1

    1

    b0

    1

    1

    1

    1

    1

    1

    1

    VALOR

    7

    4

    7

    5

    5

    7

    b7 b6 b5 b4 b3

    B0

    B1

    b2

    1

    b1

    1

    b0

    1

    1

    VALOR

    7

    1

    160

  • B2

    B3

    B4

    B5

    1

    1

    1

    1

    1

    2

    2

    2

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    1

    1

    1

    b1

    1

    1

    1

    b0

    1

    1

    1

    1

    1

    1

    VALOR

    7

    5

    7

    5

    5

    7

    b7 b6 b5 b4 b3

    B0

    B1

    B2

    B3

    B4

    B5

    b2

    1

    1

    1

    b1

    1

    1

    1 1

    b0

    1

    1

    1

    1

    1

    1

    VALOR

    7

    5

    7

    1

    1

    7

    TABLA 5.8: Tabla de codificacin para caracteres numricos.

    En la figura 5.24 observamos la pantalla de interfase para el programa de

    pruebas del controlador del panel de LEDs. La descripcin del programa en

    lenguaje Visual Basic se describe a continuacin.

    FIGURA 5.24: Pantalla de control para prueba de controlador de panel

    CODIGO VISUAL BASIC

    '...................................................................................................................

    Public Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

    Public Declare Function Inp Lib "inpout32.dll" _

    Alias "Inp32" (ByVal PortAddress As Integer) As Integer

    Public Declare Sub Out Lib "inpout32.dll" _

    Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

    Public Const WR = 1

    Public Const STR = 2

    Public Const RESET = 4

    Public I As Integer

    161

  • Public Comando As Byte

    Public TABLA(10, 6) As Byte

    Public Buffer(5) As Byte

    Public Tiempo As Integer

    '...................................................................................................................

    Sub WRITE_PULSE()

    Out Val("&H37A"), Val("&H02")

    Out Val("&H37A"), Val("&H03")

    End Sub

    '...................................................................................................................

    Sub STROBE_PULSE()

    Out Val("&H37A"), Val("&H01")

    Out Val("&H37A"), Val("&H03")

    End Sub

    '...................................................................................................................

    Private Sub Com_RESET_Click()

    Comando = Inp(Val("&H37A"))

    Out Val("&H37A"), (Comando + RESET)

    Out Val("&H37A"), (0)

    sleep (100)

    Out Val("&H37A"), (Comando And (Not (RESET)))

    End Sub

    '...................................................................................................................

    Private Sub EnviaData()

    Dim I As Integer

    For I = 0 To 5

    Out Val("&H378"), Buffer(I)

    WRITE_PULSE

    Next I

    WRITE_PULSE

    STROBE_PULSE

    End Sub

    '...................................................................................................................

    Private Sub Cmd_Inicio_Click()

    Timer1.Enabled = True

    End Sub

    '...................................................................................................................

    Private Sub Command2_Click()

    Dim Valor, I As Integer

    Dim ByteL, ByteH As Byte

    Dim LOW(5) As Byte, HIGH(5) As Byte

    Valor = Val(Text_DATO)

    162

  • ByteH = Valor \ 10

    ByteL = Valor - (ByteH * 10)

    For I = 0 To 5

    LOW(I) = TABLA(ByteL, I)

    HIGH(I) = TABLA(ByteH, I)

    Buffer(I) = HIGH(I) * 16 Or LOW(I)

    Next I

    EnviaData

    End Sub

    '...................................................................................................................

    Private Sub Command1_Click()

    Timer1.Enabled = False

    End Sub

    '...................................................................................................................

    Private Sub Form_Load()

    Out Val("&H37A"), Val("&H03")

    Comando = 0

    TABLA(0, 0) = 7

    TABLA(0, 1) = 5

    TABLA(0, 2) = 5

    TABLA(0, 3) = 5

    TABLA(0, 4) = 5

    TABLA(0, 5) = 7

    TABLA(0, 0) = 7

    TABLA(1, 0) = 1

    TABLA(1, 1) = 3

    TABLA(1, 2) = 1

    TABLA(1, 3) = 1

    TABLA(1, 4) = 1

    TABLA(1, 5) = 1

    TABLA(2, 0) = 7

    TABLA(2, 1) = 1

    TABLA(2, 2) = 7

    TABLA(2, 3) = 4

    TABLA(2, 4) = 4

    TABLA(2, 5) = 7

    TABLA(3, 0) = 7

    TABLA(3, 1) = 1

    TABLA(3, 2) = 7

    TABLA(3, 3) = 1

    TABLA(3, 4) = 1

    TABLA(3, 5) = 7

    TABLA(4, 0) = 5

    TABLA(4, 1) = 5

    TABLA(4, 2) = 7

    TABLA(4, 3) = 1

    TABLA(4, 4) = 1

    TABLA(4, 5) = 1

    TABLA(5, 0) = 7

    163

  • TABLA(5, 1) = 4

    TABLA(5, 2) = 7

    TABLA(5, 3) = 1

    TABLA(5, 4) = 1

    TABLA(5, 5) = 7

    TABLA(6, 0) = 7

    TABLA(6, 1) = 4

    TABLA(6, 2) = 7

    TABLA(6, 3) = 5

    TABLA(6, 4) = 5

    TABLA(6, 5) = 7

    TABLA(7, 0) = 7

    TABLA(7, 1) = 1

    TABLA(7, 2) = 1

    TABLA(7, 3) = 2

    TABLA(7, 4) = 2

    TABLA(7, 5) = 2

    TABLA(8, 0) = 7

    TABLA(8, 1) = 5

    TABLA(8, 2) = 7

    TABLA(8, 3) = 5

    TABLA(8, 4) = 5

    TABLA(8, 5) = 7

    TABLA(9, 0) = 7

    TABLA(9, 1) = 5

    TABLA(9, 2) = 7

    TABLA(9, 3) = 1

    TABLA(9, 4) = 1

    TABLA(9, 5) = 7

    Slider.Value = 10

    Timer1.Interval = Val(Slider.Value) * 50

    End Sub

    '...................................................................................................................

    Private Sub Slider_Change()

    If Slider.Value = 0 Then

    Timer1.Interval = 1

    Else

    Timer1.Interval = Val(Slider.Value) * 50

    End If

    End Sub

    '...................................................................................................................

    Private Sub Timer1_Timer()

    If Tiempo >= 99 Then

    Tiempo = 0

    Else

    Tiempo = Tiempo + 1

    Text_DATO.Text = Tiempo

    Command2_Click

    End If

    164

  • End Sub

    '...................................................................................................................

    Conclusiones y Recomendaciones.

    Despus de el estudio realizado el cual a incluido una extensa explicacin

    terica fundamental para el correcto entendimiento de los conceptos que

    involucra un diseo digital utilizando lenguaje descriptivo, algunos ejemplos

    prcticos en los que se ha tratado de detallar el proceso de diseo,

    verificacin y pruebas, vemos que el uso de los lenguajes descriptivos

    puede constituir una herramienta muy poderosa para los ingenieros en el

    desarrollo de hardware.

    Con la introduccin de dispositivos digitales como son CPLDs y

    especialmente FPGAs el uso de un lenguaje descriptivo es una necesidad, la

    densidad con respecto a elementos lgicos es tan alta que para poder

    utilizar estos dispositivos los mtodos tradicionales esquemticos son casi

    imposibles de utilizar. En este documento se han descrito ejemplos

    relativamente sencillos, pero las aplicaciones actuales de estos elementos

    estn enfocados a sistemas digitales de alta complejidad.

    Una verdadera industria se ha creado en torno al uso de estos ASICs que

    muchas empresas han dedicado sus esfuerzos al desarrollo de lo que en

    este mundo digital se conoce con el nombre de "IP" o propiedades

    intelectuales, que no son mas que porciones de cdigo debidamente

    probados y verificados para diferentes aplicaciones, ejemplo de estos son

    puertos seriales, i2c, SPI, controladores de ethernet, USB, PCI, filtros

    digitales, DSPs, procesadores, microcontroladores etc. Cientos de

    aplicaciones se encuentran disponibles tambin de forma gratuita, as que

    antes de comenzar a desarrollar un modulo o circuito, es posible que ya se

    encuentre listo nicamente para ser integrado a nuestro diseo. Estas

    ventajas se logran al utilizar los lenguajes descriptivos de Hardware ya que

    estos son independientes de la tecnologa o dispositivo que se utilice.

    Es muy importante tener en cuenta que cuando se trabaja con un lenguaje

    descriptivo de Hardware no estamos "programando" software en un

    procesador, lo que hacemos es describir hardware el que luego ser

    plasmado en un circuito ASIC sea cual fuere, as que los conceptos bsicos

    digitales debemos manejarlos muy bien de tal forma de obtener mediante

    el cdigo lo que realmente queremos.

    En el desarrollo de esta tesis se utiliz un CPLD para las pruebas, estos

    dispositivos no son mas que arreglos compuertas similares a los PLDs

    comunes tales como 22V10. En estos dispositivos el uso de memorias

    requiere una cantidad significativa de registros los cuales consumen gran

    cantidad de los recursos disponibles para solo lograr pequeas porciones de

    165

  • memoria. Los FPGAs en contraste son dispositivos basados en PLAs

    (Arreglos Lgicos Programables) los cuales poseen bloques especficos de

    memoria con capacidades ya significativas que pueden solucionar estas

    necesidades. Adems bloques de circuitos diferenciales especialmente

    diseados para comunicacin entre dispositivos, ejemplo de esto sistemas

    tenemos los buses SATA o interfases PCI Express que alcanzan velocidades

    en el orden de los Ghz.

    En conclusin, el xito en el desarrollo de un diseo digital esta basado

    primeramente en el uso del dispositivo correcto para la aplicacin y en un

    buen diseo del hardware a travs de un lenguaje descriptivo, verificacin

    de funcionamiento y el uso de simuladores que nos ayudan a recortar los

    tiempos de desarrollo y pruebas.

    Despus de un extenso estudio el cual solo constituye una introduccin a

    este amplio campo del diseo digital, se puede decir que es muy

    importante tener bases fuertes en electrnica digital, circuitos lgicos tales

    como registros, flip-flops, registros de desplazamiento y muchos otros

    elementos lgicos, ya que al escribir un cdigo en HDL debemos pensar en

    el dispositivo que se requiere utilizar y que el cdigo escrito sintetice el

    elemento o modulo correcto.

    166

  • APENDICE A. Definiciones Formales del

    Lenguaje

    Los anexos a continuacin especificados son tomados del Estndar Internacional Documento IEEE1364, IEC61691-4 primera edicin del 2004,

    parte 4, "Behavioral Lenguajes, Verilog Hardware Description Lenguajes".

    Formal syntax definition

    A.1 Source text

    A.1.1 Library source text library_text ::= { library_descriptions } library_descriptions ::= library_declaration | include_statement | config_declaration library_declaration ::= library library_identifier file_path_spec [ { , file_path_spec } ] [ -incdir file_path_spec [ { , file_path_spec } ] ; file_path_spec ::= file_path include_statement ::= include ; A.1.2 Configuration source text config_declaration ::= config config_identifier ; design_statement {config_rule_statement} endconfig design_statement ::= design { [library_identifier.]cell_identifier } ; config_rule_statement ::= default_clause liblist_clause | inst_clause liblist_clause | inst_clause use_clause | cell_clause liblist_clause | cell_clause use_clause default_clause ::= default inst_clause ::= instance inst_name inst_name ::= topmodule_identifier{.instance_identifier} cell_clause ::= cell [ library_identifier.]cell_identifier liblist_clause ::= liblist [{library_identifier}] use_clause ::= use [library_identifier.]cell_identifier[:config]

    A.1.3 Module and primitive source text

    source_text ::= { description }

    description ::=

    module_declaration

    | udp_declaration

    module_declaration ::=

    { attribute_instance } module_keyword module_identifier [ module_parameter_port_list ]

    [ list_of_ports ] ; { module_item }

    endmodule

    | { attribute_instance } module_keyword module_identifier [ module_parameter_port_list ]

    Ap.1

  • [ list_of_port_declarations ] ; { non_port_module_item }

    endmodule

    module_keyword ::= module | macromodule

    A.1.4 Module parameters and ports

    module_parameter_port_list ::= # ( parameter_declaration { , parameter_declaration } )

    list_of_ports ::= ( port { , port } )

    list_of_port_declarations ::=

    ( port_declaration { , port_declaration } )

    | ( )

    port ::=

    [ port_expression ]

    | . port_identifier ( [ port_expression ] )

    port_expression ::=

    port_reference

    | { port_reference { , port_reference } }

    port_reference ::=

    port_identifier

    | port_identifier [ constant_expression ]

    | port_identifier [ range_expression ]

    port_declaration ::=

    {attribute_instance} inout_declaration

    | {attribute_instance} input_declaration

    | {attribute_instance} output_declaration

    A.1.5 Module items

    module_item ::=

    module_or_generate_item

    | port_declaration ;

    | { attribute_instance } generated_instantiation

    | { attribute_instance } local_parameter_declaration

    | { attribute_instance } parameter_declaration

    | { attribute_instance } specify_block

    | { attribute_instance } specparam_declaration

    module_or_generate_item ::=

    { attribute_instance } module_or_generate_item_declaration

    | { attribute_instance } parameter_override

    | { attribute_instance } continuous_assign

    | { attribute_instance } gate_instantiation

    | { attribute_instance } udp_instantiation

    | { attribute_instance } module_instantiation

    | { attribute_instance } initial_construct

    | { attribute_instance } always_construct

    module_or_generate_item_declaration ::=

    net_declaration

    | reg_declaration

    | integer_declaration

    | real_declaration

    | time_declaration

    | realtime_declaration

    | event_declaration

    | genvar_declaration

    | task_declaration

    | function_declaration

    non_port_module_item ::=

    { attribute_instance } generated_instantiation

    | { attribute_instance } local_parameter_declaration

    Ap.2

  • | { attribute_instance } module_or_generate_item

    | { attribute_instance } parameter_declaration

    | { attribute_instance } specify_block

    | { attribute_instance } specparam_declaration

    parameter_override ::= defparam list_of_param_assignments ;

    A.2 Declarations

    A.2.1 Declaration types

    A.2.1.1 Module parameter declarations

    local_parameter_declaration ::=

    localparam [ signed ] [ range ] list_of_param_assignments ;

    | localparam integer list_of_param_assignments ;

    | localparam real list_of_param_assignments ;

    | localparam realtime list_of_param_assignments ;

    | localparam time list_of_param_assignments ;

    parameter_declaration ::=

    parameter [ signed ] [ range ] list_of_param_assignments ;

    | parameter integer list_of_param_assignments ;

    | parameter real list_of_param_assignments ;

    | parameter realtime list_of_param_assignments ;

    | parameter time list_of_param_assignments ;

    specparam_declaration ::= specparam [ range ] list_of_specparam_assignments ;

    A.2.1.2 Port declarations

    inout_declaration ::= inout [ net_type ] [ signed ] [ range ]

    list_of_port_identifiers

    input_declaration ::= input [ net_type ] [ signed ] [ range ]

    list_of_port_identifiers

    output_declaration ::=

    output [ net_type ] [ signed ] [ range ]

    list_of_port_identifiers

    | output [ reg ] [ signed ] [ range ]

    list_of_port_identifiers

    | output reg [ signed ] [ range ]

    list_of_variable_port_identifiers

    | output [ output_variable_type ]

    list_of_port_identifiers

    | output output_variable_type

    list_of_variable_port_identifiers

    A.2.1.3 Type declarations

    event_declaration ::= event list_of_event_identifiers ;

    genvar_declaration ::= genvar list_of_genvar_identifiers ;

    integer_declaration ::= integer list_of_variable_identifiers ;

    net_declaration ::=

    net_type [ signed ]

    [ delay3 ] list_of_net_identifiers ;

    | net_type [ drive_strength ] [ signed ]

    [ delay3 ] list_of_net_de