QT-Analizador Lógico

From Qi-Hardware
Jump to: navigation, search

Contents

[edit] Integrantes

Interfaz con el usuario en QT

  • Mauricio Erazo
  • Ricardo "The matrix" Díaz

Periférico que hace la captura

  • Sergio Abreo
  • Carlos Angulo
  • William Salamanca

Especificaciones:

  • Parámetros de entrada.
  • Canales: N
  • Escala de tiempo.
  • Trigger.
  • Buffer - 2 pantallas/N canales..


[edit] Interfaz con el usuario en QT

Acá escribe Richard matrix & Mato

[edit] Periférico que hace la captura

La implementación del periférico se ha segmentado en 3 partes:

  • Driver: Se encarga de hacer la abstracción del periférico ofreciendo una interfaz para que desde el espacio del usuario se pueda configurar el periférico. Así mismo, se puede acceder a los datos de la captura escribiendo y leyendo sobre el nodo /dev/analizador como si fuera un archivo común y corriente de Linux.
  • Interfaz: Se encarga de decodificar las direcciones del bus principal del procesador y de sincronizar las señales que van y vienen entre el procesador y el FPGA.
  • Periférico: Se encarga de realizar la adquisición según los parámetros que se le envían, almacenando los datos en un bloque de memoria RAM. Al finalizar debe activar una línea de interrupción.
Diagrama de bloques general

Como se muestra en la figura se ha propuesto un diagrama de bloques que representa la segmentación que se ha planteado del proyecto. Se han definido algunos elementos de almacenamiento que permitirán el intercambio de información entre el procesador y el periférico. Para la configuración del periférico es necesario que éste reciba ciertos parámetros, por lo cual se han descrito registros de 8 bits con las siguientes funciones:

  • Registro C(# de Canales): Por defecto en esta versión inicial se van a habilitar siempre 8 canales pero en futuras versiones podría variarse la cantidad de canales en detrimento de la cantidad de muestras que se pueden capturar.
  • Registro D(Disparo): Mediante este registro se pueden manipular las condiciones bajo las cuales se da inicio a la captura, es decir las condiciones de trigger. Un uno en el bit k-ésimo del registro indica que se requiere que el canal k esté en uno para que inicie la captura.
  • Registro F(Frecuencia de muestreo): Mediante el valor cargado en este registro se puede seleccionar la frecuencia de muestreo entre 256 posibles valores (solo 4 en la versión inicial).
  • Registro M(# de Muestras): Mediante este registro se podrán controlar la cantidad de muestras capturadas (no implementado en esta primera versión).
  • Registro I(Inicio/Habilitador): Este registro permite darle al periférico la orden de iniciar la búsqueda de la condición de disparo, es decir, que puede ser empleado como un habilitador del periférico.

Cada uno de estos registros es accedido por el procesador mediante la escritura de datos sobre las direcciones de memoria asignadas a cada uno de ellos. La salida de cada uno de estos registros puede ser leída por el procesador accediendo a su posición de memoria, pero a su vez estas señales llegan al periférico ajustándolo según lo especifique el procesador.

Por otro lado la lectura de datos de la adquisición que debe hacer el procesador, se realiza accediendo un bloque de memoria RAM (BRAM), el cual está configurado como un dispositivo FIFO de dos puertos. Eso se debe a que tanto el ingreso como la lectura de las muestras se hace de forma secuencial. Así mismo desde el punto de vista del mapa de memoria del procesador, esto facilita la tarea de lectura, debido a que únicamente se debe acceder una posición de memoria para extraer los 32KB de información que puede adquirir el periférico.

[edit] Driver.

El driver tiene dos funciones básicas dentro del sistema:

  • Hacer la interfaz (intercambio de datos) entre el usuario y el periférico.
  • Manejar la interrupción que genera el periférico al terminar la adquisición.

Teniendo en cuenta esto se han implementado las funciones init, close?, open?, release, write y read, las cuales tienen las siguientes funciones a cargo:

  • init: Se ejecuta al hacer insmod, es decir al añadir el driver al kernel.
    • Reservar el número major.
  • close: Se ejecuta al hacer rmmod, es decir al retirar el driver del kernel.
  • open: Es ejecutado cuando se hace abre el archivo /dev/analizador
  • release: Es ejecutado cuando se cierra el archivo /dev/analizador
  • write:
  • read:

[edit] Interfaz HW entre el procesador y el periférico en el FPGA.

La interfaz entre el procesador y el periférico tiene como función facilitar el intercambio de información entre estos dos elementos. Para ello hace uso de las señales de control ncs, nwe; de un bus de direcciones llamado addr y un bus de datos bidireccional llamado sram_data. La forma en la que trabaja la interfaz se describe a continuación.

  • Sincronización

Inicialmente la interfáz realiza un proceso de sincronización sobre todas las señales que recibe del procesador (ncs,nwe,addr,sram_data), haciendolas pasar a travez de un grupo de registros como se puede apreciar en la figura. Luego con las señales sincronizadas (sncs,snwem,buffer_addr,buffer_data), la interfaz procede a decodificar la acción que solicita el procesador (a travez del cambio en las señales sncs y snwe) y a identificar sobre quién se efectuará dicha acción a partir de la dirección que recibe por el bus buffer_addr.

  • Acciones

Las posibles acciones que puede solicitar el procesador son lectura o escritura. La lectura el procesador la solicita cuando desea acceder las muestras capturadas por el analizador lógico ó cuando desea revisar el contenido de los registros de configuración del analizador lógico(C=# de canales, D=disparo, F=frecuencia de muestreo, M=# de muestras, I=registro de inicio de operación). La operación de escritura el procesador la solicita cuando desea modificar los parámetros de operación del analizador lógico a travez de la modificación del contenido de los registros de configuración antes mencionados.

  • Direcciones

Las direcciones de los registros de configuración son:

Registro Dirección Función
ID 0x00 ID del periférico A5.
C 0x01 # de canales
D 0x02 Opciones de disparo
F 0x03 Frecuencia de muestreo
M 0x04 # de muestras
I 0x05 Señal de inicio de operación.
Bloque Ram 0x06 Acceso a la memoria RAM.
counter[7:0] 0x07 Byte 7:0 de counter.
counter[15:8] 0x08 Byte 15:8 de counter.
counter[23:16] 0x09 Byte 23:16 de counter.
counter[31:24] 0x0A Byte 31:24 de counter.
contador[7:0] 0x0B Byte 7:0 de contador.
contador[15:8] 0x0C Byte 15:8 de contador.
Enable_Analizador 0x0D Habilitación.
address_Analizador[7:0] 0x0E Dirección LSB.
address_Analizador[15:8] 0x0F Dirección MSB.
write_Analizador 0x10 WE.
input_data_Analizador 0x11 Datos_in.
busy 0x12 Ocupado.
Finish 0x13 Fin.
Estado 0x14 Estado de la FSM.
sync_start 0x15 start sincronizado.
pb2 0x16 push button 2.
pb3 0x17 push button 3.
Posición de memoria no válida otras direcciones Devuelve =0xEE.

Se debe aclarar que las direcciones de trabajo van desde 0x01 hasta 0x06. El resto de direcciones son de solo lectura y fueron creadas para poder depurar el funcionamiento interno del analizador lógico.

Diagrama de bloques de la interconexión
  • Direccionamiento del bloque de memoria RAM

Para el desarrollo de este proyecto se utilizó un FPGA Spartan3E-500; El cual tiene 32KB de bloques RAM. Para la captura de los datos entregados por el analizador lógico se decidió usar todos los bloques RAM disponibles, pero surgió un problema debido a que para poder direccionar todos los 32KB se necesitaba un bus de direcciones superior al disponible físicamente por la tarjeta. Entonces para solucionar este problema se decidió hacer una pequeña máquina de estados que incrementara un contador cada vez que se hiciera una lectura a la dirección 0x06, y se usó al contador como la señal encargada de direccionar la lectura de la ram interna. De esta manera se pudo tener acceso a todos los 32KB de ram interna de una manera muy simple usando solo la dirección 0x06. Las fuentes en VHDL y Verilog de esta sección se encuentran al final de la página.

[edit] Periférico.

Diagrama de bloques del bloque que hace la captura

La implementación del periférico se ha dividido en 5 bloques: Multiplexor, Divisor de frecuencia, Contador, Máquina de estados, Registros

  • Multiplexor
Con este multiplexor se escoge el módulo del divisor de frecuencia de acuerdo al valor de "sel_frec_adq" y con esto se logra la selección de la frecuencia a la cual se va a realizar la adquisición de datos. En esta primera versión, la selección de 4 posibles frecuencias de muestreo se hace mediante los dos bits menos significativos del registro F, los cuales están conectados a "sel_frec_adq".
  • Divisor de frecuencia
Para hacer la división de frecuencia se utiliza un contador binario de 8 bits que genera un pulso cada vez que se alcance el módulo escogido anteriormente. El contador estará en cero mientras no se estén adquiriendo datos.
  • Contador
Contador de 15 bits que lleva la cuenta del número de muestras adquiridas, lo cual sirve también como dirección de memoria en la cual se almacenará la muestra. Este contador permanecerá en cero hasta que se dé inicio a la captura de muestras y se incrementará en 1 con cada pulso de la salida del divisor de frecuencia.
  • Máquina de estados
Control del periférico...
  • Registros
Mediante dos registros de 8 bits se logra retardar los datos de entrada para así poder graficar su valor en el momento antes del disparo.
Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export