Índice:

Faça qualquer sensor de um FPGA: 4 etapas
Faça qualquer sensor de um FPGA: 4 etapas

Vídeo: Faça qualquer sensor de um FPGA: 4 etapas

Vídeo: Faça qualquer sensor de um FPGA: 4 etapas
Vídeo: Kit de FPGA RZ-EasyFPGA - Primeiras Impressões e um Teste Simples. 2024, Julho
Anonim
Image
Image
O FPGA
O FPGA

A maioria dos fabricantes tentou construir pelo menos uma vez na vida um termômetro, talvez o que eles têm em casa não seja inteligente o suficiente, ou talvez eles pensem que podem construir o próximo NEST. No entanto, em algum momento eles tiveram um microcontrolador com seu software de última geração conectado a um sensor de temperatura (e talvez outros sensores: pressão, luz). Até agora tudo perfeito, o software está rodando e o sensor está detectando. Vamos testar!

Hmmmm … talvez ele devesse aquecer o sensor com um secador de cabelo e esfriar com gelo, funciona por um tempo. Mas não parece profissional, o sensor muda os valores muito rapidamente se você aquecê-lo, ele não aquece mais do que alguns graus. O projeto é um fracasso! Mas o algoritmo é novo, leva em consideração uma série de fatores, que pena que ele ficou preso nesta coisa estupidamente menor.

Minha solução é a seguinte: fazer um FPGA atuar como um sensor com valores transmitidos de um PC (ou armazenados na memória, ou criados ad-hoc dentro do FPGA). Portanto, para o seu precioso MCU, o FPGA parece um sensor, mas não qualquer sensor: o sensor que você quiser. Talvez você decida que precisa de mais resolução ou tempo de resposta mais rápido do que o esperado, você terá que trocar o sensor. Encomende online, chegará dentro de alguns dias, de alguns meses, quem sabe. Fixe novamente seu PCB ou solicite um módulo com o novo sensor. Ou… alguns cliques e o FPGA é configurado como seu novo sensor e pode emular a configuração interna exata.

No momento em que este artigo foi escrito, o FPGA poderia atuar como um LM75 com dados de temperatura armazenados no BRAM (no FPGA).

Etapa 1: O MCU

Meu MCU de escolha é um LPC4337 em um LPCXpresso. Em cima dele, eu tenho um escudo (LPC General Purpose Shield) com um display e um sensor LM75 real. LPC4337 é um ARM Cortex M4 rodando a 200 MHz e um Cortex M0 menor (não usado aqui). O sensor real é conectado ao periférico I2C1 e o nosso virtual será conectado ao I2C0. A fonte está disponível no meu GitHub.

Como construir? Baixe LPCXpresso IDE junto com a biblioteca LPCOpen. Importe essa biblioteca para o IDE e também abra o projeto do GitHub. Tudo deve ser configurado e você pode clicar em "Debug" no canto inferior esquerdo.

Todo o projeto é baseado em um dos exemplos do NXP (para mostrar que meu projeto simula um sensor real e não precisa de código especial no lado do MCU). No arquivo principal (chamado iox_sensor.cpp) está este código:

#define SENSORS_ON_SHIELD

#if definido (SENSORS_ON_SHIELD) #define SHIELD_I2C I2C1 #elif definido (SENSORS_ON_FPGA) #define SHIELD_I2C I2C0 #endif

Ao trocar SENSOR_ON_SHIELD e SENSOR_OR_FPGA o usuário pode trocar em tempo de compilação para qual sensor falar, o real ou o virtual, visto que estão em diferentes pinos I2C.

Etapa 2: O FPGA

Minha placa FPGA de escolha é uma Artix 7 da Digilent, com um Xilinx Arty 7. Dois dos conectores PMod são usados, um para depuração e um para a carga real, a conexão com a placa MCU.

Novamente, o código-fonte do FPGA está disponível no meu GitHub (pasta fpgaSide).

Como construir? Baixe, compre ou abra o IDE Xilinx Vivado. Importe os arquivos do projeto do GitHub. Um dos arquivos (content.coe) são os dados de temperatura em formato bruto que serão transmitidos ao sensor falso. Há também um arquivo Excel com o mesmo nome que ajuda a converter dados de temperatura legíveis por humanos em dados LM75 brutos. Estou planejando mudar isso para um processo automatizado com um software escrito em Java, mas até então essa solução funciona. A síntese e a implementação devem demorar um pouco, leve isso em consideração.

Etapa 3: Como funciona?

Como funciona?
Como funciona?
Como funciona?
Como funciona?

Como eu disse, para o MCU, o FPGA parece um sensor, mais exatamente um sensor I2C. A saída do periférico I2C é conectada à entrada do FPGA. Dentro do FPGA existem 3 componentes principais: - Controlador I2C - Dispositivo I2C - Dados O Controlador I2C recebe dados I2C dos pinos do FPGA e os envia para o resto do FPGA e faz o mesmo na ordem inversa. Ele mantém uma máquina de estado interna para o protocolo I2C (aliás, aqui está a documentação para ele). O que este componente envia para o dispositivo I2C? O byte recebido atualmente, a posição desse byte na comunicação atual e se o MCU está escrevendo ou lendo do FPGA. O dispositivo I2C recebe os bytes enviados e atualiza a estrutura interna simulada do sensor. Ele pode apenas atualizar o ponteiro do registro ou solicitar novos dados da fonte de dados. O componente de dados transmite novos pontos de dados. Atualmente é apenas uma memória ROM cujo endereço é incrementado (aproximadamente) duas vezes por segundo.

Qual é o meu objetivo final? Isso é mostrado na segunda foto. Ou seja: possibilitar que mais dispositivos I2C (sensores e outros) sejam simulados ao mesmo tempo dentro do FPGA. Os dados no backend do sensor devem ser armazenados em cache no FPGA e transmitidos do PC via USB ou Ethernet. Suporta sensores mais avançados e outros dispositivos I2C (memória, drivers de LED, etc.).

Etapa 4: juntando tudo

Juntando tudo
Juntando tudo
Juntando tudo
Juntando tudo

Agora é a hora de conectar tudo junto. Teoricamente, é simples: a placa mcu tem um conector PMod (I2C0 e SSP0 (pode funcionar como SPI)). A placa Artix possui 4 conectores PMod que podem ser usados como você quiser. Eu escolho o conector D para falar com o MCU e o conector B para conectar ao meu analisador lógico.

Aviso

Você não pode conectar as duas placas juntas assim. Porque? PMod foi construído para facilitar a conexão de uma placa Master / Host (que fornece energia) a uma placa Slave / Sensor (que recebe energia). Mas neste projeto ambas as placas fornecem energia e se você conectar a saída de 3,3 V de uma placa à saída de 3,3 V da outra placa, coisas ruins podem acontecer. Mas eles podem não e você pode apenas alterar os parâmetros dos trilhos de alimentação do FPGA (eles são projetados com muito cuidado). Portanto, não corra esse risco e mova o conector um pino para a esquerda (e também vire a placa FPGA) como pode ser visto nas fotos acima. Aqui está a especificação do PMod, você pode estudar, o que fiz em poucas palavras é não conectar os VCCs das duas placas.

Recomendado: