ciencias básicas e ingeniería ingeniería en electrónica...

67
1 UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA Ciencias Básicas e Ingeniería Ingeniería en Electrónica Área de Concentración Comunicaciones Proyecto de Ingeniería Electrónica Diseño de una UART, bloque de recepción utilizando un fpga Rosalba de la Cruz Gilberto Espinosa Loyola Asesor Laura Ortiz Balbuena ______________________________________

Upload: duongminh

Post on 12-Oct-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

1

UNIVERSIDAD AUTONOMA METROPOLITANA

IZTAPALAPA

Ciencias Básicas e Ingeniería

Ingeniería en Electrónica

Área de Concentración Comunicaciones

Proyecto de Ingeniería Electrónica

Diseño de una UART, bloque de recepción utilizando un fpga

Rosalba de la Cruz

Gilberto Espinosa Loyola

Asesor Laura Ortiz Balbuena

______________________________________

2

INTRODUCCIÓN En la actualidad estamos rodeados de tecnología, donde recientemente se ha dado un auge de comunicaciones entre PCs. Las computadoras son ya una parte indispensable en la vida diaria. La intención de este proyecto es mostrar las diversas formas de comunicación en serie, ya sea entre computadoras, entre una PC y sus periféricos, entre teléfonos celulares o cualquiera de las múltiples aplicaciones donde podemos encontrar una comunicación serial. En las comunicaciones en serie encontramos dos tipos, la comunicación serial: síncrona y asíncrona . En la comunicación serial con sincronía , se tiene el mismo reloj en la parte de envío y de recepción de datos, y en la comunicación asíncrona , tienen un reloj independiente entre la transmisión y la recepción. Cuando se aborda el diseño de un sistema electrónico, se debe tomar en cuenta que dispositivos se utilizaran y cuales son sus características de coste, flexibilidad y duración. Otra opción es diseñar un sistema con base en un circuito ya fabricado que se pueda programar, como son los FPGA’s. De estas dos opciones la primera proporciona mejores prestaciones, aunque es más cara y exige un ciclo de diseño relativamente largo. Por otro lado, los dispositivos lógicos programables constituyen una buena oferta para realizar diseños electrónicos digitales con un buen compromiso coste-prestaciones. Y lo que es mejor, permiten obtener una implementación en un tiempo de diseño corto. Lo que se pretende mostrar en este reporte es una de la múltiples aplicaciones de los FPGA’s ,mediante la etapa receptora de una UART (Transmisor-Receptor Asíncrono Universal), un dispositivo importante en la comunicación de datos. Como antecedente a este proyecto tuvimos la etapa receptora de la UART, la cual nos ayudó a comprender mejor el funcionamiento de este dispositivo y comenzar a esbozar los bloques de los cuales se compondría nuestro proyecto. Tratando de ser lo más explícitos posibles para que el lector pueda entender sin ningún problema su funcionamiento. Se incluye además, las simulaciones, funcionamiento del software y una breve explicación de cada bloque.

3

AGRADECIMIENTOS Este trabajo esta dedicado a:

Mi Madre ..........y a todas las personas que con su cariño me dieron la confianza y el ánimo para seguir adelante.

Rosalba A mi Hermano Donaciano que siempre me brindo su apoyo y sobre todo a mi Madre, que fue la mejor motivación.

Gilberto

4

INDICE Capítulo 1 Diseño de una UART parte de recepción. 1.1 El dispositivo UART………………………..…………………………5 1.2 Diagrama a bloques de nuestra UART bloque de recepción….…6 1.3 Desarrollo de cada bloque………………………………………...…6 1.3.1 Baudrate……………………………………………………….……6 1.3.2 Detección……………………………………………………………8 1.3.3 Reconstrucción……………………………………………….. …11 1.3.4 Maquina de estados……………………………………… .….…12 1.3.5 Sincronización……………………………………………… ……21 1.3.6 Registro de corrimiento……………………………………… …21 1.3.7 Registro de datos………………………………………… …..… 22 1.3.8 Verificador de paridad……………………………………….. … 23 1.4 Conclusiones……………………………………………………..…… 23 Capítulo 2 Desarrollo de cada bloque en MAX+plus II. . 2.1 Entorno MAX+plus II……………………………………………………24 2.2 Desarrollo de cada bloque en MAX+plus II…………………..……… 24. 2.2.1 Baudrate………………………………………………….……….… 34 2.2.2 Detección………………………………………….………………… 41 2.2.3 Reconstrucción…………………………………………………...… 44 2.2.4 Maquina de estados……………………………………………..… 46 2.2.5 Sincronización……………………………………………………… 50 2.2.6 Registro de datos……………………………………………...…… 51 2.2.7 Verificador de paridad… …52 2.3 Conclusiones…53. Capitulo 3 Diseños y Simulaciones de todos los bloques. . 3.1 Archivo top……………………………………………………………... 54 3.2 Archivo Baudrate…………………………………………………….… 56 3.3 Archivo Detección…………………………………………………...… 57 3.4 Archivo Reconstrucción………………………………………………. 58 3.5 Archivo Maquina de estados ………………………………………… 59 3.6 Archivo Sincronización………………………………………………. .60 3.7 Archivo Registro de corrimiento……………………………………... 61 3.8 Archivo Registro de datos ……………………………………………. 62 3.9 Archivo Verificación de paridad……………………………………… 63 3.10 Conclusiones………………………………………………………… 64 ANEXO ESPECIFICACIONES…………………………………………… 64 BIBLIOGRAFÍA… …………………………………………………………. 67

5

.. CAPÍTULO 1 Diseño de una UART parte de recepción. 1.1 EL DISPOSITIVO UART La UART (Universal Asynchronous Receiver/Transmitter), es uno de los dispositivos más importantes en telecomunicaciones, se encarga de transmitir y recibir datos seriales, también se ocupa de la conversión de paralelo a serie y viceversa, para que el transmisor y receptor se sincronicen y detecten un posible error la UART genera los bits de inicio, paridad y parada. Este dispositivo se emplea para comunicar vía serie sistemas que no comparten una señal de reloj común. Por ese motivo se debe estar previamente de acuerdo de cual es la velocidad a la que se deben trasmitir los datos. Entre las aplicaciones básicas de la UART se encuentran las comunicaciones con la PC, con un PDA, o transmisiones de datos por medio de infrarrojo y bluetooth. En la figura 1.1.1 se muestra de una manera general la comunicación entre dos módems (modulador-demodulador), como se puede apreciar la UART le trasmite las señales digitales de paralelo a serie al MODEM, para que este las transmita en una forma analógica. El receptor recibe la señal analógica la digitaliza y la manda a la UART recepción para que transforme los datos en paralelo.

Figura 1.1.1

6

1.2 Diagrama a bloques de nuestra UART bloque de recepción En la figura 1.2.1 mostraremos diagrama a bloques de nuestro proyecto.

Figura 1.2.1 1.3 DESARROLLO DE LOS BLOQUES En esta sección se describirá la función de cada bloque que conforma la etapa de recepción del UART. 1.3.1 BAUD RATE El circuito baudrate genera las diferentes frecuencia que se van a utilizar para la transmisión y recepción, estas frecuencias se generan a partir de un reloj maestro. En el bloque de transmisión se generó una frecuencia TX con la que se enviaran los datos en serie y para el bloque de recepción RX generamos una frecuencia de reloj 16 veces la frecuencia de transmisor RX =16*Tx con la que se muestrearan los datos. El circuito que diseñamos para el baud rate es el que se muestra en la figura 1. 3. 1

7

Figura 1.3.1

La tasa de transmisión se mide en baudios o número de bits que se transmiten por segundo Los valores estándar son 110, 150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400. Bps. En nuestro proyecto se usó la frecuencia de 38400 hz porque fue el valor que se eligió al enviar los datos, hablando en baud’s se tiene el mismo valor 38.4 kbps porque cada bit representa un solo símbolo. Para generar las frecuencias, dividimos un reloj maestro con divisores de frecuencia frecdiv de tal forma que la señal de reloj CPU-CLK se divida en múltiplos de 2^n n=1, 2,3. Las frecuencias que utilizamos son las siguientes: • La frecuencia de entrada CLK_CPU= 4.9152 Mhz • La frecuencia de salida TX =38 .4Khz, esta frecuencia de salida es la que

se utilizo para transmitir los datos. • La frecuencia de salida 16FTX = 307.2 Khz, esta señal la utilizaremos para

la recepción de los datos, esta frecuencia es 16 veces mayor que la frecuencia de transmisión.

8

1.3.2 BLOQUE DE DETECCIÓN En la comunicación serial asíncrono cada palabra se identifica con un bit de inicio y un bit de parada. El bit de inicio siempre debe ser 0 y el bit de parada 1; como se muestra en la figura 1.3.21 1 1 inicio D0 D1 D2 D3 D4 D5 D6 D7 paridad stop inicio D0

1 1 0 X X X X X X X X X 1 0 X Figura 1.3.2.1. Muestra una palabra completa. Antes de cada palabra la línea debe estar en nivel alto 1 y cuando detecta un flanco de bajada se pone a 0 es cuando empieza la recepción al terminar regresa a un nivel alto para esperar la próxima palabra. En el bloque de detección se reciben los datos de la línea, sabemos que durante el trayecto las señales eléctricas se deformaron y al llegar a su destino no son exactamente como se transmitieron, para tener un valor confiable de la información que trae la señal y sabiendo cuales son las características que tenían al enviarse tomaremos una muestra a la mitad de cada bit y trabajaremos con la información obtenida. Para detectar el cambio en la línea utilizamos una compuerta xor su salida genera una señal que utilizamos como referencia para iniciar un contador de 8 ciclos el cual se posiciona a la mitad del bit de inicio, para después iniciar otro contador que tendrá como objetivo hacer un muestreo los bits de datos.vease figura 1.3.2.2

Figura 1.3.2.2 primera parte del circuito de detección. Definimos A como la entrada de datos en serie y B una señal auxiliar que nos ayuda a detectar el flanco. Esta primera parte del circuito fue construido con un par de compuertas xor que nos detectan el flanco de bajada clear1 y a partir de ahí inicia un contador

9

de 8 ciclos de Rx para posicionarse a la mitad del bit de inicio, éste contador de 8 ciclos fue diseñado con base a uno de 4 bits como se muestra en la figura 1.2.3.3

Figura 1.2.3.3 contador de 8 ciclos.

El diseño para este circuito se basa en un contador de modulo n, esto quiere decir que tendrá un pulso de salida cada n pulsos. Ver figura 1.2.3.4

Figura 1.2.3.4 Por ejemplo; en la figura anterior de cada 10 pulsos de reloj recibidos solo deja pasar el décimo, esto se debe a que cuando el contador detecta el noveno pulso habilita la compuerta and de salida y el siguiente pulso es el que pasa a través de ella.

10

Para nuestro caso necesitamos una salida cada 8 pulsos (0 a 7), el número 7 en binario es 0111 y es por eso que tomamos las salidas QA, QB, QC, del contador de 4 bits, figura 1.2.3.3 En la salida del contador de 8 ciclos pusimos un arreglo que nos genera una señal constate que empieza a la mitad del bit de inicio.

Figura 1.2.3.5 Este diseño esta formado por 2 flipflop D puenteados en la entrada con el reloj por lo que su salida es constante. La segunda parte del circuito de detección consta de tomar las muestras a la mitad de cada bit, una vez detectado el flanco de bajada, y contar 8 pulsos de reloj se procede a iniciar un contador de 16 ciclos de Rx que tomará una muestra a la mitad del bit, esta muestra será del tamaño de un pulso de Rx. El circuito cuenta16 fue construido a partir del contador de 8 ciclos que se uso como entrada de reloj un segundo contador que debe contar un ciclo y dejar pasar el otro. El objetivo de este contador es tomar una muestra a la mitad de los bits de datos, como el punto de referencia es un ciclo antes de la mitad del bit de inicio agregamos un flipflop D para desplazarlo, en la parte baja de la figura se encuentra una compuerta and que es la que muestrea los pulsos con la señal de entrada A. . Para el contador de 16 ciclos utilizamos el siguiente diseño, figura 1.2.3.6

11

Figura 1.3.2.6

La tercera parte del circuito de detección diseñamos un contador de 16 ciclos de Rx pero desfasado 50% (8 ciclos de rx), para lograr esto iniciamos un contador de 16 ciclos de rx a partir de la detección del flanco de bajada del bit de inicio.

Figura 1.3.2.7 Contador defasado

Para el circuito anterior usamos el mismo contador de 16 ciclos y un flipflop D , el contador cuenta 15 ciclos y el pulso 16 lo deja pasar, el flipflop D desfasa un ciclo de Rx porque se inició un ciclo antes, para que la salida este desfasada usamos clear1 que esta desfasa do 50% con respecto al clear usado en el contador anterior (cuenta 16). 1.3.3 RECONSTRUCCIÓN

Una vez teniendo las muestras de los datos debemos reconstruirlas dándoles el ancho que tenían cuando se transmitieron. Para esto aplicaremos los conocimientos de códigos de línea en este caso codificación diferencial con un contador de 4 bits codificamos las muestras dándole un ancho de 16ciclos de RX, ya que tenemos la codificación necesitamos esa misma señal desfasada

12

50%, teniendo las dos señales le aplicamos una compuerta xor para obtener la señal original que estará desfasada medio ciclo de TX. Ver figura 1.3.3.1

Figura 1.3.3.1 El circuito de la figura esta diseñado con un contador de 4 bits que tiene como reloj las muestras de la señal, esta parte del circuito codificará las muestras de los datos. Para obtener una señal desfasada de la codificación generamos un reloj de 16ciclos de Rx pero desfasado 50%, ésta señal se desfasa con 2 flipflops D con reloj de 16 ciclos de RX desfasado 50%, ya que tenemos la codificación y la codificación desfasada le aplicamos una compuerta xor para obtener la señal original. 1.3.4 MAQUINA DE ESTADOS Este bloque es el más importante porque dirige el proceso de recepción de las tramas. Su función es detectar el cambio de 1 a 0 en la línea y a partir de ahí contar hasta 10 ( 8 bits de datos, un bit de paridad y un bit de parada) con lo que se habrá recibido una palabra y nuevamente regresar a 1 a esperar detectar los siguientes datos. También genera la señal que habilitara el registro de corrimiento. Para detectar las palabras en la línea diseñamos un autómata de moore con 11 estados (Q0-Q10). El diagrama se muestra en la figura 1.3.4.1

13

AUTÓMATA DE MOORE

Figura 1.3.4.1 Diagrama de estados, a partir de este obtuvimos la tabla de transición

Su funcionamiento es el siguiente, en el estado Q0 se empiezan a recibir los datos, si el bit es 1 se quedaran en el estado q0 hasta que haya un a transición en la línea, cuando esto suceda se pasará al siguiente estado q1 cuya salida es 0 (bit de inicio) los siguientes bits que son de información son representados con el símbolo no importa x hasta llegar al estado q10 que representa el bit de parada si este bit es 1 la máquina queda en reposo en el estado q0, si no el sistema se salta al estado q1 hasta encontrar un nivel alto (1). La tabla 1.3.4.1 nos muestra los estados codificados y los valores que queremos en las salidas:

Estados codificados y salidas

Estados Codificados Salidas Q0 0000 1 Q1 0001 0 Q2 0010 X Q3 0011 X Q4 0100 X Q5 0101 X Q6 0110 X Q7 0111 X Q8 1000 X Q9 1001 X Q10 1010 X Q11 1011 X Q12 1100 X Q13 1101 X Q14 1110 X

14

Q15 1111 X Tabla 1.3.4.1

La tabla 1.3.4.1 muestra los valores de salida 1 y 0 que representan la línea en alto señal de que esta desocupado y esperando recibir tramas y el bit de inicio, todos los demás valores son marcados con el símbolo no importa ya que pueden tomar cualquier valor. La tabla 1.3.4.2 muestra la transición de los estados codificados.

Tabla de transición de estados

Estados Presente Siguiente Q0 0000 0001 Q1 0001 0010 Q2 0010 0011 Q3 0011 0100 Q4 0100 0101 Q5 0101 0110 Q6 0110 0111 Q7 0111 1000 Q8 1000 1001 Q9 1001 1010 Q10 1010 0000 Q11 1011 X Q12 1100 X Q13 1101 X Q14 1110 X Q15 1111 X

Tabla 1.3.4.2 Para implementar la transición de los estados necesitamos flipflops y decidimos utilizar FF JK porque estos son más estables para el diseño de autómatas. La tabla 1.3.4.3 muestra la transición del flipflop JK del estado presente al estado siguiente:

Tabla de transición del _lip-flop J K

Presente Siguiente J K

Qn Qn+1 0 0 0 x 0 1 1 x 1 0 x 1 1 1 x 0

Tabla 1.3.4.3

15

Teniendo la tabla de transiciones codificada y la tabla de transición del flipflop JK, construimos la tabla de excitación de los mismos. Tabla 1.3.4.4

Mini

E Q3 Q2 Q1 Q0

Q3+ Q2+ Q1+ Q0+ s J3 K3 J2 K2 J1 K1 J0 K0

0 0 0 0 0 0 0 0 0 1 1 0 X 0 X 0 X 1 X 1 0 0 0 0 1 0 0 1 0 0 0 X 0 X 1 X X 1 2 0 0 0 1 0 0 0 1 1 X 0 X 0 X X 0 1 X 3 0 0 0 1 1 0 1 0 0 X 0 X 1 X X 1 X 1 4 0 0 1 0 0 0 1 0 1 X 0 X X 0 0 X 1 X 5 0 0 1 0 1 0 1 1 0 X 0 X X 0 1 X X 1 6 0 0 1 1 0 0 1 1 1 X 0 X X 0 X 0 1 X 7 0 0 1 1 1 1 0 0 0 X 0 X X 1 X 1 X 1 8 0 1 0 0 0 X 0 0 1 X 0 0 0 X 0 X 1 X 9 0 1 0 0 1 X 0 1 0 X 0 0 0 X 1 X X 1 10 0 1 0 1 0 X 0 0 0 X 0 1 0 X X 1 0 X 11 0 1 0 1 1 X X X X X 0 X X X X X X X 12 0 1 1 0 0 X X X X X 0 X X X X X X X 13 0 1 1 0 1 X X X X X 0 X X X X X X X 14 0 1 1 1 0 X X X X X 0 X X X X X X X 15 0 1 1 1 1 X X X X x 0 X X X X X X X 16 1 0 0 0 0 0 0 0 0 1 0 X 0 X 0 X 0 X 17 1 0 0 0 1 0 0 1 0 0 0 X 0 X 1 X X 1 18 1 0 0 1 0 0 0 1 1 X 0 X 0 X X 0 1 X 19 1 0 0 1 1 0 1 0 0 X 0 X 1 X X 1 X 1 20 1 0 1 0 0 0 1 0 1 X 0 X X 0 0 X 1 X 21 1 0 1 0 1 0 1 1 0 X 0 X X 0 1 X X 1 22 1 0 1 1 0 0 1 1 1 X 0 X X 0 X 0 1 X 23 1 0 1 1 1 1 0 0 0 X 0 X X 1 X 1 X 1 24 1 1 0 0 0 X 0 0 1 X 0 0 0 X 0 X 1 X 25 1 1 0 0 1 X 0 1 0 X 0 0 0 X 1 X X 1 26 1 1 0 1 0 X 0 0 0 X 0 1 0 X X 1 0 X 27 1 1 0 1 1 X X X X X 0 X X X X X X X 28 1 1 1 0 0 X X X X X 0 X X X X X X X 29 1 1 1 0 1 X X X X X 0 X X X X X X X 30 1 1 1 1 0 X X X X X 0 X X X X X X X 31 1 1 1 1 1 X X X X X 0 X X X X X X X

Tabla 1.3.4.4 Una vez obtenida la tabla completa calculamos las ecuaciones lógicas para cada flipflop usando el método de karnaugh.

16

J0

J0= (~q3*q1)+(q2)+(q3*~q1)+(~e*~q3) La figura muestra el mapa de karnaugh pata la entrada J el flipflop JK 0 k0

K0=1 La figura muestra el mapa de karnaugh para la entrada K del flipflop JK 0

17

j1

J1=(q3) La figura muestra el mapa de karnaugh para la entrada J del flipflop JK 1 k1

K1=(q0)+(q3) La figura muestra el mapa de karnaugh para la entrada K del flipflop JK 1

18

j2

J2=(q1*q0) La figura muestra el mapa de karnaugh para la entrada J del flipflop JK 2 k2

K2=(q1*q0) La figura muestra el mapa de karnaugh para la entrada K del flipflop JK 2

19

j3

J3=(q1*q2*q3) La figura muestra el mapa de karnaugh para la entrada J del flipflop JK 3 k3

K3=(q1) La figura muestra el mapa de karnaugh para la entrada K del flipflop JK 3 S0

20

La figura anterior muestra el mapa de karnaugh para la salida S0. En este capitulo se muestra como se obtienen las ecuaciones lógicas para las entradas de los flipflop JK en el siguiente se mostrara la implementación de los circuitos con MAXPLUS. J0=(~q3*q1)+(q2)+(q3*~q1)+(~E0*~q3) K0=(1) J1=(q0) K1=(q0)+(q3) J2=(q1*q0) K2=(q1*q0) J3=(q2*q1*q0) K3=(q1) S0=(~q3*~q2*~q1*~q0) De esta ecuaciones lógicas obtuvimos los circuitos que conforman nuestra maquina de estados.

21

1.3.5 SINCRONIZACIÓN . Este es un pequeño circuito pero de gran importancia ya que es casi imposible que coincidan los datos recibidos con el reloj, si ese fuera el caso seria una comunicación serial síncrona, este circuito es muy simple figura 1.3.5.1

Figura 1.3.5.1

Este circuito solo consta de un flipflop D y una compuerta xor, la función del flipflop es sincronizar la salida de la maquina de estados para que sea la que dirija el registro de corrimiento entrada de datos A con el reloj TX primo (Este reloj es de la misma frecuencia que el de transmisión pero no de la misma fase), esta función siempre aplica, el flipflop se encarga de recorrer la trama hasta que coincida con el reloj. Cada que se recorre una trama el flipflop recorre todos los datos es por eso que con la compuerta xor le sumamos una constante c de medio ciclo de TX a la salida, si lo dejáramos así el sistema lo tomaría como un cero. 1.3.6 Registro de corrimiento

El registro de corrimiento es la parte esencial de la recepción de la UART es el bloque que convierte los datos de serie a paralelo, con un circuito sencillo como el que se muestra en la figura 1.3.6.1

22

Figura 1.3.6.1

El circuito anterior esta formado por 10 flipflops D que van recorriendo los datos a cada pulso de reloj. Este circuito también tiene una entrada de clear que indica cuando recorrer los bits, esta entrada esta regida por la maquina de estados.

1.3.7 Registro de datos Construimos un registro de datos para dar presentación a los bits en paralelo que trae el registro de corrimiento. Este circuito figura 1.3.7.1 se encarga de tomar la salida del registro anterior y de darle un ancho que tenían cuando se enviaron.

Figura 1.3.7.1

23

1.3.8 VERIFICADOR DE PARIDAD Una transmisión de datos esta expuesta a errores que nos podrían dar datos que no servirían al propósito, para esto existen varios métodos de detección y corrección de errores, en este proyecto usaremos un método de paridad para detectar errores..Consiste en agregar un bit de a la trama, este bit de paridad se añade a la palabra y se transmite con los demás, su valor pude ser 1 o 0 dependiendo del número de unos en la trama. Se diseñó un circuito que suma todos los bits, figura 1.3.8.1, este circuito esta basando en compuertas Xor cuya tabla de verdad nos dice que si las entradas son iguales la salida es cero y si las entradas son diferentes la salida es 1:por lo tanto ,la suma de un numero par de unos sin acarreo es 0 y la suma de un numero impar de unos sin acarreo es 1.

figura 1.3.8.1

1.4 CONCLUCIONES En este primer capitulo se explico el funcionamiento de cada bloque, cabe señalar que el bloque Baudrate es una modificación del circuito que se utilizo en la transmisión. Otro punto que se destaca es el circuito de sincronización, este bloque nos ayudo a dirigir el registro de corrimiento que tenia la entrada de datos defasada medio ciclo de TX.

24

CAPÍTULO 2. 2.1 ENTORNO MAX+plus II El tipo de software para programar los dispositivos son especializados en el diseño de sistemas a implementarse en un FPGA. MAX+plus II plus es un software que provee un entorno de diseño fácil y adaptable para cualquier diseño ya que integra lenguajes de programación como son AHDL que es el lenguaje de descripción de hardware de altera y VHDL. Otra forma de programar el FPGA es capturando el diseño como esquemático que es que usamos en este proyecto. 2.2 DESARROLLO DE CADA BLOQUE EN MAXPLUS En esta parte vamos a mostrar como se debe trabajar en MAX+plus II, detallaremos su procedimiento en este bloque; ya que es el mismo para todos los demás. En primer lugar abrimos el programa MAX+plus II 10.2 BASELINE, una vez abierto nos vamos al menú file y seleccionamos New , como se muestra en la figura 2.21.

Figura 2.2.1

Figura 2.2.2 En esta opción (figura 2.2.2), se debe escoger que tipo de archivo se desea crear. Este puede ser: gráfico, editor de símbolos, editor de texto o editor de señales.

25

En este caso vamos a crear un archivo gráfico, así que elegimos la opción Graphic Editor file, figura 2.2.3.

Figura 2.2.3.

Llegando a este punto estamos listos para diseñar cualquier circuito digital. Para el ejemplo, mostraremos cuales son los pasos para diseñar el circuito registro de corrimiento. El primer paso es insertar un dispositivo, por ejemplo; compuertas o flipflops. Para eso nos vamos a Menú Symbol y seleccionamos Enter Symbol y nos aparece el siguiente cuadro, figura 2.2.4.

Figura 2.2.4. Este cuadro nos indica que podemos insertar un símbolo ya sea de nuestra creación o de los que incluye el sistema. Para obtener un símbolo del sistema debemos ubicarnos en el directorio maxplus2/max2lib como se muestra en la figura 2.5 y elegir el elemento deseado o escribir el nombre en el espacio

26

symbol name . En esta parte es importante saber el nombre del dispositivo, podemos acudir a la ayuda, help , este menú cuenta con varias opciones una de ellas es: primitives , (figura 2.2.5).

Figura 2.2.5

En esta parte encontramos los dispositivos lógicos más básicos y sus características Ver figura 2.2.6

Figura 2.2.6

Por ejemplo; la compuerta XOR. Ver figura 2.7

27

Figura 2.2.7

Teniendo en cuenta los pasos anteriores seguiremos con la construcción del registro de corrimiento, necesitamos varios flipflops tipo D que buscaremos de la forma antes indicada. El nombre MAX+plus II de flipflop D es dff y así lo escribiremos en el campo. Figura 2.2.8

Figura 2.2.8

28

Repetimos la operación para obtener los demás flipfllops D.

Figura 2.2.9 Para que se recorran los datos; la salida del primer ffd debe ser la entrada del segundo, la salida del segundo debe ser la entrada del tercero y así sucesivamente, todos los flipflop tienen el mismo reloj y clear. Figura 2.2.10

Figura 2.2.10

Así queda el circuito registro de corrimiento serie-paralelo de 10 bits, MAX+plus II nos ofrece la opción de convertir este circuito en un solo símbolo para poder utilizarlo en este u otro proyecto donde se requiera. Para esto nos vamos al menú file Create Default Symbol y automáticamente se crea en el directorio donde estemos trabajando. Para llamar al símbolo nos vamos a menú file open, figura 2.2.11.

29

Figura 2.2.11 Escogemos la opción Symbol Editor File y nos aparece el símbolo del registro de corrimiento y otros que hemos creado. Figura 2.2.12

Figura 2.2.12

30

Una parte muy importante en cada esquema es alimentar el circuito y obtener una salida. Para esto MAX+plus II nos ofrece dos símbolos especiales input que es para la señal de entrada y output que es para la señal de salida. Los valores de estos pines se verán en la simulación en el archivo scf que pertenece al editor de señales. EDITOR DE SEÑALES. Es una herramienta donde podemos visualizar las entradas y resultados del cualquier circuito diseñado en MAX+plus II; para llegar a esta herramienta nos vamos al menú file y seleccionamos New, donde debemos elegir el tipo de archivo que deseamos crear. Figura 2.2.13

Figura 2.2.13 Escogemos la opción Waveform Editor File con la extensión scf y nos aparece inmediatamente la siguiente ventana, figura 2.2.14.

Figura 2.2.14

31

Debemos de aclarar que este archivo debe tener el mismo nombre que el archivo gráfico. Una vez simulado el proyecto procedemos con la inserción de nodos en el editor de señales. Nos vamos al menú Node y seleccionamos Insert Node y aparece el siguiente cuadro, figura 2.2.15.

Figura 2.2.15

En el cuadro anterior insertamos un nodo de entrada, en este caso un reloj; por lo tanto tenemos que ver la forma de darle una frecuencia. Un parámetro que debemos definir es el Grid Size , que indica los intervalos en el que se divide el tiempo en el editor, por ejemplo; si el grid es de 100 ns las divisiones de tiempo van de cien en cien. Durante el tiempo que usamos el programa vimos una relación entre el gid size y el periodo de la señal la cual nos indica que el periodo de la señal es el doble de tiempo del valor de grid size, con esos datos podemos poner cualquier frecuencia a una señal. En nuestro caso usamos una frecuencia de reloj de 4915.2 Khz. De este valor se derivan otras frecuencias utilizadas en el proyecto, por ejemplo; el reloj del registro de corrimiento que se obtuvo mediante divisores de frecuencia y que es de 38400 hz. Las otras entradas del registro de corrimiento son la señal en serie A y el CLRN (que se obtuvo de una maquina de estados).

32

Figura 2.2.16

El siguiente paso, es compilar el proyecto y verificar que no tenga errores si no hay errores procedemos a insertar las salidas en el editor de señales. Figura 2.15 Para insertar las señales de salida nos vamos a menú Node , seleccionamos Incert y nos aparece el siguiente cuadro (figura 2.2.17), escogemos las opciones de salida y presionado el botón list se despliegan todas las salidas.

Figura 2.2.17 Una vez insertadas todas las salidas simulamos el proyecto, este queda de la siguiente forma (figura 2.2.18):

33

Figura 2.2.18 En el punto anterior se mostró con detalle el diseño de los bloques con MAX+plus II, ahora se mostrarán los demás bloques omitiendo algunos detalles.

34

2.2.1 BAUDRATE Para hacer el baud rate abrimos el editor gráfico, figura 2.2.1

Figura 2.2.1 El propósito del baud rate es dividir la frecuencia de reloj. Revisando la librería de Max+plus II encontramos el circuito frecdiv, que es el que usaremos para dividir la señal en múltiplos de 2^n en nuestro caso n=7; por tal razón usamos 2 frecdiv ; donde la salida del primero es la entrada del segundo y cada salida del los circuitos representa una división entre dos. De esta manera se obtuvo la frecuencia de transmisión TX. Figura 2.2.2

Figura 2.2.2

35

Para la señal de recepción necesitamos una frecuencia 16 veces mayor a la de transmisión, revisando el circuito encontramos que nos proporciona esa salida en el pin entre16. Figura 2.2.2 Para el baudrate abrimos el editor gráfico, vamos a menú symbol enter symbol y localizamos el símbolo frecdiv y lo insertamos, figura 2.2.3

Figura 2.2.3 Repetimos el mismo paso para obtener 2 símbolos frecdiv, figura 2.2.4

Figura 2.2.4

36

Ya que tenemos los símbolos, procedemos a insertar las entradas. En este caso solo tiene una entrada, que es el reloj de la cpu. Nos vamos al menú Symbol y seleccionamos Enter Symbol y escribimos en el campo input. Figura 2.2.5

Figura 2.2.5 Se despliega la entrada que renombramos como CPU_CLK y la ponemos en reloj del primer freqdiv. Figura 2.2.6

Como necesitamos dividir una señal en múltiplos de 2^n donde n=7 usamos 2 freqdiv donde la ultima salida del primero es la entrada de reloj del segundo. Cada salida representa una división entre 2 y necesitamos dividir la señal siete veces entre dos así que nuestra señal queda en la tercera salida del segundo freqdiv . Figura 2.2.7

Figura 2.2.7

37

Para insertar la salida, nos dirigimos al menú Symbol, seleccionamos Enter Symbol y escribimos en el campo output. Nos aparece el símbolo que renombramos como FRECTX. También necesitamos una señal que sea 16 veces mayor a FRCTX. Aplicando el procedimiento inverso; o sea, multiplicando la señal cuatro veces por 2 encontramos nuestra señal 16FTX en la tercera salida del primer freqdiv. Figura 2.2.8

Figura 2.2.8

Para terminar y polarizar el circuito, colocamos una tierra y una señal en alto. Se insertaron con el mismo procedimiento con los nombres VCC Y GDN. Ya que tenemos el circuito lo guardamos con el nombre: baudrate y lo compilamos para ver si no hay errores. Figura 2.2.9

Figura 2.2.9

38

Después de ver que no hay errores nos vamos al editor de señales. En esta etapa abrimos el editor de señales, vamos a la ventana para insertar nodos, escribimos el nombre y seleccionamos la opción input pin que indica que insertamos nodos de entrada, figura 2.2.9.

Figura 2.2.9

Figura 2.2.10

Para darle la frecuencia, modificamos el parámetro grid size que se encuentra en menú Opcions /Grid Size que representa la mitad del periodo. En nuestro caso necesitamos un periodo de 203.45ns, así que el valor del grid debe ser 101.7ns. Otro parámetro que debemos tomar en cuenta es End Time , que significa hasta que punto del tiempo se va a simular el circuito; nosotros lo fijamos en 60us.

39

Ya definidos los parámetros procedemos a fijar la frecuencia. Para esto seguimos los siguientes comandos (figura 2.2.11):

Figura 2.2.11 Se muestra la siguiente, ventana con un periodo que lo multiplicamos por uno que es el valor que queremos. Figura 2.2.12

Figura 2.2.12 Nuestra señal de entrada queda de la siguiente forma (figura 2.2.13):

Figura 2.2.13

40

Para los nodos de salida compilamos el proyecto, vamos a Node/Incert seleccionamos la opción output Pin en la parte de arriba y Outputs en la parte de abajo, dando click al botón List nos da la lista de todas las salidas. Figura 2.2.14

Figura 2.2.14 Una vez insertadas las salidas compilamos y simulamos el proyecto y los resultados que dan de la siguiente forma (figura 2.2.15):

Figura 2.2.15

41

2.2.2 DETECCIÓN El propósito del bloque, es detectar el flanco de bajada y muestrear la señal de entrada. Para el circuito de detección abrimos el editor gráfico, para detectar el flanco usamos un arreglo que consta de una compuerta xor y un flipflop D; estos son elementos básicos que podemos encontrar en la librería primitives. Figura 2.2.2.1 A es la señal de entrada y B es una señal auxiliar que nos ayuda a detectar el flanco. La salida clear1 nos indica el cambio de flanco.

Figura 2.2.2.1

Para detectar si hay un bit de inicio diseñamos un contador de ocho bits (este se explicará más adelante); para insertarlo nos vamos a Incert/Symbol y seleccionamos contador8 e insertamos un arreglo de dos flipflop D. Figura 2.2.2.2

Figura 2.2.2.2

42

Para alimentar el contador8 necesitamos las señales: 16FTX y clear1; misma que se obtuvo al detectar el flanco, a la salida del contador8 pusimos un arreglo de dos flipflop D para clavar la señal de salida del contador. Conectando los dispositivos queda de la siguiente forma (figura 2.2.2.3):

Figura 2.2.2.3

La salida cuenta8, es una señal que cuenta 8 ciclos de reloj 16FTX para posicionarse a la mitad del bit de inicio y después iniciar otro contador de 16 ciclos que muestrea los datos. Figura 2.2.3 La salida clear2 muestra una señal que parte de la mitad del bit de inicio. Para muestrear los datos diseñamos un contador de 16 ciclos Figura 2.2.2.4 (este contador lo veremos más adelante). Para insertarlo nos vamos a Symbol/Enter Symbol y seleccionamos contador16; también necesitamos un flipflop D una compuerta and2 y una compuerta not .

Figura 2.2.2.4

43

Para alimentar el contador16, necesitamos las señales: 16FTX y clear2 que obtuvimos al detectar la mitad del bit de inicio. A la salida del contador pusimos un flipflop D con la entrada de reloj 16ftx invertido, para desplazar la señal un ciclo pues iniciamos a contar un ciclo antes de la mitad del bit de inicio. Para muestrear la señal usamos la compuerta and entre la salida del flipflop D y la señal de entrada. Conectando los dispositivos queda de la siguiente forma (figura 2.2.2.5):

Figura 2.2.2.5 En la siguiente etapa (Reconstrucción), vamos a necesitar un contador de 16 ciclos, pero con una salida desfasada 50%, como usamos contadores en este circuito modificaremos uno para obtener la señal deseada. Insertaremos el mismo contador de 16 ciclos y un flipflop D. Figura 2.2.2.6

Figura 2.2.2.6

44

Las entradas del contador son las señales 16FTX y clear1. Usaremos clear1 ya que está desfasado 50% con respecto a clear2 que se uso para muestrear la señal. A la salida del contador pusimos un flipflop D para desplazar la señal un ciclo de reloj; ya que se inició el contador un ciclo antes. 2.2.3 RECONSTRUCCIÓN En esta etapa convertiremos las muestras en una señal reconstruida. Insertaremos un contador de 4 bits, en la librería de Max+plus II encontramos el 7493 que es el que usamos. Figura 2.2.3.1

Figura 2.2.3.1 En las entradas R01 Y R02 usamos la señal clear2 y en las entradas CLKA Y CLKB usamos la señal de muestra. El contador codifica la señal usando codificación diferencial. Después de codificar la señal debemos desplazarla 50% para esto insertamos un arreglo de flipflops. Figura 2.2.3.2

Figura 2.2.3.2

45

Las entradas de este arreglo son la señal codificada con reloj cuenta16 en el primer flipflop. Para el segundo flipflop usaremos el reloj cuenta16defa. Ya que tenemos la señal codificada y la señal desplazada le aplicamos una función xor y así obtenemos la señal reconstruida. Conectando los dispositivos queda de la siguiente manera; figura 2.2.3.3

Figura 2.2.3.3

46

2.2.4 MAQUINA DE ESTADOS La maquina de estados es la parte más importante de la recepción, sin este elemento no podríamos dirigir cada dispositivo en determinado tiempo. En el capítulo anterior se explico como se realizo la maquina de estados y como se obtuvieron las ecuaciones para las entradas de los flipflops JK , en este capítulo veremos como se implementaron en Max+plus II. Las ecuaciones son las siguientes: J0=(~q3*q1)+(q2)+(q3*~q1)+(~E0*~q3) K0=(1) J1=(q0) K1=(q0)+(q3) J2=(q1*q0) K2=(q1*q0) J3=(q2*q1*q0) K3=(q1) S0=(~q3*~q2*~q1*~q0) q0-q3 son las salidas de los flipflops , E es la entrada y S0 es la salida. Para esto insertamos 4 flipflops jk con sus salidas respectivas. Figura 2.2.4.1

Figura 2.2.4.1

47

Entradas Flipflop JK0 Para la entrada J0 la ecuación es:

J0=(~q3*q1)+(q2)+(q3*~q1)+(~E0*~q3)

En la figura 2.2.4.2 se muestra el circuito lógico para la entrada J0. Para la entrada K0 la ecuación es: K0=(1) Para el flipflop JK1 las entradas son las siguientes Para la entrada J1 la ecuación es:

J1=(q0) Para la entrada K1 la ecuación es:

K1=(q0)+(q3)

En la figura 2.2.4.3 se muestra el circuito lógico para la entrada K1.

48

Las entradas para el flipflop JK 2

J2=(q1*q0)

la figura 2.2.4.4

K2=(q1*q0)

Figura 2.2.4.5

49

Las entradas para el flipflop 3

J3=(q2*q1*q0)

la figura 2.2.4.6

K3=(q1) La salida de la maquina de estados tiene la siguiente ecuación:

S0=(~q3*~q2*~q1*~q0)

la figura 2.2.4.7

50

En este mismo circuito agregamos un contador, para que muestre un pulso en el bit de parada y con este pulso verificar si las tramas llegaron completas. Insertamos el contador 74163 que obtuvimos de la librería de Max+plus II. Figura 2.2.4.8

Las entradas de este contador son la salida de la maquina de estados: un reloj de pulsos cuenta16defa y la misma salida del contador como clearn.

51

2.2.5 SINCRONIZACIÓN

Figura 1.3.5.1

Este circuito solo consta de un flipflop D y una compuerta xor , sus entradas son un reloj TX y la señal A que es del ancho de la trama. Su función es sincronizar la salida de la maquina de estados para que sea la que dirija el registro de corrimiento . Cada que se recorre una trama el flipflop recorre todos los datos es por eso que con la compuerta xor le sumamos una constante c de medio ciclo de TX a la salida, si lo dejáramos así el sistema lo tomaría como un cero. 2.2.6 REGISTRO DE DATOS Se detalla al principio. 2.2.7 REGISTRO DE DATOS El registro de datos, es un circuito de candado que muestra el nivel de la señal después de pasar por el registro de corrimiento. Su construcción es muy sencilla; solo necesitamos 9 ffd, ya que en este registro omitimos el bit de parada, entonces insertamos los ffd . Figura 2.2.7.1

El objetivo de este circuito, es que las salidas sean iguales a las entradas pero con el ancho de la trama. Por lo tanto el diseño queda así (figura 2.2.7.2):

52

Figura 2.2.7.2

2.2.8 VERIFICACIÓN DE PARIDAD Una transmisión de datos esta expuesta a errores, que nos podrían generar datos que no servirían al propósito. Existen varios métodos de detección y corrección de errores. En este proyecto usaremos un método de detección de errores que es el de paridad. Este método consiste en agregar un bit de paridad a la trama, este bit se añade a la trama y se transmite con los demás, su valor puede ser 1 o 0 dependiendo del número de 1’s en la trama.. En nuestro circuito podemos encontrar estos casos para la recepción de tramas. 8 bits de datos, paridad Par, 1 bit de parada 8 bits de datos: paridad Non, 1 bit de parada En nuestro caso usaremos una paridad par, es decir; que el transmisor debió agregar un bit de paridad 1 a las tramas que tenían un número de 1’s impar y a las tramas que tenían un número de 1’s par se agregó un bit de paridad 0. El objetivo de nuestro circuito es verificar los bits que se reciben y sumarlos con una or exclusiva, cumpliendo la regla de: “La suma de un número par de 1’s, descartando los acarreos, siempre es cero. Y la suma de un número impar de 1’s siempre es 1”. Figura 2.2.8.1

53

Figura 2.2.8.1

La construcción de este circuito fue muy sencillo, ya que solo usamos compuertas xor que suman todas las entradas. La compuerta xor es la indicada ya que su tabla de verdad nos dice que si las entradas son dos valores iguales la salida es cero y si son diferentes la salida es 1. 2.3 CONCLUCIONES En este capítulo 2 se mostró como se usa la herramienta Max+plusII. Se probaron todas las herramientas y se verifico la sencillez de trabajar con este paquete. Con este proyecto hemos aprendido a crear cualquier diseño, y eso es lo satisfactorio.

54

CAPÍTULO 3 . BLOQUES Y SIMULACIONES

Top. Gdf Este archivo muestra el diseño total del circuito de recepción UART. Está formado por sub. Bloques que son: BAUDRATE, DETECCION, RECONSTRUCCIÓN, MAQUINA DE ESTADOS, SINCRONIZACIÓN, REGISTRO DE CORRIMIENTO, SERIE-PARALELO, REGISTRO DE DATOS y VERIFICADOR DE PARIDAD. Top.scf Este archivo muestra la simulación del proyecto BAUR RATE Deteccion Reconstrucción Top.scf

55

Este archivo muestra la simulación del proyecto

En esta simulación podemos ver la entrada de datos A, con las tramas 1 0 0 1 1 0 0 1 1 1 y 1 1 1 0 1 0 1 1 0 1, fueron muestreadas y reconstruidas correctamente .Al verificar la paridad la primera trama tiene un error, porque, tiene un numero de bits par y bit de paridad 1.En la segunda trama la información llego correctamente.

56

BAUDRATE.GDF BAUDRATW

BAUDRATE.SCF

Se puede apreciar como de derivan las señales de un solo reloj CPU-CLK, y como coincide un periodo de FRECTX con 16 periodos de 16FTX.

57

DETECCIÓN.GDF

DETECCION.SCF

58

RECONSTRUCCIÓN.GDF

RECONSTRUCCION.SCF

59

MAQUINA DE ESTADOS.GDF

MAQUINA DE ESTADOS.SCF

60

SINCRONIZA.GDF

SINCRONIZA.SCF

61

REGISTRO DE CORRIMIENTO.GDF

62

REGISTRO DE CORRIMIENTO.SCF

REGISTRO DE DATOS.GDF

REGIDTRO DE DATOS.SCF

63

VERIFICADOR DE PARIDAD.GDF

VERIFICADOR DE PARIDAD.SCF

64

CONCLUCIONES Las materias de Proyecto de ingeniería electrónica l y ll decidimos tomarlas con la Profesora Laura Ortiz Balbuena ya nos ofrecía un proyecto donde aprenderíamos usar la tecnología FPGA. Con ésta tecnología diseñamos una UART que mostramos en este reporte. Y aprendimos las bases para diseñar cualquier circuito, y eso nos servirá para aplicarlo en el campo laboral. ANEXO ESPECIFICACIONES Compuertas: Compuerta AND

Con dos o más entradas, esta compuerta realiza la función booleana de la multiplicación Compuerta OR

La función booleana que realiza la compuerta OR es la asociada a la suma, y matemáticamente la expresamos como “+”. Compuerta XOR

La compuerta XOR realiza la operación lógica correspondiente al OR inclusivo, es decir, una o ambas de las entradas deben estar en 1 para que la salida sea 1. FLIPFLOPS : Flipflop D

65

La tabla de excitación del ffd es la siguiente:

D Q

0 0

1 0

Flipflop JK

La tabla de excitación para el flipflop JK es la siguiente:

J K Q 0 0 q 0 1 1 1 0 0 1 1 q‘

DISPOSITIVOS MAX+plus ll:

66

67

BIBLIOGRAFIA. [1] T.L. Floyd, Fundamentos de Sistemas Digitales sexta edición, Prentice Hall, 1997. [2] M.Morris Mano y Charles R. Kime, Fundamentos de Diseño Lógico y Computadores, Prentice Hall, 1998. [3].Mandado Enrique, sistemas Electrónicos Digitales, Alfaomega marcombo, 1991. [4] Wayne Tomasi, Sistemas de Comunicaciones Electrónicas, Prentice may, 1996. [5] http://www.altera.com [6] MAX+plus II Versión 10.1 Help