12
Implementação de uma versão Havard/RISC reconfigurável do microcontrolador 8051 em FPGA Remy Eskinazi João Paulo Zaqueu [email protected] , [email protected] Resumo Este trabalho descreve a implementação de uma versão Havard/RISC do microcontrolador 8051 em FPGA. A implementação refere‐se a um subconjunto funcional do microcontrolador, ou seja, trata‐se de uma versão simplificada dos recursos apresentados em um microcontrolador 8051 padrão de forma a obter‐se um melhor desempenho. Da mesma forma, um subconjunto das instruções foi implementado considerando‐se as funções mais importantes para execução de um programa. Todo o projeto foi especificado e descrito em VHDL e os teste e simulações mostraram que o protótipo encontra‐se perfeitamente funcional. Em trabalhos futuros, pretende‐se utilizar este “core” em redes de processadores embarcados em SOCs (Sistem on Chip) voltados para processamento paralelo. Palavras‐chave: Microcontrolador, FPGA, RISC. Abstract This work describes the implementation of a Haverd/RISC version of the 8051 microcontroller in a FPGA. This implementation refers to a functional subset of the microcontroller. This means that this implementation was a simplified version of the resources presented in a standard 8051 microcontroller in order to obtain a better functional performance. Following this strategy, a subset of the instruction set was implemented regarding the most import functions for a program execution. The design was specified and described in VHDL language and all the tests and simulations have been demonstrated that the prototype works perfectly. In future works, we have intention to use this core processor in embedded processors networks (SOCs) aiming parallel processing. Keywords: Microcontroller, FPGA, RISC.

FPGA - unibratec.edu.br · Mover MOV As operações lógicas e aritméticas são feitas a partir do Acumulador (ACC) com os ... Operação Opcode 0 Adição 0000 1 Subtração 0001

Embed Size (px)

Citation preview

Implementação de uma versão Havard/RISC reconfigurável do microcontrolador 8051 em 

FPGA 

Remy Eskinazi 

João Paulo Zaqueu 

[email protected], [email protected] 

Resumo 

Este  trabalho descreve a  implementação de uma versão Havard/RISC do microcontrolador  8051  em  FPGA.  A  implementação  refere‐se  a  um  subconjunto funcional  do microcontrolador,  ou  seja,  trata‐se de uma  versão  simplificada dos recursos apresentados em um microcontrolador 8051 padrão de forma a obter‐se um  melhor  desempenho.  Da mesma  forma,  um  subconjunto  das  instruções  foi implementado  considerando‐se  as  funções  mais  importantes  para  execução  de um  programa.  Todo  o  projeto  foi  especificado  e  descrito  em VHDL  e  os  teste  e simulações mostraram que o protótipo encontra‐se perfeitamente  funcional. Em trabalhos  futuros,  pretende‐se  utilizar  este  “core”  em  redes  de  processadores embarcados em SOCs (Sistem on Chip) voltados para processamento paralelo. 

Palavras‐chave: Microcontrolador, FPGA, RISC. 

Abstract 

This work describes  the  implementation of  a Haverd/RISC  version of  the 8051 microcontroller in a FPGA. This implementation refers to a functional subset of  the  microcontroller.  This  means  that  this  implementation  was  a  simplified version of the resources presented in a standard 8051 microcontroller in order to obtain  a  better  functional  performance.  Following  this  strategy,  a  subset  of  the instruction  set  was  implemented  regarding  the  most  import  functions  for  a program execution. The design was specified and described in VHDL language and all  the  tests  and  simulations have been demonstrated  that  the prototype works perfectly.  In  future  works,  we  have  intention  to  use  this  core  processor  in embedded processors networks (SOCs) aiming parallel processing. 

Keywords: Microcontroller, FPGA, RISC.

Introdução 

Atualmente  o  projeto  de  sistemas  embarcados  vem  se  tornando  cada  vez  mais  complexos. 

Diversos  destes  sistemas  estão  baseados  em  microcontroladores  que  suportam  atividades  de 

aquisição  de  dados,  processamento  e  controle.  Características  como  custo,  domínio  da 

arquitetura, ferramentas de desenvolvimento e desempenho são considerados para a tomada de 

decisão na escolha de uma arquitetura em particular.  Em contrapartida aos microcontroladores 

discretos,  processadores  embarcados  em  dispositivos  reconfiguráveis  constituem‐se  em  uma 

alternativa  viável  para  a  implementação  de  controle  em  sistemas  embarcados,  especialmente 

considerando‐se o cada vez menor custo de aquisição destes componentes [D’Amore], [Ordonez]. 

Como exemplo, pode‐se citar os controladores embarcados NIOS da Altera [Nios] e MicroBlaze da 

Xilinx  [Microblaze].  Entretanto,  dispositivos  FPGAs  não  disponibilizam  em  sua  biblioteca  de 

componentes  (provavelmente  por  uma  questão  de  estratégia  comercial)  versões  de 

microcontroladores comerciais discretos tais como da família 8051.  Uma vantagem imediata para 

utilização  destes  componentes  seria  a  utilização  de  diversos  tipos  de  códigos  e  ferramentas 

gratuitos de projeto, que já se encontram a disposição pelo fato do microcontrolador 8051 (e seus 

variantes)  ser um dos mais utilizados para projetos  de  sistemas  embarcados.   De  fato,  existem 

atualmente  implementações  deste microcontrolador  em  FPGAs  tais  como  propostas  por  Carro 

[Carro]  e  Oregano  [Oregano].  Estas  propostas  implementam  um  subconjunto  funcional  do 

microcontrolador  8051  [Mazidi],  voltado  para  processamento  de  tarefas  discretas,  ou  seja, 

apresentam  um  conjunto  de  instruções  fixo  e  reduzido  que  não  pode  ser  alterado  de  forma  a 

adaptar‐se a novas situações de processamento. A nossa proposta difere destas implementações 

por  construir  um  controlador  que,  futuramente,  apresente  um  conjunto  de  instruções 

reconfigurável, bem como possa adptar‐se a mudanças operacionais e paradigmas de controle em 

sistemas embarcados. 

Descrição da arquitetura Na versão implementada do microcontrolador, as instruções e dados estão em formatos 

de 8 bits [Patterson], sendo que o formato das instruções é dividido conforme ilustra a fig.1. 

Figura 1. Formato das Instruções

Existem 14 principais instruções do 8051 divididas em 4 tipos, conforme mostra a tabela 1. 

TABELA 1. Instruções 

Aritméticas  ADD, ADDI, SUB,SUBI 

Lógica  AND, OR, NOT, XOR 

Desvio  JC, JZ, ACALL, SJMP, RET 

Mover  MOV 

As  operações  lógicas  e  aritméticas  são  feitas  a  partir  do  Acumulador  (ACC)  com  os 

registradores ou dados. A arquitetura apresenta 2 portas de I/O, P0 e P1, 1 memória RAM interna 

dividida conforme a tabela 2. 

TABELA 2. Divisão da Memória RAM 

00  Registrador0 

01  Registrador1 

02  Registrador2 

03  Registrador3 

04  Registrador4 

05  Registrador5 

06  Registrador6 

07  Registrador7 

08  ACC 

09  P0 

10  P1 

11  TMOD 

12  Stack 

13  Stack 

14  Stack 

15  Stack

Adicionalmente,  existe  ainda  um  grupo  de  registradores,  RI  (Registrador  Inicial),  PC 

(Program  Counter),  REND  (Registrador  de  endereço)  e  o  ACC*  (Registrador  auxiliar  do  ACC),  5 

multiplexadores, um decodificador, uma unidade de controle, a ULA , um comprador, um Timer e 

o  Stack  Pointer  ,  como  mostra  a  figura  2,  e  suas  conexões  necessárias  para  o  correto 

funcionamento . 

Figura 2. Visão Geral da Arquitetura. 

Para a instrução de desvio ACALL, o microcontrolador guarda o endereço seguinte (PC+1) 

nos endereços reservados para a Pilha (Stack), que começa no endereço 15 e vai até o endereço 

12.  O  elemento  que  determina  em  qual  endereço  vai  ser  gravado  é  o  Stack  Pointer  (SP). 

Posteriormente, durante a execução da instrução RET, pega‐se o dado que está no endereço onde 

o Stack Pointer está indicando e coloca‐o no PC, fazendo assim que a pilha seja do tipo LIFO. 

De maneira semelhante ao 8051 padrão, o Timer se divide em TH e TL onde contém 8bits 

cada. Existem dois modos de operação no Timer. No Modo0, o timer funciona como um contador 

pleno de 16 Bits. No Modo1, o  timer  carrega o  valor de TH em TL e quando o TL  “estoura” ele 

recarrega  TL  com  o  valor  de  TH  e  o  Flag  de  estouro  do  timer  é  ativado  (modo  de  recarga 

automático). 

Os  27 bits  de  saída da UC  (26:0)  são utilizados para execução de microinstruções onde 

cada bit tem uma função especifica, conforme mostra a tabela 3.

TABELA 3. Definição de Cada Bit de uma Microinstrução 

BIT  Significado 

0  clock PC 

1  Load PC 

2  Clock RI 

3  Selecionador do multiplexador de acesso ao multiplexador que terá acesso a 

memória RAM 

4  Clock da memória RAM 

5  Clock do ACC* 

9‐6  Selecionador de operação da ULA 

10  Clock do REND 

11  Load do REND 

12  Selecionador do multiplexador de acesso ao endereço da memória de programa 

13  Bit auxiliar para operação SJMP 

14‐17  Selecionador de endereço da memória RAM 

18  Leitura ou escrita da memória RAM 

19  Selecionador do multiplexador de acesso ao contador de programa 

20  Selecionador do multiplexador de acesso de dados a memória RAM 

21  Clock do Stack Pointer 

22  Muda o endereço do Stack Pointer 

23  Selecionador do multiplexador de acesso de endereços a memória RAM 

24  Seleciona o TH ou TL para fazer a gravação de dados 

25  Habilita a gravação de dados no Timer 

26  Habilita P0 e P1 como saídas.

Descrição da ULA 

A ULA do controlador é capaz de realizar dez das principais operações lógicas e aritméticas 

do 8051 padrão. A Tabela 4 descreve estas operações. 

TABELA 4. Operações da ULA. 

Operação  Opcode 

0  Adição  0000 

1  Subtração  0001 

2  AND  0010 

3  OR  0011 

4  XOR  0100 

5  NOT  0101 

6  NOR  0110 

7  XNOR  0111 

8  Incrementa  1000 

9  Decrementa  1001 

10  Reservado  1010 

11  Reservado  1011 

12  Reservado  1100 

13  Reservado  1101 

14  Reservado  1110 

15  Reservado  1111 

Na descrição da ULA foram utilizadas duas entradas e uma saída de 8 bits, um opcode de 4 bits 

e um bit de carry (conforme mostrado na Fig. 3).

Figura 3. Diagrama em bloco da ULA. 

A implementação VHDL da ULA consiste em uma estrutura de seleção do tipo case, a qual 

realiza  uma  operação  específica  entre  seus  barramentos  de  entrada  a  partir  de  uma 

determinada microoperação  de  controle  que  fornece  o  opcode  atual  [D’Amore].  Conforme 

indica  a  Figura  4,  no  início  da  descrição,  a  ULA  verifica  se  há  uma  solicitação  de  reset.  Se 

houver, serão zeradas todas as saídas. Caso contrário, a ULA lê o código de operação e executa 

o procedimento adequado. 

Figura 4. Fluxograma da ULA 

INÍCIO 

RESET = 1? 

SIM NÃO 

Opcode 0000? 

S  SOMA 

Opcode 0001? 

S  SUBTRAI 

Opcode 0010? 

S  AND 

Opcode 1001? 

S  DECREM 

... 

INÍCIO 

RESET = 1? 

SIM NÃO 

Opcode 0000? 

S  SOMA 

Opcode 0001? 

S  SUBTRAI 

Opcode 0010? 

S  AND 

Opcode 1001? 

S  DECREM 

... 

8 8 

8 8 

4

Descrição dos resultados iniciais e testes 

Os testes iniciais  feitos no controlador  foram todos a partir de simulações feitas através 

do  procedimento  com  waveform  do  QUARTUS  II,  onde  foi  observado  o  funcionamento  do 

microcontrolador, obtendo resultados positivos na implementação do mesmo. A figura 5 mostra o 

teste em um determinado momento onde o acc está com o dado 96 e é chamada a função ADD 

A,#6. Em 1 acontece o ciclo de busca e codificação, em 2 o valor do acc é registrado em uma das 

entradas da ULA (ulain2), em 3 o valor 6 é colocado na outra entrada da ULA(ulain1) e acontece a 

soma, em 4 o resultado é salvo no acc. 

Figura 5. Execução da instrução ADD A,#dado 

A figura 6 mostra o funcionamento do timer em modo0, é possível observar que em 1 o 

timer está em contagem plena, em 2 ele carrega o valor de 250 em TL , em 3 ele continua a sua 

contagem,  em  4  ele  carrega  o  valor  de  255  no  TH,  em  5  o  timer  continua  a  sua  contagem  e 

quando ele “estoura” sua contagem o bit de carry(C_T) é colocado em nivel alto. 

Figura 6. Timer operando no modo0

Já a figura 7 mostra o timer trabalhando no modo1 de operação. Em 1 o timer conta até o 

TL “estourar”,  quando isso ocorre ele aciona o Flag de estouro do Timer(C_T), em 2 ele recarrega 

TL com o valor 253 que  já estava  carregado em TH  e repete o que ocorreu em 1, em 3  ele  fica 

repetindo até o programador mudar o modo de operação. 

Figura 7. Timer operando no modo1 

A  figura  8 mostra  um  teste  feito  na  porta0  utilizando  ela  como  entrada  e  colocando  o 

valor no acumulador.  Em 1  ele  faz  a busca e  codificação,  em 2  ele  salva o  valor da entrada no 

Acumulador (representado no gráfico por ram_block [8]) 

Figura 8. Utilizando P0 como entrada 

Foram  realizados  testes  entre  o  microcontrolador  implementado  comparativamente  a 

uma versão 8051 padrão de referência, utilizando o mesmo clock de 12MHz para ambos. Para tal, 

foram utilizados algoritmos de procura de dados na memória, ordenação de dados pelo método 

de  bubble  sort,  conversão  ASCII,  e  acesso    aos  ports  paralelos.    Novamente  utilizou‐se 

ferramentas de simulação Quartus II para o controlador implementado em FPGA e a ferramenta 

Pinnacle  [Pinnacle]  para  um  microcontrolador  8051  padrão.  Especificamente  para  o  teste  de

ordenação, foi preparado um programa que ordenasse os valores encontrados em R0, R1, R2, R3, 

R4, R5 e R6, usando o mesmo código tanto para um quanto para outro. Como mostra a figura 9, o 

8051  padrão  levou  177  microsegundos  para  realizar  a  ordenação,  enquanto  que  o 

microcontrolador proposto foi necessário 710 ciclos dando um total de 59,16 microsegundos. O 

microcontrolador proposto foi 2,99 vezes mais rápido que o 8051. 

Figura 9. Simulação do programa ordena no 8051 sem end. Indireto 

Em outro teste o mesmo programa foi alterado para utilizar endereçamento indireto. Para 

realizar  a mesma  ordenação  foram  necessários  539 microssegundos  como  mostra  a  figura  10, 

fazendo com que o microcontrolador proposto fosse 9,1 vezes mais rápido. 

Figura 10. Simulação do programa ordena no 8051 com end. Indireto 

A figura 11 mostra o  tempo gasto que o 8051 padrão levou para executar os programas 

de  teste  em  comparação  com  o  microcontrolador  proposto,  utilizando  o  mesmo  código  para 

ambos.  Foi  possível  perceber  que  o  microcontrolador  em  FPGA  foi  mais  rápido  em  todos  os 

testes.

Figura 11. Resultados de desempenho para o controlador implementado 

Trabalhos futuros 

Os próximos passos em trabalhos futuros serão no sentido de adicionar outras instruções 

e  uma  arquitetura  mais  complexa  a  partir  do  projeto  atual.  A  partir  do  microcontrolador 

implementado,  uma  futura  versão  em  arquitetura  Havard/RISC,  poderá  operar  de  modo  que 

possa  ter  seu  conjunto  de  instruções  dinâmicamente  reconfigurável  em  uma  estrutura  que  irá 

integrar diversos microcontroladores em rede. 

Conclusões 

Este  trabalho  descreveu  a  implementação  de  um  microcontrolador  em  arquitetura 

reconfigurável.  O  projeto  foi  construído  como  um  subset  de  um  microcontrolador  8051  em 

arquitetura Havard/RISC. As características funcionais e de desempenho permitem que o mesmo 

seja utilizado como elemento de controle em uma rede de controladores em um SOC. O projeto 

obteve  sucesso diante  à  sua proposta. A  simulação e os  testes  funcionais  de  todos  os módulos 

indicaram o êxito da descrição desenvolvida. A principal contribuição é o código fonte em VHDL, 

aberto,  que  especifica  e  descreve  funcionalmente  um  subset  de  um  microcontrolador  8051. 

Trabalhos futuros consideram o uso da arquitetura em controladores com conjunto de instruções 

reconfigurável de forma a adptar‐se a demandas de processamento. 

Referências 

[Carro] É. Cota, L. Carro, F. Lima, S. Rezgui, R. Velazco, M. Lubaszewski, R. Reis, Synthesis of an 

8051‐Like Micro‐Controller Tolerant to Transient Faults Journal of Electronic Testing: Theory and 

Applications archive, Volume 17 ,  Issue 2 ,April 2001, 149 – 161 

[D’Amore] R. D’Amore, VHDL, Descrição e síntese de circuitos digitais, LTC, 2005.

[Mazidi] Mazidi, M, Mazidi, J.  The 8051 Microcontroller and Embedded Systems, Prentice Hall, 

2000 

[Microblaze] ‐ MicroBlaze Processor Reference Guide. Disponível para download  em 

www.xilinx.com/support/documentation/ip.../xmtc.pdf 

[Nios] ‐ NIOS Embedded processor Disponível em 

http://www.altera.com/products/ip/processors/nios/nio‐index.html 

[Ordonez] E.D.M. Ordonez, F.D. Pereira, C.G. Penteado, R.A. Perecini, Projeto, Desempenho e 

Aplicações de Sistemas Digitais em Circuitos Programáveis (FPGAs), Bless, 2003 

[Oregano] ‐ 8051 IP core Disponível para download em  http://www.oregano.at/ip/ip01.htm 

Ultimo acesso: 31.08.2009 

[Patterson] Patterson & Hennessey Computer Organization and Design: The Hardware/Software 

Interface, Elsevier Ed. 752p 

[Pinnacle] Pinnacle – Simulador para microcontroladores da família 8051 disponível para 

download em http://www.vaultbbs.com/pinnacle. Ultimo acesso em 30/06/2010 

[Souza] SOUZA, David J. Desbravando o PIC, Ed. Érica, São Paulo,2000. 

Remy Eskinazi: Professor Adjunto da Universidade de Pernambuco – Escola Politécnica e do IFPE 

– Instituto Federal de Educação Tecnológica – [email protected] 

João Paulo Zaqueu: Graduando e aluno do programa de I.C. em engenharia Elétrica pela 

Universidade de Pernambuco – Escola Politécnica – [email protected]