Lição do Teach
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.
Entre com uma conta de professor para preparar uma sessão. Os estudantes entram com um código da turma.
Ainda não tem uma conta na LabsLand? Criar sua conta de professor
Objetivos de aprendizagem
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.
Visualização da atividade do estudante
Conteúdo da atividade
Apenas visualização. Em uma sessão de aula, os estudantes podem preencher respostas e entregar o trabalho ao professor.
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 valor0.li rd, valor: coloca um valor constante no registradorrd. Nesta lição, carrega endereços de hardware, como0xFF200000, e máscaras, como0x3FF.lw rd, deslocamento(rs1): carrega da memória uma palavra de 32 bits emrd. Aqui, lê um registrador de hardware.sw rs2, deslocamento(rs1): armazena na memória uma palavra de 32 bits ders2. Aqui, grava em um registrador de hardware.srli rd, rs1, quantidade: desloca os bits ders1para a direita por uma quantidade fixa e coloca o resultado emrd.and rd, rs1, rs2: mantém apenas os bits que valem1nos 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?
Transforme esta visualização em uma sessão de aula
Continue para o LabsLand Teach para usar esta lição com seus estudantes e conferir o acesso disponível para sua conta.
Ainda não tem uma conta na LabsLand? Criar sua conta de professor