RTV forum PL | NewsGroups PL

Generator Dźwięku w VHDL na płytce TREX C1 z układem Altera Cyclone EP1C6Q240C8

VHDL generator dzwieku

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Generator Dźwięku w VHDL na płytce TREX C1 z układem Altera Cyclone EP1C6Q240C8

Krystian Rafałowicz
Guest

Thu Feb 08, 2007 3:08 pm   



Witam Serdecznie Szanownych grupowiczów:

Mam do napisania projekt na zaliczenie przedmiotu tematem tego projektu
jest Generator Dzwieku cały Projekt realizowany jest na płytce
TREX C1 zawierającej układ programowalny firmy Altera serii Cyclone
EP1C6Q240C8. Sterowanie układem odbywa się za pomocą przycisków
znajdujących się na płytce.
Generalnie chodzi o to ze po naciśnieciu przycisku ma generować sygnał
(dzwiek) słyszalny w słuchawce podączonej do płytki.
No i nie chodzi mi tak jak powinien nie słysze sygnału (dzwieku) w
słuchawce..Czy może ktoś kiedys projektował coś podobnego.,
Pomóżcie panowie...

Pod spodem zamieszce kod:

4.Działanie powyszego układu zostało opisane w kodzie VHDL:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Main is
port( CLK: in STD_LOGIC; --zegar 27MHz
signal FreqSin: in Integer;
-- signal ClockTimeO: out Integer;
signal IntToCA: out STD_LOGIC_VECTOR(15 downto 0));
type TabIntV is array (integer range <>) of STD_LOGIC_VECTOR(15 downto 0);
end Main;
na wejście 27MHZ wpuszczany jest sygnał zegara częstotliwość
generowanego sinusa
jest wyznaczana za pomocą tego zegara, oraz jest deklarowany typ tablicowy.

architecture Behavioral of Main is
--tablica sinusa
constant
TabSin:TabIntV(0 to 19):=( "1010011110001100", --42892 0
"1100101100111010", --52026 1
"1110011110001100", --59276 2
"1111100110111010", --63930 3
"1111111111111110", --65534 4
"1111100110111010", --63930 5
"1110011110001100", --59276 6
"1100101100111010", --52026 7
"1010011110001100", --42892 8
"0111111111111111", --32767 9
"0101100001110001", --22641 10
"0011010011000011", --13507 11
"0001100001110001", --6257 12
"0000011001000011", --1603 13
"0000000000000000", --0 14
"0000011001000011", --1603 15
"0001100001110001", --6257 16
"0011010011000011", --13507 17
"0101100001110001", --22641 18
"0111111111111111"); --32767 19
Następnie jest deklarowana sama tablica czyli wartości amplitudy w
poszczególnych chwilach w okresie sinusa. Są zapisane w kodzie binarnym.
Cały okres podzielony jest na
20 części. Kolejno przesuwając się o 1/20 okresu otrzymujemy kolejne
wartości sinusa

Signal LiczSin:Integer range 0 to 19 :=0; -licznik kolejnej wartości z
tablicy sinusa;
Signal ClockTime, BClockTime: Integer:=0; -czas trwania zegara
[us](1/20okresu sinusa)
begin
process(CLK, LiczSin, BClockTime) -proces wysyłający do przetwornika CA;
begin
if(RISING_EDGE(CLK) and BClockTime=1) then
-- if(BClockTime=1) then
if (LiczSin<19) then LiczSin<=LiczSin+1;
else LiczSin<=0; end if;
end if;
-- end if;
IntToCA<=TabSin(LiczSin);
end process;

Następnie licznik kolejnej wartości z tablicy sinusa co 1/20 okresu
wysyła 1 wartość do
kolejno bloku a ten kolejny blok wysyła dopiero do przetwornika Cyfrowo
Analogowego

process(FreqSin) --obliczjący opuźnienie;
begin
-- ClockTime<=1000000000/FreqSin; -okres sinusa [ns];
-- ClockTime<=ClockTime/20 -okres wysyłania jednej próbki do
przetwornika CA;
-- ClockTime<=ClockTime/27; -ilość impulsów do odliczenia(CLK we = 27MHz);
-- if (FreqSin=0) then ClockTime<=0;
-- else ClockTime<=1000000000/FreqSin/20/27; end if;
ClockTime<=FreqSin;
-- wait until (CLK='0');
-- ClockTimeO<=ClockTime;
end process;

to jest funkcja która przelicza zadaną częstotliwość na okres z jakimi
powinny pojawiać się
kolejne próbki na przetworniku CA

process(CLK, ClockTime) --timer odmierza czas miedzy próbkami dla
przetwornika CA;
begin
if(RISING_EDGE(CLK)) then
if (BClockTime=0) then BClockTime<=ClockTime;
else BClockTime<=(BClockTime-1); end if;
end if;
-- ClockTimeO<=BClockTime;
end process;
end behavioral;

Proces ten ma za zadanie odmierzać czas miedzy próbkami trafiającymi do
Przetwornika
Cyfrowo Analogowego.


W pliku Ster Vhd. Znajduje się natępujący kod:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Ster is
port( BUTTON: in STD_LOGIC_VECTOR (4 downto 0);
signal FreqSin:out integer); --częstotliwosc sinusa (Hz);
type TabInt is array (integer range <>) of integer;
end Ster;
architecture Behavioral of Ster is
--constant FreqTab: TabInt(0 to 4):=(20000,1000,2000,4000,8000);
constant FreqTab: TabInt(0 to 4):=(92,1851,926,462,231); --
1000000000/FreqSin/20/27 => 1851851/FreqSin
begin

Proces sterowania odbywa się po przez pobranie odpowiednich wartości z
TabInt czyli,
sprawdzane jest który przycisk został naciśnięty i wtedy pobierana jest
odpowiednia wartość
częstotliwości


process(BUTTON) --proces ustawiający częstotliwość generowanego sinusa;
begin
case BUTTON is
when "00001"=> FreqSin<=FreqTab(0);
when "00010"=> FreqSin<=FreqTab(1);
when "00100"=> FreqSin<=FreqTab(2);
when "01000"=> FreqSin<=FreqTab(3);
when "10000"=> FreqSin<=FreqTab(4);
when others=> FreqSin<=0;
end case;
end process;
end behavioral;

Proces BUTTON :
00001 oznacza ,e wciśnięto pierwszy przycisk i zostanie wprowadzona
pierwsza wartość z FreqSin_i kolejne wartości do 4.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity OutToCA is

port( CLK: in STD_LOGIC; --zegar 27MHz
signal IntToCA: in STD_LOGIC_VECTOR(0 to 15):="0110000111100111";
-- OLiczInt: out Integer range 0 to 17;
BCK: inout STD_LOGIC:='0'; --zegar dla przetwornika CA
WS: inout STD_LOGIC:='0'; --wybór kanału dla przetwornika CA,
1-lewy kanał 0-prawy kanał
DATA: out STD_LOGIC:='0'); --dane dla przetwornika CA
end OutToCA;

Proces słuy do wysyłania ądanej wartości do przetwornika CA. Generowane
są w nim sygnały sterujące dla przetwornika tzn.: BCK zegar dla przetwornika
,WS wybór kanału dla przetwornika CA 1-lewy kanał 0-prawy oraz DATA dane
dla przetwornika. Wysyłana liczba do przetwornika pobierana jest przy
pomocy16 bitowego wektora.


architecture Behavioral of OutToCA is
signal LiczInt : Integer range 0 to 17 :=17; --licznik wysyłanego
bitu do przetwornika CA, jeśli 17 to nic nie wysyła;
signal BIntToCA:STD_LOGIC_VECTOR(0 to 15):="0110000111100111";
begin
process(CLK) --proces wysyłający do przetwornika CA;
begin
if(rising_edge(CLK)) then
if BIntToCA/=IntToCA And LiczInt=17 then
BIntToCA<=IntToCA;
LiczInt<=0;
WS<='0';
end if;
if LiczInt<16 then --jeśli jest liczba do wysłania
if BCK='1' then
DATA<=BIntToCA(LiczInt);
LiczInt<=LiczInt+1;
end if;
BCK<=Not BCK;
elsif WS='0' And LiczInt=16 then
WS<='1';
LiczInt<=0;
elsif WS='1' And LiczInt=16 then
LiczInt<=17;
end if;
end if;
end process;
-- process(LiczInt) --proces wysyłający do przetwornika CA;
-- begin
-- OLiczInt<=LiczInt;
-- end process;
end behavioral;

Proces OutToCA opisuje licznik wysyłanego bitu do przetwornika CA, jeśli
wystąpi 17 to licznik nie wysyła adnej wartości następnie proces(CLK)
proces wysyłający do przetwornika CA na wstępnie zadeklarowane jest zbocze
narastające z którego wynika e jezeli pojawieniu sie 17 to zacznij
wysyłać odoczątku ,jesli przy pojawieniu sie wartości mniejszej ni 16
inkrementuje sie do 1 .

Program cały jest pisany w Qartusie...

JA
Guest

Thu Feb 08, 2007 4:56 pm   



Krystian Rafalowicz:


Quote:
Mam do napisania projekt na zaliczenie przedmiotu
[...]


moze znajdziesz kogos, kto przeanalizuje ten
kod i znajdzie blad ...

jak nie, to skorzystaj z Signal Tap, narzedzia
do odpluskwiania hardware wbudowanego w quartus,
badz z symulatora, by zobaczyc ktory fragment nie
dziala tak, jak sie spodziewasz;

JA


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Cyrk
Guest

Thu Feb 08, 2007 7:20 pm   



Użytkownik "Krystian Rafałowicz" <krystian_niko@interaia.pl> napisał w
wiadomości news:eqfato$s7l$1@nemesis.news.tpi.pl...
<ciach>
Rozumiem, ze podczas symulowania ukladu wszystko jest ok i na wyjsciu masz
dokladnie taki sygnal jak sobie zyczyles? Dokladnie napisz w ktorym miejscu
cos jest nie tak. Jak przy symulowaniu jest ok, a na plytce nie to zobacz
zworki czy inne DIPy. Plytki "edukacyjne" maja to do siebie, ze wszystko
mozna przestawiac i zmieniac. Jak blad bedzie juz podczas symulacji to
zobacz dokladnie na ktorym bloku cos sie piepszy. Przesledz sygnaly
wejsciowe i wyjsciowe. potem jak ci zostanie z 15 linijek wadliwego kodu to
mozna juz szukac co sprawia problem.

Zdravim

elektroda NewsGroups Forum Index - Elektronika Polska - Generator Dźwięku w VHDL na płytce TREX C1 z układem Altera Cyclone EP1C6Q240C8

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map