PRÁCTICA FINAL OSCILOSCOPIO DIGITAL CON INTERFAZ USB

Laboratorio de Diseño de Circuitos y Sistemas
Electrónicos
INGENIERÍA ELECTRÓNICA
PRÁCTICA FINAL
OSCILOSCOPIO DIGITAL CON
INTERFAZ USB
Dpto. Electrónica
Curso 2008/2009
1.
Introducción
La siguiente práctica tiene como objetivo el desarrollo de un sistema digital descrito
mediante VHDL e implementado sobre una FPGA. Con ella se pretenden cubrir todas las fases
que aparecen en el flujo de diseño: modelado, simulación, síntesis e implementación.
Concretamente el sistema a desarrollar consiste en un osciloscopio digital de 100 MHz dotado
de una interfaz USB que permite conectarlo a un ordenador personal. Para su implementación se
utilizará la tarjeta de pruebas del laboratorio, basada en una FPGA de la familia Spartan3 de
Xilinx. La Figura 1 ilustra lo expuesto.
TARJETA
EVALUACI ÓN
FPGA
Spartan3
BLOQUE ADC
Puerto
USB
Figura 1. Diagrama de bloques del sistema completo.
2.
Descripción del diseño
Se pretende diseñar un osciloscopio digital de un solo canal, con una frecuencia máxima de
adquisición de 100 MS/s y conectable a un ordenador personal mediante un enlace USB. A
través de este enlace se fijarán los parámetros que controlan el funcionamiento del sistema y se
recibirán las muestras adquiridas para su posterior representación en el ordenador. El elemento
central del osciloscopio es una FPGA Spartan 3 1000-4 que incluye toda la lógica necesaria para
el control del sistema. La FPGA recibe las muestras de conversor A/D externo LTC2217 (16
bits, 100 MS/s), almacenándolas en una memoria de adquisición implementada mediante
BRAMs hasta el momento de ser transferidas al PC a través del enlace USB. Para dotar de
conectividad USB al osciloscopio el sistema incluye un controlador CY7C681013A. Este
dispositivo dispone una interfaz genérica programable (GPIF) que puede configurarse para
operar como una gran variedad de interfaces: ATA, EPP, PCMCIA, buses de procesador. En el
caso considerado se ha optado por esta última posibilidad de forma que el controlador USB se
comporta como maestro de bus que se conecta a la FPGA, la cual se aparece como un mero
periférico asociado a este controlador.
La interfaz de bus considerada se compone de las siguientes señales:
• addr[3:0] Bus de direcciones
• data[15:0] Bus de datos
• rd_n
Señal de comando de lectura
• wr_n
Señal de comando de escritura
Esta interfaz utiliza un protocolo similar el empleado por los micros de Intel. En dicho
protocolo las señales de comandos (rd_n, wr_n) actúan como elementos de validación
de la dirección depositada en el bus. Según esto, sólo cuando alguna de estas señales
esté activa (parte activa del ciclo de acceso) puede darse por valido el contenido del bus
de direcciones. Esta apreciación ha de tomarse en consideración durante el diseño de la
2
lógica de control con el interfaz USB. La figura 2 muestra los cronogramas de los
accesos generados por el citado controlador. La señal de reloj mostrada en estos
cronogramas es una señal interna del controlador utilizada para sincronizar su operación
interna y que se ha incluido únicamente a efectos informativos (no se conecta a la
FPGA).
CICLO DE LECTURA
clk
addr
Ax
rd_n
wr_n
rdy
data
Dx
CICLO DE ESCRITURA
clk
addr
Ax
rd_n
wr_n
rdy
data
Dx
Figura 2. Cronogramas de acceso del controlador USB.
Además de estas líneas, el controlador USB dispone de una entrada de interrupción
controlada desde la FPGA que será utilizada para indicar cuándo se ha completado una
secuencia de adquisición.
En lo que respecta a la conexión del conversor LTC2217 a la FPGA, tal y como muestra
el diagrama de bloques que aparece en la figura 3, este dispositivo dispone de un bus de
datos de salida de 16 bits. Las señales de datos pueden configurarse en modo diferencial
o en modo simple, siendo esta última la configuración elegida para el diseño planteado.
No obstante, la señal de reloj empleada sí es diferencial (terminales ENC+ y ENC-)
siendo generada por la propia FPGA. Además de los citados, el conversor dispone de
una serie de entradas digitales que controlan su operación:
•
•
SHDN: Paso a modo de bajo consumo (Shutdown). Controlado por la FPGA.
DITH: Habilitación del circuito de dither interno. Controlado por la FPGA.
3
•
•
•
MODE: Formato de salida y control del módulo de estabilización del ciclo de
trabajo del reloj de conversión. El nivel de este terminal se ha fijado en la placa
PCB para obtener las muestras de salida en complemento a 2.
LVDS: Selecciona el modo de los terminales de datos: simple o diferencial. El
nivel de este terminal se ha fijado en la placa PCB para que opere en modo
simple.
RAND: Habilitación del módulo de aleatorización de los datos de salida para
reducir las interferencias EMC generadas por el bus de datos. Controlado por la
FPGA.
Las señales de la lista anterior para las que se ha establecido que su control lo realizará
la FPGA se conectarán a ciertos terminales de esta última. Su nivel lógico se fijará
mediante un registro interno en función de los parámetros recibidos desde el ordenador
personal.
Figura 3. Diagrama de bloques del conversor A/D LTC2217.
La siguiente figura muestra el diagrama de bloques de la lógica a implementar en la
FPGA. La FPGA recibe una señal de reloj externa denominada sys_clk. A partir de
esta señal de 50 MHz se generan mediante un DCM dos señales internas de 50 y 100
MHz, denominadas respectivamente clk_1x y clk_2x. La señal clk_2x se utilizará
para sincronizar la operación de todos los módulos relacionados con la adquisición y
procesamiento de la señal de entrada. Por otro lado, la lógica relacionada con el interfaz
USB, que presenta una temporización menos crítica se sincronizará con el reloj
clk_1x. El módulo de control del ADC es el encargado de generar la señal de
conversión y captura los datos provenientes de este dispositivo. Este módulo incluye un
módulo de ‘descrambling’ para recuperar los valores originales cuando el modo de
aleatorización está activado. Además, este módulo genera las señales de control de los
modos de operación del ADC.
Dado que el ADC siempre opera a la máxima frecuencia (100 MHz), para ajustar la
frecuencia de adquisición del sistema se aplican técnicas de diezmado. El módulo de
diezmado recibe el caudal de muestras del módulo de control del ADC proporcionando
a su salida una de cada N muestras de entrada, donde N es el factor de diezmado. Dicho
4
factor se fija mediante un registro interno de 8 bits denominado decimate_reg, siendo
la frecuencia de adquisición efectiva resultante:
Diezmado
Filtro
Memoria
adquisición
4Kx16
Generación
de reloj
clk_1x (50 MHz)
clk_2x (100 MHz)
Control de
disparo
CY7C681013A
Control ADC
f SAMPLING (100MHz)
1 + decimate _ reg
Interface USB
LTC2217
f ACQUISITION =
sys_clk (50 MHz)
Figura 4. Diagrama de bloques de la lógica interna de la FPGA.
La salida del módulo de diezmado se aplica a un filtro FIR de hasta 48 coeficientes
simétricos. El orden de este filtro viene limitado por el número de multiplicadores
hardware de que dispone la FPGA empleada. Debido a la elevada frecuencia de
operación del sistema se ha de optar por una arquitectura completamente paralela para
este filtro, utilizando un multiplicador para realizar el producto de dos muestras
simétricas. Los valores de los coeficientes del filtro se fijarán mediante un conjunto de
registros controlados desde la interfaz con el controlador USB.
El resto de la cadena de procesamiento está compuesta por la memoria de adquisición y
el bloque de control de disparo. En el diseño planteado es posible seleccionar si se desea
adquirir la señal original o su versión filtrada, utilizando para ello el multiplexor
mostrado en la figura. La señal de selección de este multiplexor se controla mediante
uno de los bits de los registros de control asociados al bloque de interfaz con el
controlador USB.
La memoria de adquisición se implementa mediante BRAMs, y tiene una capacidad de
4Ksamples. Su funcionamiento se controla desde el módulo de control de disparo, tal y
como se describirá a continuación. Para poder iniciar una secuencia de adquisición es
preciso rearmar el circuito de disparo. El diseño planteado ha de permitir configurar la
profundidad de pretrigger mediante un registro interno, lo que obliga a gestionar la
memoria de adquisición como una FIFO. Una vez rearmado el circuito de disparo, el
sistema de adquisición comienza a llenar la memoria de adquisición hasta alcanzar el
nivel de pretrigger PR. En ese momento se inicia la búsqueda de la condición de
disparo, durante la cual, por cada escritura realizada para almacenar una nueva muestra
entrante, se realiza una lectura para descartar la muestra más antigua. Esto permite
mantener en la FIFO las PR muestras más recientes hasta el momento de detectarse la
condición de disparo. Una vez detectada la condición de disparo se detiene el citado
5
descarte, es decir, cesan las lecturas sobre la FIFO y sólo se realizan escrituras hasta
completar su llenado. Una vez llena se detienen las escrituras dando por concluida la
secuencia de adquisición, no iniciándose una nueva secuencia hasta que no se vuelva a
rearmar el circuito de disparo
La condición de disparo viene determinada cuando la señal que llega al módulo de
adquisición supera un determinado umbral con una determinada pendiente (ascendente
o descendente). El nivel de disparo se fija mediante el registro interno
trigger_level, mientras que el flanco se fija mediante el bit trigger_edge del
registro de control. Ambos registros se controlan desde el módulo de interfaz con el
controlador USB. Una vez concluida la secuencia de adquisición las muestras
almacenadas en la memoria FIFO estarán listas para ser transferidas al PC. Este hecho
vendrá señalado por la activación de la entrada de interrupción del controlador USB.
Finalmente el módulo de interfaz con el controlador USB incluye un conjunto de
registros utilizados para controlar la operación del osciloscopio así como la lógica
necesaria para gestionar los accesos a dichos registros. La tabla 1 describe estos
registros así como la dirección base que ocupa cada uno de ellos. Todos ellos son
registros de 16 bits, aunque en algunos casos no se utilicen todos ellos
Tabla 1: Registros internos del osciloscopio.
Dirección
Nombre
0
1
2
3
4
5
6
7-15
ctrl_reg
decimate_reg
coef_idx_reg
coef_data_reg
trigger_level_reg
pretrigger_reg
sample_data_reg
-
Descripción
Registro de control global del sistema (R/W)
Registro de factor de diezmado (R/W)
Registro de indice de coeficiente (W)
Registro de datos de coeficiente (W)
Registro de nivel de disparo (R/W)
Registro de profundidad de pretrigger (R/W)
Salida de la FIFO de adquisición (R)
Reservados
La tabla 2 muestra la descripción de los bits del registro de control. El bit de enable
habilita la operación del sistema. Cuando está desactivado no se permite adquisición de
señales. El bit rearm se utiliza para rearmar el circuito de disparo. Se trata de un bit no
persistente, es decir, para rearmar el circuito de disparo es preciso realizar una escritura
sobre el registro de control con este bit a 1. En estas condiciones, al concluir el ciclo de
escritura se genera un pulso de un ciclo de clk_1x con el que se rearma el circuito de
disparo. Esto mismo es aplicable para el bit de borrado de interrupciones int_clear.
6
Tabla 2: Registro de control global.
Bit
Nombre
0
1
enable
rearm
2
trigger_edge
3
searching
4
data_ready
5
6
7
int_enable
int_clear
adc_shutdown
9
adc_rand
9-15
-
Descripción
Habilita el funcionamiento del sistema
Rearmado del ciruito de disparo (no persistente)
Establece el flanco de disparo: 1 ascendente, 0
descendente
Se activa al rearmar el circuito de disparo y se
desactiva al detectarse la condición de disparo
Se desactiva al iniciarse una secuencia de adquisición
(rearmado) y se activa una vez completada
Habilitación de interrupciones
Borrado de interrupciones.
Control de bajo consumo del ADC
Habilitación del modo aleatorio de la salida de datos
del ADC
Reservados (fijos a 0)
En el registro de factor de diezmado sólo se utilizan los 8 bits de menor peso. Como se
ha comentado, el filtro FIR admite 24 coeficientes (uno por cada multiplicador
hardware de que dispone la FPGA). Cada uno de estos coeficientes se almacena en un
registro interno del filtro. Puesto que con un bus de direcciones de 4 líneas no es posible
direccional tal cantidad de registros se utilizará técnica de pasarela. Según esta
aproximación, para fijar un nuevo valor se escribe el índice del coeficiente en el
registro coef_idx_reg del interfaz con el controlador USB. A continuación se
realizará una escritura sobre el registro coef_data_reg, mediante la cual se transferira
el dato recibido del controlador en el registro de coeficiente del filtro. En el registro de
índices de coeficientes sólo se emplean los 5 bits de menor peso, mientras que el de
datos es un registro de 16 bits.
El comportamiento de los restantes registros del sistema queda completamente descrito
con la información incluida en la tabla 1 y los textos previos.
7
3.
Desarrollo de la práctica
Con el desarrollo de la práctica se pretenden abordar tanto aspectos de modelado en VHDL
para síntesis como para simulación. Para ello se ha dividido en una serie de apartados de
dificultad progresiva que lleven a la consecución del diseño final. Para cada uno de los
apartados se indica la nota máxima que aporta (sobre un total de 10 puntos), pudiéndose
modificar dicha nota a la baja en función del examen de laboratorio. Todos los apartados
deben realizarse en el orden en que se enumeran a continuación; aquellas modificaciones
que se salten desarrollos previos no serán tenidas en cuenta durante la evaluación.
3.1. Apartado 1
La puntuación máxima proporcionada por este apartado es de 0.5 puntos.
Se trata de un apartado básico que permita al alumno familiarizarse con el protocolo
utilizado por el controlador USB mediante un diseño sencillo. El diseño desarrollado servirá
como base para posteriores apartados.
Dicho diseño consistirá en la implementación de dos registros de I/O de 8 bits en la FPGA.
Éstos estarán ubicados en las direcciones 8 y 9. A efectos de depuración, el dato almacenado
durante una escritura en el registro 8 se representará en la salida denominada LEDS.
La declaración de la entidad del diseño se debe ajustar a la siguiente definición:
entity usb_oscilloscope is
port (
sys_clk
: in
std_logic;
sys_rst_n
: in
std_logic;
--usb_addr
: in
std_logic_vector(3 downto 0);
usb_rd_n
: in
std_logic;
usb_wr_n
: in
std_logic;
usb_data
: inout std_logic_vector(15 downto 0);
--switches
: in
std_logic_vector(7 downto 0);
leds
: out
std_logic_vector(7 downto 0));
end usb_oscilloscope;
Para facilitar el desarrollo de este apartado se proporciona una serie de ficheros fuente
VHDL. El fichero ap1.vhd (entidad usb_oscilloscope) contiene el diseño a desarrollar. Los
ficheros usb_bfm.vhd y ap1_tb.vhd (entidad usb_oscilloscope_tb) se utilizan únicamente para
validar el diseño mediante simulación. El primero de ellos es un modelo funcional de bus o
BFM del controlador USB. Dispone de una serie de procedimientos que facilitan la simulación
de accesos a un periférico externo mediante el protocolo descrito. Los comentarios incluidos el
código fuente son lo suficientemente explicativos como para no entrar en detalles de su
8
funcionamiento. El fichero ap1_tb.vhd contiene un banco de pruebas para validar el sistema
completo (diseño de la interfaz controlador USB + BFM del cotrolador). Tal y como muestra la
figura 5, el banco de pruebas se limita a instanciar los dos componentes citados y a generar la
señal sys_clk (señal de reloj de 50MHz del oscilador externo de la placa de desarrollo). La señal
de reloj patrón será regenerada dentro de la FPGA mediante la inclusión del gestor de relojes
(DCM) de la arquitectura Spartan3.
usb_oscilloscope_tb
sys_rst_n
usb_bfm
rst_n
addr[3:0]
rd_n
wr_n
data[15:0]
int_n
usb_oscilloscope
sys_rst_n
usb_addr[3:0]
usb_rd_n
usb_wr_n
usb_data[15:0]
leds[7:0]
switches[7:0]
usb_int_n
Figura 5. Estructura del banco de pruebas.
Este apartado se dará por válido únicamente si se realizan todas las fases que componen el
flujo de diseño en VHDL (simulación funcional, síntesis del diseño, implementación y
simulación temporal).
3.2. Apartado 2
La puntuación máxima proporcionada por este apartado es de 1.5 puntos.
El osciloscopio propuesto, cuya implementación se llevará a cabo sobre una FPGA Spartan3
requiere de un dispositivo ADC externo. Para ello, se va a emplear el circuito de LTC2217 de
Linear Technology, cuyas hojas de características se adjuntan como anexo al final de este
documento.
Para la simulación de las distintas etapas en el desarrollo del osciloscopio, es necesario
disponer de un modelo de simulación que permita llevar a cabo la validación del diseño
realizado. Por ello, en este apartado, se pide desarrollar el modelo de simulación del
mencionado componente, teniendo en cuenta no sólo las características funcionales de cada uno
de sus terminales, sino también su comportamiento temporal (retardos especificados por el
fabricante). Las muestras proporcionadas por este modelo se obtendrán de un fichero binario
que contiene una secuencia de enteros de 32 bits (formato utilizado internamente por Modelsim
para representar los tipos integer VHDL). Junto con el resto de los ficheros se suministrará un
script de Matlab para generar dicho fichero.
Este apartado se dará por válido únicamente si, mediante simulación funcional, se demuestra
el correcto funcionamiento del modelo para la correcta excitación de las entradas del ADC.
9
3.3. Apartado 3
La puntuación máxima proporcionada por este apartado es de 4 puntos.
En este apartado se desarrollará la lógica interna de la FPGA que aparece en el diagrama de
bloques de la figura 4 exceptuando el bloque de correspondiente al filtro digital. En este
apartado dicho bloque consistirá en un mero registro que transfiere a su salida las muestras que
recibe a su entrada.
Este apartado se dará por válido únicamente si se realizan todas las fases que componen el
flujo de diseño en VHDL (simulación funcional, síntesis del diseño, implementación y
simulación temporal). La calificación máxima sólo se podrá alcanzar si el sistema funciona a
100 MHz. Una disminución de la frecuencia de operación supondrá una menor puntuación en
este apartado.
3.4. Apartado 4
La puntuación máxima proporcionada por este apartado es de 2 puntos.
En este apartado se abordará el diseño del filtro digital. Para validar dicho bloque se una
señal compuesta por sendos tonos de 10 y 40 MHz, calculándose los coeficientes del filtro
mediante un script de matlab que se suministrará a tal efecto.
3.5. Apartado 5
La puntuación máxima proporcionada por este apartado es de 2 puntos.
En este apartado se llevará a cabo la integración del filtro desarrollado en el apartado anterior
con el resto del sistema, validando el diseño completo.
Este apartado se dará por válido únicamente si se realizan todas las fases que componen el
flujo de diseño en VHDL (simulación funcional, síntesis del diseño, implementación y
simulación temporal).
4.
Evaluación de la práctica
Cada puesto de trabajo deberá entregar una memoria al profesor del laboratorio con fecha
límite el viernes de la penúltima semana de clase (véase la página web de la asignatura en las
fechas correspondientes). La memoria deberá contener los siguientes apartados:
•
Para cada uno de los apartados abordados una breve descripción del diseño realizado que
facilite la interpretación del código fuente VHDL.
10
•
Listados del código fuente VHDL desarrollado.
•
Cronogramas de la simulación temporal que ilustren el correcto funcionamiento del diseño
realizado. Para el caso del apartado 3 no es necesario.
•
Si el diseño contiene máquinas de estados, se incluirá el diagrama de estados.
Asimismo, se entregará un disco o CD con todos los ficheros del diseño (ficheros fuente
VHDL, scripts de simulación y síntesis, ficheros ucf, etc). Finalmente, se realizará un examen
de la práctica desarrollada en el laboratorio en las fechas que se establezcan para ello (véase la
página web de la asignatura). El examen se realizará de forma individual y el alumno deberá
responder a las preguntas realizadas por el profesor sobre el funcionamiento del sistema, así
como simular, sintetizar o demostrar el funcionamiento real de las partes que se le pidan.
11