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.
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.
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.
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.
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.
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.
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.
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
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 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;
-------------------------------------------------------------------------------------------------------------
-- 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:
:)
Postar um comentário