Teach lesson
Nios V na DE1-SoC (3/5): E/S em assembly RISC-V
Modifique a E/S em assembly RISC-V, acompanhe instruções de carga e armazenamento e teste o caminho das chaves aos LEDs na DE1-SoC.
New to LabsLand? Create your teacher account
Learning Outcomes
Compilar e executar um arquivo ELF em assembly RISC-V para o Nios V.
Relacionar instruções de carga, armazenamento, deslocamento, máscara e desvio ao comportamento em C.
Explicar o papel dos registradores temporários em um laço de consulta contínua.
Validar o comportamento do assembly na placa DE1-SoC real.
Student activity preview
Activity Content
Preview only. In a class session, students can fill in responses and submit their work to the teacher.
O mesmo hardware, em código de nível mais baixo
6 min
Na lição anterior, o código C leu os dados do JP1, deslocou e mascarou o valor de NSW0..NSW9 e gravou o resultado no registrador dos LEDs. Nesta lição, você implementará o mesmo laço diretamente em assembly RISC-V.
Não é preciso conhecer todo o conjunto de instruções RISC-V para este workshop. Use esta minirreferência ao ler o programa inicial:
- t0..t6: registradores temporários usados para guardar endereços, valores de entrada, máscaras e valores de saída.
- zero: registrador que sempre fornece o valor 0.
- li rd, valor: coloca um valor constante no registrador rd. Nesta lição, carrega endereços de hardware, como 0xFF200000, e máscaras, como 0x3FF.
- lw rd, deslocamento(rs1): carrega da memória uma palavra de 32 bits em rd. Aqui, lê um registrador de hardware.
- sw rs2, deslocamento(rs1): armazena na memória uma palavra de 32 bits de rs2. Aqui, grava em um registrador de hardware.
- srli rd, rs1, quantidade: desloca os bits de rs1 para a direita por uma quantidade fixa e coloca o resultado em rd.
- and rd, rs1, rs2: mantém apenas os bits que valem 1 nos dois registradores de origem.
- j rótulo: salta de volta para um rótulo, mantendo o laço de consulta em execução.
Para consultar o conjunto completo de instruções, use a especificação oficial da ISA RISC-V sem privilégios. Para conhecer o sistema Nios V e os periféricos mapeados em memória, consulte o manual FPGAcademy DE1-SoC Computer with Nios V. Para esta atividade, bastam a minirreferência acima, as notas de endereços da Lição 2 e os comentários do código abaixo.
O programa inicial em assembly repete um laço de observação: carrega os dados do JP1, desloca para baixo os bits de NSW, mascara as dez chaves, armazena o resultado em LEDR e salta de volta para consultar as entradas novamente.
Com base na minirreferência, explique por que esse laço precisa de uma carga, um armazenamento, um deslocamento, uma máscara e um salto. Ainda não se preocupe com a sintaxe exata.
Execute o programa inicial em assembly
12 min
Abra
Nios V Assembly IDE for DE1-SoC.Examine
main.s.Clique em
Build ELF(Compilar ELF).Envie para a FPGA com
Upload to FPGA.Alterne
NSW0,NSW5eNSW9.Observe se os LEDs vermelhos correspondentes mudam.
Use a tabela para registrar três testes do programa inicial no laboratório. Preencha uma linha por padrão de chaves e anote o que a placa realmente mostrou.
Registre três testes do caminho entre chaves e LEDs no programa inicial em assembly. Use os padrões de chaves já preenchidos ou substitua-os por testes equivalentes que você realmente executou.
| Entrada testada | LEDR observada na placa | Observações |
|---|---|---|
Acompanhe o laço
13 min
O programa inicial tem esta estrutura:
li t0, 0xFF200000 # LEDR
li t1, 0xFF200060 # dados do GPIO JP1
li t2, 0xFF200064 # direção do GPIO JP1
sw zero, 0(t2) # usar as linhas do GPIO 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
Use a minirreferência e os comentários do código para preencher a tabela de registradores. Cada linha deve explicar o que o registrador guarda durante o laço. O registrador t3 contém os dados que estão sendo transformados: primeiro, recebe o valor de entrada carregado do JP1; depois, passa a conter o valor deslocado e mascarado que é gravado nos LEDs.
Para cada registrador temporário, indique o que ele guarda neste programa e classifique o valor como endereço, valor de entrada, máscara, valor de saída ou valor de entrada/saída transformado.
| Registrador | Papel no programa | Tipo de valor |
|---|---|---|
Qual instrução lê o valor do GPIO das chaves e qual instrução grava nos LEDs?
Por que a instrução final j loop é necessária para controlar as chaves em tempo real?
Relacione C e assembly
12 min
Relacione esta expressão C às instruções em assembly: (*JP1 >> 5) & 0x3FF. Qual linha do assembly lê o valor do registrador? Qual faz o deslocamento? Qual cria a máscara? Qual aplica a máscara?
Cite duas operações que a expressão em C oculta, mas que você escreveu explicitamente em assembly. Depois, cite um aspecto que o assembly torna mais difícil de ler ou manter.
Uma pequena modificação no assembly
12 min
Modifique o assembly para que somente NSW0..NSW3 apareçam nos LEDs. Dica: a máscara passa de dez bits para quatro bits.
Envie as linhas de assembly modificadas e explique qual valor você alterou.
Descreva um teste em que uma chave acima de NSW3 estava ligada. O que os LEDs devem mostrar depois da alteração da máscara?