Teach Lecciones con laboratorios remotos

Lección Teach

Nios V en la DE1-SoC (2/5): E/S mapeada en memoria con C

El alumnado modifica código C para controlar E/S mapeada en memoria en un sistema Nios V, lee los controles lógicos `NSW0..NSW9`, controla los LED y explica cómo las direcciones conectan el código con el hardware.

  • Nios V para DE1-SoC
  • 55 min
  • Primeros cursos universitarios de informática, electrónica o ingeniería de computadores
  • Español
  • Sistemas digitales y FPGA · Sistemas embebidos

¿Primera vez que activas Teach? Puedes realizar una sesión de clase sin costo. El alumnado entra con un código de clase.

Controles NSW de LabsLand encaminados mediante los bits de JP1 hasta los LED rojos de la DE1-SoC
Nios V para DE1-SoC · Ver información del laboratorio

Resultados de aprendizaje

  • Usar en C punteros a registros declarados volatile para acceder a E/S mapeada en memoria.

  • Leer los interruptores lógicos de Nios V en LabsLand mediante la ruta GPIO JP1.

  • Usar máscaras y desplazamientos para asignar bits de entrada a bits de salida de los LED.

  • Validar el comportamiento del hardware con la cámara en directo de la placa.

Vista previa de la actividad del estudiante

Contenido de la actividad

Solo vista previa. En una sesión de clase, los estudiantes pueden completar respuestas y entregar su trabajo al docente.

1

El mapa de E/S

8 min

El procesador Nios V ve los periféricos de hardware como direcciones de memoria. En este laboratorio, el programa inicial usa estas direcciones:

- LEDR en 0xFF200000: registro de salida de los LED rojos.
- Registro de datos de JP1 en 0xFF200060: ruta de entrada de los interruptores lógicos de LabsLand.
- Registro de dirección de JP1 en 0xFF200064: registro de dirección del GPIO.
- JTAG UART en 0xFF201000: salida del terminal mediante printf.

La CPU lee y escribe estas direcciones como si fueran memoria normal, pero la lógica de la FPGA dirige cada acceso a un periférico en vez de a la RAM convencional. Eso es E/S mapeada en memoria.

Los controles del navegador se llaman NSW0..NSW9. En el flujo remoto actual no corresponden al puerto físico SW0..SW9 situado en 0xFF200040. Los controles NSW lógicos entran por los bits GPIO de JP1 y el programa inicial desplaza esos bits hacia abajo antes de escribir el registro de LED.

Como referencia, el manual FPGAcademy DE1-SoC Computer with Nios V documenta el diseño fijo del sistema Nios V y su mapa de periféricos mapeados en memoria. Esta actividad utiliza la ruta JP1 validada por LabsLand para los controles NSW del navegador, en lugar de pedirte que uses directamente el registro de interruptores físicos de FPGAcademy.

Controles NSW de LabsLand encaminados mediante los bits de JP1 hasta los LED rojos de la DE1-SoC

Los controles NSW del navegador se leen en los bits 5 a 14 de los datos de JP1. El programa desplaza el valor cinco posiciones a la derecha para que NSW0 pase a ser el bit 0 y después escribe el valor de diez bits en LEDR0..LEDR9.

Posiciones de bits principales:

- NSW0 se lee como el bit 5 de los datos de JP1 y pasa a LEDR0.
- NSW1 se lee como el bit 6 de los datos de JP1 y pasa a LEDR1.
- NSW2 se lee como el bit 7 de los datos de JP1 y pasa a LEDR2.
- El mismo patrón continúa hasta NSW9, que se lee como el bit 14 de los datos de JP1 y pasa a LEDR9.

En este perfil del laboratorio, escribir 0 en el registro de dirección de JP1 configura como entradas las líneas de JP1 utilizadas por NSW0..NSW9. Por eso el programa ejecuta *JP1_DIR = 0; antes de leer el registro de datos de JP1.

¿Por qué escribe el programa en 0xFF200064 antes de leer la entrada de los interruptores en 0xFF200060?

2

Compilar el programa inicial en C

14 min

El espacio de trabajo del IDE se conserva por cuenta. Antes de compilar, comprueba que main.c contiene el ejemplo inicial que asigna NSW0..NSW9 a LEDR0..LEDR9. Si conserva cambios anteriores, pide al docente que proporcione o restaure el programa inicial antes de continuar.

  1. Abre Nios V C IDE for DE1-SoC.

  2. Examina main.c.

  3. Haz clic en Build ELF.

  4. Haz clic en Enviar a la FPGA para cargar el programa.

  5. Comprueba que el terminal muestra Hello from Nios V.

  6. Activa y desactiva NSW0, NSW3 y NSW9; comprueba en la cámara en directo de la placa las salidas LEDR correspondientes.

Usa la tabla para registrar tres pruebas rápidas del laboratorio. Completa una fila por patrón de interruptores: predice primero la salida LEDR, acciona después los controles NSW correspondientes y anota lo que observaste en la cámara en directo de la placa.

Registra tres pruebas del laboratorio. En cada fila, predice la salida LEDR antes de probarla y escribe después la salida LEDR que observaste realmente en la placa.

Entrada probada Salida `LEDR` esperada antes de la prueba Salida `LEDR` observada en la placa ¿Coincidió con la predicción?
3

Seguir la ruta del código

15 min

Mantén abierta la pestaña del IDE de C del laboratorio. Puedes responder esta sección a partir del fragmento siguiente, extraído del mismo archivo main.c que acabas de compilar y probar.

Las declaraciones y el bucle siguientes proceden de ese programa inicial.
LEDS es el puntero de C al registro de salida LEDR:

volatile int *LEDS = (int *) 0xFF200000;
volatile int *JP1 = (int *) 0xFF200060;
volatile int *JP1_DIR = (int *) 0xFF200064;

*JP1_DIR = 0;
while (1) {
    *LEDS = (*JP1 >> 5) & 0x3FF;
}

El desplazamiento mueve los bits de JP1 usados por NSW0..NSW9 de LabsLand a las posiciones 0 a 9. La máscara conserva únicamente esos diez bits antes de escribirlos en el registro de LED.

Por ejemplo, cuando solo está activado NSW0, el bit 5 de JP1 vale 1. Después de >> 5, ese valor pasa al bit 0 y se enciende LEDR0. El calificador volatile debe aplicarse al dato apuntado: el registro leído mediante JP1 puede cambiar por efecto del hardware y no de una asignación de C. Sin volatile, una optimización del compilador podría reutilizar un valor anterior o eliminar un acceso repetido al registro que parecería redundante en memoria normal.

Si NSW0 llega al bit 5 de los datos de JP1, ¿por qué desplaza el código el valor de JP1 cinco posiciones a la derecha?

¿Qué bits conserva & 0x3FF y por qué conviene limitar el valor a diez bits antes de escribirlo en LEDR?

¿Por qué debe declararse volatile el tipo de dato al que apuntan estos punteros? Explícalo en términos de la optimización del compilador y los registros de hardware.

4

Modificar la correspondencia

13 min

Vuelve a usar la pestaña de Nios V C IDE for DE1-SoC del laboratorio. Cambia el programa para que los LED muestren una transformación del patrón de interruptores y haz clic en Build ELF. Si la sesión con la placa sigue abierta, puedes reutilizarla; si ha caducado, Enviar a la FPGA iniciará una sesión nueva. Haz clic en Enviar a la FPGA y prueba el comportamiento transformado en la placa.

Elige una transformación:

- Invertir los diez bits de los interruptores antes de escribirlos en los LED.
- Mostrar solo los cinco controles NSW inferiores en LEDR0..LEDR4.
- Desplazar el patrón NSW una posición de LED a la izquierda y explicar qué ocurre con NSW9.

Espacio de trabajo de C modificado

Captura una instantánea del código del espacio de trabajo completo que has
probado, incluidas las declaraciones de los registros y el bucle modificado.

Explica en un párrafo la transformación que has aplicado.

El resultado observable debe coincidir con tu explicación. Por ejemplo, si eliges invertir el patrón, con NSW0 apagado debe encenderse LEDR0, y con NSW0 encendido debe apagarse LEDR0.

Describe un patrón de interruptores que hayas probado, qué comportamiento esperabas en los LED y qué mostró la placa.

5

Cierre

5 min

Resume la ruta completa de los datos desde que haces clic en NSW4 en el navegador hasta que ves cambiar LEDR4 en la placa.

Convierte esta vista previa en una sesión de clase real

Activa LabsLand Teach para usar esta lección con tus estudiantes. La primera vez que actives Teach, podrás realizar una sesión de clase sin costo.