Logika Układów cyfrowych 2 Projekt



Pobieranie 222.14 Kb.
Strona1/2
Data09.05.2016
Rozmiar222.14 Kb.
  1   2


Politechnika Wrocławska

Logika Układów cyfrowych 2

Projekt


Temat:

Odczyt pliku *.wav z SDCard z wizualizacjami VGA


Autorzy:

Kamil Markuszewski 171016

Matełusz Mikłuszka 171001
Prowadzący:

dr inż. Jarosław Sugier


Spis treści


  1. Cel projektu 3

  2. Teoria problemu 4

  3. Opis sprzętu 6

  4. Opis projektu 7

          1. 4.1 Wykorzystane gotowe moduły 7

        1. 4.2 Hierarchia plików źródłowych 12

    1. 4.3 Moduł wyświetlający wizualizacje 13

    2. 4.4 Moduł wyświetlający wizualizacje – sygnały 14

    3. 4.5 Moduł wyświetlający wizualizacje – implementacja 17

        1. 4.6 Wykresy czasowe SIM1 22

          1. 4.7 Raport z syntezy 23




  1. Implementacja 24

  2. Bibliografia 26



  1. Cel projektu

Celem naszego projektu było zaimplementowanie układu wyświetlającego wizualizacji dźwięku na monitorze VGA. Dźwięk pobierany miał być z karty SD umieszczonej w czytniku dołączanym do płytki. Odczytywany dźwięk następnie zamieniany był w pojedyncze próbki wysyłane do głośnika oraz do układu prezentującego wizualizacje.


Wybrana przez nas prezentacja dźwięku miała polegać na wyświetlaniu dwóch słupków prezentujących poziomy głośności, postanowiliśmy także nadać im kolory, niebieski przy najcichszych dźwiękach, zielony przy średnich, oraz czerwony przy głośnych. Było to jednak wykonane w ten sposób, iż przy dużej głośności słupek był trzykolorowy. Dodatkowo dodaliśmy kolejne dwa słupki które stale opadały, jednak nie mogły opaść poniżej wskaźników poziomu dźwięku, one także przybierały różne kolory, ale zawsze były jednokolorowe.


  1. Teoria problemu

Planowanie projektu rozpoczęliśmy od rozważenia sposobu wizualizacji, postanowiliśmy przeglądać próbkowany dźwięk w poszukiwaniu maksimum w określonym kwancie czasu, a następnie to maksimum prezentować. Dźwięk jest w naszym przypadku zwykłym ciągiem liczb 16-bitowych. Poniższa ilustracja pozwala zobrazować naturę problemu.



Sinusoidy ukazują jakiś dźwięk, został on poddany próbkowaniu z większą częstotliwością niż jego częstotliwość, by zgodnie z twierdzeniem Kotielnikowa-Shannona zachować prawidłowo sygnał. Ilość próbek na kwant czasu jest zatem bardzo duży i jak się okazuje o wiele większy niż kwant czasu jaki wybraliśmy do robienia kolejnych partii pomiarów, kwant ten wiązany jest z odświeżaniem monitora. Jeżeli zatem częstotliwość dźwięku oraz próbkowania jest o wiele większa to najprostsze szukanie maksymalnej wartości próbki w zbiorze da nam maksymalną amplitudę w określonym okresie czasu.
Głównym problemem naszego projektu nie był jednak odczyt z karty, ani przetwarzanie sygnału, ale wyświetlanie wyniku na monitorze VGA. Wymagało to od nas wysyłania na port RS-232 określonych bitów odpowiadających za synchronizację poziomą oraz pionową, a także kolory (czerwony, zielony, niebieski) poszczególnych pikseli. VGA jest jednym ze standardów kart graficznych IBM-PC, urządzenia tego typu rysują piksele na ekranie liniami zaczynając od lewego górnego rogu, a kończąc na prawym dolnym. Wymaga to ustawiania w trakcie rysowania odpowiednich bitów synchronizacji, które w zależności od trybu rozdzielczości graficznej należy obsłużyć inaczej.
Początkowo pracowaliśmy na mniejszej rozdzielczości 640x480, gdzie należało ustawić bit synchronizacji wertykalnej po osiągnięciu wartości 2 przez licznik wertykalny, a także bit synchronizacji horyzontalnej po osiągnięciu 96 tyknięć zegara, czyli osiągnięciu wartości 96 przez licznik horyzontalny. Licznik horyzontalny osiągał maksymalnie 800, a wertykalny 512.
Po przejściu na rozdzielczość 800x600 inkrementowany co okres zegara licznik horyzontalny inkrementował co 1040 taktów licznik wertykalny jednocześnie zerując się. Licznik wertykalny był zerowany po osiągnięciu wartości 666. Synchronizacja pozioma wymaga osiągnięcia przez licznik horyzontalny wartości 121, a wertykalna osiągnięcia przez licznik wertykalny wartości 7.
Oczywiście w pozostałych przypadkach bity synchronizacji zawierają wartość logiczną 0, a bity kolorów odpowiednią dla danego położenia.


  1. Opis sprzętu

Projekt został zrealizowany przy pomocy platformy sprzętowej S3Estarter oraz programu Xilinx, oraz języka VHDL.


Układ służący do realizacji projektu:


Urządzenie zostało dodatkowo rozbudowane o czytnik kart SD po jego prawej stronie (1). Do Portu RS-232 (2) został podłączony monitor VGA, a do pinów wyjściowych (3) głośnik, dodatkowo do włączaniu dźwięku posłużyło pokrętło (4), a do wyboru pliku umieszczonego na karcie SD przełączniki (5), do wyświetlania wyświetlacz LCD (6). Programowanie układu oczywiście było zrealizowane za pomocą łącza USB (8), punkt oznacza zasilanie (7). Najważniejszym elementem jest tutaj port łączący się z do monitorem VGA, na który wysyłaliśmy dane rysujące obraz.

  1. Opis projektu

4.1 Wykorzystane gotowe moduły



Naszym pierwszym zadaniem w projekcie było odczytanie pliku dźwiękowego w formacie .wav z karty Secure Digital (SD). Do odczytu danych z tej karty postanowiliśmy użyć gotowego modułu o nazwie WAVreader.




Moduł ten wyposażony jest w szereg w szereg wejść i wyjść, oraz korzysta z innego już stworzonego modułu o nazwie SDC_FileReader, część z tych wejść pokrywa się w obu modułach co pomoże nam w prostszym opisaniu ich.





Przede wszystkim musimy wprowadzić nazwę pliku. Posłuży nam do tego magistrala Fname(7:0). Jak widać możemy tam wprowadzić 8 bitów jednocześnie, zatem uzyskujemy maksymalnie liczbę 255, jest to odpowiednik zapisu pojedynczego znaku w ASCII. Nazwa pliku nie jest dowolna, musi się ona składać z jednego znaku oraz określonego rozszerzenia, a plik musi się znajdować w głównym katalogu na karcie SD. Moduł WAVreader oczywiście nie daje nam możliwości wyboru i domyślnie ustawia rozszerzenie „wav”, jednak gdybyśmy obsługiwali bezpośrednio SDC_FileReader możemy na wejściu Fext(1:0) podać dwa bity, które pozwolą nam ostatecznie określić plik.
Mamy do wyboru :

„ ” dla FExt(1:0) = "00"

„bin” dla FExt(1:0) = "01"

„txt” dla FExt(1:0) = "10"

„wav” dla FExt(1:0) = "11"
Format pliku .wav w module WAVreader również jest określony, musi on mieć 8 lub 16 bitów na próbkę oraz jedną ze standardowych częstotliwości próbkowania: 8, 12, 16, 22.05, 24, 32, 44.1 lub 48 kHz.
Aby rozpocząć odczyt z karty podać 1 na wejście start, wyjście Busy natychmiast przyjmie wartość 1, gdy na wyjściach DO_L(15:0) oraz DO_R(15:0) pojawią się jakieś dane do odczytu DO_Rdy przyjmie wartość 1. Kolejne dane kierowane na te wyjścia będą przetrzymywane w strukturze typu FIFO, a wysłanie ich na wyjścia można wykonać za pomocą pobudzenia wejścia DO_Pop. Gdy dane do odczytu się skończą zarówno Busy jak i DO_Rdy przyjmą stan logicznego zera. Aby przerwać pracę modułu w trakcie jej trwania należy podać jedynkę na wejście Abort.
Dodatkowo moduł rozpoznając plik przekazuje nam kilka jego ustawień: na wyjściu FmtMnS pokaże się informacja o tym czy plik jest w stereo czy w mono, wyjście Fmt8n16 sygnalizuje rozmiar próbek w bitach, a FmtSRate częstotliwość próbkowania. Dodatkowo w zależności od częstotliwości próbkowania na wyjściu SRate_Tick pojawi się taktowanie synchroniczne względem zegara 50MHz.
Oba moduły posiadają również wyjście błędów dzięki któremu możemy się dowiedzieć co w naszym układzie jest nie tak jak być powinno oraz wyjścia SDC_MISO, SDC_MOSI, SDC_SCK, SDC_SS należy podłączyć je do urządzeń zewnętrznych.

Początkowo nasz projekt wyglądał następująco:


Jednak później zrealizowaliśmy go w oparciu o rozbudowany układ znajdujący się pod następującym adresem:


http://www.zsk.ict.pwr.wroc.pl/zsk_ftp/fpga/Test_WAVreader.pdf
Powyższy układ rozbudowaliśmy jedynie o sporej wielkości moduł wyświetlający wizualizacje na monitorze VGA. Finalny przerobiony schemat został pokazany na kolejnej stronie.

4.2 Hierarchia plików źródłowych


Nasz projekt ma wyjątkowo prostą strukturę plików źródłowych. Cała ogólna struktura związana z odczytem dźwięku oraz odtwarzaniem go znajduje się w pliku schematu o nazwie Test_WAVreader.sch. Plik te wykorzystuje zaimplementowany przez nas moduł służący wyświetlaniu o nazwie vga2222.vhd. Ponadto wykorzystujemy w projekcie gotowy moduł FSM_SendSamples.vhd służący obsłużeniu wysyłania pobranych próbek dźwięku. Oczywiście aby połączyć odpowiednie sygnały kodu źródłowego z fizycznymi elementami płytki należało użyć także plików o rozszerzeniu *.ucf.

Pliki:
- Test_WAVreader.sch – ogólny schemat



- vga2222.vhd – wyświetlanie na VGA

- FSM_SendSamples.vhd – wysyłanie próbek

- PS2_USB_SDC.ucf – połączenie z czytnikiem SD

- LCD.ucf – połączenie z wyświetlaczem LCD

- GenIO.ucf – połączenie z portem RS-232 do wyświetlania na VGA

- ADC_DAC.ucf – odtwarzanie dźwięku


4.3 Moduł wyświetlający wizualizacje


Głównym modułem naszego projektu jest moduł vhdl odpowiadający za wizualizacje na monitorze VGA. Pierwsze linijki kodu oznaczają oczywiście załączenie odpowiednich bibliotek.
library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.NUMERIC_STD.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;
Już na ogólnym schemacie można zobaczyć jak wygląda ten element projektu. Posiada on 3 wejścia oraz 5 wyjść. Wejścia to zegar taktujący z częstotliwością 50MHz, a także próbki dźwięku lewego oraz prawego kanału o rozmiarze 16 bitów. Wyjścia to wysyłane na port RS-232 bity odpowiadające za kolor piksela i bity synchronizacji pionowej oraz poziomej. Wyjścia są opisane w pliku GenIO.ucf i odnoszą się bezpośrednio do sprzętu.

entity vga2222 is

port(

clk50_in : in std_logic;

kanal_l : in std_logic_vector (15 downto 0);

kanal_r : in std_logic_vector (15 downto 0);



red_out : out std_logic;

green_out : out std_logic;

blue_out : out std_logic;

hs_out : out std_logic;

vs_out : out std_logic);

end vga2222;

4.4 Moduł wyświetlający wizualizacje - sygnały


Dodatkowe sygnały wykorzystywane w module:
signal licznik : std_logic_vector (31 downto 0);

signal horizontal_counter : std_logic_vector (10 downto 0);

signal vertical_counter : std_logic_vector (10 downto 0);
signal k_l : std_logic_vector (15 downto 0);

signal k_l2 : std_logic_vector (15 downto 0);

signal k_r : std_logic_vector (15 downto 0);

signal k_r2 : std_logic_vector (15 downto 0);

signal licznik : std_logic_vector (31 downto 0);
signal max_l : std_logic_vector (15 downto 0);

signal max_r : std_logic_vector (15 downto 0);
signal k_l_global : std_logic_vector (15 downto 0) := x"0309";

signal k_r_global : std_logic_vector (15 downto 0) := x"0309";


      1. Sygnał: licznik

Początkowo był licznikiem który zerował się po osiągnięciu określonej wartości i wtedy wyświetlaliśmy znalezione maksimum ze zbioru próbek i zaczynaliśmy szukanie maksimum od nowa. Następnie postanowiliśmy zsynchronizować wyświetlanie z odświeżaniem na monitorze, zatem za każdym razem gdy wyświetliliśmy pełny obraz szukaliśmy nowego maksimum, co dało efekt płynności i zredukowało błędy wyświetlania. Częstotliwość próbowania była na tyle duża, iż uzyskane wyniki były wiarygodne.




      1. Sygnał: horizontal_counter

Licznik służący do nadzorowania wyświetlania pikseli w poziomie oraz ustawiania bitów synchronizacji poziomej. Był on w każdym takcie inkrementowany razem z sygnałem „licznik”, a po osiągnięciu odpowiedniej dla danej rozdzielczości ekranu zerowany inkrementując vertical_counter.




      1. Sygnał: vertical_counter

Licznik służący do nadzorowania wyświetlania pikseli w pionie oraz ustawiania bitów synchronizacji pionowej. Inkrementowany za każdym razem gdy zeruje się licznik horizontal_counter. Po osiągnięciu odpowiedniej dla danej rozdzielczości ekranu zerowany.




      1. Sygnał: k_l

Służy do przechowywania znalezionej do wyświetlenia wartości przed samym rysowaniem.




      1. Sygnał: k_r

Służy do przechowywania znalezionej do wyświetlenia wartości przed samym rysowaniem.




      1. Sygnał: k_l2

Przechowuje przed wyświetlaniem wartość pobraną z sygnału max_r, służy do wykonywania operacji na tej wartości. Następnie wartość przepisywana jest do k_l.




      1. Sygnał: k_r2

Przechowuje przed wyświetlaniem wartość pobraną z sygnału max_r, służy do wykonywania operacji na tej wartości. Następnie wartość przepisywana jest do k_r.




      1. Sygnał: max_l

Zmienna przechowująca aktualną maksymalną wartość sygnału kanału lewego. Gdy skończy się wyświetlanie obrazu na VGA przepisywana jest do innej zmiennej w celu wyświetlenia znalezionej wartości, a poszukiwanie maksimum trwa od nowa.




      1. Sygnał: max_r

Zmienna przechowująca aktualną maksymalną wartość sygnału kanału prawego. Gdy skończy się wyświetlanie obrazu na VGA przepisywana jest do innej zmiennej w celu wyświetlenia znalezionej wartości, a poszukiwanie maksimum trwa od nowa.




      1. Sygnał: k_l_global

Zawiera maksimum kanału lewego w danym kwancie czasu, pod warunkiem że jest większe od wcześniej przechowywanej wartości. Zatem wartość ta jest zawsze większa lub równa aktualnemu maksimum, a jednocześnie cały czas dekrementowana, nie spadając poniżej maksimum.




      1. Sygnał: k_r_global

Zawiera maksimum kanału prawego w danym kwancie czasu, pod warunkiem że jest większe od wcześniej przechowywanej wartości. Zatem wartość ta jest zawsze większa lub równa aktualnemu maksimum, a jednocześnie cały czas dekrementowana, nie spadając poniżej maksimum.

4.5 Moduł wyświetlający wizualizacje - implementacja
Całe działanie modułu opiera się o zegar taktujący z częstotliwością 50 Mhz pozostałe operacje dotyczą działania w obrębie tego taktu.
begin

process (clk50_in) begin

if clk50_in'event and clk50_in = '1' then
W każdym takcie wyszukiwane jest maksimum próbek które posłuży następnie do wyświetlenia.
if(kanal_l > max_l)

then

max_l <= kanal_l;

end if;

if(kanal_r > max_r)

then

max_r <= kanal_r;

end if;
Za każdym razem inkrementujemy także licznik horyzontalny o którym była już mowa. Gdy osiągnie on ustaloną dla danej rozdzielczości wartość jest zerowany i inkrementuje licznik wertykalny, któy także przy określonej dla danej rozdzielczości wartości się zeruje.
horizontal_counter <= horizontal_counter+"00000000001";

if (horizontal_counter="10000010000") then

vertical_counter <= vertical_counter+"00000000001";

horizontal_counter <= "00000000000";

end if;

if (vertical_counter="01010011010") then

vertical_counter <= "00000000000";

licznik <= x"00207840";

end if;

Następnie dla konkretnych wartości licznika wysyłamy bity synchronizacji potrzebne do wyświetlania. Są to wartości pobrane z odpowiedniego dokumentu opisującego standard VGA.


if (horizontal_counter > "00000000000" ) and (horizontal_counter < "00001111001" )

then

hs_out <= '0';

else

hs_out <= '1';

end if;

if (vertical_counter > "00000000000" )and (vertical_counter < "00000000111" )

then

vs_out <= '0';

else

vs_out <= '1';

end if;
W chwili gdy licznik osiągnął określoną przez nas wartość zerowaliśmy wartość licznika, z wcześniej wyszukanych wartości maksymalnych max_l i max_r przepisywaliśmy 9 starszych bitów do sygnałów tymczasowych k-l2 oraz k-r2 po wykonaniu tej czynności zerowaliśmy max_l i max_r.
Następnie wartości w k_l2 oraz k_r2 musieliśmy przeskalować tak aby ostatecznie określały wysokość słupków w tym celu odieliśmy od nic 0x307, wartość uzyskana w wyniku odejmowania zapisaliśmy do k_l oraz k_r. Są to wartości określające wysokość środkowych słupków. Aby ustalić wysokość zewnętrznych słupków sprawdzaliśmy czy poprzednie wartości k_l_global oraz k_r_global sa większe od odpowiednio k_l oraz k_r dla danego kanału. Wartości słupków zewnętrznych opadają z określoną prędkością do wysokości odpowiednich im słupków wewnętrznych.

licznik <= licznik + x"1";

if(licznik >= x"0207840") -- stary licznik 17D7840

then

licznik <= x"00000000";

--max_l <= x"c100";



k_l2(8 downto 0) <= max_l(15 downto 7);

k_r2(8 downto 0) <= max_r(15 downto 7);



max_l <= x"0000";

max_r <= x"0000";



k_l <= x"307" - k_l2; -- powinno byc od 258 ale to dla kosmetyki

k_r <= x"307" - k_r2;



if (k_r_global >= k_r)

then

k_r_global <= k_r + x"0001";

else

k_r_global <= k_r_global + x"0001";

end if;



if (k_l_global >= k_l)

then

k_l_global <= k_l + x"0001";

else

k_l_global <= k_l_global + x"0001";

end if;

end if;
Fragment odpowiedzialny za opadanie słupków:
if (k_l_global >= k_l)

then

k_l_global <= k_l + x"0001";

else

k_l_global <= k_l_global + x"0001";

end if;
Aby wyświetlić słupek należy sprawdzić w jakiej pozycji jest obecnie horizontal_counter oraz vertical_counter. Podany niżej fragment prezentuje rysowanie zewnętrznego słupka w położeniu od 0x27a do 0x298 o wysokości zadanej przez wcześniej obliczona wartość k_l_global. Kolor słupka jest zależny od wartości k_l_global. Poniżej zaprezentowany jest fragment wyświetlający słupek zewnętrzny odpowiadający prawemu kanałowi.
if ((horizontal_counter >= x"27A" ) and (horizontal_counter < x"298" ))

and ((vertical_counter >= k_r_global ) and (vertical_counter < "01001011000" ))

then

if(k_r_global > x"190")

then

red_out <= '0';

green_out <= '0';

blue_out <= '1';

else

if(k_r_global > x"150" ) and (k_r_global <= x"190" )

then

red_out <= '0';

green_out <= '1';

blue_out <= '0';

else

red_out <= '1';

green_out <= '0';

blue_out <= '0';

end if;

end if;

else

Słupki wewnętrzne są rysowane w podobny sposób co słupki zewnętrzne. Wysokość słupka jest zależna od k_r lub k_l odpowiednio dla danego kanału. Kolor danego słupka wewnętrznego jest również uzależniony od wysokości z ta różnicą ze słupek może mieć trzy kolory jednocześnie, granice występowania danego koloru na słupku są określone przez odpowiednie instrukcje warunkowe.


Poniżej zaprezentowany jest fragment wyświetlający słupek wewnętrzny odpowiadający prawemu kanałowi.
if ((horizontal_counter >= x"23E" ) and (horizontal_counter < x"25C" ))

and ((vertical_counter >= k_r ) and (vertical_counter < "01001011000" ))

then
if(vertical_counter > x"200")

then


red_out <= '0';

green_out <= '0';

blue_out <= '1';

else


if(vertical_counter > x"150" ) and (vertical_counter <= x"200" )

then


red_out <= '0';

green_out <= '1';

blue_out <= '0';

else


red_out <= '1';

green_out <= '0';

blue_out <= '0';

end if;


end if;

else


red_out <= '0';

green_out <= '0';

blue_out <= '0';

end if;


4.6 Wykresy czasowe SIM
Symulacja przedstawia fragment działania modelu polegający na odpowiednim konwertowaniu sygnału z danego kanału. Symulacja pokazuje wyszukiwanie maksimum z danych podanych na kalane lewym.

Ponieważ aby zaprezentować działanie modułu musieliśmy odpowiednio przeskalować symulacje gdyż wyświetlanie odbywa się co określony okres czasu vertical_counter musi osiągnąć swoja wartość maksymalna w tedy dopiero jest wyświetlany obraz na monitorze vga.

Poniższa symulacja pokazuje ustawienie red_out będącego wyjściem modułu powodującym ustawienie wyświetlania na obecnej pozycji na kolo czerwony.



4.7 Raport z syntezy
Częstotliwość maksymalna



Raport z syntezy




Device Utilization Summary

[-]

Logic Utilization

Used

Available

Utilization

Note(s)

Number of Slice Flip Flops

870

9,312

9%

 

Number of 4 input LUTs

1,655

9,312

17%

 

Number of occupied Slices

1,136

4,656

24%

 

    Number of Slices containing only related logic

1,136

1,136

100%

 

    Number of Slices containing unrelated logic

0

1,136

0%

 

Total Number of 4 input LUTs

1,840

9,312

19%

 

    Number used as logic

1,653

 

 

 

    Number used as a route-thru

185

 

 

 

    Number used as Shift registers

2

 

 

 

Number of bonded IOBs

40

232

17%

 

Number of RAMB16s

1

20

5%

 

Number of BUFGMUXs

1

24

4%

 

Average Fanout of Non-Clock Nets

3.27

 

 






5. Implementacja


Gotowy projekt do swojego działania potrzebuje karty SD na której są umieszczone pliki w formacie wav mające nazwę będącą cyfra w systemie hexadecymalnym 0-f. Nazwa pliku jest istotna gdyż aby wybrać utwór należy posłużyć się czterema przełącznikami, przełączając je w taki sposób aby tworzyły wybrana cyfrę w systemie hexadecymalnym.
Gdy już wybraliśmy odpowiedni utwór, aby go odtworzyć należało przewinąć Rotary w prawa stronę, przewiniecie w lewa stronę powodowało zatrzymanie odtwarzania.

Ilustracja poniżej przedstawia działanie projektu który wyświetla za pomaca modułu vga wizualizacje wybranego przez nas sygnału dźwiękowego w formacie .wav.


Wewnętrzne słupki przedstawiają wartości maksymalne sygnału w określonym fragmencie czasu będącym czasem potrzebnym na wyświetlenie całego obrazu na ekranie dla danego kanału. Słupki te mogą mieć trzy kolory niebieski, zielony lub czerwony, wyświetlenie danego koloru zależy od wartości sygnału.
Zewnętrzne słupki prezentują wartości maksymalne osiągnięte przez słupki wewnętrzne. Słupki te opadają z określoną przez nas prędkością oraz są „podbijane” przez słupki wewnętrzne.

Na poniższym zdjęciu widać działanie układu podczas odtwarzania stosunkowo głośnego dźwięku.





Podsumowanie
Podsumowując, projekt ten wniósł wiele nowego w nasze pojmowanie zagadnień programowania układów cyfrowych. Jest wiele sposobów wizualizacji sygnału dźwiękowego. Nasz projekt wyświetlał wyliczone słupki będące odzwierciedleniem maksimum w krótkim odstępie czasu. Moduł napisany przez nas wyświetlał dynamicznie obraz na monitorze vga, początkowo spora trudność w projekcie stanowiło opanowanie posługiwaniem się wyświetlania obrazów na monitorze vga oraz odpowiednie przekonwertowanie danych gdyż stosowaliśmy nieodpowiednio długie wektory sygnałów przez co pojawiały się nieoczekiwane skoki słupków. Problem ten szybko rozwiązaliśmy.

Koncepcja rozwiązania zmieniała się wraz z rozwojem projektu, stąd też niektóre archaiczne formy w kodzie.




  1. Bibliografia

http://www.zsk.ict.pwr.wroc.pl/zsk_ftp/fpga/Test_WAVreader.pdf

http://www.zsk.ict.pwr.wroc.pl/zsk_ftp/fpga/

http://pl.wikipedia.org/wiki/Secure_Digital

http://pl.wikipedia.org/wiki/Video_Graphics_Array
Jako załącznik dodajemy logi konsoli

Started : "Synthesize - XST".

Running xst...

Command Line: xst -intstyle ise -ifn "D:/koko4/Test_WAVreader.xst" -ofn "D:/koko4/Test_WAVreader.syr"

Reading design: Test_WAVreader.prj

=========================================================================

* HDL Compilation *

=========================================================================

Compiling vhdl file "D:/koko4/FSM_SendSamples.vhd" in Library work.

Entity compiled.

Entity (Architecture ) compiled.

Compiling vhdl file "D:/koko4/vga2222.vhd" in Library work.

Entity compiled.

Entity (Architecture ) compiled.

Compiling vhdl file "D:/koko4/Test_WAVreader.vhf" in Library work.

Entity compiled.

Entity (Architecture ) compiled.

=========================================================================

* Design Hierarchy Analysis *

=========================================================================

Analyzing hierarchy for entity in library (architecture ).

Analyzing hierarchy for entity in library (architecture ).

Analyzing hierarchy for entity in library (architecture ).

=========================================================================

* HDL Analysis *

=========================================================================

Analyzing Entity in library (Architecture ).

WARNING:Xst:2211 - "D:/koko4/Test_WAVreader.vhf" line 183: Instantiating black box module .

WARNING:Xst:753 - "D:/koko4/Test_WAVreader.vhf" line 190: Unconnected output port 'FmtSRate' of component 'WAVreader'.

WARNING:Xst:2211 - "D:/koko4/Test_WAVreader.vhf" line 190: Instantiating black box module .

WARNING:Xst:753 - "D:/koko4/Test_WAVreader.vhf" line 226: Unconnected output port 'SF_CE0' of component 'DACWrite'.

WARNING:Xst:2211 - "D:/koko4/Test_WAVreader.vhf" line 226: Instantiating black box module .

WARNING:Xst:2211 - "D:/koko4/Test_WAVreader.vhf" line 246: Instantiating black box module .

WARNING:Xst:753 - "D:/koko4/Test_WAVreader.vhf" line 273: Unconnected output port 'm_kanal_l' of component 'vga2222'.

WARNING:Xst:753 - "D:/koko4/Test_WAVreader.vhf" line 273: Unconnected output port 'm_kanal_r' of component 'vga2222'.

Entity analyzed. Unit generated.

Analyzing Entity in library (Architecture ).

Entity analyzed. Unit generated.

Analyzing Entity in library (Architecture ).

Entity analyzed. Unit generated

=========================================================================

* HDL Synthesis *

=========================================================================

Performing bidirectional port resolution...

Synthesizing Unit .

Related source file is "D:/koko4/FSM_SendSamples.vhd".

WARNING:Xst:647 - Input > is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:647 - Input > is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

Found finite state machine for signal .

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

| States | 6 |

| Transitions | 10 |

| Inputs | 3 |

| Outputs | 9 |

| Clock | Clk (rising_edge) |

| Reset | Reset (positive) |

| Reset type | asynchronous |

| Reset State | sreset |

| Power Up State | sreset |

| Encoding | automatic |

| Implementation | LUT |

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

Summary:

inferred 1 Finite State Machine(s).

Unit synthesized.

Synthesizing Unit .

Related source file is "D:/koko4/vga2222.vhd".

WARNING:Xst:653 - Signal > is used but never assigned. This sourceless signal will be automatically connected to value 0000000.

WARNING:Xst:653 - Signal > is used but never assigned. This sourceless signal will be automatically connected to value 0000000.

Found 16-bit register for signal .

Found 16-bit register for signal .

Found 1-bit register for signal .

Found 1-bit register for signal .

Found 1-bit register for signal .

Found 1-bit register for signal .

Found 1-bit register for signal

  1   2


©absta.pl 2016
wyślij wiadomość

    Strona główna