Teach Remote lab lessons

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.

  • Nios V for DE1-SoC
  • 55 min
  • Graduação em Ciência ou Engenharia da Computação
  • Português (Brasil)
  • Digital systems & FPGA · Embedded systems
Nios V for DE1-SoC
Nios V for DE1-SoC · Lab details

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.

1

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.

Laço de consulta em assembly RISC-V no qual a entrada JP1 é carregada, deslocada e mascarada, depois gravada em LEDR, e o processo se repete.

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.

2

Execute o programa inicial em assembly

12 min

  1. Abra Nios V Assembly IDE for DE1-SoC.

  2. Examine main.s.

  3. Clique em Build ELF (Compilar ELF).

  4. Envie para a FPGA com Upload to FPGA.

  5. Alterne NSW0, NSW5 e NSW9.

  6. 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
3

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?

4

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.

5

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?