77
Sergio Noriega - 2015 MÓDULO 2

MÓDULO 2 - UNLPcatedra.ing.unlp.edu.ar/electrotecnia/islyd/... · diseÑo en vhdl de microprocesador elemental basado en el proyecto cu9, adicionando un controlador independiente

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Sergio Noriega - 2015

MÓDULO 2

CU9

PROYECTO CU9 DISEÑO EN VHDL DE MICROPROCESADOR ELEMENTAL BASADO EN EL PROYECTO CU8, DONDE SE ADICIONA UN MODO DE DIRECCIONAMIEMTO INDIRECTO A MEMORIA DE DATOS, A TRAVÉS DE UN REGISTRO INDICE DENOMINADO "IX".

Sergio Noriega - 2015

RST CLK

CU9

BUS DATA_IN

BUS ADDRESS

MEM

OR

IA

uP16

CPU

PC

16R

MA

R

RX

IR

MD

RO

M

DR

I

MU

XM

AR

MUXRX

FPGA

CCR ALU

BUS CONTROL

BUS DATA _OUT

PORT A PORT B

ENTRADAS A FPGA SALIDAS DE FPGA

REGPA M

UX

MD

RI

REGPB

ENTR

AD

A S

A F

PG

A

IX

MU

XM

AR

2

Sergio Noriega - 2015

CU9 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 IR 15

X”0000” 00000000 = CLR RX X”0100” 00000001 = INC RX X”0200” 00000010 = LDI RX X”0300” 00000011 = DEC RX X”0400” 00000100 = NOP X”8000” 10000000 = RST X”0500” 00000101 = LDD RX X”0600” 00000110 = STR RX X”070X” 00000111 = OPERACIONES ARITMÉTICO- LÓGICAS ENTRE MEMORIA DE DATOS Y REGISTRO “RX”. X”0800” 00001000 = STR RXL, PORT A X”09X0” 00001001 = BIT SET I, PORT A X”0AX0” 00001010 = BIT CLR I, PORT A X”0B00” 00001011 = INC PORT A X”0C00” 00001100 = DEC PORT A X”0D00” 00001101 = LDI RX, PORT B X”0E00” 00001100 = BTIJC, PORT B X”0F00” 00001101 = BTIJS, PORT B X”1000” 00010000 = JMP PC, DIR X”1100” 00010001 = JMP PC, IF Z, DIR X”1200” 00010010 = JMP PC, IF C, DIR X”1300” 00010011 = DEC RX, IF NZ X"1400" 00010100 = LDI IX X"1500" 00010101 = INC IX X"1600" 00010110 = LDD RX, IX X"1700" 00010111 = STR RX, IX

USO ESTOS BITS PARA ENTRAR EL CÓDIGO DE IDENTIFICACIÓN DEL BIT A SELECCIONAR: PORT_A(BIT 0) = “000” PORT_A(BIT 1) = “001” . . . . PORT_A(BIT 6) = “110” PORT_A(BIT 7) = “111”

RESERVADOS PARA OPER. CON LA "ALU"

Total: 40 instrucciones

Sergio Noriega - 2015

Sergio Noriega - 2015

SE SUMAN LAS SIGUIENTES INSTRUCCIONES : LDI_IX CARGA INMEDIATA DE REGISTRO "IX". INC_IX INCREMENTO DEL CONTENIDO DEL REGISTRO "IX". LDD_RX_IX CARGA DE "RX" CON CONTENIDO DE MEMORIA APUNTADA POR REGISTRO "IX". STR_RX_IX CARGA DE MEMORIA APUNTADA POR REGISTRO "IX" CON EL CONTENIDO DE "RX".

CU9

DIRECCIONAMIENTO INDEXADO

Sergio Noriega - 2015

IX

Sergio Noriega - 2015

MUXMAR2

PC

MDRI IX

MU

XM

AR

2

SELEMUXMAR

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9 CONTENIDO DEL ARCHIVO RAM.HEX PARA ESTE PROYECTO

0000 CLR RX 0001 LDI IX, 0A00 0002 0A00 0003 STR RX, IX 0004 INC IX 0005 INC RX 0006 STR RX, IX 0007 INC IX 0008 INC RX 0009 STR RX, IX 000A LDI IX, 0A00 000B 0A00 000C LDD RX, IX 000D STR RXL, PORTA 000E INC IX 000F STR RX, IX 0010 STR RXL, PORTA 0011 INC IX 0012 STR RX, IX 0013 STR RXL, PORTA 0014 INC RX 0015 JMP PC, 0001 0016 0001

RUTINA DE PRUEBA

Sergio Noriega - 2015

CU9 SE PRUEBAN LAS INSTRUCCIONES RELACIONADAS CON EL REGISTRO IX

PRIMERO : SE ESCRIBEN LAS POSICIONES DE RAM DE 0A00, 0A01 Y 0A02 CON "STR RX,IX" SEGUNDO: SE LEEN DICHAS POSICIONES CON "LDD RX, IX" MIENTRAS SE ESCRIBEN EN PORTA. TERCERO: AL TERMINAR EL CICLO, SE INCREMENTA RX Y SALTA A "0001" DONDE SE REPITE TODO PERO CON NUEVOS VALORES DE "RX" EN UN LOOP INFINITO.

Sergio Noriega - 2015

CU9

RUTINA PARA DETECCIÓN Y EJECUCIÓN DE INSTRUCCIÓN LDI_IX

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9

RUTINA SIMILAR A LA DE "LDI RX"

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9

RUTINA PARA DETECCIÓN Y EJECUCIÓN DE LAS INSTRUCCIONES LDD RX, IX Y STR RX, IX

Sergio Noriega - 2015

CU9

Sergio Noriega - 2015

CU9

PARA RACIONALIZAR ESTADOS, VUELVO A UTILIZAR PARTE DE LAS RUTINAS DE "LDD RX, MEM" Y "STR RX, MEM" COMUNES A "LDD RX, IX" Y "STR RX, IX".

Sergio Noriega - 2015

CU9

RUTINA PARA DETECCIÓN Y EJECUCIÓN DE INSTRUCCIÓN "INC IX"

Sergio Noriega - 2015

CU9

CU10

PROYECTO CU10

DISEÑO EN VHDL DE MICROPROCESADOR ELEMENTAL BASADO EN EL PROYECTO CU9, ADICIONANDO UN CONTROLADOR INDEPENDIENTE DEL CONVERSOR ANALÓGICO-DIGITAL TIPO SERIE ADC128S022, QUE SE ENCUENTRA INTEGRADO EN LA PLACA DE0-NANO DE LA CYCLONE IV. .

RST CLK

CU10

BUS DATA_IN

BUS ADDRESS

MEM

OR

IA

uP16

CPU

PC

16R

MA

R

RX

IR

MD

RO

M

DR

I

MU

XM

AR

MUXRX

FPGA

CCR ALU

BUS CONTROL

BUS DATA _OUT

PORT A PORT B

ENTRADAS A FPGA SALIDAS DE FPGA

REGPA

MU

XM

DR

I2

REGPB

ENTR

AD

A S

A F

PG

A

IX

MU

XM

AR

2

CO

NTR

OLA

DO

R D

E A

DC

CO

NV

ERSO

R

AD

C S

ERIE

Sergio Noriega - 2015

CU10

A10 B10 A9 B14

Sergio Noriega - 2015

CU10

Sergio Noriega - 2015

CU10

CONTROLADOR DE ADC CONVERSOR

ADC SERIE

uP16

csn_adc

clock_adc

dout_adc

din_adc

salid

a_co

ntr

add

r_co

ntr

end

_of_

con

v

star

t_co

ntr

FPGA

muxmdri <= salida_contr addr_contr <= salidair(7 downto 5)

ADC128S022

CU10 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 IR 15

X”0000” 00000000 = CLR RX X”0100” 00000001 = INC RX X”0200” 00000010 = LDI RX X”0300” 00000011 = DEC RX X”0400” 00000100 = NOP X”8000” 10000000 = RST X”0500” 00000101 = LDD RX X”0600” 00000110 = STR RX X”070X” 00000111 = OPERACIONES ARITMÉTICO- LÓGICAS ENTRE MEMORIA DE DATOS Y REGISTRO “RX”. X”0800” 00001000 = STR RXL, PORT A X”09X0” 00001001 = BIT SET I, PORT A X”0AX0” 00001010 = BIT CLR I, PORT A X”0B00” 00001011 = INC PORT A X”0C00” 00001100 = DEC PORT A X”0D00” 00001101 = LDI RX, PORT B X”0E00” 00001100 = BTIJC, PORT B X”0F00” 00001101 = BTIJS, PORT B X”1000” 00010000 = JMP PC, DIR X”1100” 00010001 = JMP PC, IF Z, DIR X”1200” 00010010 = JMP PC, IF C, DIR X”1300” 00010011 = DEC RX, IF NZ X"1400" 00010100 = LDI IX X"1500" 00010101 = INC IX X"1600" 00010110 = LDD RX, IX X"1700" 00010111 = STR RX, IX X”1800” 00011000 =START CONV CH I, ADC X”1900” 00011001 = LDD RX, ADC X”1A00” 00011010 = JUMP PC IF EOC NZ, ADC

USO ESTOS BITS PARA ENTRAR EL CÓDIGO DE IDENTIFICACIÓN DEL BIT A SELECCIONAR: PORT_A(BIT 0) = “000” PORT_A(BIT 1) = “001” . . . . PORT_A(BIT 6) = “110” PORT_A(BIT 7) = “111”

RESERVADOS PARA OPER. CON LA "ALU"

Total: 43 instrucciones

Sergio Noriega - 2015

Controlador ADC

Start

Clock_50MHz

Reset

sal_controller

End of Conversion address

Sergio Noriega - 2015

Controlador del conversor ADC128S022 (de la placa Terasic DE0-Nano - Cyclone IV)

ADC128S022

dout din sclk csn

FPGA

8 canales

CU10

Sergio Noriega - 2015

ADC128S022 CU10

Sergio Noriega - 2015

ADC128S022 CU10

Sergio Noriega - 2015

ADC128S022 CU10

Sergio Noriega - 2015

ADC128S022 CU10

Sergio Noriega - 2015

csn

start

t

t

t

t t t

clock

DIAGRAMA DE TIEMPOS DE LAS SEÑALES DE CONTROL

sclk

din

dout DB11 DB10 DB9 DB8 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Carga de datos al ADC: en cada flanco descendente de “sclk”. Lectura de datos desde el ADC : en cada flanco ascendente de “sclk”.

Momento de escribir al ADC Momento de leer el ADC

CU10

Sergio Noriega - 2015

Código del controlador del ADC

CU10

Sergio Noriega - 2015

Enable se activa con «start_contr» y se desactiva con «counter = 32»

Cambia el dato para el ADC en cada flanco ascendente que se envía a la línea «din_adc».

CU10

Sergio Noriega - 2015

Se lee el dato desde el ADC en cada flanco descendente Por la línea «dout_adc»

El dato en formato paralelo desde el ADC se refresca en cada fin de conversion del ADC (flanco ascendente de «csn»)

Se genera un pulso positivo al finalizar la conversión para que sea usado como «aviso» al micro.

CU10

Sergio Noriega - 2015

Código del testbench del controlador del ADC

CU10

Sergio Noriega - 2015

CU10

Cómo se debe adaptar este proyecto para ser usado por el microcontrolador ...???

Sergio Noriega - 2015

Simulación del controlador del ADC

Aquí se generó artificialmente una respuesta del conversor.

CU10

CU11

PROYECTO CU11

DISEÑO EN VHDL DE UN CONTROLADOR MASTER PARA BUS SERIE I2C PARA SER EMPLEADO COMO CONTROL DE TRANSFERENCIA DE DATOS ENTRE EL MICROCONTROLADOR Y LA MEMORIA EEPROM SERIE 24LC02B QUE POSEE LA PLACA TERASIC DE0-NANO CYCLONE IV.

Controlador I2C

Start

Clock_200KHz

Reset

Dataout

Datain

Sergio Noriega - 2015

Controlador de bus maestro I2C Ejemplo con la memoria EEPROM 24LC02B

(de la placa Terasic DE0-Nano - Cyclone IV)

Memoria EEPROM (2Kbits serie I2C)

24LC02B

SDA SCL

FPGA Vdd Vdd

R_Wn

Addressin

Acnowledge

Error_out

End_of_Trans

CU11

Sergio Noriega - 2015

I2C BUS

La versión básica suele usar un dispositivo Master que controla por el bus desde un dispositivo Slave hasta 128 que pueden interactuar sólo con el Master. El bus es de 2 hilos, del tipo open-drain: Uno es un reloj (SCL) que gobierna el Master y el otro es de datos (SDA) que es bidireccional.

La versión extendida consiste de múltiples Master que pueden tomar el control del bus a través de un modo de arbitraje.

CU11

Sergio Noriega - 2015

I2C BUS Las líneas SCL y SDA deben terminar con una resistencia de pull-up y por lo tanto los terminales de dispositivos conectados a ellas deben admitir la bidireccionalidad. Todo proceso de comunicación para la transferencia de información debe consistir de una condición inicial de inicio (START) y una de finalización (STOP). En cada paquete enviado por el master se espera un reconocimiento del slave seleccionado. Si no responde debe generarse el apropiado manejo de error en dicha transferencia en una capa superior del protocolo de comunicación.

CU11

Sergio Noriega - 2015

I2C BUS

Los cambios en la línea de SDA para transferencia de datos se deben realizar siempre con SCL en bajo.

Para comenzar una transacción se debe generar un flanco negativo en SDA cuando SCL esté en alto.

Para terminar una transacción se debe generar un flanco positivo en SDA cuando SCL esté en alto.

CU11

Sergio Noriega - 2015

I2C BUS

Cuando el master comienza una transacción, manda una señal de START con SCL en «1». En los próximos 8 estados en bajo de SCL, manda 7 bits con la dirección del dispositivo elegido y otro bit en «0» o «1» para señalar que va a escribir o leer en el mismo. En el noveno ciclo de SCL, el master pone la línea SDA en «Z» y espera a recibir un dato por SDA (reconocimiento = acknowldge). Si recibe un «0» prosigue, sino ha habido un error. La cantidad de bytes subsiguientes son ilimitados y depende del sistema. Al finalizar cada byte se debe pedir reconocimiento. Para terminar se debe generar una señal de STOP.

CU11

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

Memoria EEPROM de 2Kbits en arreglo de 265 x 8. Bus de comunicación serie de dos cables tipo I2C. Velocidad de transferencia de 100KHz ó 400KHz. Protección contra escritura por hardware. Retención de datos hasta 200 años. Mas de 1 millón de ciclos de borrado/escritura.

CU11

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

Este modelo de memoria tiene una identificación de 7 bits: 1010XXX.

CU11

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

La escritura de un simple byte "BYTE WRITE" se realiza enviando : 1 - Dirección del dispositivo. 2 - Posición de memoria. 3 - Dato. Se puede escribir también, en múltiples posiciones de memoria consecutivas (hasta 8) denominado "PAGE WRITE", desde la inicial, enviando cada dato con su respectiva confirmación (ACK).

MODO USADO AQUI

CU11

EL DISPOSITIVO AL RECIBIR EL "STOP" LUEGO DE UN PEDIDO DE "WRITE", COMIENZA UN CICLO INTERNO DE ESCRITURA QUE PUEDE TARDAR HASTA 5 ms...!!!

SE ESCRIBEN 8 BYTES CONSECUTIVOS

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

La memoria tiene un contador interno que se incrementa en cada acceso. Si por ejemplo, quedó apuntando en la dirección N, al generar una sesión de lectura como se muestra, se leerá el dato de la dirección N+1.

CU11

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

La forma convencional de lectura de una posición de memoria específica, es la de Random Read. Se deben generar dos ciclos: uno START-ACK y otro START-STOP. El primero direcciona el dispositivo y la posición de memoria deseada para leer. El segundo direcciona nuevamente el dispositivo pero indicándole que se lo va a leer y luego se adquiere el dato almacenado.

MODO USADO AQUI

CU11

Sergio Noriega - 2015

24LC02B(I2C 2K EEPROM)

El caso «secuencial» permite la lectura de varias posiciones de memoria consecutivas, terminando la transacción con una señal de STOP.

CU11

Sergio Noriega - 2015

En la placa Terasic DE0-Nano de Cyclone IV, las resistencias de pull-up ya están insertadas en la placa del impreso.

CU11

Sergio Noriega - 2015

CU11 Código del controlador I2C

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

IMPORTANTE: EL DISPOSITIVO 24LC02, AL RECIBIR EL STOP" COMIENZA UN CICLO INTERNO DE ESCRITURA QUE TARDA 5 ms...!!! => ESTO DEBE SER CONSIDERADO EN LA RUTINA DEL CONTROLADOR "I2C" PARA EL MANEJO DE LA MEMORIA 24LC02 .......!!!

QUE HABRÍA QUE MODIFICAR EN ESTE PROYECTO ...???

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

CU11

Sergio Noriega - 2015

Simulación de dos rutinas de escritura en la memoria serie EEPROM de

dirección 1010xxx en las posiciones de memoria 00 y 01

CU11

Sergio Noriega - 2015

Rutina completa de la primera escritura

CU11

Sergio Noriega - 2015

Zoom de la primera rutina desde comienzo de START y escritura del CONTROL BYTE

CU11

Sergio Noriega - 2015

Zoom de la primera rutina desde escritura de WORD ADDRESS y WRITE DATA

CU11

Sergio Noriega - 2015

Rutina de la segunda escritura desde START e indicando CONTROL BYTE y WORD ADDRESS

CU11

Sergio Noriega - 2015

Rutina de la segunda escritura desde WORD ADDRESS y WRITE DATA

CU11

CU12

PROYECTO CU12

DISEÑO EN VHDL DE UN GENERADOR INDEPENDIENTE DE PWM (PULSE WIDTH MODULATION) PROGRAMABLE.

Generador PWM Clock_50MHz

Reset_in sal_pwm data_in

Genera una onda cuadrada de ciclo de trabajo variable y frecuencia ajustable . data_in (9 downto 0) = Define el ciclo de trabajo (resolución 1/1024 ó 1‰) data_in (13 downto 12) = Define la frecuencia de referencia(50, 25, 10 ó 5 KHz)

Sergio Noriega - 2015

GENERADOR "PWM" (Pulse Width Modulation) CU12

Sergio Noriega - 2015

sal_pwm

clock_per

t

t

t

clock_50mhz

Desde 1 hasta 1022 ciclos de clock_per

mode_ucnt => "x x M1 M0 x x D9 ...............D0"

M1 M0 => F_pwm 0 0 50 KHz 0 1 25 KHz 1 0 10 KHz 1 1 5 KHz

Rango de 1 a 1023 períodos de clock_per para definir el "1" lógico

GENERACIÓN DE SEÑAL "PWM" (Pulse Width Modulation)

Desde 1022 a 1 Período de clock_per

CU12

Sergio Noriega - 2015

CU12

Código del Generador PWM

Sergio Noriega - 2015

CU12

Sergio Noriega - 2015

CU12

Sergio Noriega - 2015

CU12

Código del TestBench para el Generador PWM

Sergio Noriega - 2015

CU12

Sergio Noriega - 2015

Período de la frecuencia = 20,48 us

CU12

Sergio Noriega - 2015

Período de la frecuencia = 40,959 us

CU12