Você está na página 1de 22

Relatrio de Sistemas de Aquisio de Dados

2006/2007

Engenharia Fsica Tecnolgica

AMOSTRAGEM DE SINAIS ANALGICOS POR


UM CIRCUITO ADC COM INTERFACE DE
COMUNICAO SRIE
Laboratrio II

Trabalho realizado por:


Alexandra Gouveia, n53760
Joo Mendes Lopes, n53788
Andr Cunha, n53757
Grupo 3; 4feira 15:00-19:00h

Lisboa, 2 de Junho de 2007

Introduo
O objectivo inicial deste trabalho consiste na implementao do protocolo SPI para a
comunicao de uma FPGA SPARTAN 3 com um dispositivo ADC. Posteriormente
pretende-se adquirir amostras individuais de um sinal analgico constante, para cada
presso manual num interruptor da placa e indicar o resultado no mostrador LCD/LED da
placa emuladora.
Quando se pretende adquirir dados amostrados atravs de um ADC, necessrio que
exista um protocolo de comunicao entre o dispositivo de converso analgica digital,
(que neste caso tem um papel de slave) e o circuito que rege o seu funcionamento (master).
O protocolo SPI um standard de interface srie sncrona e pode ser utilizado para a
comunicao com um ADC, como se pretende neste trabalho. Este protocolo especifica
quatro sinais lgicos de 1 bit para a comunicao srie: o relgio (sinal de sada do master),
um sinal de sada de comando (do ponto de vista do master), um sinal de entrada de dados
(do ponto de vista do master) e um sinal de sada do master, activo a low, designado por chip
select. Por vezes o slave requer que a comunicao seja feita em transies de flanco negativo
do relgio, que o caso do ADC que se pretende utilizar.
Para que a comunicao se inicie, o master deve configurar o relgio para uma frequncia
igual ou inferior frequncia mxima que o slave capaz de suportar. De seguida o master
pe o CS (chip select) a low para que se inicie a comunicao. Durante cada ciclo de relgio
posterior ocorre a transmisso de comando e de dados: o master envia bits para a linha Data
out (do master) que o slave l, enviando de seguida bits pela linha Data in (do master), que so
lidos pelo master. importante referir que o protocolo permite que um master tenha
controlo sobre vrios slaves. Neste caso existem tantas linhas CS quantos os dispositivos a
comandar e o master activa apenas a linha CS do dispositivo com quem pretende trocar
informao.
No caso do projecto que se pretende implementar, o ADC utilizado, MCP3202, funciona
atravs de um protocolo SPI como o descrito acima. Assim, este dispositivo ser um slave,
pretendendo-se programar o master, o dispositivo de controlo do ADC, na FPGA
SPARTAN3, cujo funcionamento foi sumariamente descrito no relatrio primeiro trabalho
de laboratrio. Na Figura 1 encontra-se um diagrama temporal do funcionamento do
sistema a implementar, sob o ponto de vista do ADC (retirado da datasheet deste
dispositivo) correspondente interface SPI MPC 3202 do mesmo.

Figura 1 Diagrama temporal da transferncia de dados SPI do ponto de vista do ADC

Projecto e implementao do protocolo SPI


1 sesso de laboratrio
Material utilizado:
Ambiente de programao XILINX ISE MPLAB e compilador VHDL.
Como este projecto foi algo longo, para alm de ter passado por vrias fases de
implementao, foi sofrendo ao longo das vrias sesses de laboratrio modificaes e
correces. Assim, apresenta-se uma descrio da implementao definitiva para as vrias
fases do projecto em cada sesso de laboratrio, chamando-se a ateno, pontualmente,
para o facto de determinadas opes referentes fase de implementao descrita em cada
parte deste relatrio terem sido tomadas posteriormente.
A primeira sesso de laboratrio consistiu na criao de um projecto VHDL em ambiente
de programao XILINX ISE MPLAB e na implementao do protocolo SPI descrito
acima. Para tal foram definidos os sinais exteriores (para ligao posterior FPGA)
clock50Mhz, reset, din_FPGA, como sinais de entrada, e dout_FPGA, cs_FPGA e clockSPI
como sinais de sada e o sinal interno count (um contador de 50MHz para a programao do
relgio mais lento, clockSPI ). Como a programao foi feita do ponto de vista da FPGA, o
master, o significado destes sinais claro. O sinal clock50Mhz o relgio da prpria FPGA,
como havia sido descrito no primeiro trabalho e o clockSPI um relgio de menor
frequncia, suportada pelo ADC. Como o trabalho de laboratrio anterior havia consistido
precisamente a programao de um relgio mais lento a partir do oscilador da FPGA, para
programar o sinal clockSPI bastou copiar e alterar ligeiramente o cdigo. Como o relgio
em questo deveria ser sempre um sinal exterior, de sada da FPGA, precisando no entanto
de ser utilizado no interior do programa como um sinal de entrada, optou-se por fazer uma
identificao de igualdade entre este sinal e um sinal interno denominado clock50kHz,.
Assim, em vez de se programar directamente o clockSPI, programou-se este ltimo,
segundo o cdigo implementado no primeiro trabalho, para uma frequncia de 50kHz,
suportada pelo ADC utilizado (os valores aconselhados na datasheet esto entre 0.9MHz e
10kHz). Como o cdigo implementado j foi descrito no relatrio do trabalho de
laboratrio anterior, no se apresenta, por agora, o cdigo em questo.
de salientar que nesta fase do projecto foram cometidos dois erros, posteriormente
corrigidos. Primeiro, a frequncia implementada inicialmente era muito elevada, da ordem
do MHz e para alm disso, o clockSPI havia sido inicialmente definido como um sinal
exterior inout, erros que se corrigiram da forma descrita acima na sesso de laboratrio em
que se comunicou pela primeira vez com o ADC.
Posteriormente decidiu-se implementar as vrias fases do protocolo SPI segundo um
diagrama de estados. Para tal definiram-se os vectores internos state (de dois bits),
PALAVRA (de quatro bits), AQUISICAO (de 13 bits), count50kHz (de 25 bits). O
objectivo era ir variando o valor de state em cada fase da comunicao do protocolo SPI,
guardar a palavra de controlo para o ADC (de quatro bits) no vector PALAVRA, guardar
o byte fornecido pelo ADC no vector AQUISICAO e programar um contador de 50kHz
para definir temporalmente determinadas mudanas de valor das variveis em questo.
Foram ainda definidos dois sinais internos de um bit, dout_tmp e cs_tmp.

Projecto e implementao do protocolo SPI


Como foi referido acima, as trocas de informao entre a FPGA e o ADC so feitas no
flanco negativo do relgio. Assim, foi necessrio criar dois processos que corressem em
paralelo. O primeiro consistiu na programao do protocolo para transies em flanco
positivo. O segundo, na actualizao dos valores de sada da FPGA, dout_FPGA e
cs_FPGA, para cada flanco negativo de relgio atravs das variveis internas dout_tmp e
cs_tmp programadas no primeiro processo. Decidiu-se que aps o reset se devia definir o
valor da PALAVRA, (1101 para o modo que se pretende usar no ADC), colocar a
varivel state no valor inicial 0 bem como o contador de 50kHz a 0. Nesta fase o sinal
cs_tmp posto a high. Na PALAVRA, que o comando que enviado da FPGA para o
ADC para permitir a aquisio de valores, o primeiro e o ltimo bit vm a high para garantir
a inicializao e que o bit mais significativo da aquisio da tenso em valores digitais vm
em primeiro lugar para a placa, respectivamente.
O protocolo SPI encontra-se ento implementado da seguinte forma: para cada transio
de flanco positivo do relgio, o contador de 50kHz incrementa; o programa comea no
estado 0. A, espera-se que o contador tenha o valor 1, instante em que se coloca cs_tmp a
low, o bit mais significativo da palavra de comando na linha dout_tmp, deslocam-se os
valores que preenchem o vector PALAVRA para a esquerda e muda-se de estado. No
estado 1, colocam-se os restantes bits da palavra de controlo na linha dout_tmp (durante trs
flancos de relgio colocado o bit mais significativo do vector PALAVRA na linha e de
seguida deslocados para a esquerda o valores que o preenchem) e posteriormente, muda-se
de estado. No estado 3, os bits da sada de dados do ADC din_FPGA (12 bits de dados e
um bit nulo sem valor informativo) so colocados em instantes sucessivos no vector
AQUISICAO, de uma forma semelhante utilizada para colocar a palavra de comando na
linha dout_FPGA. Como a FPGA pode receber a informao para transies de flanco
positivo, no necessrio proceder como no caso de dout_FPGA e cs_FPGA. Quando o
vector se encontra preenchido, passa-se ao estado 3, onde o cs_tmp novamente colocado a
high para que cessem as comunicaes, permanecendo o programa neste estado
indefinidamente.
de salientar que tambm aqui foi cometido um erro, pois inicialmente o protocolo foi
implementado apenas para transies de relgio de flanco positivo, corrigindo-se este erro
na sesso em que se comunicou com o ADC. Nesta fase do projecto, o cdigo era o
seguinte:
--importao de bibliotecas
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--declarao de variveis externas
entity SPI is
Port ( din_FPGA : in STD_LOGIC;
dout_FPGA : out STD_LOGIC;
reset : in STD_LOGIC;
cs_FPGA : out STD_LOGIC;
clock50Mhz : in STD_LOGIC;
clockSPI : out STD_LOGIC);
end SPI;

Projecto e implementao do protocolo SPI


architecture Behavioral of SPI is
--definio de variveis internas
signal PALAVRA: STD_LOGIC_VECTOR (3 downto 0);
signal AQUISICAO: STD_LOGIC_VECTOR (12 downto 0);
signal clock50kHz : STD_LOGIC;
signal count50kHz : STD_LOGIC_VECTOR (24 downto 0);
signal count: STD_LOGIC_VECTOR (24 downto 0);
signal state : STD_LOGIC_VECTOR (1 downto 0);
signal dout_tmp : STD_LOGIC;
signal cs_tmp : STD_LOGIC;
begin
--identificao de clockSPI com clock10kHz
clockSPI <= clock10kHz;
--implementao de um relgio de 50kHz
main:
process (clock50Mhz, reset)
begin
if reset='1' then
count <= (others =>'0');
clock50kHz <= '1';
elsif rising_edge(clock50Mhz) then
count <= count + 1;
if count = 500 then
clock50kHz <= '0';
end if;
if count = 1000 then
clock50kHz <= '1';
count <= (others =>'0');
end if;
end if;
end process;
--implementao do protocolo SPI
--actualizao de dout_FPGA e cs_FPGA em transies de
--flanco negativo do relgio SPI
process (clock50kHz)
begin
if falling_edge(clock50kHz) then
dout_FPGA <= dout_tmp;
cs_FPGA <= cs_tmp;
end if;
end process;

Projecto e implementao do protocolo SPI

process (reset, clock50kHz)


begin
--inicializao de state a 0, do vector PALAVRA a 1101(comando do
--ADC), do contador de 50kHz a 0; colocao de cs_FPGA a 1 atravs
--de cs_FPGA_tmp
if reset='1' then
state <= "00";
PALAVRA <= "1101";
count50kHz <= (others =>'0');
cs_tmp <= '1';
--para cada flanco positivo de relgio
elsif rising_edge(clock50kHz) then
--contador incrementa
count50kHz <= count50kHz + 1;

--no estado 0 iniciam-se as comunicaes atravs da


--colocao de cs_tmp a low, envia-se o start bit (primeiro bit da
--palavra de controlo do ADC) e muda-se de estado
if state= "00" then
if count50kHz = 1 then
cs_tmp <= '0';
dout_tmp <= PALAVRA(3);
PALAVRA(3 downto 1) <= PALAVRA (2 downto 0);
State <= "01";
end if;
end if;

--no estado 1 enviam-se os restantes bits de controlo e


--muda-se de estado
if state= "01" then
dout_tmp <= PALAVRA(3);
PALAVRA(3 downto 1) <= PALAVRA (2 downto 0);
if count50kHz = 4 then
state <= "10";
end if;
end if;

Projecto e implementao do protocolo SPI


--no estado 2 recebe-se a palavra do ADC e muda-se de estado

if state = "10" then


AQUISICAO(0) <= din_FPGA ;
AQUISICAO(12 downto 1) <= AQUISICAO(11 downto 0);
if count50kHz = 18 then
state <= "11";
end if;
end if;

--no estado trs cessam as comunicaes com o ADC atravs da


--colocao de cs_FPGA a high; permenece-se no estado 3
--indefinidamente
if state = "11" then
cs_tmp <= '1';
end if ;
end if;
end process;
end Behavioral;

Depois de implementado o projecto, este foi testado, recorrendo a um ficheiro de teste


gerado pelo programa, configurado de forma a gerar um relgio de 50MHz e um sinal de
reset de forma a poder desencadear o funcionamento do cdigo projectado anteriormente.
O teste em questo foi corrido e verificou-se o bom funcionamento do circuito simulado,
encontrando-se o resultado na Figura 2.

Figura 2 Simulao de 1000s do circuito implementado (foi omitida a varivel din_FPGA, que como
ainda no se havia comunicado com o ADC no variava, bem como o relgio de 50MHz e o reset)

Pode-se verificar o bom funcionamento de todas as variveis em questo. Se se tiver em


ateno a unidade da simulao, em s, pode-se verificar que o relgio tem um perodo de
20ms o que equivale frequncia desejada de 50kHz. Por outro lado, visvel que no
instante em que o chip select vai a low se inicia e comunicao e comeam a ser enviados os
bits de controlo, sempre para flancos de relgio negativos. Depois de enviados os quatro
bits 1101, verifica-se a existncia de um intervalo equivalente a treze flancos positivos para
a transio da informao do ADC para a FPGA e imediatamente de seguida o chip select
volta a high, na transio seguinte de flanco negativo do relgio.

Projecto e implementao do funcionamento dos displays de sete segmentos


Embora no se consiga ver a continuao da simulao, verificou-se que este sinal
permanecia constante a high indefinidamente. Assim, uma vez verificado o bom
funcionamento do circuito simulado, passou-se fase seguinte da programao.
2 e 3 sesses de laboratrio
Material utilizado:
Ambiente de programao XILINX ISE MPLAB e compilador VHDL;
Kit SPARTAN 3.
Como foi referido na introduo deste trabalho, pretendia-se, para alm de guardar o valor
da aquisio do ADC num vector, visualizar essa aquisio no mostrador LCD/LED da
placa SPARTAN 3. Optou-se pela primeira hiptese, j que assim a visualizao do
resultado da aquisio seria mais fcil. Como possvel concluir atravs da observao da
Figura 1, constante na introduo deste trabalho, o ADC envia um bit inicial, no
informativo, neste caso para o vector AQUISICAO e s depois envia doze bits, para o
mesmo vector, informao referente converso de um sinal analgico constante num
sinal digital. Eram estes doze bits que se pretendiam visualizar, de alguma forma, no LCD
da placa SPARTAN3. Decidiu-se que se iriam agrupar estes bits em trs grupos de quatro
bits e exprimir o valor que cada grupo representava em hexadecimal, usando-se apenas trs
dos quatro displays de sete segmentos existentes na placa. Para compreender o
funcionamento dos displays e a forma como deveriam ser programados para executarem o
que se pretendia, consultou-se o manual da placa SPARTAN 3. Tambm foi facultado um
programa, clock.vhd, j implementado, cuja funo era gerar um sinal de 1MHz, um sinal
de um kHz a partir do anterior e um sinal de 1Hz a partir do segundo, e usando este ltimo
sinal ir incrementado uma varivel, enviada para o display. Quando se copiou o cdigo
descrito para um projecto parte e o respectivo ficheiro clock.ucf, pode-se verificar,
atravs da passagem do programa para a placa FPGA SPARTAN 3 o valor dos displays a
incrementar em cada segundo. Para alm disso foi fornecido um ficheiro, associado ao
programa clock.vhd, com a explicao da forma como se deviam enderear os portos dos
displays. Daqui retiraram-se dois esquemas que constam nas Figuras 3 e 4.

Figura 3 Esquema das palavras de endereamento para os displays de sete segmentos

Projecto e implementao do funcionamento dos displays de sete segmentos

Figura 4 Diagrama temporal do funcionamento dos displays de sete segmentos

Constatou-se assim que para aceder aos displays era necessrio actualizar primeiro uma
palavra de sete bits, que decide que segmentos devem acender e posteriormente actualizar
uma palavra de quatro bits que postula qual o display em que esses segmentos devem
acender. Estas palavras so activas a low. A primeira palavra corresponde a uma sequncia
abcdefg (e um bit adicional se se pretender utilizar o ponto, o que no o caso) mapeada
na Figura 3. A segunda palavra deve ser igual a 0111, 1011, 1101 e 1110 para activar
respectivamente o display AN3, AN2, AN1 e AN0. de salientar que de cada vez que se
acende um display ele deve ser apagado no instante seguinte, como se pode observar no
diagrama temporal e que por outro lado, estes dispositivos no dispem de memria e
portanto, para que se consiga visualizar alguma coisa, necessrio que os displays estejam
sempre a ser endereados.
Uma vez compreendido o funcionamento destes dispositivos, decidiu-se que se faria o
comando dos displays no terceiro estado, a partir do qual o valor do chip select permanece a
high. Acrescentaram-se mais dois sinais externos de sada de respectivamente quatro e sete
bits, digit e seg, o primeiro para enderear caracteres e o segundo, segmentos. Foi ainda
acrescentado um vector interno de quatro bits curr para ser actualizado de acordo com os
troos de quatro bits da palavra adquirida e dois sinais definidos como STATE_TYPE que
variavam de S1 a S8, de forma a se poder definir uma srie de estados dentro do estado 3,
para em cada um deles enderear, ligando e desligando, os quatro caracteres. Tinha-se
decidido utilizar, para visualizar a aquisio, apenas trs dos quatro caracteres existentes,
mas por questes do controlo da implementao, programou-se tambm o quarto caracter
para ter um valor constante igual a A. Como a codificao do valor que deve assumir o
sinal seg semelhante para cada estado, definiu-se um modulo VHDL parte, no qual se
implementou exclusivamente este descodificador, de uma forma muito semelhante que
havia sido implementada no projecto clock.vhd.

Projecto e implementao do funcionamento dos displays de sete segmentos


O cdigo deste mdulo, dependente do mdulo principal era o seguinte:
--importao de bibliotecas
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity dec_seg is
Port ( char : in
seg : out
end dec_seg;

STD_LOGIC_VECTOR (3 downto 0);


STD_LOGIC_VECTOR (6 downto 0));

architecture Behavioral of dec_seg is


begin
--codificador para a programao dos sete segmentos
process (char)
begin
--a cada valor de curr corresponde uma representao em hexadecimal
case char is
when "0000" => seg <= "0000001" ;--0
when "0001" => seg <= "1001111" ;--1
when "0010" => seg <= "0010010" ;--2
when "0011" => seg <= "0000110" ;--3
when "0100" => seg <= "1001100" ;--4
when "0101" => seg <= "0100100" ;--5
when "0110" => seg <= "0100000" ;--6
when "0111" => seg <= "0001111" ;--7
when "1000" => seg <= "0000000" ;--8
when "1001" => seg <= "0000100" ;--9
when "1010" => seg <= "0001000" ;--A
when "1011" => seg <= "1100000" ;--b
when "1100" => seg <= "0110001" ;--C
when "1101" => seg <= "1000010" ;--d
when "1110" => seg <= "0110000" ;--E
when "1111" => seg <= "0111000" ;--F
when others => seg <= "1111110" ;
end case ;
end process;
end Behavioral;

Projecto e implementao do funcionamento dos displays de sete segmentos


Como se pode verificar foram definidos dois vectores seg e char que no mdulo principal
correspondem respectivamente a seg e curr. Este mdulo faz a correspondncia directa entre
o valor em hexadecimal que o sinal char representa e a respectiva codificao para a
representao num display genrico.
No modulo principal foi ento feita a importao do mdulo do codificador e a
identificao dos sinais seg e curr com os sinais do modulo dependente seg e char.
Posteriormente foram implementados os estados sucessivos de endereamento de cada
caracter. Em cada estado actualizado o valor de curr, passando-se para este vector o troo
do vector AQUISICAO que se pretende representar. De cada vez que curr actualizado, o
modulo secundrio automaticamente chamado actualizando-se o sinal externo seg. De
seguida actualiza-se o valor da varivel digit para enderear o caracter pretendido. No estado
seguinte actualiza-se este sinal para 1111, de forma a apagar o caracter em questo. Assim,
o cdigo final deste projecto, construdo da forma descrita era o seguinte:
--importao de bibliotecas
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--declarao de variveis externas
entity SPI is
Port ( din_FPGA : in STD_LOGIC;
dout_FPGA : out STD_LOGIC;
reset : in STD_LOGIC;
cs_FPGA : out STD_LOGIC;
clock50Mhz : in STD_LOGIC;
clockSPI : out STD_LOGIC);
end SPI;

architecture Behavioral of SPI is


--importao do modulo descodificador
COMPONENT dec_seg is
Port ( char : in STD_LOGIC_VECTOR (3 downto 0);
seg : out STD_LOGIC_VECTOR (6 downto 0));
end COMPONENT;
--definio de variveis internas
signal PALAVRA: STD_LOGIC_VECTOR (3 downto 0);
signal AQUISICAO: STD_LOGIC_VECTOR (12 downto 0);
signal clock50kHz : STD_LOGIC;
signal count50kHz : STD_LOGIC_VECTOR (24 downto 0);
signal count: STD_LOGIC_VECTOR (24 downto 0);
signal state : STD_LOGIC_VECTOR (1 downto 0);
signal dout_tmp : STD_LOGIC;
signal cs_tmp : STD_LOGIC;
signal curr : STD_LOGIC_VECTOR (3 downto 0) ;
--varivel interna tipo state
type STATE_TYPE is (S1, S2, S3, S4, S5, S6, S7, S8);
signal stateDisp, nextState: STATE_TYPE;

Projecto e implementao do funcionamento dos displays de sete segmentos


begin
--identificao de clockSPI com clock50kHz
clockSPI <= clock50kHz;
--importao do mdulo do descodificador
decoder:
dec_seg PORT MAP(
char=>curr,
seg=>seg
);
--implementao de um relgio de 50kHz
main:
process (clock50Mhz, reset)
begin
if reset='1' then
count <= (others =>'0');
clock50kHz <= '1';
elsif rising_edge(clock50Mhz) then
count <= count + 1;
if count = 500 then
clock50kHz <= '0';
end if;
if count = 1000 then
clock50kHz <= '1';
count <= (others =>'0');
end if;
end if;
end process;

--implementao do protocolo SPI


--actualizao de dout_FPGA e cs_FPGA em transies de
--flanco negativo do relgio SPI
process (clock50kHz)
begin
if falling_edge(clock50kHz) then
dout_FPGA <= dout_tmp;
cs_FPGA <= cs_tmp;
end if;
end process;

Projecto e implementao do protocolo SPI

process (reset, clock50kHz)


begin
--inicializaes
if reset='1' then
state <= "00";
PALAVRA <= "1101";
count50kHz <= (others =>'0');
cs_tmp <= '1';
digit <= (others => '1') ;
curr <= (others => '0') ;
nextState <= S1;
--para cada flanco positivo de relgio
elsif rising_edge(clock50kHz) then
--contador incrementa
count50kHz <= count50kHz + 1;

--no estado 0 iniciam-se as comunicaes atravs da


--colocao de cs_tmp a low, envia-se o start bit (primeiro bit da
--palavra de controlo do ADC) e muda-se de estado
if state= "00" then
if count50kHz = 1 then
cs_tmp <= '0';
dout_tmp <= PALAVRA(3);
PALAVRA(3 downto 1) <= PALAVRA (2 downto 0);
State <= "01";
end if;
end if;

--no estado 1 enviam-se os restantes bits de controlo e


--muda-se de estado
if state="01" then
dout_tmp <= PALAVRA(3);
PALAVRA(3 downto 1) <= PALAVRA (2 downto 0);
if count50kHz = 4 then
state <= "10";
end if;
end if;

Projecto e implementao do protocolo SPI


--no estado 2 recebe-se a palavra do ADC e muda-se de estado

if state = "10" then


AQUISICAO(0) <= din_FPGA ;
AQUISICAO(12 downto 1) <= AQUISICAO(11 downto 0);
if count50kHz = 18 then
state <= "11";
end if;
end if;

--no estado trs cessam as comunicaes com o ADC atravs da


--colocao de cs_FPGA a high; permenece-se no estado 3
--indefinidamente, onde se passa constantemente a aquisio
--para os displays de sete segmentos
if state = "11" then
--cessa a comunicao com o ADC; em cada flanco positivo o
--sinal stateDisp actualizado para nextState
cs_tmp <= '1';
stateDisp <=nextState;

--no primeiro estado, escrito um A no display AN3


if stateDisp = S1 then
curr <= "1010";
digit <= "0111";
nextState <= S2;
--no segundo estado, o display AN3 apagado
elsif stateDisp = S2 then
digit <= "1111";
nextState <= S3;
--no terceiro estado, so escritos os bits das posies 11
--a 8 do vector aquisio no display AN2
elsif stateDisp = S3 then
curr <= AQUISICAO(11 downto 8);
digit <= "1011";
nextState <= S4;
--no quarto estado, o display AN2 apagado
elsif stateDisp = S4 then
digit <= "1111";
nextState <= S5;

Projecto e implementao do protocolo SPI


--no quinto estado, so escritos os bits na posio 7 a 4
--do vector aquisio no display AN1
elsif stateDisp = S5 then
curr <= AQUISICAO(7 downto 4);
digit <= "1101";
nextState <= S6;
--no sexto estado, o display AN1 apagado
elsif stateDisp = S6 then
digit <= "1111";
nextState <= S7;
--no stimo estado, so escritos os quatro bits menos
--significativos do vector aquisio no display AN0
elsif stateDisp = S7 then
curr <= AQUISICAO(3 downto 0);
digit <= "1110";
nextState <= S8;
--no oitavo estado, o display AN0 apagado
elsif stateDisp = S8 then
digit <= "1111";
nextState <= S1;
end if;
--o programa mantm-se no estado 3 indefinidamente,
--enviando continuamente sinais de endereamento para os
--displays
end if;
end process;
end Behavioral;

de salientar que foi esta a parte mais morosa do projecto, j que se demorou algum
tempo a compreender o funcionamento dos displays de sete segmentos, tendo-se cometido
alguns erros, como a troca de ordem de actualizao das variveis seg e digit e o facto de
inicialmente no se ter compreendido que os displays tm que ser continuamente
endereados para se acenderem.

Projecto e implementao do protocolo SPI


Para uma melhor visualizao do funcionamento do programa na sua verso definitiva, foi
construdo um diagrama de estados.

Figura 5 Diagrama de estados do programa implementado

Depois de implementado o projecto, este foi testado, recorrendo ao habitual ficheiro de


teste. Verificou-se o bom funcionamento do circuito simulado, encontrando-se o resultado
na Figura 5. Como nesta altura ainda no se tinha comunicado com o ADC a palavra
AQUISICAO ainda no se encontrava definida. Assim, para fazer o teste, substituram-se
os troos do vector AQUISICAO que actualizavam o vector curr por sequncias fixas de
quatro bits: 0101, 1011 e 1001, equivalentes a 5, b e 9 em hexadecimal.

Projecto e implementao do protocolo SPI

Figura 6 Simulao do funcionamento dos sinais digit e seg

Pode-se verificar o bom funcionamento das variveis em questo. No flanco positivo


anterior ao sinal cs_FPGA voltar a high (num flanco negativo de relgio) o sinal digit
actualizado para o primeiro display (AN3) e no mesmo instante actualizado o sinal seg com
abcdefg equivalente 0001000 ou seja um A. De seguida o valor de digit actualizado para
1111 o que equivale a desligar o caracter que anteriormente havia sido ligado. De seguida
este comportamento repete-se para AN2, AN1 e AN0, para os quais se verificam os
caracteres definidos por seg 5, b e 9 como se pretendia. Embora no se consiga ver a
continuao da simulao, verificou-se que este padro se repetia indefinidamente, como
tambm se pretendia. Assim, uma vez verificado o bom funcionamento do circuito
simulado, voltou-se a programar a actualizao de curr segundo os valores do vector
AQUISICAO.

Aquisio de dados com um ADC com interface SPI MPC3202


4 sesso de laboratrio
Material utilizado:

Ambiente de programao XILINX ISE MPLAB e compilador VHDL;

Kit SPARTAN 3;

Multmetro;

Osciloscpio;

Ligaes unifilares;

Breadboard;

Fonte de alimentao DC e gerador de sinais;

Dispositivo ADC de 12 bits do tipo aproximaes sucessivas com interface SPI


MPC3202.

Uma vez verificado o bom funcionamento do cdigo implementado, pretendiam-se obter


amostras individuais de um sinal analgico para cada presso manual no boto de reset da
placa e visualizar essas aquisies no LCD da placa SPARTAN 3.
Assim, programou-se o ficheiro .ucf, que especifica os portos da placa para os quais se
devem enviar o sinais emulados. O relgio de 50Mhz, bem como os sinais de seg e digit
devem ser enviados para portos especficos, postulados no manual da placa. Para os
restantes sinais escolheram-se os pinos mais acessveis e para o boto de reset escolheu-se o
boto de presso da placa L14. O ficheiro depois de configurado era o seguinte:
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET
NET

"clock50Mhz"
"reset"
"digit<0>"
"digit<1>"
"digit<2>"
"digit<3>"
"seg<0>"
"seg<1>"
"seg<2>"
"seg<3>"
"seg<4>"
"seg<5>"
"seg<6>"
"din_FPGA"
"dout_FPGA"
"cs_FPGA"
"clockSPI"

LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC
LOC

= "T9";
="L14";
= "D14";
= "G14";
= "F14";
= "E13";
= "N16";
= "F13";
= "R16";
= "P15";
= "N15";
= "G13";
= "E14";
= "C5";
= "C7";
= "C9";
= "A3";

Aquisio de dados com um ADC com interface SPI MPC3202


Posteriormente colocou-se o ADC na breadboard ligando-o placa SPARTAN 3 com as
linhas de comunicao necessrias (para alm das ligaes aos pinos do cs_FPGA,
dout_FPGA, din_FPGA e clockSPI, tambm se ligou a massa do dispositivo massa da placa
e a alimentao do dispositivo fonte de 3.3V da placa), consultado a datasheet deste
dispositivo. De seguida, ligou-se a fonte DC varivel (mx. 15V) da placa de alimentao
entrada CH0 do ADC, tendo o cuidado de colocar a fonte no valor mnimo da tenso,
aproximadamente 0V, j que por razes evidentes a tenso do sinal analgico de input do
ADC no pode exceder a tenso de alimentao/referncia. Para se verificar se a
comunicao se estava a efectuar correctamente, ligou-se a cada sinal da FPGA (cs_FPGA,
dout_FPGA, din_FPGA e clockSPI) um canal do osciloscpio e observou-se o andamento
dos sinais em questo, carregando o programa na placa SPARTAN 3 e no boto de reset
L14. Foi tirada uma fotografia do ecr do osciloscpio para uma determinada aquisio (o
display mostrava o valor 021 para o valor de tenso mnimo na base de alimentao). Foi
tambm feita uma aquisio dos valores de cada canal para a referida amostragem, com os
quais se construiu um grfico. Ambos constam nas Figuras 7 e 8.

00
.00 44
00
.00 88
01
3
.00 2
01
.00 76
02
.00 2
02
.00 64
03
.00 08
03
.00 52
03
.00 96
04
4

.00

-.0
0

00
.00 44

T e m p o (s)

4 .0 0
3 .5 0

Tenso (V)

3 .0 0
2 .5 0
2 .0 0
1 .5 0
1 .0 0
.5 0
.0 0
-.5 0

Figura 7 Andamento dos sinais do protocolo SPI (cs a azul claro, dout a amarelo, din a azul escuro
e o relgio a magenta)

Figura 8 Imagem do andamento dos sinais do protocolo SPI (50s/Div)

Aquisio de dados com um ADC com interface SPI MPC3202


Verifica-se que os sinais em questo tm o comportamento previsto. Pode-se constatar que
de facto o sinal de relgio tem uma frequncia de 50kHz e que os sinais cs_FPGA,
dout_FPGA e din_FPGA so modificados para flancos negativos de relgio (este ltimo
enviado para flancos negativos de relgio, como se pode ver na Figura 1, embora seja
recebido pela FPGA em flancos positivos). Observa-se o envio da palavra 1101
nitidamente e tambm se pode observar a recepo da uma palavra 000000100001,
equivalente descrita no display 021. O sinal cs_FPGA est tambm a low e a high nos
instantes previstos. Assim, constatou-se o bom funcionamento do programa. Uma vez
ultrapassada a fase da implementao e montagem do projecto, puderam-se recolher uma
srie de amostras individuais do sinal analgico, para presses sucessivas no reset da placa e
variaes muito suaves da tenso de entrada deste dispositivo. Os valores da tenso de
entrada foram medidos com um multmetro e registados os seus valores e a respectiva
leitura no display da placa. Foram retirados 47 valores que so apresentados no grfico
representado na Figura 9. O objectivo desta leitura exaustiva de valores de entrada e sada
do ADC era a execuo de uma recta de calibrao do ADC e a verificao da boa preciso
do dispositivo ADC utilizado. Para tal, no mesmo grfico apresenta-se a recta terica de
calibrao do ADC, que provm de uma proporcionalidade directa entre a tenso de
referncia (3.3 V) e o nmero mximo possvel gerado por 12 bits:

DOC=

4095. V IN
V DD

com DOC o cdigo digital de sada do ADC, VIN a tenso analgica de entrada e VDD a
tenso de alimentao/referncia.

Anlise dos resultados


O grfico obtido da relao entre os valores de tenso de entrada no ADC medidos pelo
multmetro e os valores lidos no display de 7 segmentos, juntamente com a recta terica de
calibrao do ADC, o seguinte:

Figura 9 Recta de calibrao do ADC utilizado

Pode-se observar a vermelho a recta terica, que corresponde a uma proporcionalidade


directa tendo em conta que o valor mais alto com 12 bits (em decimal corresponde a 4095)
equivale tenso de referncia, Vref= 3.3 V. Pode-se observar que todos os valores obtidos
se encontram sobre a recta, sem nenhuma excepo, o que permite verificar o bom
funcionamento do circuito incorporado e do cdigo implementado e descarregado para a
placa. Foi assumido um erro de 0.0005V nas tenses de entrada, visto corresponder
menor diviso da escala do aparelho usado para leitura das tenses, o multmetro.

Concluses
Com este trabalho, pode-se compreender o funcionamento do protocolo SPI do ADC
utilizado. Para alm disto, o projecto permitiu o contacto com uma placa FPGA
SPARTAN 3, j iniciado no trabalho de laboratrio anterior. Desta vez este contacto foi
aprofundado, tendo-se usado uma srie de sadas da placa, botes de presso e os displays
de sete segmentos. A aprendizagem desta parte do projecto, mais relacionada com o
hardware, foi fundamental. Por outro lado, pode-se aprofundar o conhecimento sobre a
programao em VHDL, que ocupou a maior parte do tempo dedicado a este trabalho.
Nela aprenderam-se uma srie de novos comandos e de regras para construo de um
circuito VHDL, cujo modo de funcionamento difere significativamente das outras
linguagens de programao at aqui aprendidas. O projecto tambm permitiu uma nova
abordagem aos circuitos ADC, atravs da interaco master/slave, regulada pelo protocolo
SPI.
Foi verificado o bom funcionamento do programa atravs de mltiplos testes na fase de
implementao do circuito master e teste do ADC, tendo-se verificado a uma relao de
linearidade entre os valores digitais de sada do dispositivo e valores analgicos do sinal de
tenso constante de entrada, condizente com a recta de calibrao pretendida.
De uma forma geral, pode-se concluir que foram cumpridos os objectivos deste trabalho e
apreendidas os novos conhecimentos a ele associados.
Bibliografia

Manual do kit SPARTAN 3;

datasheet do integrado ADC MCP 3202;

cdigo clock.vhd, clock.ucf e documento anexo.