marcus anderson almeida bezerra.pdf
TRANSCRIPT
UNIVERSIDADE FEDERAL DO CEARÁ
CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA ELÉTRICA
CURSO DE ENGENHARIA ELÉTRICA
MARCUS ANDERSON ALMEIDA BEZERRA
PROTOCOLOS DE COMUNICAÇÃO APLICADOS EM FPGAs
FORTALEZA
2013
MARCUS ANDERSON ALMEIDA BEZERRA
PROTOCOLOS DE COMUNICAÇÃO APLICADOS EM FPGAs
Monografia apresentada ao Curso de
Engenharia Elétrica do Departamento de
Engenharia Elétrica da Universidade Federal do
Ceará, como requisito parcial para a obtenção
do Título de Engenheiro Eletricista.
Orientador: Prof. Dr. Paulo Peixoto Praça.
FORTALEZA
2013
___________________________________________________________________________
Página reservada para ficha catalográfica que deve ser confeccionada após apresentação e
alterações sugeridas pela banca examinadora.
Para solicitar a ficha catalográfica de seu trabalho, acesse o site: www.biblioteca.ufc.br, clique
no banner Catalogação na Publicação (Solicitação de ficha catalográfica)
___________________________________________________________________________
MARCUS ANDERSON ALMEIDA BEZERRA
PROTOCOLOS DE COMUNICAÇÃO APLICADOS EM FPGAs
Monografia apresentada ao Curso de
Engenharia Elétrica do Departamento de
Engenharia Elétrica da Universidade Federal do
Ceará, como requisito parcial para a obtenção
do Título de Engenheiro Eletricista.
Aprovada em: ___/___/______.
BANCA EXAMINADORA
________________________________________
Prof. Dr. Paulo Peixoto Praça. (Orientador)
Universidade Federal do Ceará (UFC)
_________________________________________
Eng. Ms. Dalton de Araújo Honório
Universidade Federal do Ceará (UFC)
_________________________________________
Profa. Dra. Ranoyca Nayana Alencar Leão e Silva
Universidade Federal do Piauí (UFPI)
A Deus.
Aos meus pais, Aristides e Lucimar.
AGRADECIMENTOS
Primeiramente a Deus por me guiar nesta minha caminhada e pelas oportunidades
que me foram concedidas.
Aos meus Pais, José Aristides Bezerra e Maria Lucimar Almeida da Silva, por todo
suporte e pela ajuda em todos os momentos da minha vida, bons ou ruins.
À minha irmã Amanda Mirelle Almeida Bezerra por sempre me encorajar e
incentivar ao longo da minha vida a superar os meus limites.
Ao professor Dr. Paulo Peixoto Praça, pela sua orientação, paciência, amizade e
disponibilidade durante todo este tempo. Agradeço pela oportunidade de trabalhar e aprender
mais nessa área, de minha grande admiração, da eletrônica digital.
Aos meus amigos e colegas de graduação Antônio Dias Júnior, Eng. Aloísio
Fernandes Dias, Eng. Diego de Sousa Aguiar, Elcid Rodrigues Oliveira Filho, Jorge Luiz
Wattes Oliveira Junior e Matheus Fernandes Freitas de Castro pelas infindáveis horas de estudo
compartilhadas e pelas contribuições na minha trajetória ao longo do curso.
A todos os outros professores do Departamento de Engenharia Elétrica da UFC e
aos demais funcionários do departamento responsáveis diretamente ou indiretamente pela
minha formação acadêmica.
“É notável uma ciência que começou com jogos
de azar tenha se tornado o mais importante
objeto do conhecimento humano.”
(Pierre Simon Laplace)”
RESUMO
Este trabalho tem por objetivo apresentar um estudo sobre os principais protocolos de
comunicação, fazendo uma abordagem desde os conceitos mais básicos de comunicação,
passando por protocolos mais simples, como o RS-232C, até chegar em protocolos mais
complexos, como o USB. Aplicando tais conceitos em FPGAs (Field Programmable Gate
Array), mais especificamente utilizando como plataforma de desenvolvimento o kit didático
DE0-Nano da fabricante Altera®. Os protocolos foram implementado através de blocos de
programa, em linguagem VHDL. Tais blocos foram desenvolvidos de forma possuam todas as
funcionalidades possíveis para cada protocolo e nos mais vários modos de operação, para que
possam ser usados em qualquer projeto de sistemas digitais. A validação foi realizada por meio
de simulações e pela implementação no periféricos disponíveis no kit de desenvolvimento. O
software QUARTUS II® é o ambiente de desenvolvimento usado na criação dos códigos, dos
blocos, da simulação e na programação do dispositivo lógico estudado.
Palavras-chave: Comunicação, FPGA, VHDL, Serial
ABSTRACT
This work aims to present a study on the main communication protocols, making an approach
from the most basic concepts of communication, through simpler protocols such as RS - 232C,
until you get into more complex protocols such as USB. Applying these concepts on FPGAs
(Field Programmable Gate Array), more specifically as a development platform using the Nano
- de0 teaching kit manufacturer Altera ® . The protocols were implemented through program
blocks in VHDL. Such blocks have been developed to have all possible features for each
protocol and more various modes of operation that can be used in any design of digital systems.
The validation was performed by means of simulations and implementing the peripherals
available on the development kit. The Quartus ® II software is the development environment
used in the creation of codes, blocks, simulation and programming of logic device studied.
Keywords: Communication, VHDL, FPGA, Serial.
LISTA DE ILUSTRAÇÕES
Figura 1 – Arquitetura interna de um circuito integrado FPGA. .............................................. 16
Figura 2 – Canal simplex. ......................................................................................................... 20
Figura 3 – Canal half-duplex. ................................................................................................... 20
Figura 4 – Canal full-duplex. .................................................................................................... 20
Figura 5 – Comunicação síncrona. ........................................................................................... 22
Figura 6 – Comunicação assíncrona. ........................................................................................ 23
Figura 7 – Sequência de bits em uma transmissão serial. ........................................................ 26
Figura 8 – Níveis de tensões válidos para a comunicação serial RS 232-C. ............................ 27
Figura 9 – Conectores padrão RS 232-C: (a) DB-25; (b) DB-9. .............................................. 28
Figura 10 – Conexão de um DTE com um DCE. ..................................................................... 29
Figura 11 - Configuração do protocolo I2C. ............................................................................ 31
Figura 12 - Condições de início e fim de comunicação do protocolo I2C. .............................. 32
Figura 13 – Comunicação I2C: (a) Processo de Escrita; (b) Processo de Leitura. ................... 33
Figura 14 – Conexão entre dispositivos por um barramento SPI. ............................................ 34
Figura 15 – Procedimento de escrita (a) e leitura (b) de dados do protocolo SPI. ................... 35
Figura 16 – Modelo de protocolo CAN proposto. .................................................................... 36
Figura 17 – Níveis lógicos do barramento CAN. ..................................................................... 38
Figura 18 – Estruturas do protocolo CAN: (a) Versão 2.0 A; (b) Versão 2.0 B. ..................... 40
Figura 19 – Conetores USB 2.0 (esquerda) e USB 3.0 (direita). ............................................. 41
Figura 20 – Kit didático DE0-Nano com FPGA da família Cyclone IV. ................................. 44
Figura 21 – Layout da placa do kit didático DE0-Nano. .......................................................... 44
Figura 22 – Código divisor de frequência em VHDL. ............................................................. 45
Figura 23 – Bloco TX. .............................................................................................................. 46
Figura 24 – Código divisor de frequência em VHDL. ............................................................. 47
Figura 25 –Transmissão de um dado pelo bloco TX. ............................................................... 48
Figura 26 – Lógica de transmissão serial RS-232 C. ............................................................... 48
Figura 27 – Bloco de recepção RX. .......................................................................................... 49
Figura 28 – Bloco de recepção de dados RX............................................................................ 50
Figura 29 – Conversor DB9 RS232 para TTL MAX232. ........................................................ 51
Figura 30 –Programa RcomSerial v1.2. ................................................................................... 51
Figura 31 – Diagrama de blocos da aplicação. ......................................................................... 52
Figura 32 – Recepção da string através da porta serial do PC. ................................................ 53
Figura 33 – Bloco I2C. ............................................................................................................. 54
Figura 34 – Escrita de dados pelo bloco I2C. ........................................................................... 54
Figura 35 – Leitura de dados pelo bloco I2C. .......................................................................... 55
Figura 36 – Conexão entre o FPGA e a memória EEPROM. .................................................. 56
Figura 37 – Conexão do ADC com o kit FPGA. ...................................................................... 58
Figura 38 – Bloco SPI para controle do ADC. ......................................................................... 59
Figura 39 – Leitura e escrita do controlador ADC. .................................................................. 59
Figura 40 – Leitura e escrita do controlador ADC. .................................................................. 60
LISTA DE TABELAS
Tabela 1 – Caracteres imprimíveis do padrão ASCII. D: Dec, H: Hex, C: Caractere. ............. 19
Tabela 2 – Taxas de Comunicações mais Comuns para protocolo RS-232. ............................ 23
Tabela 3 – Descrição dos pinos dos conectores serias de 9 e 25 pinos. ................................... 29
Tabela 4 – Descrição dos pinos do padrão SPI. ....................................................................... 35
Tabela 5 – Tipos de protocolo CAN. ........................................................................................ 37
Tabela 6 – Parâmetros de ajuste do bloco TX. ......................................................................... 45
Tabela 7 – Pinos do bloco TX. ................................................................................................. 46
Tabela 8 – Cálculo da paridade. ............................................................................................... 47
Tabela 9 – Pinos do bloco TX. ................................................................................................. 49
Tabela 10 – Interface do bloco I2C. ......................................................................................... 54
Tabela 11 – Legenda dos sinais do ADC128S022. .................................................................. 58
Tabela 12 – Descrição dos sinais do Bloco ADC. .................................................................... 59
LISTA DE ABREVIATURES E SIGLAS
ACK Acknowledge
A/D Analógico/Digital
ADC Conversor Analógico Digital
ASCII American Standard Code for Information Interchange
CAN Controller Area Network
CD Carrier Detect
CI Circuito Integrado
CTS Clear To Send
D/A Digital/Analógico
DCE Data Communication Equipment
DLC Data Lenght Code
DSR Data Set Ready
DTE Data Terminal Equipment
DTR Data Terminal Ready
EEPROM Eletrical Erasable Programmable Read Only Memory
EIA Eletronics Industry Association
FPGA Field-Programmable Gate Array
GPIO General Purpose Input/
IDE Identifier Extension
ISO International Organization for Standardization
LCD Liquid Crystal Display
LE Logic elements
RAM Random Access Memory
RC Received Data
RI Ring Indicator
ROM Read Only Memory
RS Recommended Standard
RTR Remote Transmission Request
RTS Request To Send
SAE Society of Automotive Engineers
SCL Serial Clock line
SDA Serial Data line
SDRAM Synchronous Dynamic Random Access Memory
SOF Start of Frame
SPI Serial Peripheral Interface
SRR Subistitute Remote Request
TD Transmitted Data
TTL Transistor-Transistor Logic
USB Universal Serial Bus
VHDL Very High Speed Integrated Circuit Hardware Description Language
SUMÁRIO
1 INTRODUÇÃO ............................................................................................................. 15
1.1 Dispositivo FPGA .......................................................................................................... 15
1.2 Objetivos ........................................................................................................................ 17
1.3 Estrutura do trabalho ................................................................................................... 17
2 CONCEITOS BÁSICOS DE COMUNICAÇÃO ....................................................... 18
2.1 Codificação da Informação .......................................................................................... 18
2.2 Direção do Fluxo de Dados ........................................................................................... 19
2.3 Modos de Comunicação ................................................................................................ 21
2.4 Comunicação Síncrona e Assíncrona .......................................................................... 21
2.5 Taxa de Transmissão .................................................................................................... 23
2.6 Paridade ......................................................................................................................... 24
3 PROTOCOLOS DE COMUNICAÇÃO ..................................................................... 25
3.1 Protocolo RS-232C ........................................................................................................ 25
3.1.1. Descrição dos Sinais ....................................................................................................... 26
3.2. Protocolo I2C ................................................................................................................. 30
3.2.1. Características do Protocolo I2C ................................................................................... 31
3.3. Protocolo SPI ................................................................................................................. 33
3.3.1. Características da interface SPI ..................................................................................... 34
3.4 Protocolo CAN ............................................................................................................... 36
3.4.1 Características dos sinais ............................................................................................... 37
3.4.2 Formato do Protocolo ..................................................................................................... 38
3.5 Protocolo USB ............................................................................................................... 40
3.5.1 Características do padrão USB. ..................................................................................... 42
4 IMPLEMENTAÇÃO DOS PROTOCOLOS ............................................................. 43
4.1 Dispositivo utilizado ...................................................................................................... 43
4.2 Biblioteca RS-232 C ...................................................................................................... 44
4.2.1 Bloco TX .......................................................................................................................... 45
4.2.2 Bloco RX.......................................................................................................................... 49
4.2.3 Proposta de aplicação..................................................................................................... 50
4.3 Biblioteca I2C ................................................................................................................ 53
4.3.1 Proposta de aplicação..................................................................................................... 56
4.4 Biblioteca SPI ................................................................................................................ 57
5 CONCLUSÃO ............................................................................................................... 61
REFERÊNCIAS ..................................................................................................................... 62
APÊNDICE A – CÓDIGOS EM VHDL .............................................................................. 64
15
1 INTRODUÇÃO
No atual crescimento tecnológico, onde a facilidade de uso (ou acessibilidade) de
um determinado equipamento, o seu tamanho físico, ou ainda sua portabilidade e seu custo
benefício final, são critérios impactantes para o sucesso frente à grande concorrência, a área de
projetos digitais vem se destacando. Um vezes que esses sistemas possuem uma flexibilidade e
uma capacidade de processamento de informações muito elevada, isso tudo em circuito que
ocupam espaço cada vez menores. Chegando a ser mais viável transformar grandezas
analógicas em digitais, realizar o processamento e depois transformá-las novamente para
grandezas analógicas.
Esta crescente deve-se principalmente a evolução da lógica programável, onde um
projeto pode ser elaborado com um diagrama lógico, desenvolvido a partir de software, no qual
é possível utilizar elementos lógicos, megafunções ou linguagens de descrição de hardware,
como, por exemplo, VHDL (Very High Speed Integrated Circuit Hardware Description
Language).
Quando se deseja realizar um projeto de um circuito digital, a decisão inicial diz
respeito a saber que tipo de circuito integrado (CI) será utilizado. A decisão depende do
projetista do circuito, de acordo com a especificação técnica do projeto e do seu conhecimento
da tecnologia de lógica programável. Em algumas aplicações, a escolha pode ser óbvia e em
outras a escolha necessita de considerações cuidadosas.
Dentre os dispositivos lógicos programáveis presentes no mercado, um que vem se
destacando são os FPGAs (Field Programable Gate Array). Devido à elevada densidade de
elementos lógicos, ampla gama de pinos de I/Os padronizados, grande números de pinos de I/O
disponíveis para o usuário e alta velocidade de processamento, além da possibilidade de
produzir novos produtos em um curto período de tempo, bem como a facilidade de atualização
e modificação de projetos já existentes.
1.1 Dispositivo FPGA
Segundo Pedroni (2010), os FPGAs foram lançados pela Xilins em meados da década
de 1980. Esta tecnologia consiste em uma matriz de blocos lógicos ou células lógicas
independentes, cercada de blocos de entrada e saída, também independentes, e por um conjunto
de recursos de interconexão programáveis, que permitem a interligação arbitrária dos blocos,
mostrado na figura 1.
16
Figura 1 – Arquitetura interna de um circuito integrado FPGA.
Fonte: Adaptado de COSTA; MESQUITA ; PINHEIRO (2011).
Cada bloco lógico, interligação e bloco de I/O, pode ser programado, tornando esta
arquiteto extremamente flexível e moldável.
O processo de projeto com FPGA envolve várias etapas que geralmente são
automatizadas. A utilização das ferramentas de software com o aperfeiçoamento do hardware
reconfigurável dos FPGAs, permite ao usuário uma enorme simplicidade e velocidade no
desenvolvimento de seus projetos. Um sistema típico de desenvolvimento de projetos, com
ferramentas via softwares, consiste em vários programas interconectados. Esse processo
envolve as seguintes etapas:
Especificação e entrada do projeto;
Síntese e mapeamento da tecnologia;
Posicionamento e roteamento;
Verificação e teste;
Programação do FPGA.
Recursos de Interligação inteligação
Blocos de I/O inteligação
Blocos Lógicos inteligação
17
1.2 Objetivos
Devido ao fato de o estudo na área de FPGAs no departamento está no início,
adquirir um base de conhecimento sólida é fundamento para criação de projeto com grau de
complexidade mais elevado. Outro fato que é grande importância para desenvolvimento de
projetos é ter sistemas de comunicações confiáveis, uma vez que elevar o grau de complexidade
de um sistema implica em aumentar o número de circuitos trabalhando em conjunto.
Deste modo, este trabalho tem como objetivo realizar um estudo do principais
modos de comunicação com o intuído de aplicá-los em FPGA utilizando a linguagem de
descrição de hardware VHDL. Serão propostos também aplicações para tais modos, com o
intuito de direcionar o estudo para futuros projetos.
1.3 Estrutura do trabalho
No capítulo 1 é realizada uma motivação para o estudo sobre os protocolos de
comunicação, bem como uma introdução sobre os principais conceitos de comunicação de
dados.
No capítulo 2 é realizada uma análise dos principais protocolos de comunicação de
comunicação serial, desde o mais simples protocolo RS-232 C até protocolos mais complexos
e mais difundidos atualmente, como, por exemplo, USB 3.0.
No capítulo 3 é realizada a transformação dos protocolo descritos no capítulo
anterior em bibliotecas que possam ser usadas em projetos futuros. Também são propostas
aplicações fáceis e de grande utilidades, que possam ser aplicadas no dispositivo escolhido.
Por fim, no capítulo 8 são feitas as considerações finais sobre este trabalho, bem
como são dadas sugestões para trabalhos futuros.
18
2 CONCEITOS BÁSICOS DE COMUNICAÇÃO
Conforme dito por Pedroni (2010), a necessidade de comunicação entre unidades
de sistemas que formam redes maiores, integradas, e a necessidade de grandes espaços para
armazenamento de dados são componentes fundamentais dos sistemas embargados. Visto que
estes sistemas necessitam trocar informações tanto com subsistemas que integram o mesmo
circuito quanto com circuitos externos ou com o periféricos. Por esta razão, um estudo
detalhado sobre os meios de transmissão de dados para dispositivos externos ao circuito
originador é indispensável para o projetista de sistemas digitais.
Primeiramente, para que ocorra a transmissão de um dado, é necessário que o
dispositivo transmissor e o receptor tenham um pleno entendimento lógico sobre o dado e como
este será enviado, para que a informação não seja perdida no processo. Para fazer essa interface
entre os sistemas existem diversos padrões ou protocolos de comunicação que devem ser
seguidos para que o dado seja enviado e interpretado pelo dispositivo receptor.
2.1 Codificação da Informação
A codificação da informação que será enviada deve ser escolhida de maneira mais
conveniente para os dispositivos envolvidos na comunicação. No caso de um sistema digital, o
dado é representado por bits de dados individuais, onde a informação é representada por pacotes
de vários bits.
O tamanho do pacote é escolhido de acordo com o tipo de dado, sendo que quanto
maior o número de bits maior o número de valores que podem ser representados. Um exemplo
de pacote comumente utilizado pelos protocolos de comunicação é o byte, uma sequência
binária de oito dígitos.
Uma codificação amplamente utilizada na comunicação entre computadores é o
ASCII (American Standard Code for Information Interchange) criado com o intuito de prover
a troca de dado entre máquinas de diferente tipo e fabricantes.
O código ASCII é utilizado para representar caracteres, composto por 7 bits,
portanto, representado por uma escala decimal de 0 a 127. Os primeiros caracteres do padrão
ASCII (0 a 31) são caracteres de controle, sendo os 95 restantes são os caracteres que podem
ser impressos. A Tabela 1 mostra esses caracteres imprimíveis.
19
Tabela 1 – Caracteres imprimíveis do padrão ASCII. D: Dec, H: Hex, C: Caractere.
Binário D H C Binário D H C Binário D H C
0010 0000 32 20 vazio 0100 0000 64 40 @ 0110 0000 96 60 `
0010 0001 33 21 ! 0100 0001 65 41 A 0110 0001 97 61 a
0010 0010 34 22 " 0100 0010 66 42 B 0110 0010 98 62 b
0010 0011 35 23 # 0100 0011 67 43 C 0110 0011 99 63 c
0010 0100 36 24 $ 0100 0100 68 44 D 0110 0100 100 64 d
0010 0101 37 25 % 0100 0101 69 45 E 0110 0101 101 65 e
0010 0110 38 26 & 0100 0110 70 46 F 0110 0110 102 66 f
0010 0111 39 27 ' 0100 0111 71 47 G 0110 0111 103 67 g
0010 1000 40 28 ( 0100 1000 72 48 H 0110 1000 104 68 h
0010 1001 41 29 ) 0100 1001 73 49 I 0110 1001 105 69 i
0010 1010 42 2A * 0100 1010 74 4A J 0110 1010 106 6A j
0010 1011 43 2B + 0100 1011 75 4B K 0110 1011 107 6B k
0010 1100 44 2C , 0100 1100 76 4C L 0110 1100 108 6C l
0010 1101 45 2D - 0100 1101 77 4D M 0110 1101 109 6D m
0010 1110 46 2E . 0100 1110 78 4E N 0110 1110 110 6E n
0010 1111 47 2F / 0100 1111 79 4F O 0110 1111 111 6F o
0011 0000 48 30 0 0101 0000 80 50 P 0111 0000 112 70 p
0011 0001 49 31 1 0101 0001 81 51 Q 0111 0001 113 71 q
0011 0010 50 32 2 0101 0010 82 52 R 0111 0010 114 72 r
0011 0011 51 33 3 0101 0011 83 53 S 0111 0011 115 73 s
0011 0100 52 34 4 0101 0100 84 54 T 0111 0100 116 74 t
0011 0101 53 35 5 0101 0101 85 55 U 0111 0101 117 75 u
0011 0110 54 36 6 0101 0110 86 56 V 0111 0110 118 76 v
0011 0111 55 37 7 0101 0111 87 57 W 0111 0111 119 77 w
0011 1000 56 38 8 0101 1000 88 58 X 0111 1000 120 78 x
0011 1001 57 39 9 0101 1001 89 59 Y 0111 1001 121 79 y
0011 1010 58 3A : 0101 1010 90 5A Z 0111 1010 122 7A z
0011 1011 59 3B ; 0101 1011 91 5B [ 0111 1011 123 7B {
0011 1100 60 3C < 0101 1100 92 5C \ 0111 1100 124 7C |
0011 1101 61 3D = 0101 1101 93 5D ] 0111 1101 125 7D }
0011 1110 62 3E > 0101 1110 94 5E ^ 0111 1110 126 7E ~
0011 1111 63 3F ? 0101 1111 95 5F _
Fonte: site http://www.ufpa.br/dicas/progra/arq-asc.htm, acessado em 3 de nov. 2013.
Como o código ASCII foi concebido a partir da língua inglesa, não contém assim
os caracteres de acento das línguas francesa, espanhola e portuguesa. Por este motivo surgiu o
ASCII estendido, agora composto por 8 bits, ou seja, agora com 128 caracteres adicionais dos
símbolos necessários para os idiomas citados.
2.2 Direção do Fluxo de Dados
Considerando a direção do fluxo de dados que vai trafegar pelos dispositivos, ou
seja, a forma de utilização do canal de comunicação de dado, pode-se distinguir três maneiras
de transmissão: simplex, half-duplex e full-duplex.
20
No canal simplex a informação é transmitida em uma única direção, do transmissor
para o receptor. Um exemplo de canal simplex é uma estação de rádio, onde o sinal é transmitido
para os ouvintes sem a possibilidade de retorno de informação. O esquemático de ligação de
um canal simplex é apresentado na Figura 2.
Figura 2 – Canal simplex.
Fonte: site http://www.podre.com.br/trabalhos/GraduacaoComputacaoUnisinos/2004-
1/Comunicacao_de_dados/aula03/tp_concbasicos.pdf, acessado em 12 de dez. 2013.
Em um canal half-duplex a informação pode trafegar nas duas direções, mas não ao
mesmo tempo, ou seja, de modo alternado. Quando um dispositivo está transmitindo o outro se
torna o receptor e vice-versa, como mostrado na figura 3.
Figura 3 – Canal half-duplex.
Fonte: site http://www.podre.com.br/trabalhos/GraduacaoComputacaoUnisinos/2004-
1/Comunicacao_de_dados/aula03/tp_concbasicos.pdf, acessado em 12 de dez. 2013.
Já em um canal full-duplex a informação é trocada simultaneamente nas duas
direções. Este tipo de canal pode ser definido com dois canais simplex, um em cada direção,
como mostrado na figura 4.
Figura 4 – Canal full-duplex.
Fonte: site http://www.podre.com.br/trabalhos/GraduacaoComputacaoUnisinos/2004-
1/Comunicacao_de_dados/aula03/tp_concbasicos.pdf, acessado em 12 de dez. 2013.
21
2.3 Modos de Comunicação
Com a evolução dos sistemas digitais surgiram dispositivos mais que interagem
com outros sistemas ou periféricos, além de outros processo que passaram a ser controlados.
Por este motivo surgiu à necessidade de obter métodos de comunicação mais otimizados para
cada processo, o que proporcionou a criação de diferentes modos de comunicação.
De acordo com Pereira e Larges (2012), os modos de comunicação empregados
pelos dispositivos digitais podem ser classificados de acordos com diferentes características.
Levando em consideração o número de dispositivos interconectados fisicamente a um
dispositivo de transmissão, pode-se diferenciar a comunicação entre ponto a ponto e multi-
ponto. Na comunicação ponto a ponto um único dispositivo comunica-se diretamente com outro
pelo meio físico, conectando o transmissor ao receptor. Na comunicação multi-ponto um
dispositivo comunica-se simultaneamente com diversos outros dispositivos, podendo ser esta
ligação feita por mais de um condutor ou por um único condutor chamado de barramento.
Considerando como os dados são transmitidos, pode-se classificar a comunicação
como serial, onde o dado é transmitido bit a bit, sequencialmente, por uma única linha de
transmissão, e como paralela, onde todo o pacote de bits é envidado simultaneamente,
utilizando um número de canais de transmissão equivalente a quantidade de bits do dado. Fato
este, que leva com que a comunicação paralela ser utilizada, na maioria dos casos, em
comunicação de curto alcance, visto que, a dificuldade física e o elevado custo dos condutores
muitas vezes tornam este tipo de estrutura inviável para o projeto.
Outro aspecto importante de se ressaltar é que apesar de aparentemente a
comunicação serial ser mais lenta que a paralela, pelo fato desta última enviar simultaneamente
os dados, com os elevados clock’s dos dispositivos digitais utilizados atualmente esta diferença
tornou-se praticamente irrisória.
2.4 Comunicação Síncrona e Assíncrona
Segundo Canzian (2013), em uma transmissão serial, como os dados são
transmitidos em sequência, é importante saber o momento em que o receptor tem que começar
a captura de cada bit para que não ocorra a ruptura ou a perda de um dado. Entretanto, na
serialização de um dado, não há garantia de um envio uniforme pelo canal. Isso ocorre devido
ao fato de cada pacote de dados ser remetido seguido de uma pausa até que toda a informação
seja transmitida. Tais pausas, muitas vezes, possuem comprimentos variáveis. O receptor deve
saber o momento exato que vai começar a captura dos bits individuais, o tempo entre cada bit
22
e quando começa e termina um pacote. Conhecendo toda esta temporização, o dispositivo
receptor é dito em sincronismo com o transmissor, garantido uma transferência de dado
confiável.
Levando em consideração a sincronização, pode-se classificar a comunicação como
síncrona e assíncrona. Em uma comunicação síncrona, há canais separados para a transmissão
de dados e para a temporização. No canal de temporização um clock é enviado ao receptor com
intuito de habilitar a captura de dados, ou seja, o receptor irá ler o canal e armazenar o dado
apenas quando receber um pulso de clock. Sendo assim, o transmissor estabelece um controle
sobre a transmissão a partir do canal de temporização, garantindo um sincronismo entre os
dispositivos. Na figura 5 é apresentado um exemplo de comunicação síncrona.
Figura 5 – Comunicação síncrona.
Fonte: CANZIAN (2012).
Em uma comunicação assíncrona, a comunicação é estabelecida com apenas um
canal. Como não há um clock de referência entre o transmissor e o receptor, o sincronismo é
feito bit a bit, através de um clock localizado no receptor com um período 𝑘 vezes menor que o
período do clock do dispositivo transmissor. Após 𝑛 amostras sequenciais, é definido o nível
lógico do bit enviado.
Para sinalizar ao receptor que a transmissão de um pacote de dados foi iniciada, o
sinal do canal, que inicialmente está em nível lógico ‘1’ (repouso), é levado para nível lógico
‘0’ (start bit). Após detectar o start bit, o dispositivo irá se preparar para receber o pacote de
dados a um taxa de transmissão pré-estabelecida e, posteriormente, um bit de paridade e um
sinal de parada (stop bit).
Ao recebe um stop bit, o dispositivo entrará novamente em repouso e só sairá desta
condição ao receber um start bit. Assim, o sincronismo é realizado a cada pacote de dados. Na
figura 6 é mostrada uma comunicação assíncrona de um pacote de dados de oito bits.
23
Figura 6 – Comunicação assíncrona.
Fonte: CANZIAN (2012).
2.5 Taxa de Transmissão
Os dispositivos digitais podem trabalhar em altíssimas velocidades, entretanto, a
velocidade com que uma informação pode ser transmitida acaba sendo limitada pelo canal.
Desta forma, a velocidade com que uma informação é transmitida dever ser de tal modo que
consiga mesclar as capacidades, tanto do receptor, quanto do canal. Daí vem o conceito de taxa
de transmissão. A taxa de transmissão nada mais é do que o número de mudanças de sinal que
ocorrem em um meio por segundo, também conhecida como baud ou taxa de modulação.
De acordo com Pereira e Larges (2012), as taxas de transmissão entre dois
dispositivos dependem de vários fatores, tais como: as características dos condutores utilizados,
a utilização do canal para transmissão de um ou mais fluxos de dados ao mesmo tempo
(multiplexação), a capacidade máxima de transmissão de cada dispositivo envolvido e etc. Na
Tabela 2 são mostrado as taxas de comunicação mais comuns para protocolo RS-232.
Tabela 2 – Taxas de Comunicações mais Comuns para protocolo RS-232.
Taxa Tempo de Mudança
150 Baud 6.66 ms
300 Baud 3.33 ms
600 Baud 1.66 ms
1200 Baud 833 us
2400 Baud 416 us
4800 Baud 208 us
9600 Baud 104 us
1920 Baud 52 us
Fonte: BRAGA (2010).
24
2.6 Paridade
Segundo Canzian (2013), ruídos ou distúrbios elétricos momentâneos podem causar
distorções nos dados quando estão trafegando pelos canais de comunicação. Se o dispositivo
receptor não perceber tal falha, a mensagem recebida será incorreta, o que pode acarretar
consequências sérias para o sistema. Como primeira linha de defesa contra erro de dados, eles
devem ser detectados. Através de uma detecção prévia de um erro pode-se pedir o reenvio do
dado ou impedir que este seja usado pelo sistema.
O bit de paridade é o método mais simples de detecção de erro. Um bit extra é
adicionado ao pacote de código original, de modo que com o novo pacote de código sempre
exiba um número par (ou ímpar) de valores unitários (‘1’s). Assim, o código pode detectar um
erro, embora não possa corrigi-lo.
Existem outros métodos mais complexos que, além de detectar o erro, efetuam a
correção do pacote de dados. Entretanto, a correção de erros em uma transmissão de dados
reduz a eficiência do sistema, resultando em uma queda na taxa de transmissão.
25
3 PROTOCOLOS DE COMUNICAÇÃO
Como mencionado no capítulo anterior, na comunicação de dados, protocolo é um
padrão que define o formato de dados e as regras a serem seguidas para possibilitar a
comunicação entre dispositivos diferentes. Sem protocolos, uma comunicação não é viável,
uma vez que nem sempre os dispositivos se comunicam através da mesma linguagem. Um
protocolo determina como um programa deve tratar os dados para serem enviados para a etapa
seguinte do processo de comunicação.
Cada dispositivo deve ser configurado com os mesmos parâmetros e obedecer
aos mesmos padrões para que a comunicação possa ser realizada sem erros. Existem diversos
tipos de protocolos de comunicação, variando de acordo com as características do circuito.
Em função dos aspectos já mencionados aspectos como redução dos custos de
cabeamento (tanto na aquisição, quanto na instalação e manutenção), uma das interfaces mais
comumente utilizadas para transmissão de dados entre dispositivos digitais são as interfaces
seriais. Consequentemente, o estudo detalhado dos protocolos de comunicação para interfaces
seriais é grande importância.
Este capítulo tem por objetivo abordar as características dos principais
protocolos de comunicação serial utilizados em sistemas embarcados, desde protocolos mais
simples, como o RS-232C, até protocolos mais sofisticados e mais amplamente utilizados
atualmente. Um estudo mais detalhado que irá possibilitar a implementação, posteriormente, de
tais protocolos em um dispositivo FPGA.
3.1 Protocolo RS-232C
Segundo Canzian (2013), os padrões RS (Recommended Standard) são protocolos
já antigos, criados no início dos anos 60, pela necessidade de se interligar dois ou mais pontos
em uma rede de computadores. Sua especificação foi criada pela Eletronics Industry
Association (EIA), e definiu-se como sendo RS as siglas que a designariam. O protocolo RS-
232C especifica as tensões, temporizações e funções dos sinais, um protocolo para troca de
informações, e as conexões mecânicas. É um protocolo muito popular e tipicamente usado para
conexão de dois dispositivos de comunicação de dados.
As taxas de transmissão para uma interface RS-232C são de até 20Kbps para uma
distância de até 15,24 m. Entretanto, atualmente já existem versões comerciais capazes de
transmitir a maiores taxas em condutores que permitem alcançar distâncias maiores do que as
26
originalmente padronizadas (por exemplo, produtos comerciais transmitindo a 115 Kbps ou
mesmo 1,6 Mbps encontram-se disponíveis).
Com este protocolo foi inicialmente criado para ser utilizado em computadores,
nada melhor para analisar todos os aspectos dessa interfase do que um estudo detalhado do
modo como o computador emprega cada um dos sinais existentes no conector serial.
3.1.1. Descrição dos Sinais
Os canais da interface RS-232C são do tipo simplex, ou seja, uma linha para
transmissão e outra para a recepção de dados, onde somente é permitida a comunicação
assíncrona. O padrão de pacote de dados utilizado é constituído por um start bit, um caractere
com 5, 6, 7 ou 8 bits, um bit de paridade e com 1, 1.5 ou 2 stop bit. Em computador, tal pacote
bem como todo o modo de operação das portas seriais são totalmente programáveis. Incluindo
um gerador de baud rate programável que permite a operação a até 115 200 bauds e um sistema
de interrupções de transmissão, recepção e erro.
Na figura 7 é mostrado um pacote de dados do protocolo RS-232C com um dado
de 8 bits, sem paridade e com 1 stop bit. Percebe-se a diferença entre os níveis de tensão entre
os níveis de tensão estabelecido pelo protocolo e o nível TTL, comumente utilizado em
dispositivos digitais.
Figura 7 – Sequência de bits em uma transmissão serial.
.
Fonte: Elaborada pelo autor.
RS-232C
TTL
27
Analisando agora a saída RS 232-C é possível distinguir três momentos distintos.
O primeiro é quando a tensão de linha for mais negativa que -3 V, denominado de “marca”,
onde será caracterizado que o estado está em nível lógico ‘1’. O segundo momento será quando
a tensão medida for mais positiva que +3 V, recebendo o nome de “espaço” e será caracterizado
como nível lógico ‘0’. As regiões compreendidas entre +3 V e -3 V e acima de +15 V ou abaixo
de -15 V são denominada região de transição e é considerado como nível inválido.
A maioria dos equipamentos digitais utilizam níveis TTL ou CMOS. Portanto, o
primeiro passo para conectar um equipamento digital a uma interface RS-232C é transformar
níveis TTL (0 a 5 V) em RS-232C e vice-versa. Isto é feito por conversores de nível. O circuito
MAX232 é o circuito integrado mais utilizado por projetista de circuito eletrônicos que queiram
trabalhar com o padrão RS-232C em conjunto com integrados da família TTL ou que operam
com 5 V.
Na figura 8 são mostrados os níveis de tensões padronizados pelo protocolo RS-
232C.
Figura 8 – Níveis de tensões válidos para a comunicação serial RS 232-C.
Fonte: Adaptado de ZELENOVSKY; MENDONÇA (2006).
3.1.2 Descrição dos conectores da porta serial
Segundo Zelenovsky e Mendonça (2006), os sinais RS 232-C podem ser
distribuídos através de dois tipos de conectores do tipo DB, de 9 ou 25 pinos. A figura 9
apresenta o formato destes conectores e os principais pinos utilizados na comunicação serial.
28
Figura 9 – Conectores padrão RS 232-C: (a) DB-25; (b) DB-9.
(a)
(b)
Fonte: PEREIRA; LARGES (2002)
Se este protocolo for completamente implementado, o equipamento que faz o
processamento dos sinais é chamando DTE (Data Terminal Equipment – usualmente um
computador ou terminal), este é um equipamento terminal de dados, ou seja, todos dados são
gerados ou terminam nele. O DTE será conectado a outro dispositivo através do DCE (Data
Communication Equipment – usualmente um modem), dispositivo que servira de interface com
o meio (normalmente uma linha telefônica), utilizando todos os 25 pinos para um controle
maior sobre a troca de dados. Esta ligação é mostrada na figura 10.
29
Figura 10 – Conexão de um DTE com um DCE.
Fonte: Elaborado pelo autor.
Para troca de dados entre dispositivos em que o DCE não é modem, ou quando dois
dispositivos DTE são diretamente conectados, poucos sinais são necessários serem utilizados.
Os principais sinais envolvidos em uma transmissão no padrão RS 232-C são mostrados na
Tabela 3.
Tabela 3 – Descrição dos pinos dos conectores serias de 9 e 25 pinos.
9 Pinos 25 Pinos Sinal PC para Disp. Ext.
3 2 TD – Transmitted Data →
2 3 RD – Received Data ←
7 4 RTS – Request to Send →
8 5 CTS – Clear to Send ←
6 6 DSR – Data Send Ready ←
5 7 GND – Ground -
1 8 CD – Carries Detect ←
4 20 DTR – Data Terminal Ready →
9 22 RI – Ring Indicator ←
Fonte: ZELENOVSKY; MENDONÇA (2006).
Dentre os sinais de entrada, que são gerados por outro dispositivo serial, sendo este
advindo de outro computador ou de um circuito conversor TTL/RS 232-C, podem-se destacar
os seguintes sinais:
RC – Received Data: Sinal por onde os dados seriais são recebidos. Mantido
em nível lógico alto (‘1’) quando estiver em repouso.
CTS – Clear To Send: Este sinal é habilitado quando o periférico estiver pronto
para transmitir o dado.
DSR – Data Set Ready: Este sinal é utilizado pelo periférico para informar ao
dispositivo está pronto para estabelecer comunicação.
CD – Carrier Detect: Este sinal é relevante quando o DCE for um modem. Ele
é habilitado quando a linha está “fora do gancho”, uma conexão for
estabelecida, e um tom de resposta começar a ser recebido do modem remoto.
30
Este sinal é desabilitado quando não houver tom de resposta sendo recebido, ou
quando o tom de resposta for de qualidade inadequada para o modem local.
RI – Ring Indicator: Este sinal só é relevante quando o DCE for um modem, e
é habilitado quando um sinal de chamada estiver sendo recebido na linha
telefônica. A habilitação desse sinal terá aproximadamente a duração do tom de
chamada, e será desabilitado entre os tons ou quando não houver tom de
chamada presente.
Por fim, dentre os sinais de saída gerados pelo dispositivo transmissor a outros
dispositivos seriais, podem-se destacar os seguintes sinais:
TD – Transmitted Data: Sinal por onde os dados seriais são transmitidos.
RTS – Request To Send: Este sinal é habilitado para informar ao periférico que
o dispositivo está pronto para transmitir.
DTR – Data Terminal Ready: Este sinal é utilizado pelo dispositivo para
informar ao periférico está pronto para estabelecer comunicação.
A conexão entre dois dispositivos deve ser realizada com bastante cuidado, uma
vez que os pinos de transmissão de um devem ser conectados com os pinos de recepção do
outro. Em alguns dispositivos esta ligação é realizada nos respectivos conectores utilizando,
desta forma, cabos denominados “transparentes”, onde nenhuma conexão cruzada é realizada.
No caso contrário, onde não há esta inversão de pinos, a conexão é realizada por cabos
denominados “null-modem”, onde as linhas são cruzadas. Desta forma, a realização de testes
ou até mesmo a criar os próprios cabos são as melhores saídas para que não ocorram problemas
futuros.
3.2. Protocolo I2C
De acordo com Marciel, Soares e Aguiar (2012), o I2C foi desenvolvido em meados
dos anos 80 pela Philips Semiconductors. O I2C é um protocolo serial, síncrono e com canal
bidirecional do tipo half-duplex, destinado a aplicações de baixo custo e transferência de dados
de volume mediano. Este protocolo tem como principal finalidade ser utilizado na comunicação
entre dispositivos onboard, ou seja, dispositivos que estão dispostos em uma mesma placa de
circuito impresso. Isso nada impede a comunicação via barramento I2C entre dispositivos
instalados em placas distintas, desde que estejam próximas fisicamente. Entretanto, se os
circuitos se encontrarem em longa distância será necessário a utilização de um circuito a parte
para amplificador sinal para que não ocorra nenhum distorção.
31
O I2C permite a comunicação entre diversos dispositivos através de um barramento
de duas vias: a Serial Data line (SDA) e a Serial Clock line (SCL). Pela linha SDA trafegam
dados e endereços, enquanto na linha SCL trafega o clock responsável pelo sincronismo dos
dispositivos.
Neste protocolo os dispositivos envolvidos na comunicação são denominados
Mestre e Escravos. Ao configurar um processo baseado no protocolo I2C, um dispositivo
mestre será responsável por comandar a transmissão, podendo ser conectado a vários Escravos,
como mostrado na figura 11.
Figura 11 - Configuração do protocolo I2C.
Fonte: MARCIEL; SOARES; AGUIAR (2012).
Uma vez configurado o dispositivo Mestre, este dispositivo será responsável pelo
clock, começar e finalizar a transmissão. Entretanto, como este protocolo possui um canal
bidirecional, ele pode tanto transmitir quanto receber informações dos dispositivos Escravos.
As principais aplicações deste protocolo estão relacionadas com o controle de
dispositivos como memória RAM, memória ROM, drive de LCD, conversores A/D e D/A,
processadores de áudio, processadores de vídeo, entre outros. Ou seja, as aplicações estão
sempre relacionadas com o controle de periféricos dos sistemas, visto seu baixo custo por usar
apenas dois condutores e sua capacidade de trabalhar com vários escravos.
Inicialmente criado para trabalhar a uma taxa de transferência de dados de até 100
Kbps, com o avanço da tecnologia e aumento do desempenho proporcionou que com a interface
I2C alcançasse taxas de transferências de até 3,4 Mbps.
3.2.1. Características do Protocolo I2C
Como o protocolo trabalha a partir do conceito de Mestre e Escravos, e a
comunicação é realizada por apenas duas linhas (clock e dados), para estabelecer uma
comunicação é necessário a identificação do dispositivo que se pretende comunicar. Sendo
assim, a comunicação sempre será iniciada pelo envio pela linha SDA do endereço do
32
dispositivo escravo com qual se deseja estabelecer comunicação. Este endereçamento pode ser
de 7 ou 10 bits e será feito por software.
A informação irá trafegar pela linha SDA através de pacotes de 8 bits. Para o
endereçamento de 7 bits, o mestre irá inicializar a comunicação com o envio de 1 byte pela
linha SDA, sendo os primeiros 7 bits para identificar o dispositivo escravo. O oitavo bit será o
bit de R/W (Read/Write), este bit irá definir a direção do fluxo de dados, ou seja, se a
comunicação será de escrita ou leitura. Para o endereçamento de 10 bits, o mestre irá enviar 2
bytes pela linha SDA, os quais 10 bits serão de endereçamento mais um bit de R/W.
Da mesma forma que o protocolo RS 232-C, o barramento I2C estará em repouso
sempre que as linhas SDA e SCL estiverem em nível lógico alto. Assim, a comunicação só terá
início quando ocorre a transição de nível lógico alto para baixo na linha SDA, ou seja, o bit de
start do protocolo. Após esta etapa o barramento será considerado ocupado, pois uma
transmissão de dados foi inicializada.
A condição de start irá inicializar a transmissão do sinal de clock pela Lina SCL.
Assim, com o clock ativo, o envio do pacote sé habilitado. A partir deste momento o receptor
deve ler os bits da linha SDA no momento em que o clock estiver em nível lógico alto, período
em que o bit presente na linha SDA deve ser manter obrigatoriamente estável. Após o envio do
pacote, a linha SDA passará novamente para a condição de repouso (nível lógico alto), cessando
o clock da linha SCL. As condições de início e fim de comunicação de um protocolo I2C é
apresentada na figura 12.
Figura 12 - Condições de início e fim de comunicação do protocolo I2C.
Fonte: MARCIEL; SOARES; AGUIAR (2012).
Como mencionado anteriormente, o bit R/W definirá a direção do fluxo de dados.
Onde o dispositivo mestre fará R/W=’1’ para leitura e R/W=’0’ escrita. Após este bit o receptor
tem que enviar um bit ACK (acknowledge), o chamado bit de reconhecimento.
O pulso ACK indica para o transmissor que um byte foi recebido com sucesso. Da
mesma forma, o dispositivo mestre deve receber um bit de ACK após cada byte transmitido,
podendo força uma condição de stop dependendo do nível lógico deste bit. Um nível lógico
33
baixo no bit de ACK definirá que o bit foi enviado com sucesso, caso contrário, a transmissão
será finalizada com uma condição de stop, sendo esta condição conhecida como pulso de
NACK (not acknowledge). O dispositivo mestre pode, após gerar uma condição stop, dar início
a uma nova transmissão e reenviar os dados ao dispositivo escravo.
No momento em que o dispositivo mestre estiver recebendo dados (ciclo de leitura),
ele deve gerar um pulso ACK após cada byte recebido com sucesso. Quando não desejar mais
receber dados, ele deve enviar um pulso NACK após o último byte recebido. Neste caso, o pulso
NACK tem o objetivo de informar ao dispositivo escravo que a transmissão será finalizada.
Após o pulso NACK o dispositivo mestre encerra a transmissão impondo uma condição stop
no barramento.
Figura 13 – Comunicação I2C: (a) Processo de Escrita; (b) Processo de Leitura.
(a)
(b)
Fonte: MARCIEL; SOARES; AGUIAR (2012).
3.3. Protocolo SPI
Desenvolvido pela Motorola® para interliga microcontroladores e outro
periféricos, o SPI (Serial Peripheral Interface), por ser bastante simples, tornou-se bastante
difundido entre os outros fabricantes. Atualmente encontrado em uma grande variedade de
dispositivos periféricos usados no projeto de sistemas embarcados. Constituído por um
barramento de comunicação full-duplex síncrono de alta velocidade, este protocolo utiliza a
comunicação do modelo Mestre/Escravo, onde o mestre sempre inicia a transmissão de cada
34
pacote de dados. Da mesma forma que o protocolo I2C, um dispositivo mestre pode ser ligado
a múltiplos dispositivos escravos, entretanto, no SPI cada um terá seu próprio canal de seleção
(Slave Select), como ilustrado na figura 14.
Figura 14 – Conexão entre dispositivos por um barramento SPI.
Fonte: SILVA (2008).
3.3.1. Características da interface SPI
De acordo com Silva (2008), a velocidade de transmissão de um padrão SPI pode
ser superior a 10 Mbps, velocidade muito superior as dos protocolos mencionados até o
momento. Fato este, que o tornou bastante popular entre fabricantes para aplicações em
microcontroladores, especialmente na parte de memória, em que a velocidade da troca de
informações é de extrema importância.
A alta taxa de transmissão deve-se ao fato de que o protocolo SPI, por ser full-
duplex, o dispositivo pode enviar um dado e receber outro ao mesmo tempo. Nenhum
dispositivo conectado é somente transmissor ou receptor.
O fluxo é controlado pelo Mestre através do sinal de relógio SCLK. Só há
transferência enquanto o Mestre pulsar o sinal SCLK. Deste modo, não somente a escrita, mas
também para a leitura os pulsos devem ser gerados, o que só ocorre quando um dado é enviado.
Para iniciar uma comunicação, o Mestre configura o clock, utilizando uma
frequência inferior ou igual à frequência máxima do dispositivo Escravo suporta. Assim, os
dados são transferidos em pacotes de 8 bits, no qual o bit mais significativo é transmitido
primeiro.
Na Tabela 4 segue a descrição dos sinais que compõem a interface física de um
padrão SPI.
35
Tabela 4 – Descrição dos pinos do padrão SPI.
Sinal (Pino) Descrição
SS Select Slave – Seleção do Escravo, ativa com
nível lógico ‘0’ (saída do Mestre e entrada do
Escravo).
SDI Serial Data Input – Canal por onde os dados
serão recebidos (entrada).
SDO Serial Data Output – Canal por onde os dados
serão enviados (saída).
SCLK Serial Clock – Clock de Sincronização (saída
do Mestre e entrada do Escravo).
Fonte: Elaborada pelo autor.
As figuras 15 (a) e (b) mostram, respectivamente, o procedimento de escrita e
leitura do protocolo SPI em dispositivo de memória. A comunicação começa com um 1 bit de
W/R, que define se o mestre quer transmitir ou receber um dado. Em seguida, um pacote é
enviado para definir o endereço de memória que se deseja acessar. Por último, o dado é
transmitido.
Figura 15 – Procedimento de escrita (a) e leitura (b) de dados do protocolo SPI.
(a)
(b)
Fonte: SILVA (2008).
36
3.4 Protocolo CAN
Segundo Marques (2004), ao longo do tempo, as técnicas de controle envolvidas e,
consequentemente, a necessidade de sensoriamento e de trocar informações expandiram de tal
forma que proporcionou o aumento do volume de cabos e linhas de controles na estrutura
automotivas. Além do aumento do custo em cabeamento, a quantidade exagerada de cabos na
estrutura proporciona um aumento físico e complexidade das ligações. Tais fatores tornam o
circuito pouco confiável no que diz respeito à segurança, a estabilidade e a tolerância a falhas,
visto que, o número de condutores em paralelo gera um ruído e o sistema ainda tem que suportar
a instabilidade e as trepidações intrínsecas do próprio automóvel.
Pensando nisso, o modelo do Controller Area Network (CAN) foi proposto por
Robert Bosh, em 1986, com o intuito de prover as interconexões automotivas de forma mais
organizada e eficiente. Este novo modelo consiste na criação de um único barramento elétrico,
que percorria todo o veículo, interconectando todos os sensores e dispositivos de controle, assim
que eles podem comunicar entre si de forma mais eficiente e organizada, evitando a quantidade
excessiva de cabos. Este novo modelo mostrou-se tão eficiente que, atualmente, a maioria dos
fabricantes automotivos o utiliza. Na figura 16 é apresentado um modelo de como o barramento
CAN foi implementado em uma estrutura automotiva.
Figura 16 – Modelo de protocolo CAN proposto.
Fonte: site http://www.mzeditora.com.br/artigos/veicular.htm, acessado em 2 de dez. 2013.
Devido suas excelentes características, o protocolo CAN vem sendo utilizadas em
aplicações industriais com bastante sucesso. Isso deve-se ao fato de ser um sistema bastante
robusto e confiável criado para suporta situações com altos índice de ruídos induzidos e grandes
variações de alimentação.
37
A regulamentação geral da rede CAN está presente na resolução ISO 11898, gerada
pela International Organization for Standardization e sua regulamentação específica para as
diversas aplicações em automóveis foi padronizada pela Society of Automotive Engineers
(SAE).
O CAN é um protocolo serial constituído por um barramento multi-mestre, ou seja,
vários dispositivos podem pedir acesso ao sistema simultaneamente. Da mesma forma, um
único dispositivos também pode mandar uma mensagem para vários dispositivos diferentes.
Ao contrário dos outros protocolos, não existe um endereçamento do destinatários
no sentido convencional. Em vez disso, são transmitidas mensagens que possuem um
determinado identificador. Assim, um emissor envia uma mensagem para todos os nós do
barramento e cada dispositivo decide com base no identificador se a mensagem é relevante e o
nível de prioridade que ela terá ao competir pelo acesso do barramento.
Segundo Barbosa (2003), algumas modificações foram realizadas no protocolo
CAN com o passar do tempo. Estas modificações ocorreram principalmente no que diz respeito
a taxa máxima de transmissão e no tamanho do identificador. Desta forma, acabaram surgindo
três tipos de protocolos CAN, diferenciada de acordo com a taxa de transferência e o tamanho
do identificador. Esta divisão é apresenta na Tabela 5.
Tabela 5 – Tipos de protocolo CAN.
Nomenclatura Padrão Taxa máxima Identificador
CAN baixa velocidade ISO 11519 125 Kbps 11 bits
Versão 2.0 A ISO 11898:1993 1 Mbps 11bits
Versão 2.0 B SO 11898:1995 1 Mbps 29 bits
Fonte: BARBOSA (2003).
Nota-se que nas duas primeiras versões o identificador pode assumir até 2048, já
com a Versão 2.0 B o identificadores podem assumir 537 milhões de números. Ou seja, uma
quantidade muito elevada de dispositivos pode estar conectada em um único barramento CAN.
3.4.1 Características dos sinais
Para se analisar os sinais envolvidos neste tipo de protocolo é necessário analisar
primeiramente como é definido cada nível lógico do barramento. O protocolo CAN utiliza um
meio de transmissão diferencial, na qual é observa a diferença de tensão entre dois condutores,
o CANH e o CANL. Quando a interface deseja gera um bit de nível lógico baixo, chamado de
bit dominante, ele força um nível elétrico no conduto CANH de aproximadamente 3,5 V e força
38
o condutor CANL para aproximadamente 1,5 V. Estabelecendo uma diferença de potencial de
aproximadamente 2 V. Da mesma forma, quando se deseja gerar um bit de nível lógico alto,
chamado de bit recessivo, é mantido um nível de tensão de aproximadamente 2,5 V nos
condutores CANH e CANL, obtendo uma diferença de potencial nula.
Esse tipo de transmissão utilizando dois condutores foi projetado de forma que reduza
o ruído através do cancelamento do efeito de campo. Além disso, não há gasto de potência da
rede quando o bit está no modo recessivo, apenas quando é gerado um bit dominante, reduzindo
a energia gasta na transmissão. Os níveis de tensões para o modo recessivo e dominante são
apresentados na figura 17.
Figura 17 – Níveis lógicos do barramento CAN.
Fonte: FERREIRA (2009).
3.4.2 Formato do Protocolo
Dentre as versões de protocolo CAN apresentada anteriormente há duas que são
bastante utilizadas atualmente: a Versão 2.0 A e a Versão 2.0 B. A diferença entre estes dois
tipos diz respeito ao tamanho do campo destinado para o identificador. De modo a manter a
compatibilidade com as outras variações, na 2.0 B podem tanto ter tanto identificadores de 11
bits quando identificadores de 29 bits.
As duas versões possuem basicamente a mesma estrutura de pacote. Assim, um
pacote de dados de um protocolo é constituído por:
Start of Frame (SOF): Indica o início da transmissão de uma informação. Um
único bit dominante.
Arbitration Field: Na versão 2.0 A é constituído por um pacote de 11 bits
chamado de Identificador da mensagem, e um bit de requisição de retransmissão
39
de dados (RTR – Remote Transmission Request). O pacote Identificador é
responsável por informar ao barramento a prioridade da mensagem. E o bit RTR,
se este for dominante, é responsável por informar que o dispositivo requisita
dados de outros nós do barramento.
Na versão 2.0 B, o Arbitration Field possui 29 bits no pacote de identificação
dividido em um pacote de 11 bits, e um de 18 bits. Um bit SRR (Subistitute
Remote Request) substitui o bit RTR e é transmitido recessivo. Após o bit SRR
vem um bit IDE (Identifier Extension), que se recessivo, informa que o próximo
pacote é a extensão do identificador, caso contrário, informa é o fim da
identificação. Sendo finalizado por um bit RTR.
Control Field: Constituído por um pacote de 4 bits informando o comprimento
da mensagem (DLC – Data Lenght Code) e por um (versão 2.0 A) ou dois (versão
2.0 B) bits reservados.
Data Field: É a mensagem propriamente dita. O campo da mensagem pode ser
composto de 0 a 8 bytes.
CRC Field: Composto por uma sequência de 15 bits e um recessivo delimitador,
este pacote é um método para detectar um erro durante a transmissão. O CRC é
identificado por um polinômio identificador, g(x). O polinômio gerador é x15 +
x14 + x10 + x8 + x7 + x4 + x3 + 1. Para calcular o CRC, a cadeia de dados, d(x),
deve ser dividida pelo polinômio gerador, g(x); Dessa operação resultam q(x)
(quociente) e r(x) (resto). O resto é o valor CRC.
ACK Field: Constituído por dois bits de confirmação de recebimento. É
dominante somente se a mensagem enviada foi recebida corretamente pelo
receptor.
End of Frame (EOF): Indica o fim de transmissão. Constituído por um pacote de
7 bits para informar o fim do pacote (7 bits recessivos) ou informar algum erro
aconteceu.
Interframe Space (IFS): Um pacote de 3 bits recessivos utilizados para definir
um espaço entre dois pacotes de dados.
Nas figura 18 (a) e (b) são apresentada, respectivamente, o pacote de dados da
Versão 2.0 A e da Versão 2.0 B.
40
Figura 18 – Estruturas do protocolo CAN: (a) Versão 2.0 A; (b) Versão 2.0 B.
(a)
(b)
Fonte: BARBOSA (2003).
Por ser uma comunicação assíncrona, onde só existem as duas linhas de dados, as
sincronização dos dispositivos em um protocolo CAN é realizada através de dois
procedimentos: a sincronização forçada e a resincronização. A sincronização forçada ocorre
dentro do dispositivo receptor quando o barramento está em repouso e detecta a transição de
um bit recessivo para um dominante. A resincronização consiste em produzir um alongamento
ou estreitar do tempo de bit, ou seja, aumenta ou diminui a diferença entre o clock do
transmissor e receptor, de forma a permitir que a localização do ponto de amostragem seja
correta.
3.5 Protocolo USB
Dentre os protocolos já mencionados, o USB (Universal Serial Bus) é um dos mais
populares, graças a sua facilidade de uso, desempenho, robustez e versatilidade em
interconectar diferentes dispositivos através de uma interface única.
De acordo com Zelenovsky e Mendonça (2006), este protocolo surgiu a partir da
metade da década de 90 pelos principais líderes de mercado com o objetivo de criar uma
interfase padrão que oferecesse características confortáveis de operação não presentes nos
padrões até então vigente, como:
Permitir a conexão de periféricos sem a necessidade de abri o gabinete do
computador;
Permitir a conexão de dispositivos com o sistema operacional em atividade;
Possuir um conector padrão, simples, barato e de fácil encaixe;
Dispensar drivers específicos de fabricantes;
41
Possuir um controle interno de energia que permite que o dispositivo se
desconecte automaticamente e não consuma potência quanto estiver ocioso;
Especificar um protocolo de comunicação com detecção e supressão automática
de erros de transmissão.
O padrão USB foi adotado e padronizado por empresas mundialmente conhecidas
no mercado de computadores pessoais como, por exemplo: Apple, Hewlett-Packard, Intel,
Microsoft, Compaq, dentre outras. O que acabou contribuindo ainda mais para o sucesso deste
protocolo.
Nas primeiras versões a interface oferecia uma taca de transmissão de até 12 Mbps,
sendo padronizado nos anos 2000, um modelo 2.0 que popularizou essa tecnologia, dispondo
de 480 Mbps de velocidade. Em 2009 surgiu a versão 3.0 disponibiliza 4.8 Gbps, ou seja,
consegue ser pelo menos dez vezes mais rápido na hora de fazer transferência de dados.
Tanto o modelo 2.0 quanto o 3.0 possuem a mesma estrutura de conector (sendo
que o do último possui cor azul), o que permite a compatibilidade de ambos em versões
diferentes, como por exemplo, usar um USB 2.0 em entrada 3.0 ou vice-versa. Entretanto, o
dispositivo não irá dispor de toda a capacidade que tecnologia permite. Na figura 19 são
mostrados os conectores 2.0 e 3.0.
Figura 19 – Conetores USB 2.0 (esquerda) e USB 3.0 (direita).
Fonte: site http://techiedas.blogspot.com.br/2012/05/all-you-need-to-know-about-usb-20-and.html, acessado em 2
de dez. 2013.
42
3.5.1 Características do padrão USB.
O USB é um barramento serial de dados constituído por um hospedeiro (Host) e
por diversos periféricos simultaneamente conectados. O barramento permite que periféricos
sejam conectados, configurados, usados e desconectados enquanto outros periféricos estão em
operação, conexão conhecida como plug and play.
O barramento físico do protocolo USB é constituído por um cabo blindado com
quatro condutores: Vbus, D+, D- e GND. O condutor Vbus é responsável pela alimentação do
dispositivo USB, desta forma o dispositivo não necessita de uma fonte próprio, o que diminui
os custo do projeto. Da mesma forma que a interfase do protocolo CAN, o USB utiliza a
diferença de tensões dos sinais D+ e D- para trocar informações.
Apesar de possuir um barramento simples, com boa taxa de transferência de dados
e uma versatilidade de uso, a interface elétrica e lógica pode torna-se bastante complexa, o que
caba inviabilizando sua construção com componentes discretos digitais e analógicos. O que
muitas vezes leva os projetistas a utilizar interfases já prontas para as aplicações.
43
4 IMPLEMENTAÇÃO DOS PROTOCOLOS
Com todas as características dos protocolos descritas no capítulo anterior é possível
cria bibliotecas para serem usadas como módulos de projetos futuros. Esta bibliotecas devem
possuir todas as funcionalidades possíveis para cada protocolo e nos vários modos de operação.
Isso daria uma grande flexibilidade ao projetista, pois aceleraria bastante o tempo de
desenvolvimento do projeto.
Desenvolvidas tais bibliotecas o projetista escolheria apenas os módulos de acordo
com a necessidade do circuito. Assim o projeto de comunicação se reduziria apenas a um
controle que ativaria cada um dos módulos no momento apropriado, sem se preocupar com os
detalhes de restrição de tempo e padrão de interfase. Uma vez que, quando ativados os modos
de operação de cada biblioteca, os dados são transmitidos com o padrão do protocolo em
questão.
Serão desenvolvidas bibliotecas para todos os protocolos citados excetuando-se os
protocolos CAN e USB, que necessitam de um interfase elétrica mais robusta e pela
indisponibilidade de periféricos ou conectores para o dispositivo FPGA escolhido como base
para tal aplicação. Além do que, o protocolo USB ser uma fonte de conhecimento que seria
mais apropriado um estudo a parte voltado apenas para este tema.
4.1 Dispositivo utilizado
Os blocos foram desenvolvidos na linguagem VHDL, sendo implementados em
FPGA utilizando como plataforma de desenvolvimento o kit didático DE0-Nano da fabricante
Altera®. A placa DE0-Nano apresenta uma plataforma de desenvolvimento FPGA de tamanho
compacto, o mais adequado para projetos de circuitos de protótipos, principalmente para projeto
elétricos voltados mercado. Este kit foi projetado para ser usada na implementação mais simples
visando o dispositivo Cyclone IV, contendo até 22.320 Logic elements (LE’s).
O DE0-Nano possui uma interface que disponibiliza incluindo dois headers
externos GPIO para estender projetos além da placa, a placa possui memória SDRAM e
EEPROM, conversor A/D, LED’s e push-buttons.
Na figura 20 é mostrado a imagem do Kit didático DE0-Nano com FPGA da família
Cyclone IV.
44
Figura 20 – Kit didático DE0-Nano com FPGA da família Cyclone IV.
Fonte: TERASIC (2011).
As vantagens do DE0-Nano incluem seu tamanho e peso, bem como sua capacidade
de ser configurado sem a necessidade de hardware. Além disso, é ideal para projetos móveis e
portáteis. Na figura 21 é apresentado o layout da placa do kit didático DE0-Nano com os
principais componentes disponíveis.
Figura 21 – Layout da placa do kit didático DE0-Nano.
Fonte: TERASIC (2011).
4.2 Biblioteca RS-232 C
Como já analisado, o protocolo RS-232C é assíncrono e constituído por canais do
tipo simplex. Partindo destes dados foram criados dois blocos para compor esta biblioteca: o
45
receptor (RX) e o transmissor (TX). Cada bloco foi projetado para funcionar de forma
independente e com parâmetros de comunicação moldáveis para funcionar em qualquer modo
de comunicação.
4.2.1 Bloco TX
Este bloco implementa o transmissor RS-232 C. É constituído por dois processos,
o primeiro gera a taxa de transmissão do pacote e o segundo é uma máquina de estado que
configura cada bit do pacote. Esta configuração será definida a partir de quatro parâmetros
definidos por variáveis genéricas no início do bloco. Estes parâmetros estão descritos na Tabela
6.
Tabela 6 – Parâmetros de ajuste do bloco TX.
Sinal Descrição
DIVISOR Valor que irá dividir o clock interno para
gerar a taxa desejada.
DBIT Número de bits do dado.
SP Número de stop bit no final do pacote.
P Dois bits para configurar a paridade.
“11” = Sem paridade
“10” = Paridade ímpar
“01” = Paridade par
“00” = sem paridade
Fonte: Elaborado pelo autor.
O primeiro processo (PROCESS: DIVIDIR) é constituído por um divisor de
frequência que a partir do valor configurado no parâmetro DIVISOR irá dividir a frequência do
clock de entrada para obter a taxa de transferência desejada para a transmissão, mostrado na
figura 22.
Figura 22 – Código divisor de frequência em VHDL.
Fonte: Elaborado pelo autor.
DIVIDIR: PROCESS (CLK_IN, CLK_OUT)
VARIABLE AUX: INTEGER RANGE 0 TO DIVISOR := 0;
BEGIN
IF (AUX = DIVISOR) THEN
AUX := 0;
CLK_OUT <='0';
ELSIF((CLK_IN'EVENT) AND (CLK_IN='1'))THEN
AUX := AUX + 1;
CLK_OUT <= '1';
END IF;
END PROCESS DIVIDIR;
46
O segundo processo (PROCESS: TRANSMITIR) é onde ocorre de fato a
configuração do pacote RS-232 C. No estado de repouso a saída CTS será levada para nível
lógico ‘1’ para mostrar ao modem que o dispositivo está pronto para transmissão. Para que a
máquina de estado saia da condição de repouso e ocorra a transmissão, o bloco tem que receber
um sinal de HABILITAR com nível lógico. Os pinos de entrada e saída do bloco TX são
mostrados na figura 23.
Figura 23 – Bloco TX.
Fonte: Elaborado pelo autor.
Na Tabela 7 é apresentada a descrição de cada pino o bloco TX.
Tabela 7 – Pinos do bloco TX.
Sinal Descrição
CLK_IN Clock de referência (50MHz)
HABILITAR Habilita a trnamissão
TxIN[7..0] Oito bits de dado para ser transmitido.
TxD Saída serial.
CTS Bloco pronto para transmitir
Fonte: Elaborado pelo autor.
Ao sair do estado de repouso a máquina irá para o estado de START onde a saída
TxD será levada para nível lógico baixo, mostrando ao dispositivo receptor que irá começar
uma nova transferência de dados. No próximo estado o dado posto na entrada TxIN será
mandado para um registrador auxiliar. A partir desse registrador o dado começará a ser
transferido desde o bit menos significativo até o mais significativo para a saída TxD, a cada
pulso de clock.
Após transferir o dado, a máquina irá para a condição de paridade ou de stop bit
dependendo do valor configurado no parâmetro P, que define se o protocolo terá ou não bit de
paridade, além de configura-la (tabela 6). Se o parâmetro P for configurado em “01” ou “10”,
47
a máquina irá para a condição de paridade, neste estado um laço FOR irá contar a quantidade
de 1’s encontrado no dado e irá definir o valor da paridade de acordo com a Tabela 8.
Tabela 8 – Cálculo da paridade.
P CONTADOR2(0) (MSB) TxD
“10” ‘1’ ‘0’
‘0’ ‘1’
“01” ‘1’ ‘1’
‘0’ ‘0’ Fonte: Elaborado pelo autor.
Na figura 24 é mostro o laço FOR responsável pelo cálculo da paridade.
Figura 24 – Código divisor de frequência em VHDL.
Fonte: Elaborado pelo autor.
Por último vem os estado de parada que são configurados pelo parâmetro SP. Este
parâmetro pode ir de 1 a 2 stop bits e define quantos estados a máquina irá percorre até chegar
na condição de final de transmissão. Ao chegar nessa condição a máquina deverá ser resetada
para que possa ser transmitido outro dado.
A figura 25 mostra a forma de onda obtida na ferramenta Programmer and
SignalTap II da Altera®. Com o bloco TX configurado para transmitir dados de 8 bits (DBIT
= 8), com paridade par (P = “01”) e com um stop bit (SP = 1), um dado com valor “10000001”
é enviado respeitando todas as etapas de transmissão do protocolo RS-232 C.
DEF : FOR i IN 0 TO 7 LOOP
IF (TxREG(i) = '1') THEN
CONTADOR2 := CONTADOR2 + 1;
END IF;
END LOOP DEF;
IF (P = "01") THEN -- PARIDADE PAR
IF (CONTADOR2(0) = '1') THEN -- NÚMERO IMPAR
TxR <= '1'; -- PARIDADE '1'
ELSE
TxR <= '0'; -- PARIDADE '0'
END IF;
ELSIF (P = "10") THEN -- PARIDADE IMPAR
IF (CONTADOR2(0) = '1') THEN -- NÚMERO PAR
TxR <= '0'; -- PARIDADE '0'
ELSE
TxR <= '1'; -- PARIDADE '1'
END IF;
END IF;
CONTADOR2 := "00000000";
48
Figura 25 –Transmissão de um dado pelo bloco TX.
Fonte: Elaborada pelo autor.
Na figura 25 são apresentadas cinco regiões que correspondem aos estados do
pacote transmitido que são:
Região 1: Bloco TX em repouso. Saída TxD em nível lógico ‘1’.
Região 2: Início de transmissão, enviando start bit. Saída TxD em nível
lógico ‘0’.
Região 3: Pacote de dado de 8 bits. Enviando sequencialmente o dado
“10000001”.
Região 4: Região de paridade. Como P = “01” (paridade par) é enviado um
bit de paridade com nível lógico ‘0’.
Região 5: Região de stop bit. A linha é levado para condição de repouso
(nível lógico ‘1’), esperando uma nova transmissão.
Um fluxograma com a lógica empregada no bloco TX é apresentada na figura 26.
Figura 26 – Lógica de transmissão serial RS-232 C.
Fonte: Elaborado pelo autor.
49
4.2.2 Bloco RX
Este bloco implementa o receptor RS-232 C. Da mesma forma que o bloco TX, o
receptor RX é composto por um processo responsável pelo clock e outro pelo controle. O
processo de clock irá definir a taxa de recepção de dados, sendo esta quatro vezes a taxa de
transmissão para manter o sincronismos entre eles. O processo de controle será responsável por
receber cada bit e alocá-los na saída RxR para compor a informação sem que esta seja
corrompida. Os pinos de entrada e saída do bloco RX são mostrados na figura 27.
Figura 27 – Bloco de recepção RX.
Fonte: Elaborado pelo autor.
Na Tabela 8 é apresentada a descrição de cada pino o bloco RX.
Tabela 9 – Pinos do bloco TX.
Sinal Descrição
CLK_IN Clock de referência (50MHz)
RxD Entrada serial.
RTS Transmissor pronto para transmitir
e habitar recepção (nível lógico ‘1’)
RxR[7..0] Dado recebido
CTS Dispositivo pronto para receber (nível lógico ‘1’)
Fonte: Elaborado pelo autor.
Este bloco funciona de maneira muito semelhante ao TX. Ao ser definido que o
dispositivo transmissor está pronto para transmitir através da detecção de um, sinal com nível
lógico alto no sinal RTS, o controle irá analisar o sinal RxD até detectar o sinal de start bit.
Com a detecção do start bit, o controle irá continuar a varredura do sinal RxD com uma
frequência quatros vezes a do transmissor pegando uma amostra no meio de cada bit e alocando
na saída RxR, sempre do bit menos significativo para o mais significativo.
A figura 28 mostra a forma de onda obtida na ferramenta Programmer and
SignalTap II da Altera®. Com o bloco RX configurado para receber dados de 8 bits (DBIT =
8), com paridade par (P = “01”) e com um stop bit (SP = 1), um sinal é enviado para o bloco
50
RX. O bloco conseguiu capturar o dado e passar para o registrado RxR sem danificar a
informação transmitida.
Figura 28 – Bloco de recepção de dados RX.
Fonte: Elaborado pelo autor.
Na figura 28 são apresentadas cinco regiões que correspondem aos estados do
pacote recebido que são:
Região 1: Bloco RX em repouso.
Região 2: Detecta início de transmissão. RxD em nível lógico ‘0’.
Região 3: Começa a receber os 8 bits de dado.
Região 4: Região de paridade. Como P = “01” (paridade par) é enviado um
bit de paridade com nível lógico ‘1’. A saída RxR (dado recebido) vai para
“00000001”.
Região 5: Região de stop bit. A linha é levado para condição de repouso
(nível lógico ‘1’), esperando uma nova transmissão.
4.2.3 Proposta de aplicação
Tendo criado as bibliotecas do protocolo RS-232 C, aplicar o conhecimento torna-
se uma questão de configurar os blocos e aplicar um controle de transferência de dados. Um
aplicação bastante simples e que ao mesmo tempo abre uma gama de possibilidades para futuras
aplicações é a comunicação entre um FPGA e um computador pessoal.
O primeiro passo é ter uma interface que converta os níveis lógicos do FPGA para
níveis aceitos pelo computador. O mercado disponibiliza módulos conversores que podem fazer
este papel com grande facilidade. Este conversores podem ir tanto de conversores TTL para
padrão RS-232 disponível para um comunicação serial com a porta serial presente nos
computadores pessoais, até conversores RS-232 para USB.
Neste trabalho, será utilizado um dispositivo que converte os níveis de 3.3 V
disponíveis pelo kit DE0-Nano para os níveis RS-232 aceitos pela porta serial do PC. A Figura
23 mostra o módulo conversor utilizado nesta aplicação.
51
Figura 29 – Conversor DB9 RS232 para TTL MAX232.
Fonte: Datasheet Conversor DB9 RS232 para TTL MAX232.
Para a recepção dos dados transmitidos para porta serial do PC será utilizado o
software RcomSerial v1.2, disponibilizado pelo fabricante Rogercom®. O RcomSerial é um
software para testar dispositivos que se comunicam através da porta serial RS232. Nesta
aplicação, este programa irá receber os dados do conversor TTL/RS-232 conectado ao kit DE0-
Nano.
Figura 30 –Programa RcomSerial v1.2.
Fonte: Elaborado pelo autor.
Para mostrar a funcionalidade da biblioteca será utilizado o bloco TX em conjunto com
um bloco de controle que irá transmitir a string “HELLO WORLD!”, sendo cada caractere
52
transmitido a cada 1s. Assim, o bloco de controle terá que mandar o ASCII correspondente de
cada caractere, assim como, um sinal de HABILITAR para resetar o transmissor serial. A
Figura 31 mostra o diagrama de blocos do processo descrito.
Figura 31 – Diagrama de blocos da aplicação.
Fonte: Elaborado pelo autor.
O bloco serial foi configurado para transmitir cada pacote de 8 bits com um velocidade
de 9600 bauds (DIVISOR = 2500), sem paridade (P = “00”) e um stop bit (SP = 1). Da mesma
forma o software RcomSerial foi configurado para recebe pacotes de dados com as mesma
características definidas no bloco TX, habilitando a porta COM1 do computador para realizar
a transmissão.
Utilizando o software Quartus II, da fabricante Altera®, o programa foi sintetizado e,
posteriormente, passando as informações para o kit DE0-Nano. Realizadas as ligações entre o
kit e o conversor, foram obtidos os seguintes resultados mostrados na figura 32.
Como pode ser observado pela figura 32, a string foi enviada com sucesso, provando a
funcionalidade do bloco em questão.
53
Figura 32 – Recepção da string através da porta serial do PC.
Fonte: Elaborado pelo autor.
4.3 Biblioteca I2C
Por ser um protocolo mais robusto que o RS-232, o I2C exige um tratamento mais
detalhado do sinal, uma vez que a interface desse protocolo é constituída por apenas dois
condutores: o SDA e o SCL, sendo o SDA um canal de dados bidirecional do tipo half-duplex,
onde que trafega pacotes de endereçamento, dados, direção da informação e estado de
transmissão. Entretanto, por ser uma comunicação serial síncrona, a etapa de sincronismo torna-
se fácil de se lidar.
O bloco criado implementa um dispositivo I2C mestre, ou seja, um dispositivo que
irá comandar todas etapas da transmissão. Devido a robustez de uma FPGA, esta atribuição
pode ser realizada com grande facilidade. Os sinais que estarão presentes neste bloco estão
apresentados na Tabela 10.
54
Tabela 10 – Interface do bloco I2C.
Sinal Tipo Descrição
I2C_CLK IN Clock de referência do FPGA.
I2C_SCLK OUT Clock de transferência de dados I2C (SCL).
I2C_DONE OUT Estado de transmissão.
I2C_SDATA IN/OUT Canal SDA por onde trafegam os dados.
I2C_DATAOUT OUT Registrador de dado recebido.
I2C_CS OUT Sinal de viabilidade de transferência de dados.
Fonte: Elaborado pelo autor.
Com base nesse sinais foi desenvolvido um bloco em VHDL no Quartus II que
implementa as funcionalidades de um protocolo I2C mestre. Este bloco é apresentado na Figura
33.
Figura 33 – Bloco I2C.
Fonte: Elaborado pelo autor.
A configuração deste bloco é realizado através dos sinais genéricos DISP_ADDR,
I2C_DATAIN e WR, que são, respectivamente, o endereço, o dado e se o processo é de escrita
ou leitura.
Na Figura 34 é apresentado a escrita de um dado pelo bloco I2C. O bloco está
configurado para enviar um endereço “0011101" e um dado com valor de "00011000" em um
processo de escrita (WR = ‘0’).
Figura 34 – Escrita de dados pelo bloco I2C.
Fonte: Elaborado pelo autor.
55
Na figura 34 são apresentadas regiões que correspondem aos estados do pacote de
escrita do bloco I2C, que são:
Região 1: Bloco Condição de start. I2C_SDATA vai para nível lógico ‘0’
Região 2: Os 7 bits de endereço são enviado serialmente. O endereço que se
deseja acessar é o “0011101".
Região 3: Um bit WR em nível lógico ‘0’ para identificar que irá realizar
um procedimento de escrita no escravo.
Região 4: Um bit ACK em nível lógico baixo é recebido, indicando que o
escravo recebeu o endereço.
Região 5: O dado com valor de "00011000" é transmitido serialmente pelo
I2C_SDATA.
Região 6: Um bit ACK em nível lógico baixo é recebido, indicando que o
escravo recebeu o dado.
Região 7: I2C_SDATA entra na condição de stop bit.
Região 8: I2C_SDATA já está na condição de parada (nível lógico ‘1’). O
sinal I2C_DONE indica que a transmissão foi realizada com sucesso (nível
lógico ‘1’).
Na Figura 35 é mostrado o processo de leitura de dados do bloco I2C. Nesta etapa
o mestre manda o endereço, manda um bit WR =’1’ para definir que espera ler um dado e espera
em alta impedância o sinal de ACK e o dado serial do escravo.
Figura 35 – Leitura de dados pelo bloco I2C.
Fonte: Elaborado pelo autor.
Na figura 35 são apresentadas regiões que correspondem aos estados do pacote de
leitura do bloco I2C, que são:
Região 1: Bloco Condição de start. I2C_SDATA vai para nível lógico ‘0’
Região 2: Os 7 bits de endereço são enviado serialmente. O endereço que se
deseja acessar é o “0011101".
56
Região 3: Um bit WR em nível lógico ‘1’ para identificar que irá realizar
um procedimento de leitura de um dado do escravo.
Região 4: O pino I2C_SDATA é colocado em alta impedância esperando o
bit de ACK do escravo.
Região 5: O pino I2C_SDATA é colocado em alta impedância esperando
que o escravo envie o dado.
Região 6: O pino I2C_SDATA é colocado em alta impedância esperando o
bit de ACK do escravo.
Região 7: I2C_SDATA entra na condição de stop bit.
Região 8: I2C_SDATA já está na condição de parada (nível lógico ‘1’). O
sinal I2C_DONE indica que a transmissão foi realizada com sucesso (nível
lógico ‘1’).
4.3.1 Proposta de aplicação
Com o intuito de validar a biblioteca de I2C ser proposto a comunicação de um
dispositivo com um periférico de memória. No caso do kit DE0-Nano, pode-se utilizar o bloco
I2C na comunicação do dispositivo com a memória EEPROM.
O DE0-Nano contém um memória EEPROM de 2 Kbits configurada por uma
interface serial I2C de dois fios, organizada em blocos de memória de 256 x 8 bits. A Figura 36
mostra a conexão interna da memória com o FPGA Cyclone IV.
Figura 36 – Conexão entre o FPGA e a memória EEPROM.
Fonte: TERASIC (2011).
57
Uma EEPROM é um tipo de memória que pode armazenar valores que serão retidos
mesmo quando a energia é desligada e pode ser programada e apagada várias vezes,
eletricamente. Este tipo de memória é bastante útil na criação de tabelas ou na aquisição de
dados.
O acesso a esta memória é realizado pelos pinos PIN_F2 e PIN_F1 do kit DE0-Nano,
respectivamente, os pinos I2C_SCLK e I2C_SDAT mostrado na figura 36.
Deste modo, com a biblioteca criada, o acesso a esta memória fica reduzido à definir o
clock de funcionamento, o dado e o endereço em que se deseja escrever ou ler uma informação.
Como forma de validação da biblioteca criada foi realizado um procedimento de escrita
e leitura de um dado na memória EEPROM do kit DE0-Nano. Utilizando o clock de 50 MHz
como referência para gerar um clock de sincronismo de 500 kHz e acessando o endereço
"1010100".
4.4 Biblioteca SPI
Com base nas informações adquiridas sobre este protocolo no capítulo anterior, será
desenvolvido uma biblioteca para a leitura do conversor A/D serial ADC128S022 em FPGA
utilizando o kit didático DE0-Nano a partir de uma comunicação serial do tipo SPI. Proposta
desenvolvida por Wattes (2013).
Dentre todas as aplicações aplicáveis do dispositivo adotado, a utilização do ADC
(Analog-to-Digital Converter) é sem dúvida a mais importante voltada para o curso de
Engenharia Elétrica, uma vez que todo projeto digital que tenha algum tipo de sensoriamento
necessita conversão analógico/digital.
O ADC que está disponível no DE0-Nano possui oito canais analógicos que
conseguem converte sinais de 0 a 3,3 V com uma precisão de 12 bits. A Figura 37 mostra a
conexão do ADC com o kit FPGA.
58
Figura 37 – Conexão do ADC com o kit FPGA.
Fonte: TERASIC (2011).
Na Tabela 8 são mostradas as descrições de cada sinal envolvidos na conversão do sinal
analógico pelo kit DE0-Nano.
Tabela 11 – Legenda dos sinais do ADC128S022.
Sinal Descrição
IN0...IN7 Entradas analógicas
𝐂𝐒̅̅̅̅ Sinal de habilitação do CI.
SCLK
Clock de conversão de sinal (0,8 a 3,2 MHz)
DIN
Entrada de sinal de dados para seleção de canal analógico.
DOUT
Saída do sinal digital convertidos.
VA Tensão de referência(+) analógica. Limita o sinal de entrada analógico em 3,3 V
VD Tensão de referência digital(+). Define o nível lógico alto em 3,3 V (compatível
com o FPGA)
AGND Tensão de referência(-) analógica.
DGND Tensão de referência(-) digital.
Fonte: WATTES(2013).
O CI ADC128S022 possui dois modos de operação: operacional e serial. Estes
modos de operação diferem entre si pelo tempo de conversão entre cada amostragem. No
operacional as conversões ocorrem sucessivamente a cada 16 pulsos de clock. Já na operação
serial há um espaçamento entre cada amostragem, desligando o ADC neste período.
O bloco SPI empregado nesta aplicação é bastante simples. Um divisor de
frequência irá pegar a frequência do oscilador interno do kit e irá coloca-la na faixa suportada
pelo ADC. A partir deste momento ocorrerá dois processos, o de escrita, repensável por enviar
ao ADC pelo canal DIN, o endereço de 3 bits do canal analógico no qual se deseja converter a
tensão. Após definir o canal, o ADC retorna o valor convertido pelo canal DOUT.
59
Independentemente da quantidade de bits utilizáveis, os dois sinais, DIN e DOUT, enviam os
dados em pacotes de 2 bytes.
Na Figura 38 é apresentado o bloco SPI desenvolvido no software Quartus II, da
fabricante Altera®. Este bloco está configurado para utilizar o ADC128S022 do kit DE0-Nano
no modo operacional, realizando conversões consecutivas. As descrição de cada pino do bloco
ADC é mostrada na Tabela 12.
Figura 38 – Bloco SPI para controle do ADC.
Fonte: Elaborado pelo autor.
Tabela 12 – Descrição dos sinais do Bloco ADC.
Sinal Tipo Descrição
DOUT IN Valor convertido pelo ADC.
CLK IN Clock interno do FPGA.
CH[3..5] IN Seleção do canal analógico.
CS OUT Sinal que Habilita o ADC.
SCLK OUT Clock de conversão A/D.
DIN OUT Pacote de seleção de canal.
DATA[11..00] OUT Sinal convertido. Fonte: Elaborado pelo autor.
Na Figura 39 é apresenta a simulação do bloco ADC para a seleção do canal analógico
do ADC. A seleção é realizada através do pino DIN, onde são contabilizado 16 bits (bordas de
descida do clock), sendo lido pelo ACD apenas os bits 3 a 5, que correspondem ao canal
escolhido.
Figura 39 – Leitura e escrita do controlador ADC.
Fonte: Elaborada pelo autor.
60
Ao contrário da seleção de canal, o valor convertido é lido na borda de subida do
clock, sendo os 4 primeiros bits desconsiderado, obtendo assim um valor convertido com uma
precisão de 12 bits. Na figura 40 é apresentado a simulação do bloco ADC mostrando o valor
convertido.
Figura 40 – Leitura e escrita do controlador ADC.
Fonte: Elaborada pelo autor.
61
5 CONCLUSÃO
Neste trabalho foi apresentada um estudo sobre os protocolos de comunicação
serial, criando bibliotecas em VHDL para tais protocolo, além de propor aplicações com o
intuito de testá-los na prática. Observou-se que devido a flexibilidade e alta capacidade de
processamento, o FPGA, conseguiu implementar com alto desempenho todos os protocolos que
a ele foi proposto.
Uma vez que o FPGA possui um elevado clock interno, até as mais elevada taxa de
transmissão podem ser alcança sem grandes problemas. Além do que a estrutura protocolada
dos modos de comunicação se adequa muito bem a linguagem de descrição de hardware
VHDL.
Entretanto, em alguns protocolos, como CAN e USB, em que possuem uma
interface elétrica mais robusta, a falta de drivers que consigam adequar os 3.3 V disponíveis
em FPGA para os níveis de tensão do protocolo e consiga acompanhar sua velocidade de
transferência de dados, acabou inviabilizando a implementação de tais protocolos.
Como proposta para trabalhos futuros, sugere-se a implementação dos protocolos
CAN e USB, com o desenvolvimento de drives que adequem o FPGA aos níveis estabelecidos
pelo protocolo ou até mesmo utilizando drivers já prontos que execute a conversão.
62
REFERÊNCIAS
BARBOSA, L.R.G. Rede CAN. Belo Horizonte, 2003. Apostila, Escola de Engenharia da
Universidade Federal de Minas Gerais.
BRAGA, A.P.S. Microprocessadores: Comunicação de Dados. Fortaleza,2010. Notas de
Aula, Universidade Federal do Ceará.
CANZIAN, E. Comunicação Serial - RS232. São Paulo, 2012. Minicurso, CNZ Engenharia e
Informática Ltda.
CONTI, F. Código ASCII. Disponível em: < http://www.ufpa.br/dicas/progra/arq-asc.htm>.
Acesso em: 3 de nov. 2013.
COSTA, C.; MESQUITA, L.;PINHEIRO, E. Elementos de Lógica Programável com VHDL
e DSP. 1 Ed. Editora Érica, p 15-30, 2011.
FERREIRA, E.H.C.: Automação Residência Utilizando Protocolo. Curitiba, 2009, p 18-30.
Monografia, Universidade Federal do Paraná.
MARCIEL, B.K.; SOARES, L.B.; AGUIAR, Y.Q. Barramento Serial I²C e SPI. Rio Grande
do Sul, 2012. Artigo, Universidade Federal de Rio Grande.
PEDRONI, V.A.: Eletrônica Digital Moderna e VHDL. 1 Ed. Editora Elsevier, 2010.
PEREIRA, C.E.; LARGES, W.F. Robótica Industrial - Aplicação na Indústria de
Manufatura e de Processos. 1 Ed. Editora Edgard Blucher LTDA, Capítulo 3, 2002.
RAVITEJA, K. All you need to know about USB 2.0 and 3.0. Disponível em: <
http://techiedas.blogspot.com.br/2012/05/all-you-need-to-know-about-usb-20-and.html>.
Acesso em: 2 de dez. 2013.
ROESLER, V. Comunicação de Dados. Disponível em: <
http://www.podre.com.br/trabalhos/GraduacaoComputacaoUnisinos/2004-
1/Comunicacao_de_dados/aula03/tp_concbasicos.pdf >. Acesso em: 12 de dez. 2013.
SILVA, A.L.V. Arquitetura Compactada para Projetos de Robôs Móveis Visando
Aplicações Multipropósitos. São Carlos, 2008. Dissertação, Escola de Engenharia de São
Carlos da Universidade de São Paulo
WATTES, J.L. Prática TAED 10 - ADC SPI-4. Fortaleza, 2013. Notas de Aula, Universidade
Federal do Ceará.
63
ZELENOVSKY, R; MENDONÇA, A. PC: um Guia Prático de Hardware e
Interfaceamento. 4 Ed. Editora Mz, p 552-561, p 778-813, 2006.
ZELENOVSKY, R; MENDONÇA, A. Introdução às Redes Intraveiculares. Disponível em:
< http://www.mzeditora.com.br/artigos/veicular.htm >. Acesso em: 2 de dez. 2013.
TERASIC. User Manual, DE0-Nano. USA, p 16-17, p 20-22, 2011.
64
APÊNDICE A – CÓDIGOS EM VHDL
A.1 – Bloco TX
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164 .ALL;
USE IEEE.NUMERIC_STD .ALL;
ENTITY TX IS
GENERIC (DIVISOR : INTEGER := 5208; -- COLOCAR BAUD 9600
DBIT : INTEGER := 8;
SP : INTEGER := 1;
P :BIT_VECTOR (1 DOWNTO 0) := "01");
-- 11 = SEM PARIDADE
-- 10 = PARIDADE IMPAR
-- 01 = PARIDADE PAR
-- 00 = SEM PARIDADE
PORT( CLK_IN : IN BIT;
HABILITAR : IN BIT;
TxIN : IN BIT_VECTOR (7 DOWNTO 0);
-- RTS : IN BIT;
TxD : OUT BIT;
CTS : OUT BIT);
END TX;
ARCHITECTURE DO OF TX IS
TYPE ST IS (PARADO, START, DADO, PARIDADE, STOP1, STOP2, FIM);
SIGNAL ESTADO : ST;
SIGNAL RTS : BIT;
SIGNAL TxREG : BIT_VECTOR (7 DOWNTO 0);
SIGNAL TxR : BIT;
SIGNAL CLK_OUT : BIT;
BEGIN
RTS <= '1';
DIVIDIR: PROCESS (CLK_IN, CLK_OUT)
VARIABLE AUX: INTEGER RANGE 0 TO DIVISOR := 0;
BEGIN
IF (AUX = DIVISOR) THEN
AUX := 0;
CLK_OUT <='0';
ELSIF((CLK_IN'EVENT) AND (CLK_IN='1'))THEN
AUX := AUX + 1;
CLK_OUT <= '1';
END IF;
END PROCESS DIVIDIR;
RECEBER : PROCESS(CLK_OUT,TxIN, HABILITAR, TxR, TxREG, ESTADO, RTS)
VARIABLE CONTADOR : INTEGER RANGE 0 TO 9;
VARIABLE CONTADOR2 : UNSIGNED (7 DOWNTO 0);
BEGIN
IF (CLK_OUT'EVENT) AND (CLK_OUT = '0') THEN
65
IF HABILITAR = '1' THEN
ESTADO <= PARADO;
ELSE
CASE ESTADO IS
WHEN PARADO =>
IF RTS = '1' THEN
ESTADO <= START;
END IF;
WHEN START =>
ESTADO <= DADO;
WHEN DADO =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = DBIT) THEN
CONTADOR := 0;
IF ((P = "00") OR (P = "11")) THEN
ESTADO <= STOP1;
ELSE
ESTADO <= PARIDADE;
END IF;
END IF;
WHEN PARIDADE =>
ESTADO <= STOP1;
WHEN STOP1 =>
IF (SP = 1) THEN
ESTADO <= FIM;
ELSIF (SP = 2) THEN
ESTADO <= STOP2;
END IF;
WHEN STOP2 =>
ESTADO <= FIM;
WHEN FIM =>
NULL;
END CASE;
END IF;
END IF;
IF (ESTADO = PARADO) THEN
CTS <= '1';
TxR <= '1';
TxREG <= "00000000" ;
IF RTS = '1' THEN
TxR <= '1';
END IF;
ELSIF (ESTADO = START) THEN
TxR <= '0';
TxREG <= TxIN;
ELSIF (ESTADO = DADO) THEN
TxR <= TxREG(CONTADOR);
ELSIF (ESTADO = PARIDADE) THEN
DEF : FOR i IN 0 TO 7 LOOP
IF (TxREG(i) = '1') THEN
CONTADOR2 := CONTADOR2 + 1;
END IF;
END LOOP DEF;
IF (P = "01") THEN -- PARIDADE PAR
IF (CONTADOR2(0) = '1') THEN -- NÚMERO IMPAR
TxR <= '1'; -- PARIDADE '1'
ELSE
TxR <= '0'; -- PARIDADE '0'
END IF;
ELSIF (P = "10") THEN -- PARIDADE IMPAR
IF (CONTADOR2(0) = '1') THEN -- NÚMERO PAR
TxR <= '0'; -- PARIDADE '0'
66
ELSE
TxR <= '1'; -- PARIDADE '1'
END IF;
END IF;
CONTADOR2 := "00000000" ;
ELSIF (ESTADO = STOP1) THEN
TxR <= '1';
ELSIF (ESTADO = STOP2) THEN
TxR <= '1';
ELSIF (ESTADO = FIM) THEN
TxR <= '1';
END IF;
TxD <= TxR;
END PROCESS;
END DO;
A.2 – Bloco RX
ENTITY RX IS
GENERIC (DIVISOR : INTEGER := 1302;
DBIT : INTEGER := 8;
SP : INTEGER := 1;
P :BIT_VECTOR (1 DOWNTO 0) := "01");
-- 11 = SEM PARIDADE
-- 10 = PARIDADE IMPAR
-- 01 = PARIDADE PAR
-- 00 = SEM PARIDADE
PORT( CLK_IN : IN BIT;
RxD : IN BIT;
RTS : IN BIT;
RxR : OUT BIT_VECTOR (7 DOWNTO 0);
CTS : OUT BIT);
END RX;
ARCHITECTURE DO OF RX IS
TYPE ST IS (PARADO, START, DADO, PARIDADE, STOP1, STOP2);
SIGNAL ESTADO : ST;
SIGNAL RxREG : BIT_VECTOR (7 DOWNTO 0);
-- SIGNAL RTS : BIT;
SIGNAL PxREG : BIT;
SIGNAL CLK_OUT : BIT;
BEGIN
--RTS <= '1';
DIVIDIR: PROCESS (CLK_IN)
VARIABLE AUX: INTEGER RANGE 0 TO DIVISOR := 0;
BEGIN
IF (AUX = DIVISOR) THEN
AUX := 0;
CLK_OUT <='0';
ELSIF((CLK_IN'EVENT) AND (CLK_IN='1'))THEN
AUX := AUX + 1;
67
CLK_OUT <= '1';
END IF;
END PROCESS DIVIDIR;
RECEBER : PROCESS(CLK_OUT,RxD, ESTADO, RTS)
VARIABLE CONTADOR : INTEGER RANGE 0 TO 9;
VARIABLE CONTADOR2 : INTEGER RANGE 0 TO 9;
BEGIN
CTS <= '1';
IF (CLK_OUT'EVENT) AND (CLK_OUT = '0') THEN
IF (RTS = '1') THEN
CASE ESTADO IS
WHEN PARADO =>
IF (RxD = '0') THEN
ESTADO <= START;
END IF;
WHEN START =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = 4) THEN
CONTADOR := 0;
ESTADO <= DADO;
END IF;
WHEN DADO =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = 4) THEN
CONTADOR2 := CONTADOR2 + 1;
CONTADOR := 0;
IF (CONTADOR2 = DBIT) THEN
IF ((P = "00") OR (P = "11")) THEN
ESTADO <= STOP1;
CONTADOR2 := 0;
ELSE
ESTADO <= PARIDADE;
CONTADOR2 := 0;
END IF;
END IF;
END IF;
WHEN PARIDADE =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = 4) THEN
PxREG <= RxD;
CONTADOR := 0;
ESTADO <= STOP1;
END IF;
WHEN STOP1 =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = 4) THEN
IF (SP = 1) THEN
IF (RxD = '0') THEN
ESTADO <= START;
ELSE
ESTADO <= PARADO;
END IF;
ELSIF (SP = 2) THEN
ESTADO <= STOP2;
END IF;
CONTADOR := 0;
68
END IF;
WHEN STOP2 =>
CONTADOR := CONTADOR + 1;
IF (CONTADOR = 4) THEN
IF (RxD = '0') THEN
ESTADO <= START;
ELSE
ESTADO <= PARADO;
END IF;
CONTADOR := 0;
END IF;
END CASE;
END IF;
END IF;
IF (ESTADO = DADO) THEN
RxREG(CONTADOR2) <= RxD;
ELSIF (ESTADO = STOP1) THEN
RxR <= RxREG;
ELSIF (ESTADO = STOP2) THEN
RxR <= RxREG;
END IF;
END PROCESS;
END DO;
A.3 – Bloco I2C
LIBRARY ieee;
USE ieee.std_logic_1164 .ALL;
ENTITY I2C IS
GENERIC(DISP_ADDR : STD_LOGIC_VECTOR (1 to 7):="0011101";
I2C_DATAIN : STD_LOGIC_VECTOR (1 to 8):="00011000" ;
WR : STD_LOGIC:='1';
DIV : NATURAL RANGE 0 to 41667:=2
);
PORT( I2C_CLK :IN STD_LOGIC ; --Clock 50MHz)
I2C_SCLK : OUT STD_LOGIC ;
I2C_DONE : OUT STD_LOGIC;
I2C_SDATA : INOUT STD_LOGIC;
I2C_DATAOUT : OUT STD_LOGIC_VECTOR (1 to 8);
I2C_CS: OUT STD_LOGIC
);
END I2C;
ARCHITECTURE do OF I2C IS
TYPE ST IS (START, ADDR, WRR, ACK1, DATA, ACK2, STOP);
SIGNAL ESTADO : ST;
SIGNAL CLK_P: STD_LOGIC:='0';
SIGNAL SCLK: STD_LOGIC:='1';
SIGNAL DATAOUT: STD_LOGIC_VECTOR (1 to 8):="00000000" ;
BEGIN
I2C_SCLK<=SCLK;
I2C_CS<='1';
divisor_freq :PROCESS(I2C_CLK)
69
VARIABLE divisor:natural range 0 to 3*DIV:=0;
BEGIN
IF(I2C_CLK'EVENT AND I2C_CLK='1')THEN
IF(divisor>=3*DIV)THEN
divisor:=0; CLK_P<='1';
ELSIF(divisor=2*DIV)THEN
divisor:=divisor+1; CLK_P<='1';
ELSIF(divisor=DIV)THEN
divisor:=divisor+1; CLK_P<='1';
ELSE
divisor:=divisor+1; CLK_P<='0';
END IF;
END IF;
END PROCESS divisor_freq ;
comunicacao : PROCESS(CLK_P)
VARIABLE contador: natural range 0 to 59:=59;
BEGIN
IF CLK_P'EVENT AND CLK_P='0' THEN
IF(contador>=59)THEN
contador:=0;
ELSE
contador:=contador+1;
END IF;
CASE contador IS
-- START
WHEN 0 => SCLK<='1'; I2C_SDATA<='1'; I2C_DONE<='0';
WHEN 1 => SCLK<='1'; I2C_SDATA<='0';
WHEN 2 => SCLK<='0'; I2C_SDATA<='0';
-- Disp. Address
WHEN 3 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(1);
WHEN 4 => SCLK<='1';
WHEN 5 => SCLK<='0';
WHEN 6 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(2);
WHEN 7 => SCLK<='1';
WHEN 8 => SCLK<='0';
WHEN 9 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(3);
WHEN 10 => SCLK<='1';
WHEN 11 => SCLK<='0';
WHEN 12 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(4);
WHEN 13 => SCLK<='1';
WHEN 14 => SCLK<='0';
WHEN 15 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(5);
WHEN 16 => SCLK<='1';
WHEN 17 => SCLK<='0';
WHEN 18 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(6);
WHEN 19 => SCLK<='1';
WHEN 20 => SCLK<='0';
WHEN 21 => SCLK<='0'; I2C_SDATA<=DISP_ADDR(7);
WHEN 22 => SCLK<='1';
WHEN 23 => SCLK<='0';
-- WRITE/READ
WHEN 24 => SCLK<='0'; I2C_SDATA<=WR;
WHEN 25 => SCLK<='1'; I2C_SDATA<=WR;
WHEN 26 => SCLK<='0'; I2C_SDATA<=WR;
-- Verificação de ACKNOWLEGE
WHEN 27 => SCLK<='0'; I2C_SDATA<='Z';
WHEN 28 => SCLK<='1';
WHEN 29 => SCLK<='0';
70
-- Data transfer
WHEN 30 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (1);
END IF;
WHEN 31 => SCLK<='1';
WHEN 32 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(1)<=I2C_SDATA;
END IF;
WHEN 33 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (2);
END IF;
WHEN 34 => SCLK<='1';
WHEN 35 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(2)<=I2C_SDATA;
END IF;
WHEN 36 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (3);
END IF;
WHEN 37 => SCLK<='1';
WHEN 38 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(3)<=I2C_SDATA;
END IF;
WHEN 39 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (4);
END IF;
WHEN 40 => SCLK<='1';
WHEN 41 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(4)<=I2C_SDATA;
END IF;
WHEN 42 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (5);
END IF;
WHEN 43 => SCLK<='1';
WHEN 44 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(5)<=I2C_SDATA;
END IF;
WHEN 45 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (6);
END IF;
WHEN 46 => SCLK<='1';
WHEN 47 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(6)<=I2C_SDATA;
END IF;
WHEN 48 => SCLK<='0';
IF(WR='0')THEN
71
I2C_SDATA<=I2C_DATAIN (7);
END IF;
WHEN 49 => SCLK<='1';
WHEN 50 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(7)<=I2C_SDATA;
END IF;
WHEN 51 => SCLK<='0';
IF(WR='0')THEN
I2C_SDATA<=I2C_DATAIN (8);
END IF;
WHEN 52 => SCLK<='1';
WHEN 53 => SCLK<='0';
IF(WR='1')THEN
I2C_SDATA<='Z';
DATAOUT(8)<=I2C_SDATA;
END IF;
-- Verificação de ACKNOWLEGE
WHEN 54 => SCLK<='0'; I2C_SDATA<='Z';
WHEN 55 => SCLK<='1';
WHEN 56 => SCLK<='0';
-- STOP
WHEN 57 =>SCLK<='0'; I2C_SDATA<='0';
WHEN 58 =>SCLK<='1'; I2C_SDATA<='0';
WHEN 59 =>SCLK<='1'; I2C_SDATA<='1';
I2C_DONE<='1';
I2C_DATAOUT <=DATAOUT;
END CASE;
IF (contador > 0) AND (contador < 3) THEN ESTADO <= START;
ELSIF (contador > 2) AND (contador < 24)THEN ESTADO <= ADDR;
ELSIF (contador > 23) AND (contador < 27)THEN ESTADO <= WRR;
ELSIF (contador > 26) AND (contador < 30)THEN ESTADO <= ACK1;
ELSIF (contador > 29) AND (contador < 54)THEN ESTADO <= DATA;
ELSIF (contador > 56) AND (contador < 58)THEN ESTADO <= ACK2;
ELSIF (contador > 55) AND (contador < 60)THEN ESTADO <= STOP; END IF;
END IF;
END PROCESS comunicacao;
END do;