Lección Teach
Nios V en la DE1-SoC (3/5): E/S en ensamblador RISC-V
El alumnado modifica E/S en ensamblador RISC-V, analiza paso a paso las instrucciones de carga y almacenamiento y prueba cómo los interruptores `NSW` de la interfaz remota se reflejan en los LED de la DE1-SoC.
¿Primera vez que activas Teach? Puedes realizar una sesión de clase sin costo. El alumnado entra con un código de clase.
¿Primera vez en LabsLand? Crea tu cuenta de docente
Resultados de aprendizaje
Compilar un programa en ensamblador RISC-V para Nios V, generar su archivo ELF y ejecutarlo en la DE1-SoC.
Relacionar las instrucciones de carga, almacenamiento, desplazamiento, enmascaramiento y salto con el comportamiento en C.
Explicar la función de los registros temporales en un bucle de sondeo.
Validar el comportamiento del programa en ensamblador en la placa DE1-SoC real.
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.
El mismo hardware, código a más bajo nivel
6 min
En la lección anterior, el código C leía los datos de JP1, desplazaba y enmascaraba el valor de los interruptores NSW0..NSW9 de la interfaz remota y escribía el resultado en el registro LEDR. En esta lección analizarás y modificarás el mismo bucle directamente en ensamblador RISC-V.
En este sistema, NSW0..NSW9 ocupan los bits 5 a 14 del registro de datos de JP1. Por eso srli t3, t3, 5 los desplaza a las posiciones 0 a 9 antes de aplicar la máscara 0x3FF.
No necesitas conocer toda la ISA RISC-V para este taller. Usa esta minirreferencia al leer el programa inicial:
- t0..t6: registros temporales para guardar direcciones, valores de entrada, máscaras y valores de salida.
- zero: registro que siempre devuelve 0 al leerlo.
- li rd, value: pseudoinstrucción del ensamblador que coloca un valor constante en el registro rd. En esta lección carga direcciones de hardware como 0xFF200000 y máscaras como 0x3FF; el ensamblador puede expandirla a varias instrucciones de la ISA base.
- lw rd, offset(rs1): carga una palabra de 32 bits desde memoria en rd. Aquí lee un registro de hardware.
- sw rs2, offset(rs1): almacena una palabra de 32 bits desde rs2 en memoria. Aquí escribe en un registro de hardware.
- srli rd, rs1, amount: desplaza los bits de rs1 a la derecha una cantidad fija y guarda el resultado en rd.
- and rd, rs1, rs2: conserva solo los bits que valen 1 en ambos registros fuente.
- j label: pseudoinstrucción del ensamblador que salta a label; en este programa, j loop vuelve al inicio del bucle de sondeo. El ensamblador la traduce a jal zero, label.
Como referencia completa del conjunto de instrucciones, usa la especificación oficial de la ISA RISC-V no privilegiada. Para el sistema Nios V y los periféricos mapeados en memoria, consulta el manual FPGAcademy DE1-SoC Computer with Nios V. Para esta actividad bastan la minirreferencia anterior, las notas de direcciones de la Lección 2 y los comentarios del código siguiente.
El programa inicial en ensamblador repite un bucle de sondeo: carga desde JP1 el valor de los interruptores NSW, desplaza los bits cinco posiciones a la derecha, enmascara los diez bits de entrada, almacena el resultado en LEDR y ejecuta j loop para volver a leer JP1.
Con ayuda de la minirreferencia, explica por qué este bucle necesita una carga, un almacenamiento, un desplazamiento, una máscara y un salto. Todavía no te preocupes por la sintaxis exacta.
Ejecutar el programa inicial en ensamblador
12 min
El espacio de trabajo del IDE se conserva por cuenta. Comprueba que main.s es el programa inicial que asigna NSW0..NSW9 a LEDR0..LEDR9 y utiliza la máscara 0x3FF. Si contiene cambios anteriores, restaura el programa inicial o pide al docente que lo proporcione antes de compilar.
Abre
Nios V Assembly IDE for DE1-SoC.Examina
main.s.Haz clic en
Build ELF.Haz clic en
Enviar a la FPGApara cargar el ELF en la placa.Activa y desactiva los controles
NSW0,NSW5yNSW9.Comprueba en la cámara en directo de la placa si cambian los LED rojos correspondientes.
Usa la tabla para registrar tres pruebas del programa inicial. Completa una fila por configuración de los controles NSW y anota lo que mostró realmente la placa.
Registra tres pruebas de correspondencia entre los controles NSW y los LED con el programa inicial en ensamblador. Usa las configuraciones ya incluidas o sustitúyelas por pruebas equivalentes que hayas ejecutado realmente.
| Entrada probada | Estado de LEDR observado en la placa | Notas |
|---|---|---|
Seguir el bucle
13 min
El programa inicial tiene esta estructura:
li t0, 0xFF200000 # LEDR
li t1, 0xFF200060 # datos del GPIO de JP1
li t2, 0xFF200064 # configuración de dirección del GPIO de JP1
sw zero, 0(t2) # configurar las líneas GPIO de JP1 como entradas
loop:
lw t3, 0(t1)
srli t3, t3, 5
li t4, 0x3FF
and t3, t3, t4
sw t3, 0(t0)
j loop
Usa la minirreferencia y los comentarios del código para completar la tabla de registros. Cada fila debe explicar qué contiene ese registro durante el bucle. t3 es el registro de datos transformados: comienza con el valor de entrada leído de JP1 y después pasa a contener el valor desplazado y enmascarado que se escribe en los LED.
Para cada registro temporal, indica qué contiene en este programa y clasifica ese valor como dirección, valor de entrada, máscara, valor de salida o valor transformado de entrada/salida.
| Registro | Función en el programa | Tipo de valor |
|---|---|---|
¿Qué instrucción lee de JP1 el valor de los controles NSW y cuál escribe en los LED?
¿Por qué es importante la instrucción final j loop para controlar los NSW en directo?
Relacionar C y ensamblador
12 min
Relaciona esta expresión de C con las instrucciones en ensamblador: (*JP1 >> 5) & 0x3FF. ¿Qué línea lee el valor del registro? ¿Cuál realiza el desplazamiento? ¿Cuál crea la máscara? ¿Cuál la aplica?
Indica dos operaciones de bajo nivel que el código C del bucle oculta y que aparecen explícitamente en ensamblador. Después, señala algo que el ensamblador haga más difícil de leer o mantener.
Pequeña modificación en ensamblador
12 min
Vuelve a la pestaña de Nios V Assembly IDE for DE1-SoC y modifica el programa para que solo se muestren NSW0..NSW3 en los LED. Cambia la máscara de diez bits por una de cuatro y haz clic en Build ELF. Si la sesión con la placa sigue abierta, reutilízala; si ha caducado, Enviar a la FPGA iniciará otra. Haz clic en Enviar a la FPGA y realiza dos comprobaciones con la cámara en directo de la placa: primero deja NSW0..NSW3 desactivados y activa un único control entre NSW4 y NSW9; después desactiva todos los demás controles y activa uno entre NSW0 y NSW3. El control alto no debe encender ningún LED y el control bajo debe encender el LED correspondiente.
Entrega las líneas de ensamblador modificadas y explica qué valor has cambiado.
Indica qué control alto (NSW4..NSW9) y qué control bajo (NSW0..NSW3) probaste después de cambiar la máscara. Anota lo que mostró la cámara en directo de la placa en cada caso y explica si el control alto no encendió ningún LED mientras que el control bajo encendió el LED correspondiente.
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.
¿Primera vez en LabsLand? Crea tu cuenta de docente