VHDL generator dzwieku

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 powyŜszego 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łuŜy 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...

Reply to
invalid unparseable
Loading thread data ...

Krystian Rafalowicz:

[...]

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

Reply to
JA

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.