Gerando formas de onda com auxílio de um FPGA ou CPLD

   Bom pessoal, esse post aqui é copiado e colado da primeiríssima experiência em pdf do meu kit de CPLD Xilinx e AVR, os métodos servem mais pro cara aprender a usar o VHDL, já que, por exemplo no caso da onda senoidal tem um jeito ainda mais fácil de gerar essa sequência! Dê uma olhada na experiência e tente descobrir como, é muito fácil!

Geração de formas de ondas arbitrárias com o conversor DA

  Nesta experiência, com o uso do kit serão
geradas formas de onda senoidal e dente de serra
com o uso de um CPLD ligado a um conversor D/
A de 5 bits.
   Este experimento não utiliza o microcontrolador
ATMEGA16, logo antes de iniciar a gravação do
CPLD, é recomendável que se faça a gravação do
arquivo tristate.hex no microcontrolador, de forma
a manter todas as saídas conectadas ao CPLD em
tristate.

O conversor DA R-2R:

  Do esquema do kit, é fornecido o circuito do
conversor, conforme a figura abaixo.



     Dado que em cada bit de entrada, representados
por DA0 à DA4, há tensões, em níveis VoH ou
VoL, considerando-se VoL (tensão de saída para
nível lógico baixo) igual à 0V e VoH (tensão de
saída para nível lógico alto igual à alimentação do
CPLD (escolhida de acordo com o componente
usado e selecionável em jumper), a partir da
análise das malhas em cada um dos 32 estados
lógicos, foi construída a tabela a seguir.

 
Gerando a forma de onda dente de serra:

Utilizando um contador do tipo crescente, cujos bits de
saída são ligados diretamente à saída do conversor, será
gerada uma forma de onda que é uma reta crescente como
o contador é sempre ativo e seu clock ligado ao clock do
sistema de 50MHz, no seu valor máximo (11111), a
contagem é reiniciada em (00000), de tal forma que há um
salto para 0V, ou seja é uma onda do tipo dente de serra.




Nessa implementação, o contador
recebe o clock referente ao oscilador contido no
kit, cuja freqüência é de 50MHz, a outra fonte de
clock, 6MHz também poderá ser usada, obtendo-se
uma forma de onda dente de serra, porém com
freqüência inferior.
  Como são necessários 32 ciclos de clock para se
gerar a onda, sua freqüência será de 1,56MHz


Gerando a forma de onda senoida:

Para a senóide, afim de se economizar em
recursos do CPLD foram utilizados apenas 4 bits
do conversor, já que a componente fundamental
poderá ser extraída com um filtro, de forma a
diminuir seu conteúdo harmônico obtido nessa
implementação.
  De forma similar ao exemplo anterior, também foi
utilizado um contador, mas agora a contagem será
em função do ângulo na senóide, não diretamente
nos valores de saída.
  Para uma senóide sendo gerada de 0° à 360°, a
próxima tabela indica que tipo de conversão será
utilizada na saída do contador.
  A próxima tabela  apresenta os resultados
convertidos de contagem para valor representativo
da senóide, cujo valor nulo está no meio da escala.


O diagrama em blocos desta implementação é
mostrado a seguir no esquema RTL, relativo à
síntese deste projeto.


Nesta implementação temos um contador e uma
lookup-table diretamente na saída do contador





Assim como no caso anterior a frequencia de saída 
é de 1,56MHz para clock de 50MHz, que pode ser
aumentada usando um clock maior, exemplo 180MHz
ou então se diminuindo o número de contagens, aumentando
assim as componentes não fundamentais do espectro. 

Outros tipos de formas de onda periódicas:

   Outras formas de onda poderão ser criadas se
modificando o conteúdo da lookup-table feita com
a estrutura with-select do caso anterior.
    Tabelas maiores e contadores maiores que estes
podem ser feitas, já que no CPLD XC9536, apenas
28% das macrocélulas foram utilizadas no caso
mais complexo da senóide.

Referências:


XAPP105: A CPLD VHDL Introduction Application
Notes v2.0 (8/01)
http://www.xilinx.com/support/documentation/application_notes/xapp105.pdf
XAPP073: Designing with XC9500 CPLDs - App Note,
V1.3 (01/98)
DS057: XC9572XL High-Performance CPLD Data Sheet
(06/02)
http://www.xilinx.com/support/documentation/data_sheets/ds057.pdf
XC9500 5V In-System Programmable CPLD Family -
Xilinx DS063
http://www.xilinx.com/support/documentation/data_sheets/DS063.pdf


E finalmente os fontes, lembrando a todos os antas de plantão: OMFG

VHDL NÃO É PROGRAMA!!!


----------------------------------------------------------------------------------------------------
--        Laboratorio 1 - Geracao de formas de ondas arbitrarias usando conversor D/A
--   
--    Parte 1: forma de onda dente de serra
--
--    Grave o tristate.hex no AVR antes de iniciar o experimento!
--      
--   
--
--    Copyright:  Arao Hayashida Filho - 2010
----------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity principal is
    Port ( CLOCK : in  STD_LOGIC;
           DA : out  STD_LOGIC_VECTOR (4 downto 0));
end principal;

architecture Behavioral of principal is

signal CONTAGEM : std_logic_vector(4 downto 0);                                           

begin


DA<=CONTAGEM;


-- Contador
process (CLOCK)               
begin
   if (CLOCK'event and CLOCK='1') then 
            CONTAGEM<=CONTAGEM+1;
   end if;
end process;

end Behavioral;
-------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------------------------------------
--        Laboratorio 1 - Geracao de formas de ondas arbitrarias usando conversor D/A
--   
--    Parte 2: forma de onda senoidal
--
--    Grave o tristate.hex no AVR antes de iniciar o experimento!
--      
--   
--
--    Copyright:  Arao Hayashida Filho - 2010
----------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity principal is
    Port ( CLOCK : in  STD_LOGIC;
           DA : out  STD_LOGIC_VECTOR (4 downto 0));
end principal;

architecture Behavioral of principal is

signal CONTAGEM : std_logic_vector(4 downto 0);                                           

begin


-- Lookup-table relativa a senoide
   with CONTAGEM select
   DA<=  "10000" when "00000", -- 0 GRAUS
            "10011" when "00001",  
         "10110" when "00010",  
         "11000" when "00011",  
         "11011" when "00100", 
         "11101" when "00101", 
         "11110" when "00110", 
         "11111" when "00111",
         "11111" when "01000",
         "11111" when "01001",
         "11110" when "01010",
         "11101" when "01011",
         "11011" when "01100",  
         "11100" when "01101",  
         "10110" when "01110",  
         "10011" when "01111",            
            "10000" when "10000", -- 180 GRAUS 
            "01101" when "10001",  
         "01010" when "10010",  
         "01000" when "10011",  
         "00101" when "10100", 
         "00100" when "10101", 
         "00010" when "10110", 
         "00001" when "10111",
         "00000" when "11000",
         "00001" when "11001",
         "00010" when "11010",
         "00100" when "11011",
         "00101" when "11100",  
         "10000" when "11101",  
         "10010" when "11110",  
         "10101" when "11111",           
            "00000" when others;  


-- Contador
process (CLOCK)               
begin
   if (CLOCK'event and CLOCK='1') then 
            CONTAGEM<=CONTAGEM+1;
   end if;
end process;

end Behavioral;

-------------------------------------------------------------------------------------------------------------

   Bom, por enquanto é só, se leu comente, é rapidão!!!!

1 comentários:

Unknown disse...

:)

Postar um comentário