O novo modelo VHDL inclui a implementação de uma interface de programação que permite o carregamento de um programa na memória de instruções, assim como o acionamento do sinal de reset do µBIP via software, o que permite reiniciar o microcontrolador (em execução no FPGA) pelo computador.
Durante o estado S0, a máquina de estados permanece aguardando o start bit. Após receber o start bit, a máquina de estados vai para o estado S1 e então inicia a amostragem de 9 bits, sendo o último bit, o stop bit. O valor de cada bit é armazenado em um registrador e deslocado à esquerda. Ao completar o recebimento de um byte, a máquina volta ao estado S0, com exceção da operação de escrita, que ao receber o ultimo dado do pacote, vai para o estado s2, de escrita em memória.
Na Figura 16 pode ser vista a forma de onda do byte 0x57 (caractere ASCII “W” ou 01010111, em binário). Cada bit que compõe o byte é transferido em um intervalo de tempo (Tbit), o qual depende da taxa de transferência B. O bit é lido na metade do seu intervalo (Tbit/2). O exemplo da figura ilustra que o byte 0x57 é transferido do bit menos significativo (=1) para o mais significativo (=0) e que ele é precedido por um start bit (=0) e sucedido por um stop bit (=1).
Figura 16. Forma de onda do byte 0x57 (captura de tela de um osciloscópio)
Para calcular o valor do divisor necessário para uma determinada taxa de transferência, é preciso ter conhecimento da frequência do sistema e da taxa de transferência que se deseja e então aplicar a Equação 1, onde D é o valor do divisor, f é a frequência de operação do sistema e B é a taxa de transferência desejada. Exemplo: 48MHz / (16 . 2400) = 1250.
D = f / ( 16 . B ) Equação 1 Para que ocorra o funcionamento da interface de programação, foi necessário definir um protocolo de comunicação baseado nos três comandos descritos a seguir.
Comando Write
Comando de escrita em memória (código 0x57 ou “W” em ASCII). Identifica um pacote composto de dois bytes de endereço da memória de programa e dois bytes da instrução. Por exemplo, o pacote “0x57 – 0x00 – 0x00 – 0x18 – 0x00” representa o comando de escrita da instrução 0x1800 (LDI 0) na posição 0x0000 da memória de instruções.
Quadro 7. Representação de um pacote do comando Write Comando W
0x57
Endereço MSB
Endereço LSB
Dado MSB
Dado LSB
Comando eXecute
Comando de execução (código 0x58 ou “X” em ASCII). Inicia a execução do programa em memória. Por meio do comando eXecute, a interface de programação desativa o sinal de reset interno e chaveia o barramento de endereço na memória de programa, para o barramento de endereço da CPU do µBIP. O comando eXecute não é sucedido por bytes adicionais.
Quadro 8. Representação de um pacote do comando Execute Comando X
0x58
Comando Stop
Comando para parar a execução (código 0x53 ou “S” em ASCII). Por meio do comando Stop, a interface de programação ativa o sinal de reset interno e chaveia o barramento de memória de programa para o barramento de endereço da interface de programa. Este comando também não sucedido por bytes adicionais.
Quadro 9. Representação de um pacote do comando Stop Comando S
0x53
A Figura 17 ilustra a visualização RTL (Register-Transfer Level) do bloco da interface de programação gerada após a síntese do modelo VHDL. Ela confirma a implementação da interface de programação.
Figura 17. Interface de programação
A Tabela 1 apresenta um comparativo dos resultados da síntese do modelo VHDL original desenvolvido por Pereira (2008), do modelo revisado neste trabalho e de uma versão com a interface de programação. Cabe destacar que o modelo original foi implementado visando FPGAs da família FLEX10K da Altera, enquanto o modelo revisado foi portado para dispositivos da família Cyclone IV (dispositivos mais recentes e presentes nos kits de desenvolvimento disponíveis atualmente no mercado). Os três modelos comparados consideram que as memórias são implementadas com o uso de bits de RAM embutidos no FPGA. Considerando-se que os três modelos possuem o mesmo custo em bits de RAM, a tabela apresenta o custo de lógica combinacional (LUTs – Look-Up Tables) e o custo de lógica sequencial (FF – Flip-Flops) de cada modelo.
Tabela 1. Comparação de resultados
Modelo LUTs FFs Bits de
memória
µBIP Original (Flex10K) 1182 244 16386
µBIP revisado (Cyclone IV) 1221 236 16386 µBIP revisado com interface de programação (Cyclone IV) 1162 328 49152
Da Tabela 1, observa-se que as diferenças entre o modelo original e o revisado sem a interface de programação são pequenas (menos de 4% em LUTs e 4% em FFs) e devem-se ao uso de famílias de FPGA diferentes. Nota-se, também, que o modelo com a interface de programação consome menos LUTs que os demais. A explicação para isso é que a aplicação é implementada com memória embarcada (nota-se pelo aumento do consumo de memória), ao passo que no modelo original, a memória de programa é sintetizada como equações lógicas mapeadas em LUTs. Com relação o número de flip-flops, observa-se um aumento de 39%
com a implementação da interface de programação. Esse custo adicional se justifica pelo fato de que o Quartus II realiza otimizações na síntese da CPU quando o código da aplicação é implementado como lógica combinacional (LUTs), como é feito no modelo original. Nesse modelo, o custo do processador varia conforme os recursos utilizados pela aplicação, o que é discutido por Pereira (2008). Já no modelo com a interface de programação, o custo do processador é fixo, dado que o código da aplicação é carregado após a síntese do processador.
Por fim, deve-se ressaltar que o custo em bits de memória do modelo com a interface de programação é significativamente maior (32 Kbits adicionais), dado que são alocados espaços para todo o espaço de endereçamento (2048 posições). Por isso, a memória de programa consome 32 Kbits (2 Kwords x 16 bits/word), sendo que a memória de dados consome 16 Kbits.
Entende-que o custo adicional decorrente da implementação da interface de programação, em especial com relação à memória de programa, é aceitável diante do benefício obtido.