0% encontró este documento útil (0 votos)
9 vistas14 páginas

Desarrollo de Sistemas con Matrix Creator

Este documento presenta la plataforma de desarrollo Matrix Creator, la cual permite el estudio de arquitecturas digitales a través de módulos como una Raspberry Pi, FPGA y microcontroladores. Explica que la FPGA actúa como puente entre los radios, sensores y actuadores con los módulos de procesamiento. También describe la programación y configuración de los diferentes módulos a través del protocolo JTAG.

Cargado por

Daniela Marin
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
9 vistas14 páginas

Desarrollo de Sistemas con Matrix Creator

Este documento presenta la plataforma de desarrollo Matrix Creator, la cual permite el estudio de arquitecturas digitales a través de módulos como una Raspberry Pi, FPGA y microcontroladores. Explica que la FPGA actúa como puente entre los radios, sensores y actuadores con los módulos de procesamiento. También describe la programación y configuración de los diferentes módulos a través del protocolo JTAG.

Cargado por

Daniela Marin
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Captulo 1

Introduccion

1.1.

Introduccion

El sistema de desarrollo formado por la raspberry-pi y el matrix creator permite el estudio completo de las arquitecturas mas utilizadoas en los sistemas digitales, esto, gracias a la flexibilidad de sus interconexiones y a la posiblidad
de implementar aplicaciones que abarcan los planes de estudios de la mayora de los cursos relacionados con el diseno
digital.
El matrix creator esta formado por tres grandes bloques (ver figura 1.1: Procesamiento, Radios y Sensores y actuadores.
Procesamiento: Este bloque esta encargado de procesar los datos provenientes de los radios, sensores y actuadores y
esta compiuesto por:
Single Board Computer (SBC) Raspberry - Pi: Esta SBC permite la ejecucion del sistema operativo Linux, esta
plataforma es utilizada por una grancantidad de desarrolladores alrededor del mundo, por lo que es posible encontrar mucha documentacion sobre ella. Adicionalmente, su bajo costo hace que este SBC sea muy u til en los
cursos de diseno digital ya que permite el estudio del sistema operativo Linux (requerimientos software y hardware,
programacion).
FPGA Spartan 6: Las FPGAs son las herramientas ideales para los cursos basicos de diseno digital, su gran capacidad logica unida a los lenguajes de descripcion de hardware (VHDL, Verilog) permite aplicar los flujos de disenos
modernos.
Microcontrolador SAM3S: Una de las desventajas de la Raspberry Pi para aplicaciones en las que no se requiere
conexion a Internet, manejo de dispositivos USB es que resulta muy costosa, fsicamente grande e impractica, esto
debido a la carencia de perifericos que permitan la interaccion a bajo nivel con sensores como conversores analogo
- digitales, PWMs, Timers; adicionalmente, la mayora de distribuciones de Linux no permitem la ejecucion de
aplicaciones en tiempo real. Por lo anterior, matrix creator cuenta con un procesador que permite la ejecucion del
sistema operativo de tiempo real ChibiOS, lo que complementa el estudio de sistemas operativos y muestra otra
opcion en la implementacion de aplicaciones.
Radios: Matrix creator tiene la capacidad de utilizar los protocoles ZigBee, Z-Wave y NFC.
Sensores y actuadores: Matrix creator posee los siguientes sensores:

1.2.

I2C: IMU, humidity and temperature, UV light, Altitude pressure.


8 microfonos MEMS
Tranceiver IR (Control Remoto)
35 LEDs RGBW.

Diagrama de Bloques

La figura 1.2 muestra el diagrama de bloques de la plataforma de desarrollo Matrix creator, en e l podemos ver la
forma en que se interconectan los modulos descritos anteriormente. La FPGA es el puente de comunicacion entre los
Radios, sensores y actuadores con el modulo de procesamiento, esta arquitectura permite que ya sea la raspberry-pi, el

1 Introduccion

Figura 1.1 Tarjeta de desarrollo Matrix Creator

microcontrolador SAM3S, o un procesador implementado dentro de la FPGA (LM32 o RISCV) controlen a los otros
modulos.
RPI_GPIO5
RPI_GPIO6
RPI_GPIO12
RPI_GPIO13
RPI_GPIO16
RPI_GPIO25

GPIO

Serial port

S6_TX
S6_RX

SPI port

SPI_MISO
SPI_MOSI
SPI_CLK
SPI_CE0_N
SPI_CE1_N

Raspberry 2

(MISO MOSI CLK CE1)

TDI
GPIO TDO
TMS
TCK

DATA_BUS
ADDR_BUS
CTRL_BUS

SAM3S
TDI

TDO

TDI
TDO
TMS
TCK
NRST

I2C port

CIS

I2C_SDA
I2C_SCL

I2C sensors

Camera

TDO

Zigbee

TDI

Microphone
CLK, DO, D2, D2, D3, D4
D5, D6, D7, D8

Microphone array

Serial port
& programming port
ZW-nRTS, ZW-TXD
ZW-RXD, ZW-CS,
ZW-CLK, ZW-MISO,
ZW-MOSI

Z-wave

NFC controller
NFC_RST, NFC_ALE,
NFC_IRQ, NFC_D5,
NFC_D6, NFC_D7

NFC

IR controller
IR_RING_EN
FPGA_IR_RX
FPGA_IR_TX

IR

LED controller
LED_FB,
LED_CTRL

LED_ring

Serial port
ZRXD, ZTXD

Spartan 6
FPGA

DF0, DF1, DF2


DF3, DF4, DF5
DF6, DF7, DF8
DF9, DF10, DF11
DF12, DF13, DF14
DF15, DF16
I2C_SDA, I2C_SCL

FPGA GPIO

Figura 1.2 Diagrama de bloques de la plataforma de desarrollo Matrix Creator

1.2.1.

Programacion

Como se menciono anteriormente, matrix creator posee una gran cantidad de recursos digitales que deben ser configurados (FPGA) o programados (SAM3S) para ser utilizados; para facilitar este proceso se utilizo el protocolo JTAG,
este protocolo permite crear cadenas formadas por cualquier cantidad de dispositivos y programarlos o configurarlos utilizando solo 4 senales (TDI, TDO, TMS y TCK), lo que reduce de forma considerable la complejidad del circuito de
programacion, aumenta la flexibilidad y permite la programacion/configuracion remota.

1.2 Diagrama de Bloques

A mediados de los 70s, la estructura de pruebas para tarjetas de circuito impreso (PCB, Printed Circuit Boards) se
basaba en el uso de la tecnica bed-of-nails. Este metodo utilizaba un dispositivo que contena una gran cantidad de
puntos de prueba, que permitan el acceso a dispositivos en la tarjeta a traves de puntos colocados en la capa de cobre para
dicho fin. Las pruebas se realizaban en dos fases: con el circuito apagado y con el circuito funcionando. Con la aparicion
de los dispositivos de montaje superficial se empezo a colocar dispositivos en las dos caras de la tarjeta, y se redujeron de
forma considerable las dimensiones de los dispositivos, disminuyendo la distancia fsica entre las interconexiones (0.4 1mm), dificultando el proceso de pruebas tradicional. A mediados de los 80s un grupo de ingenieros de pruebas miembros
de companas electronicas europeas se reunieron para examinar el problema y buscar posibles soluciones. Este grupo se
auto-denomino JETAG (Joint European Test Action Group). El metodo de solucion propuesto por ellos estaba basado en el
concepto de un registro de corrimiento serial colocado alrededor de la frontera dispositivo, de aqu el nombre Boundary
Scan. Despues el grupo se asocio a companas norteamericanas y la E de European desaparecio del nombre de la
organizacion convirtiendose en JTAG (Join Test Action Group).

[Link].

Arquitectura BOUNDARY SCAN

A cada senal de entrada o salida se le adiciona un elemento de memoria multi-proposito llamado Boundary Scan Cell
(BSC). Las celdas conectadas a los pines de entrada reciben el nombre de Celdas de entrada, y las que estan conectadas
a los pines de salida Celdas de salida. En la Figura 1.3 se muestra esta arquitectura.

Figura 1.3 Arquitectura Boundary Scan

Las BSC se configuran en un registro de corrimiento de entrada y salida paralela. Una carga paralela de los registros
(captura) ocasiona que los valores de las senales aplicadas a los pines del dispositivo pasen a las celdas de entrada y
que opcionalmente los valores de las senales internas del dispositivo pasen a las celdas de salida. Una descarga paralela
(Actualizacion) ocasiona que los valores presentes en las celdas de salida pasen a los pines del dispositivo, y opcionalmente
los valores almacenados en las celdas de entrada pasen al interior del dispositivo.
Los datos pueden ser corridos a traves del registro de corrimiento de forma serial, empezando por un pin dedicado TDI
(Test Data In) y terminando en un pin de salida dedicado llamado TDO (Test Data Out). La senal de reloj se proporciona
por un pin externo TCLK (Test Clock) y el modo de operacion se controla por la senal TMS (Test Mode Select). Los
elementos del Boundary Scan no afectan el funcionamiento del dispositivo. Y son independientes del nucleo logico del
mismo.

[Link].

Instrucciones JTAG

El Standard IEEE 1149.1 describe tres instrucciones obligatorias: Bypass, Sample/Preload, y Extest [?].

1 Introduccion

BYPASS Esta instruccion permite que el chip permanezca en un modo funcional, hace que el registro de Bypass se
coloque entre TDI y TDO; permitiendo la transferencia serial de datos a traves del circuito integrado desde TDI hacia
TDO sin afectar la operacion. La codificacion en binario para esta instruccion debe ser con todos sus bits en uno.
SAMPLE/PRELOAD Esta instruccion selecciona coloca el registro Boundary-Scan entre los terminales TDI y TDO.
Durante esta instruccion, se puede acceder al registro Boundary-Scan y obtener una muestra de los datos de entrada
y salida del chip a traves de la operacion Data Scan. Esta instruccion tambien se utiliza para precargar los datos de
prueba en el registro Boundary-Scan, antes de ejecutar la instruccion EXTEST. La codificacion de esta instruccion la
define el fabricante.
EXTEST Esta instruccion coloca al circuito integrado en modo de test externo (pruebas de interconexion) y conecta el
regsitro Boundary-Scan entre TDI y TDO. Las senales que salen del circuito son cargadas en el registro boundary-scan
en el flanco de bajada de TCK del estado Capture-DR; las senales de entrada al dispositivo son cargadas al registro
boundary-scan durante el flanco de bajada de TCK dl estado Update-DR (ver Figura 1.4). La codificacion para esta
instruccion esta definida con todos sus bits en cero.
INTEST La instruccion INTEST (opcional) selecciona el registro boundary-scan, pero es utilizado para capturar las
senales que salen del nucleo logico del dispositivo, y para aplicar valores conocidos a las senales de entrada del nucleo.
La codificacion para esta senal es asignada por el disenador.

Figura 1.4 Arquitectura Boundary Scan

[Link].

Cadena JTAG

En la figura 1.5 se muestra la cadena JTAG del matrix creator, la cual esta formada por el microcontrolador SAM3S,
la FPGA Spartan 6 y el microcontroador EM358 (Zigbee).
La cadena es controlada por un puerto creado con pines de proposito general (GPIOs) de la raspberry-pi, lo que elimina
la necesidad de interfaces de hardware adicionales, o la necesidad de llevar la plataforma a un sitio especfico.
Para programar los microcontroladores SAM3S y EM358 se utiliza el proyecto OpenOCD (Open On-Chip Debugger)
el cual permite la programacion de la memoria flash interna de una gran variedad de procesadores, y la depuracion de
procesadores ARM utilizando el modulo ICE. Este proyecto se ha convertido en el mas popular dentro del grupo de
desarrolladores de sistemas Embebidos. En la figura 1.5 se muestra como se debe especificar la cadena en los archivos de
configuracion para openocd (es necesario crear un archivo de configuracion para cada microcontrolador).
Para configurar la FPGA se utiliza el proyecto xc3sprog, el cual permite configurar una gran variedad de FPGAs de
Xilinx, para ellos se utiliza el mismo puerto formado por los GPIOs de la raspberry-pi. Debido a que estos pines se encuen-

1.3 Conexion entre el microcontrolador SAM3S y la FPGA

source [find interface/[Link]]


transport select jtag
adapter_khz 512
tag newtap em357 cpu \
-irlen 4\
-ircapture 0x1\
-irmask 0xf \
-expected-id 0x3ba00477
jtag newtap em357 bs \
-irlen 4 \
-ircapture 0x0e \
-irmask 0xf \
-expected-id 0x069AA62B
jtag newtap [Link] fpga \
-irlen 6 \
-ircapture 0x11 \
-irmask 0x3f \
-expected-id 0x24000093
jtag newtap sam3_3.cpu cpu \
-irlen 4\
-ircapture 0x1\
-irmask 0xf \
-expected-id 0x3ba00477

Raspberry 3

GPIO22 TDI
GPIO04 TMS
GPIO17 TCK
GPIO27 TDO

SAM3S

TDI
TMS

TDO
TCK

TDI
TMS
TCK
TDO

Running openocd & xc3spog


TMS

TDO

TCK

EM358

target create [Link] cortex_m -endian little -chain-position 3


flash bank flash0 at91sam3 0x00400000 0 0 0 [Link]
init
halt
wait_halt
sleep 10
at91sam3 gpnvm set 1
flash info 0
flash probe 0
flash write_bank 0 [Link] 0
soft_reset_halt
reset run
Shutdown

TDI

Spartan 6
FPGA

target create [Link] cortex_m -endian little -chain-position 0


[Link] configure -work-area-phys 0x20000000 -work-area-size 0x3000 -work-area-backup 0
flash bank flash0 em357 0x08000000 0x30000 0 0 [Link]
cortex_m reset_config vectreset

Figura 1.5 Cadena JTAG

tran disponibles en el conector de expansion del matrix-creator es posible configurar/programar los microcontroladores y
la FPGA sin la necesidad de la raspberry pi, para ello, es necesario utilizar una interfaz USB serial FTDI (o similar) tal
como se muestra en la figura 1.6

OpenOCD
libFTDI

Puerto
USB

Interfaz JTAG
FT2232

Conexin TCP
localhost:2000

TDO

TDI
TMS
TCK
nTRST

Puerto TCP
2000

Puerto JTAG

ELF
.debug
PC

In Circuit
Emulation ICE

SoC

Figura 1.6 Principio de funcionamiento del proyecto OpenOCD

1.3.

Conexion entre el microcontrolador SAM3S y la FPGA

Es comun, que algunas aplicaciones requieran ciertos perifericos especiales que les permitan cumplir las restricciones
temporales, es decir, se deben crear tareas Hardware que ayuden a las tareas software a cumplir con las restricciones
de diseno. Para esto es necesario implementar algunas funciones en perifericos externos al procesador. Si la tarea no se
encuentra implementada en un dispositivo comercial es necesario implementarlas en un dispositivo logico programable

1 Introduccion

(PLD) o en un circuito integrado de aplicacion especfica (ASIC). En esta seccion realizaremos una explicacion detallada
del proceso de comunicacion entre el micro-controlador y un periferico implementado en una FPGA.
Como se menciono anteriormente es posible que el microcontrolador SAM3S controle los sensores y actuadores conectados a la FPGA, para hacer esto posible, se utilizo un miembro de la familia SAM3S con capacidad de manejo de
memorias externas, es decir, con control de los buses de datos direccion y control. La figura 1.7 muestra la conexion entre
la FPGA y el SAM3S, el bus de datos de 8 bits DS[7:0], el de direcciones de 14 bits AS[13:0] y el de control formado
por SNWE, SNRD, SNCS3 y SNWAIT.

P2

AD0
AD1

DF<7>
DF<6>
DF<5>
DF<4>
DF<3>
DF<2>
DF<1>
DF<0>

= "P88"
= "P85"
= "P83"
= "P82"
= "P81"
= "P80"
= "P79"
= "P78"

DF<16>
DF<15>
DF<14>
DF<13>
DF<12>
DF<11>
DF<10>
DF<09>
DF<08>

= "P104"
= "P102"
= "P101"
= "P99"
= "P98"
= "P95"
= "P94"
= "P93"
= "P92"

AD[0:1]
DF[0:16]
URXD0
UTXD0

SAM_TX = P2
SAM_RX = P5

TWCK
TWD

I2C_SCL = P75
I2C_SDA = P74

DATA[0:7]
ADDRESS[0:13]
NWE
NRD
NCS3
NWAIT

SAM3S

DS[0:7]
AS[0:13]
SNWE
SNRD
SNCS3
SNWAIT

MISO
MOSI
SPI_CLK
CE1_N

SPI_MISO = P114
SPI_MOSI = P112
SPI_CLK
= P115
SPI_CE0_N = P116

Spartan 6
FPGA

AS<13> = "P24"
AS<12> = "P26"
AS<11> = "P27"
AS<10> = "P100"
AS<9> = "P14"
AS<8> = "P17"
AS<7> = "P48"
AS<6> = "P50"
AS<5> = "P51"
AS<4> = "P57"
AS<3> = "P60"
AS<2> = "P61"
AS<1> = "P62"
AS<0> = "P66"

DS<7> = "P137"
DS<6> = "P132"
DS<5> = "P131"
DS<4> = "P127"
DS<3> = "P124"
DS<2> = "P121"
DS<1> = "P117"
DS<0> = "P6"
SNWE = "P97"
SNRD = "P87"
SNCS = "P8"
SNWAIT = "P10"

NRTS

GPIO18

SPI

RaspBerry

Figura 1.7 Conexion entre la FPGA y el microcontrolador SAM3S

1.3.1.

Comunicacion Microcontrolador - FPGA

La figura 1.8 muestra una arquitectura basica para la comunicacion de tareas Hardware - Software; en ella podemos
observar que el procesador maneja tres buses:
Bus de Datos: Bus bidireccional por donde se realiza el intercambio de informacion.
Bus de Direcciones: Bus controlado por el procesador y es utilizado para direccionar un determinado periferico o una
determinada funcionalidad del mismo.
Bus de control: Senales necesarias para indicarle a los perifericos el tipo de comunicacion (lectura o escritura).
Todos los perifericos que requieren intercambio de informacion con el procesador comparten el mismo bus de datos,
por lo que es necesario que mientras el procesador no se comunique con ellos permanezcan en estado de alta impedancia;
esto es necesario para evitar corto - circuitos originados por diferentes niveles logicos en el bus. Por lo tanto, las comunicaciones siempre son iniciadas por el procesador y se selecciona uno y solo un periferico a la vez. El decodificador de
direcciones es el encargado de habilitar un determinado periferico ante una solicitud del procesador (mediante una direccion de memoria), esto lo hace activando la senal CSX, cuando esta senal se encuentra en estado logico alto el periferico

1.3 Conexion entre el microcontrolador SAM3S y la FPGA

Figura 1.8 Arquitectura basica hardware/software

coloca su bus de datos en alta impedancia; si se encuentra en estado logico bajo, el periferico escribe o lee el bus de datos,
dependiendo de la activacion de las senales del bus de control RD y WR.
El decodificador de direcciones, como su nombre lo indica utiliza como entradas el bus de direcciones y activa solo
una senal de seleccion de Chip (CSX), basandose en un rango de direcciones asignado a cada periferico, este rango de
direcciones no debe traslaparse para asegurar que solo un chip es seleccionado. Este rango de direcciones que se asigna a
cada dispositivo que puede ser accesado por la unidad de procesamiento recibe el nombre de mapa de memoria y puede
variar para cada plataforma.
Cuando la unidad de procesamiento necesite comunicarse con un determinado periferico, colocara en el bus de direcciones un valor que se encuentre en el rango de direcciones asignado para ese periferico; esto hace que el decodificador
de direcciones active la senal de seleccion adecuada para informarle al periferico que el procesador va a iniciar una transferencia de informacion. La Figura 1.9 muestra el diagrama de tiempos para un ciclo de lectura y escritura del procesador.

Figura 1.9 Ciclo de lectura y escritura para la arquitectura de la Figura 1.8

De lo anterior podemos concluir que un periferico es visto por el procesador como una posicion de memoria y las
transacciones las inicia u nicamente el procesador.

[Link].

Implementacion de Perifericos en una FPGA

Es importante tener en cuenta los siguientes putos cuando se implemente una tarea Hardware en una FPGA:
La frecuencia del reloj de la FPGA es mucho mayor que la de las senales del bus de control; por lo que es necesario
asegurarse que cada vez que el procesador realiza una solicitud de lectura o escritura, la senal de activacion cambia del

1 Introduccion

estado logico alto al bajo; si solo se tiene en cuenta el estado bajo de la senal CSX el periferico puede ejecutar la tarea
varias veces en el mismo ciclo de activacion, lo que puede llevar a resultados incorrectos.
La fase de los relojes del procesador y la FPGA no es la misma, por lo que es necesario sincronizar las senales del
procesador con el reloj de la FPGA; si esto no se hace las senales fuera de fase pueden originar un estado de metaestabilidad en los Flip-Flops internos de la FPGA y por lo tanto el mal-funcionamiento del sistema.
El bus de datos es bidireccional, por lo que es necesario que la FPGA lo coloque en alta impedancia cuando no se
este habilitando un periferico.
La FPGA no permite implementar buffers tri-estado internamente por lo que es necesario separar los buses de entrada
y salida a cada periferico. El bus de entrada es comun a todos los perifericos mientras que es necesario utilizar un
esquema de multiplexacion entre los buses de salida.
La figura 1.11 muestra el diagrama de bloques de la interfaz necesaria para poder comunicar un grupo de perifericos o
tareas Hardware con el bus de datos, direccion y control de un procesador. El bloque SYNC se encarga de sincronizar las
senales provenientes de la FPGA con el reloj interno de la misma.

CS1
Peripheral
1

Data_out P1

IRQ1

Data_out P2
Data_out Pn

nrd | ncs2

Csn

rdBus

Peripheral
n
buffer_data

wdBus

sram_data
ncs
nwe

Address

sncs
snwe
SYNC

IRQn

Write
Pulse
generator

we
CSPIC

buffer_address

PIC

IRQ1
IRQn

sncs
snwe

CS1
Address
Decoder

IRQ

CSPIC
CSn

we

Figura 1.10 Diagrama de Bloques para la comunicacion de tareas HW-SW 1.8

El modulo Write Pulse generator genera un pulso cuando las senales sncs y snwe son activadas como se indica en la
parte inferior izquierda de la figura 1.8. El decodificador de direcciones selecciona un determinado periferico dependiendo
del rango especificado para cada uno. Como mencionamos anteriormente, las FPGAs no permiten implementar buffers
tri-estado internamente , por lo que cada periferico debe tener un bus de entrada y uno de salida de datos, los buses de
entrada de datos son comunes, mientras que los de salida deben ser manejados por un dispositivo de salida, el cual puede
ser un multiplexor controlado por el decodificador de direcciones o una compuerta OR, para este u ltimo caso es necesario
que los perifericos coloquen el bus de datos en 0 cuando no esten seleccionados. Finalmente es necesario colocar un
buffer tri-estado en los pines de la FPGA, este buffer esta controlado por las senales nrd y ncs2 y solo se activa cuando el
procesador inicia una operacion de lectura.

[Link].

Ejemplo de periferico

La figura 1.11 muestra un ejemplo sencillo de un periferico que implementa una comunicacion en ambas vas con
el procesador. En cada uno de sus componentes se indica su implementacion utilizando el lenguaje de descripcion de

1.3 Conexion entre el microcontrolador SAM3S y la FPGA

hardware verilog. El periferico instancia una memoria RAM de Xilinx utilizando sus celdas propietarias, de tal forma que
visto por el procesador, este periferico no es mas que un espacio de memoria de lectura/escritura.

assign sram_data = T?8'bZ:rdBus;


wire T = nrd | ncs;

nrd
T

always @(posedge clk)


if(reset) {w_st, we, wdBus} <= 0;
else begin
wdBus <= buffer_data;
case (w_st)
0: begin
we <= 0;
if(sncs | snwe) w_st <= 1;
end
1: begin
if(~(sncs | snwe)) begin
we <= 1;
w_st <= 0;
end
else we <= 0;
end
endcase
end

ncs
rdBus

buffer_data

sram_data
ncs
nwe

sncs
snwe
SYNC

addr

DO

wdBus
Write
Pulse
generator

we

buffer_address

DI
WE

RAM
Memory

ADDR
EN
SSR

always @(negedge clk)


begin
sncs <= ncs;
snwe <= nwe;
buffer_data <= sram_data;
buffer_addr <= addr;
end

RAMB16_S2 ba0( .CLK(~clk), .EN(1'b1), .SSR(1'b0), .ADDR(buffer_addr),


.WE(we), .DI(wdBus[1:0]), .DO(rdBus[1:0]) );
RAMB16_S2 ba1( .CLK(~clk), .EN(1'b1), .SSR(1'b0), .ADDR(buffer_addr),
.WE(we), .DI(wdBus[3:2]), .DO(rdBus[3:2]) );
RAMB16_S2 ba2( .CLK(~clk), .EN(1'b1), .SSR(1'b0), .ADDR(buffer_addr),
.WE(we), .DI(wdBus[5:4]), .DO(rdBus[5:4]) );
RAMB16_S2 ba3( .CLK(~clk), .EN(1'b1), .SSR(1'b0), .ADDR(buffer_addr),
.WE(we), .DI(wdBus[7:6]), .DO(rdBus[7:6]) );

Figura 1.11 Diagrama de Bloques para la comunicacion de tareas HW-SW 1.8

El modulo Write Pulse generator genera un pulso cuando las senales sncs y snwe son activadas. Como mencionamos
anteriormente, las FPGAs no permiten implementar buffers tri-estado internamente , por lo que cada periferico debe tener
un bus de entrada y uno de salida de datos, los buses de entrada de datos son comunes, mientras que los de salida deben ser
manejados por un dispositivo de salida, el cual puede ser un multiplexor controlado por el decodificador de direcciones o
una compuerta OR, para este u ltimo caso es necesario que los perifericos coloquen el bus de datos en 0 cuando no esten
seleccionados. Finalmente es necesario colocar un buffer tri-estado en los pines de la FPGA, este buffer esta controlado
por las senales RDWRn y ncs2 y solo se activa cuando el procesador inicia una operacion de lectura.
Adicionalmente al anterior codigo se hace que el LED asociado a la FPGA (P39) haga blink, esto para comprobar que
la FPGA fue programada correctamente, esto se implementa con el siguiente codigo.
reg [24:0] counter;
always @(posedge clk) begin
if(reset)
counter <= 0;
else
counter <= counter + 1;
end
assign led = counter[24];

10

1 Introduccion

1.3.2.

Programa en el microcontrolador para comunicarse con la FPGA

En esta seccion se explicara el codigo necesario para comunicarse con el periferico explicado en la sub-seccion anterior.

[Link].

Aplicacion Hello World Hardware: Blinking LED

La aplicacion mas sencilla que permite comprobar el correcto funcionamiento del hardware y de las herramientas de
desarrollo es el blink de un LED, para esto se implemento la siguiente tarea que realiza dicha funcion:
rea de trabajo de Thread1
static WORKING_AREA(waThread1, 128); // Definici
on del a
static msg_t Thread1(void *arg) { // Definici
on de Thread1
(void)arg;
while (TRUE) {
palClearPad(IOPORT3, 17); // El LED est
a conectado a PC17
chThdSleepMilliseconds(50);
palSetPad(IOPORT3, 17);
chThdSleepMilliseconds(50);
}
return(0);
}

El siguiente codigo crea e inicia la tarea Thread1


chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);

[Link].

Configuracion de la interfaz de Bus Externo (EBI)

El periferico encargado de controlar los buses de datos direccion y control recibe el nombre de EBI por sus siglas en
ingles, el primer paso para configurar el EBI es asignar los pines del bus de datos, direccion y control (los pines de los
microcontroladores poseen varias funciones, esto es, multiplexan varios perfifericos) al EBI:
PIO_Configure(pinPsram, PIO_LISTSIZE(pinPsram));

La funcion PIO Configure asigna la lista de pines pinPsram al periferico EBI, la definicion de la lista se hace en el
archivo psram.h:
const Pin pinPsram[] = {PIN_DATA_BUS_ON_EBI, \
PIN_NRD_ON_EBI, \
PIN_NWE_ON_EBI, \
PIN_NCS3_ON_EBI,\
PIN_ADDR_BUS_ON_EBI
};

donde:
#define PIN_DATA_BUS_ON_EBI {0x000000ff, PIOC, ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} // PC0 -PC7
#define PIN_NRD_ON_EBI {1 << 11, PIOC, ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} // PC11
#define PIN_NWE_ON_EBI {1 << 8, PIOC, ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} // PC8

1.3 Conexion entre el microcontrolador SAM3S y la FPGA

11

#define PIN_NCS3_ON_EBI {1 << 12, PIOC, ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} // PC12


#define PIN_ADDR_BUS_ON_EBI {0xfffc0000, PIOC, ID_PIOC, PIO_PERIPH_A, PIO_PULLUP} // PC18 PC31

Finalmente, se debe configurar el EBI:


/* complete SMC configuration between PSRAM and SMC waveforms.*/
BOARD_ConfigurePSRAM( SMC ) ;

La funcion BOARD ConfigurePSRAM esta declarada en el archivo {os/hal/platforms/AT91SAM3S/atmel psram.c


extern void BOARD_ConfigurePSRAM( Smc* pSmc )
{
uint32_t dwTmp ;
/* Enable peripheral clock */
PMC_EnablePeripheral( ID_SMC ) ;
pSmc->SMC_CS_NUMBER[3].SMC_SETUP = SMC_SETUP_NWE_SETUP( 3 )
| SMC_SETUP_NCS_WR_SETUP( 4 )
| SMC_SETUP_NRD_SETUP( 3 )
| SMC_SETUP_NCS_RD_SETUP( 5 ) ;
pSmc->SMC_CS_NUMBER[3].SMC_PULSE = SMC_PULSE_NWE_PULSE( 3 )
| SMC_PULSE_NCS_WR_PULSE( 4 )
| SMC_PULSE_NRD_PULSE( 3 )
| SMC_PULSE_NCS_RD_PULSE( 5 ) ;
/* NWE_CYCLE: The total duration of the write cycle.
NWE_CYCLE = NWE_SETUP + NWE_PULSE + NWE_HOLD
= NCS_WR_SETUP + NCS_WR_PULSE + NCS_WR_HOLD
(tWC) Write Cycle Time min. 70ns
NRD_CYCLE: The total duration of the read cycle.
NRD_CYCLE = NRD_SETUP + NRD_PULSE + NRD_HOLD
= NCS_RD_SETUP + NCS_RD_PULSE + NCS_RD_HOLD
(tRC) Read Cycle Time min. 70ns. */
pSmc->SMC_CS_NUMBER[3].SMC_CYCLE = SMC_CYCLE_NWE_CYCLE( 4 )
| SMC_CYCLE_NRD_CYCLE( 5 ) ;
dwTmp = SMC->SMC_CS_NUMBER[3].SMC_MODE & (uint32_t)((SMC_MODE_DBW_Msk)) ;
pSmc->SMC_CS_NUMBER[3].SMC_MODE = dwTmp
| SMC_MODE_READ_MODE
| SMC_MODE_WRITE_MODE
| SMC_MODE_DBW_8_BIT ;
}

[Link].

Lectura y escritura al EBI

La lesctura y escritura al EBI se hace a traves de un puntero que apunta al rango de memoria asignado al NCS3 (pin
que esta conectado a la FPGA)
uint32_t *ptr = (uint32_t *) PSRAM_BASE_ADDRESS; // 0x63000000 NCS3

El siguiente codigo asigna a las primeras 256 posiciones de memoria los valores 0 - 255, y luego imprime los valores
leidos por el puerto serial

12

1 Introduccion

while (TRUE) {
for (i = 0; i < 256; ++i) {
ptr[i] = i;
}

for (i = 0; i < 256; ++i) {


chprintf((BaseChannel *)&SD2, ", %x \r\n", ptr[i] & 0xFF ) ;
}
chprintf( (BaseChannel *)&SD2, "123\n" ) ;
chThdSleepMilliseconds(500);
}

[Link].

Compilacion, sntesis, programacion, configuracion y prueba de la comunicacion SAM3S - FPGA

En el directorio code/psram se encuentra el codigo del ejemplo de la comunicacion entre el SAM3S y la FPGA, la
arquitectura de este directorio es ls siguiente:
+--hdl/
Makefile
[Link]
sram.v
+--src/
Makefile
chconf.h
halconf.h
main.c
mcuconf.h
psram.c
psram.h
Para sintetizar el codigo de la FPGA se debe colocar en la variable de entorno PATH el directorio donde se encuentre
el ejecutable de la herramienta de sntesis de Xilinx xst, cambiarse al directorio hdl y ejecutar el comando make. Despues
del proceso de sntesis se debe generar el archivo [Link].
Para compilar el codigo fuente del microcontrolador se debe:
Descargar la cadena de herramientas de mentor graphics arm Sourcery CodeBench Lite 2013.11-24 for ARM EABI y
colocar el directorio de los ejecutables en la variable de entorno PATH.
Clonar el repositorio mcu (git clone [Link]
En el directorio code/psram/src editar el archivo Makefile y cambiar la ruta donde se encuentran los fuentes del ChibiOS.
CHIBIOS = /home/cain/Embedded/matrix-creator-mcu/third_party/ChibiOS/

Compilar la aplicacion ejecutando el comando make


Al finalizar este proceso se debe generar el archivo build/[Link].
Finalmente se debe copiar los archivos generados en estos procesos a la raspberry-pi:
scp hdl/[Link] pi@[Link]:
scp src/build/[Link] pi@[Link]:
scp src/[Link] pi@[Link]:

1.3 Conexion entre el microcontrolador SAM3S y la FPGA

13

Para probar el correcto funcionamiento de este periferico debemos programar el microntrolador SAM3S:
sudo openocd -f [Link]

Al finalizar de forma adecuada la programacion aparecera el siguiente mensaje:


flash at91sam3 found at 0x00400000
wrote 24128 bytes from file [Link] to flash bank 0 at offset 0x00000000 in 1.262818s
(18.659 KiB/s)
Info : JTAG tap: [Link] tap/device found: 0x3ba00477 (mfg: 0x23b (ARM Ltd.), part:
0xba00, ver: 0x3)
Info : JTAG tap: [Link] tap/device found: 0x069aa62b (mfg: 0x315 (Ember Corporation),
part: 0x69aa, ver: 0x0)
Info : JTAG tap: [Link] tap/device found: 0x24000093 (mfg: 0x049 (Xilinx),
part: 0x4000, ver: 0x2)
Info : JTAG tap: [Link] tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part:
0xba00, ver: 0x4)
Error: [Link]: IR capture error; saw 0x35 not 0x11
Warn : Bypassing JTAG setup events due to errors
Warn : Only resetting the Cortex-M core, use a reset-init event handler to reset any
peripherals or configure hardware srst support.
shutdown command invoked

Y configurar la FPGA:
sudo xc3sprog -c matrix_pi [Link] -p 1

Al finalizar de forma adecuada la configuracion aparecera el siguiente mensaje:


XC3SPROG (c) 2004-2011 xc3sprog project $Rev: 774 $ OS: Linux
Free software: If you contribute nothing, expect nothing!
Feedback on success/failure/enhancement requests:
[Link]
Check Sourceforge for updates:
[Link]
DNA is 0x193a3abb753a3ffc

Para observar la salida del puerto serial del SAM3S se debe configurar minicom en la raspberry con los siguientes
valores (ejecutando: minicom -s - Serial port setup:
Serial Device : /dev/ttyS0
Lockfile Location : /var/lock
Bps/Par/Bits : 115200 8N1
Hardware Flow Control : No
Software Flow Control : No

Finalmente, en minicom se debe observar la secuencia:


,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,A ,B ,C ,D ,E ,F
...
,F0 ,F1 ,F2 ,F3 ,F4 ,F5 ,F6 ,F7 ,F8 ,F9 ,FA ,FB ,FC ,FD ,FE ,FF

También podría gustarte