Já pensou em construir o seu próprio microcontrolador? É claro que para grande maioria dos desenvolvedores, hobbistas e pequenos fabricantes o desenvolvimento de um chip é algo totalmente fora da realidade, mas e se ao invés de desenvolver um chip em silício desenvolvêssemos uma solução em lógica programável? Neste caso, praticamente qualquer pessoa poderia desenvolver um microcontrolador! Eu sei que o domínio da lógica programável (os famosos CPLDs e FPGAs) é algo ainda obscuro para muita gente e também era para mim (ou ainda é, já que não sou nenhum especialista)!
Foi por isso que, no início de 2016, decidi estudar um pouco mais sobre VHDL e para isso decidi focar num campo que me fascina e que é o das CPUs. Inicialmente eu portei o código VHDL que eu havia escrito para o Ahmes e implementei uma versão sintetizada (1) do mesmo num FPGA Cyclone IV da Altera.
Posteriormente eu decidi dar um passo além e desenvolver um novo projeto: implementar uma CPU comercial de um microcontrolador. A idéia seria desenvolver um softcore que pudesse executar código-objeto de uma plataforma conhecida e incluir funcionalidades adicionais, especialmente um debugger.
Inicialmente eu comecei a desenvolver um softcore baseado no HCS08, mas após alguns dias me dei conta de que a implementação do BDM no softcore seria mais complexa do que eu gostaria. Então eu parti para procurar outro core de microcontrolador que fosse relativamente fácil de implementar e com um debugger simples. Foi então que me lembrei dos Z8 Encore da Zilog: eles são microcontroladores com um conjunto de instruções CISC com arquitetura Harvard e um debugger muito interessante (chamado OCD – On-Chip Debugger) que opera por uma porta serial padrão! Além disso, a Zilog disponibiliza um IDE muito simples e eficiente (o Zilog Developer Studio II ou ZDS-II) que inclui um compilador ANSI-C, editor, simulador e depurador integrado!
Após cerca de um mês de trabalho surgiu a primeira versão totalmente funcional do FPz8, um softcore compatível com o código-objeto do Zilog Z8 Encore e que foi implementado num FPGA Altera Cyclone IV (modelo EP4CE6).
Figura 1 – Diagrama em blocos do FPz8 com um timer básico
O FPz8 foi projetado de forma a funcionar como um SoC (System on Chip), ou seja, ele não necessita de nenhum componente externo adicional (exceto a memória de configuração do FPGA) para poder funcionar (as implementações tradicionais de softcores normalmente utilizam memórias externas), por isso, é possível testar o FPz8 em praticamente qualquer kit de FPGA existente no mercado!
Figura 2 – O kit onde foi desenvolvido o FPz8
O softcore inclui toda a infraestrutura básica para a operação de um eZ8: o core com praticamente todas as instruções implementadas (exceto as instruções LDE e LDEI que manipulam memória externa de dados), um controlador de interrupções vetorizado de 8 entradas e com prioridade programável e um debugger OCD totalmente funcional! Chique não?
E sabe o que é mais legal do FPz8? Utilizando um chip conversor serial/USB (presenta na maioria dos kits de FPGA) é possível carregar e depurar um programa rodando na memória do FPGA através da IDE oficial da Zilog! Isto significa que você pode escrever um programa em Assembly ou C, montar/compilar, descarregar o código na memória do FPGA e acompanhar a execução do mesmo, executar passo-a-passo, verificar e alterar variáveis e registradores do microcontrolador! Não é legal?
Eu sei que isso tudo não é novidade, já existem outros softcores disponíveis gratuitamente, sendo provavelmente o Open430 e o NEO430 (ambos compatíveis com o MSP430 da Texas Instruments) os mais famosos. Mas o FPz8 possui uma arquitetura simples, compatível com um IDE simples e leve e que pode ser utilizado para o estudo de programação, arquitetura de computadores, sistemas embarcados, etc! Você pode alterá-lo, incluir novas instruções ou periféricos! E como tudo o que ele necessita é um kit muito simples, é muito barato utilizar o FPz8 no ensino de lógica programável, programação de microcontroladores e sistemas embarcados!
Na forma atual o FPz8 ocupa cerca de 4889 elementos lógicos e cerca de 522 registradores (cerca de 78% dos elementos lógicos do menor FPGA da linha Cyclone IV, o EP4CE6), um módulo de timer básico de 16 bits ocupa outros 120 elementos lógicos e 61 registradores. A velocidade máxima de clock é de 23.1MHz (o exemplo roda a 16.667MHz).
O código completo do FPz8, incluindo o projeto no Quartus II (versão 9.1SP2) pode ser encontrado na minha conta no GitHub ou no site Opencores.org! Lembre-se: o FPz8 é totalmente open source!
Eu também gravei um vídeo alguns meses atrás demonstrando o FPz8 (infelizmente a qualidade do vídeo não é das melhores) e em breve será publicado um artigo sobre ele na revista Norte-Americana Nuts & Volts.
Nos próximos artigos eu vou descrever algumas características internas da sua implementação e mostrar alguns exemplos. Até lá!
Referências
- Ahmes – Implementação em FPGA Cyclone IV
- FPz8 no GitHub
- FPz8 no OpenCores
- Website da Zilog
- Kit do Cyclone IV no Ebay
- Quartus II SP2
- Cyclone IV na Altera
- Revista Nuts & Volts