Teach Lições com laboratórios remotos

Lição do Teach

Nios V na DE1-SoC (2/5): E/S mapeada em memória com C

Edite E/S mapeada em memória em C no Nios V, leia chaves, controle LEDs e explique como os endereços ligam o código ao hardware.

  • Nios V for DE1-SoC
  • 55 min
  • Graduação em Ciência ou Engenharia da Computação
  • Português (Brasil)
  • Sistemas digitais e FPGA · Sistemas embarcados

Entre com uma conta de professor para preparar uma sessão. Os estudantes entram com um código da turma.

Controles NSW do LabsLand mapeados pelos bits do JP1 até os LEDs vermelhos da DE1-SoC.
Nios V for DE1-SoC · Detalhes do laboratório

Objetivos de aprendizagem

  • Usar ponteiros volatile em C para acessar E/S mapeada em memória.

  • Ler as chaves lógicas do Nios V no LabsLand pelo caminho GPIO JP1.

  • Usar máscaras e deslocamentos para mapear bits de entrada nos bits de saída dos LEDs.

  • Validar o comportamento do hardware pela câmera ao vivo da placa.

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.

1

O mapa de E/S

8 min

O processador Nios V enxerga os periféricos de hardware como endereços de memória. Neste laboratório, o programa inicial usa:

  • LEDR em 0xFF200000: registrador de saída dos LEDs vermelhos.
  • dados JP1 em 0xFF200060: caminho de entrada das chaves lógicas do LabsLand.
  • direção JP1 em 0xFF200064: registrador de direção do GPIO.
  • JTAG UART em 0xFF201000: saída do terminal por printf.

A CPU lê e escreve esses endereços como memória comum, mas o tecido da FPGA encaminha cada acesso a um periférico, e não à RAM. Isso é E/S mapeada em memória.

Os controles do navegador têm os rótulos NSW0..NSW9. Neste fluxo remoto, eles não são a porta física SW0..SW9 em 0xFF200040. Os controles NSW lógicos entram pelos bits do GPIO JP1; o programa inicial desloca esses bits para baixo antes de escrever no registrador de LEDs.

Limite da referência: o manual FPGAcademy DE1-SoC Computer with Nios V é a referência correta para o computador Nios V fixo e seu mapa de periféricos. Esta lição usa deliberadamente o caminho JP1 validado pelo LabsLand para os controles NSW do navegador, em vez de usar diretamente o registrador das chaves físicas da FPGAcademy.

Controles NSW do LabsLand mapeados pelos bits do JP1 até os LEDs vermelhos da DE1-SoC.

Os controles NSW do navegador são lidos nos bits 5 a 14 dos dados JP1. O programa desloca o valor cinco posições à direita para que NSW0 se torne o bit 0 e escreve o valor de dez bits em LEDR0..LEDR9.

Posições principais:

  • NSW0 é lida como o bit 5 do JP1 e se torna LEDR0.
  • NSW1 é lida como o bit 6 do JP1 e se torna LEDR1.
  • NSW2 é lida como o bit 7 do JP1 e se torna LEDR2.
  • O padrão continua até NSW9, lida como o bit 14 e transformada em LEDR9.

Neste perfil, escrever 0 no registrador de direção JP1 configura como entradas as linhas usadas por NSW0..NSW9. Por isso o programa executa *JP1_DIR = 0; antes de ler os dados JP1.

Por que o programa escreve em 0xFF200064 antes de ler as chaves em 0xFF200060?

2

Compile o programa C inicial

14 min

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

  2. Examine main.c.

  3. Clique em Build ELF (Compilar ELF).

  4. Envie para a FPGA com Upload to FPGA.

  5. Confirme que o terminal imprime Hello from Nios V.

  6. Alterne NSW0, NSW3 e NSW9; observe as saídas LEDR correspondentes.

Registre três testes rápidos. Em cada linha, preveja primeiro a saída LEDR, alterne o controle NSW na placa e anote o resultado observado.

Registre três testes. Para cada linha, preveja a saída LEDR antes de testar e depois anote a saída realmente observada na placa.

Entrada testada LEDR esperada antes do teste LEDR observada na placa Coincidiu com a previsão?
3

Leia o caminho do código

15 min

Mantenha aberta a aba do laboratório C. Você pode responder usando o código abaixo, que é o mesmo main.c que acabou de compilar e testar.

Concentre-se no laço:

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

O deslocamento move para as posições 0 a 9 os bits do JP1 usados por NSW0..NSW9. A máscara mantém apenas esses dez bits antes da escrita no registrador de LEDs.

Por exemplo, quando apenas NSW0 está ligada, o bit 5 do JP1 é 1. Depois de >> 5, ele se torna o bit 0 e acende LEDR0. Os qualificadores volatile são necessários porque o valor apontado por JP1 pode mudar devido ao hardware, não a uma atribuição em C. Sem volatile, uma otimização poderia reutilizar um valor antigo ou remover um acesso repetido que pareceria redundante na memória comum.

Se NSW0 chega ao bit 5 dos dados JP1, por que o código desloca o valor cinco posições à direita?

Qual seria o risco de escrever o valor bruto do JP1 diretamente no registrador de LEDs sem & 0x3FF?

Por que esses ponteiros devem ser volatile? Explique em termos de otimização do compilador e registradores de hardware.

4

Modifique o mapeamento

13 min

Use novamente a aba do C IDE. Se a primeira sessão ainda estiver aberta, reutilize-a; se tiver expirado, compile o ELF modificado e envie-o outra vez. Altere o programa para que os LEDs mostrem um padrão transformado das chaves, clique em Build ELF, envie-o e teste na placa.

Escolha uma transformação:

  • Inverta os dez bits das chaves antes de escrever nos LEDs.
  • Mostre apenas os cinco controles NSW inferiores em LEDR0..LEDR4.
  • Desloque o padrão NSW uma posição de LED para a esquerda e explique o que acontece com NSW9.

Envie o laço C modificado e um parágrafo explicando a transformação.

O resultado observável deve corresponder à explicação. Por exemplo, se você inverter o padrão, NSW0 desligada deve acender LEDR0, e NSW0 ligada deve apagá-lo.

Descreva um padrão de chaves testado, o resultado esperado nos LEDs e o que a placa mostrou.

5

Síntese

5 min

Resuma o caminho completo dos dados, desde o clique em NSW4 no navegador até a mudança de LEDR4 na placa.

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.