Professional Documents
Culture Documents
Projektni Zadatak Konacna Verzija
Projektni Zadatak Konacna Verzija
1. PROJEKTNI ZADATAK
Generator sinusnog signala 2
Projektni zadatak:
Projektovati digitalni generator sinusnog signala kod koga se biranjem odgovarajućih vrednosti
konstanti i podtipova može menjati broj odmeraka i broj bitova po odmerku signala.
Vrednosti odmeraka sinusnog signala čuvaju se u “lookup” tabeli (Napomena: ”Lookup” tabelu
formirati za određen konkretan broj odmeraka i broj bitova po odmerku). Da bi se ostvarila
ušteda u memoriji “lookup” tabela treba da sadrži samo vrednosti odmeraka sinusnog signala u
opsegu od π/2 radiana. Drugih π/2 radiana je slika prvih π/2 radiana po vremenu, a preostalih π
radiana je slika po amplitudi prvih π radiana.
Rad treba da sadži opis funkcije svakog bloka na VHDL-u, šemu implementacije koja je
rezultat opisa, talasne oblike napona koji dokazuju ispravnost implementacije, projekat layout-a,
i tekstualna objašnjenja.
PREDMETNI NASTAVNIK
2. UVOD
Generator sinusnog signala 3
Tehnike za ovakvo projektovanje zahtevaju pisanje po jedne jednačine za svaki ulaz flip-
flopa ili bloka gejtova. Ova tehnika je zato veoma nepraktična za velike projekte.
Uprkos lakoći upotrebe logičkih jednačina i šematskog projektovanja ovi metodi imaju i
nedostataka. Najvažniji je taj što se sistem uvek predstavlja kao mreža međusobno povezanih
elemenata, a na taj način specifikacija sistema ne treba da bude kreirana i predstavljena.
Specifikacija sistema je uvek data u obliku očekivanog ponašanja sistema tj. šta sistem radi u
određenim slučajevima.
Još jedan nedostatak ovih metoda projektovanja je rešavanje velike složenosti projekta.
Kada se prešlo na šematsko projektovanje, prihvaćeno je da šeme sa preko šest hiljada gejtova
postaju nerazumljive.
VHDL je akronim, a sastoji se od alfabetskih znakova “V” koje potiče od Very High Speed
Integrated Circuit (Integrisano kolo velike brzine), i “HDL” koji znači jezik za opis hardvera.
Ovaj jezik, kao i ime, potiče od Američkog ministarstva odbrane koje je prvo koristilo ovakav
vid projektovanja, modelovanja i simulacije elektronskih sistema. VHDL simulatori su se
pojavili ranih devedesetih. Sinteza nije bio jedan od razloga za stvaranje VHDL jezika. VHDL
uglavnom služi za simulaciju i modelovanje. Sinteza je dodata kao način da se automatizuje
proces projektovanja. Prvi VHDL standard uključen u IEEE (Institute of Electrical and
Electronic Engineers-institut inženjera elektrotehnike i elektronike) pojavio se 1987. godine i
postao dostupan širim krugovima za korišćenje. Prateći zakone IEEE revidiran je 1993. godine, i
1998 (Svi IEEE standardi se moraju revidirati svakih pet godina). Različite ekspertske grupe
učinile su VHDL još univerzalnijim. Na taj način je IEEE STD 1164 standard proširio VHDL
jezik sa logikom sa više nivoa koja služi za opis realnih sistema.
VHDL ne ograničava korisnika na samo jedan tip opisa. On se može koristiti kao strukturni
jezik (obezbeđujući tekstualnu verziju šema) i kao jezik ponašanja. Ova dva tipa se mogu mešati.
VHDL se koristi na različitim nivoima složenosti: od jednog tranzistora do kompletnih sistema, a
sve ostaje u istom okruženju VHDL simulacije.
Iako je VHDL namenjen za elektroniku koristi se i u drugim oblastima, kao sto su:
elektromehanika, hidraulika, hemija i druge, za modelovanje.
U ovom projektu je odabran VHDL jezik. VHDL kod je prvo opisan na funkcijskom nivou,
zatim sledi funkcijska verifikacija VHDL koda i sinteza u gejt nivo kola. Nivo gejta se simulira u
verifikaciji vremenskih ograničenja.
Postoje dva najopštija metoda za sintezu generatora sinusnog oblika signala različite frekvencije,
i to:
Bitni elementi indirektne metode su naponski upravljan oscilator i fazna povratna veza sa
deliteljem frekvencije. Delitelj je obično u formi digitalnog brojača. Na ovaj način se mogu
dobiti samo celi umnožci frekvencije. U praksi se ovako ne može dobiti širok spektar
frekvencije, zato što komparator ima ograničen frekventni opseg. Takođe, teško je napraviti
visokofrekventni VCO sa širokim frekventnim opsegom. Ovaj princip je prikazan na sledećoj
slici (sl.3.1) .
slika 3.1
Na slici 3.2 je data šema koja prikazuje princip sa kojim je moguće dobiti periodični signal bilo
kog oblika, upotrebom odgovarajućeg ROM-a.
Na sličnom principu je realizovan i ovaj projekat mada on u sebi ne sadrži deo za DA konverziju
i filtar . Na istoj slici prikazan je projekat generatora funkcija koji proizvodi sinusoidalne talase.
Sinteza talasnih oblika je bazirana na direktnoj digitalnoj sintezi (DDS).
DDS se izvodi na taj način što se prvo generiše vremenski promenljivi signal u digitalnom
domenu. To nam omogućava brzo prelaženje sa jedne na drugu izlaznu (generisanu) frekvenciju,
finu frekventnu rezoluciju i rad u širokom spektru frekvencija.
Danas, ovakvi uređaji imaju veliku gustinu pakovanja, malu snagu, i nisku cenu.
Jezgro DDS uređaja se sastoji iz sledećih delova: faznog akumulatora, memorije (“lookup”
tabele), i D/A konvertora, kao što je prikazano na blok šemi (slici) 3.2.
slika 3.2
Izlazna frekvencija zavisi od dve promenljive: referentne klok frekvencije i binarnog broja
smeštenog u prihvatni registar. Glavni ulaz u fazni akumulator čini ovaj binarni broj. Fazni
akumulator izračunava adresu za svaki klok ciklus i adresira memoriju za “lookup” tabelu. Iz
memorije (“lookup” tabele) se dobija vrednost za izlaznu digitalnu amplitudu (fazni priraštaj
definisan binarnim brojem na serijskom ulazu).
Generator sinusnog signala 7
Ako je fazni priraštaj veliki, akumulator će “protrčati” kroz sinusnu “lookup” tabelu i na
taj način generisati visokofrekventni sinusni talas. Ako je fazni priraštaj mali, akumulator će
“odabrati” mnogo više koraka, i na taj način generiše niskofrekventni sinusni talas.
Fazni akumulator na neki način predstvlja brojač neke osnove M, koji akumulira priraštaje
svaki put kada primi klok impuls. Amplituda priraštaja je definisana sa binarnom ulaznom rečju
M. Ova reč formira veličinu faznog koraka, odnosno broj odmeraka. Broj odmeraka je definisan
rezolucijom akumulatora n, koji definiše podešavanje rezolucije DDS-a.
Mxf c
f out = ∀M < 2 n −1
2n
gde je:
Frekventna reč f out je celobrojna. Ovde se frekventna rezolucija dobija za M=1 i jednaka
f clk
je: ∆f = .
2n
Kvalitet izlaznog signala direktno zavisi od kvaliteta referentnog klok signala. Bitni faktori su
frekventna stabilnost, ivična odstupanja, i fazni šum a ako pritom postoje kod referentnog klok
signala preneće se i na izlaz DDS-a.
Recimo još i to da je broj uzoraka, za koji se smatra da je zadovoljena dobra predstava signala, u
memoriji minimum 16384.
Generator sinusnog signala 8
Postoji mnogo značajnih prednosti DDS sinteze u odnosu na tradicionalnu PLL sintezu.
Neke od tih prednosri su: brzo vreme podešavanja, digitalno kontrolisana frekvencija koja može
biti ispod jednog herca (µHz), fazna rezolucija ispod jednog stepena, nizak fazni šum,
mogućnost daljinske kontrole sistema, eliminisana potreba za manuelno podešavanje sistema i
promene koja su povezana sa starenjem i temperaturnim driftom,eliminisane frekventne
oscilacije i analogno taloženje vremenskih anomalija.Još neke prednosti su vezane za
konkurentnu cenu, integrisanu i malu veličinu pakovnja uz gore navedene visoke performanse.
Neki od metoda za smanjenje veličine ROM-a su: Sunderland’s metod ,smanjuje veličinu ROM-a
za 50%, Nicola’s metod, Bellauoar metod, sa samo 16 tačaka u LUT-u a upotrbljava se za žičane
komunikacije, Rom-less metod, na kom je baziran i ovaj projekat pa će o njemu još biti reči
kasnije.
Hegazi je uočio da tradicionalni DDFS ima različit broj uzoraka sinusnog talasa za različite
izlazne frekvencije. On je predložio metod za generisanje fiksnog broja uzoraka sinusnog talasa
za različite izlazne frekvencije. Takođe tu su metodi vezani za polinome i nelinearne funkcije i
drugi koji se mogu naći u literaturi.
Generator sinusnog signala 9
-- Vhdl opis ulaznog kola.Ovo kolo predstavlja ulazni blok u okviru projekta
--Sluzi za prihvat i definisanje koraka u zavisnosti od rezima rada
library ieee;
use ieee.std_logic_1164.all;
entity ulazno_kolo is
korak_in(6:0)
begin poctes
prihvat:process(reset,clk)
reset
begin test
end if;
end if;
end process;
4.2. BROJAČ
--Vhdl opis brojaca.Ovo kolo sluzi za definisanje kvadranata
--brojac je osnove 2,tj broji do 11(00,01,10,i 11).
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity brojac is
port(reset:in std_logic; --signal za reset
clk:in std_logic; --klok signal
broj: out std_logic_vector(1 downto 0); --izlaz iz brojaca
en_brojac: in std_logic); --dozvola za brojanje
end entity brojac;
U2
--Definisanje arhitekture brojaca
clk broj(1:0)
architecture behaviour of brojac is
en_brojac
begin reset
brojac:process(reset,clk)
variable lok_broj:std_logic_vector(1 downto 0); brojac
begin
if (en_brojac='1')then
lok_broj:=lok_broj+1;
end if;
end if;
broj<=lok_broj;
end process;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kontrola_kvadranata is
port(reset:in std_logic; --reset signal
brojac:in std_logic_vector(1 downto 0); --ulaz sa brojaca
clk: in std_logic; --klok signal
korak: in std_logic_vector(6 downto 0); --Korak
en_brojac:out std_logic; -- dozvola za promenu dvo-bitnog brojaca (smer i
invertovanje)
new_addr: out std_logic_vector(9 downto 0) --vrednost nove adrese
);
end entity kontrola_kvadranata;
U3
--Vhdl opis arhitekture kola za kontrolu kvadranata
clk new_addr(9:0)
signal x, y : std_logic_vector(9 downto 0);
signal pom: std_logic_vector(10 downto 0); korak(6:0)
new_addr<=x;
begin
pom2<=('0'&x)+("0000"&korak);
end process;
else
end if;
end process;
end process;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity rom1023x8 is
port(addr:in std_logic_vector (9 downto 0); --sdresa rom-
a
U4
data:out std_logic_vector (7 downto 0) --izlazni
addr(9:0) data(7:0)
podatak iz roma
);
end entity; rom1023x8
--Definisanje arhitekture za rom
constant rom:rom_niz:=(
"00000000","00000000","00000000","00000001","00000001","00000001","00000010","000
00010","00000010","00000011","00000011","00000100",
"00000100","00000101","00000101","00000101","00000110","00000110","00000111","000
00111","00000111","00001000","00001000","00001001",
"00001001","00001001","00001010","00001010","00001011","00001011","00001011","000
01100","00001100","00001100","00001100","00001101",
"00001101","00001110","00001110","00001110","00001111","00001111","00010000","000
10000","00010000","00010001","00010001","00010010",
"00010010","00010010","00010011","00010011","00010100","00010100","00010100","000
10101","00010101","00010101","00010110","00010110",
"00010111","00010111","00010111","00011000","00011000","00011001","00011001","000
11001","00011010","00011010","00011011","00011011",
"00011011","00011100","00011100","00011101","00011101","00011101","00011110","000
11110","00011111","00011111","00011111","00100000",
"00100000","00100000","00100001","00100001","00100010","00100010","00100010","001
00011","00100011","00100100","00100100","00100100",
"00100101","00100101","00100110","00100110","00100110","00100111","00100111","001
00111","00101000","00101000","00101001","00101001",
"00101001","00101010","00101010","00101011","00101011","00101011","00101100","001
01100","00101100","00101101","00101101","00101110",
"00101110","00101110","00101111","00101111","00110000","00110000","00110000","001
10001","00110001","00110010","00110010","00110010",
"00110011","00110011","00110011","00110100","00110100","00110101","00110101","001
10101","00110110","00110110","00110111","00110111",
"00110111","00111000","00111000","00111000","00111001","00111001","00111010","001
11010","00111010","00111011","00111011","00111011",
"00111100","00111100","00111101","00111101","00111101","00111110","00111110","001
11111","00111111","00111111","01000000","01000000",
"01000000","01000001","01000001","01000010","01000010","01000010","01000011","010
Generator sinusnog signala 14
00011","01000011","01000100","01000100","01000101",
"01000101","01000101","01000110","01000110","01000111","01000111","01000111","010
01000","01001000","01001000","01001001","01001001",
"01001010","01001010","01001010","01001011","01001011","01001011","01001100","010
01100","01001100","01001101","01001101","01001110",
"01001110","01001110","01001111","01001111","01010000","01010000","01010000","010
10001","01010001","01010001","01010010","01010010",
"01010011","01010011","01010011","01010100","01010100","01010100","01010101","010
10101","01010101","01010110","01010110","01010111",
"01010111","01010111","01011000","01011000","01011000","01011001","01011001","010
11010","01011010","01011010","01011011","01011011",
"01011011","01011100","01011100","01011100","01011101","01011101","01011110","010
11110","01011110","01011111","01011111","01011111",
"01100000","01100000","01100000","01100001","01100001","01100010","01100010","011
00010","01100011","01100011","01100011","01100100",
"01100100","01100100","01100101","01100101","01100110","01100110","01100110","011
00111","01100111","01100111","01101000","01101000",
"01101000","01101001","01101001","01101010","01101010","01101010","01101011","011
01011","01101011","01101100","01101100","01101101",
"01101101","01101101","01101101","01101110","01101110","01101110","01101111","011
01111","01110000","01110000","01110000","01110001",
"01110001","01110001","01110010","01110010","01110010","01110011","01110011","011
10011","01110100","01110100","01110100","01110101",
"01110101","01110110","01110110","01110110","01110111","01110111","01110111","011
11000","01111000","01111000","01111001","01111001",
"01111001","01111010","01111010","01111010","01111011","01111011","01111011","011
11100","01111100","01111100","01111101","01111101",
"01111101","01111110","01111110","01111111","01111111","01111111","10000000","100
00000","10000000","10000001","10000001","10000001",
"10000010","10000010","10000010","10000011","10000011","10000011","10000100","100
00100","10000100","10000101","10000101","10000101",
"10000110","10000110","10000110","10000111","10000111","10000111","10001000","100
01000","10001000","10001001","10001001","10001001",
"10001010","10001010","10001010","10001011","10001011","10001011","10001100","100
01100","10001100","10001101","10001101","10001101",
"10001110","10001110","10001110","10001111","10001111","10001111","10010000","100
10000","10010000","10010001","10010001","10010001",
"10010010","10010010","10010010","10010011","10010011","10010011","10010011","100
10100","10010100","10010100","10010101","10010101",
"10010101","10010110","10010110","10010110","10010111","10010111","10010111","100
11000","10011000","10011000","10011001","10011001",
"10011001","10011010","10011010","10011010","10011011","10011011","10011011","100
11011","10011100","10011100","10011100","10011101",
"10011101","10011101","10011110","10011110","10011110","10011110","10011111","100
11111","10011111","10100000","10100000","10100000",
"10100001","10100001","10100001","10100010","10100010","10100010","10100011","101
00011","10100011","10100011","10100100","10100100",
"10100100","10100100","10100101","10100101","10100101","10100110","10100110","101
00110","10100111","10100111","10100111","10100111",
"10101000","10101000","10101000","10101001","10101001","10101001","10101010","101
01010","10101010","10101010","10101011","10101011",
"10101011","10101100","10101100","10101100","10101100","10101101","10101101","101
01101","10101110","10101110","10101110","10101111",
"10101111","10101111","10101111","10110000","10110000","10110000","10110000","101
10001","10110001","10110001","10110010","10110010",
"10110010","10110010","10110011","10110011","10110011","10110100","10110100","101
10100","10110100","10110101","10110101","10110101",
Generator sinusnog signala 15
"10110110","10110110","10110110","10110111","10110111","10110111","10110111","101
11000","10111000","10111000","10111000","10111001",
"10111001","10111001","10111001","10111010","10111010","10111010","10111010","101
11011","10111011","10111011","10111100","10111100",
"10111100","10111100","10111101","10111101","10111101","10111101","10111110","101
11110","10111110","10111110","10111111","10111111",
"10111111","10111111","11000000","11000000","11000000","11000000","11000001","110
00001","11000001","11000010","11000010","11000010",
"11000010","11000011","11000011","11000011","11000011","11000100","11000100","110
00100","11000100","11000101","11000101","11000101",
"11000101","11000110","11000110","11000110","11000110","11000111","11000111","110
00111","11000111","11001000","11001000","11001000",
"11001000","11001001","11001001","11001001","11001001","11001010","11001010","110
01010","11001010","11001011","11001011","11001011",
"11001011","11001011","11001100","11001100","11001100","11001100","11001101","110
01101","11001101","11001101","11001110","11001110",
"11001110","11001110","11001110","11001111","11001111","11001111","11001111","110
10000","11010000","11010000","11010000","11010001",
"11010001","11010001","11010001","11010010","11010010","11010010","11010010","110
10010","11010011","11010011","11010011","11010011",
"11010011","11010100","11010100","11010100","11010100","11010100","11010101","110
10101","11010101","11010101","11010101","11010110",
"11010110","11010110","11010110","11010111","11010111","11010111","11010111","110
11000","11011000","11011000","11011000","11011000",
"11011001","11011001","11011001","11011001","11011001","11011010","11011010","110
11010","11011010","11011010","11011011","11011011",
"11011011","11011011","11011011","11011100","11011100","11011100","11011100","110
11100","11011101","11011101","11011101","11011101",
"11011101","11011110","11011110","11011110","11011110","11011110","11011111","110
11111","11011111","11011111","11011111","11100000",
"11100000","11100000","11100000","11100000","11100001","11100001","11100001","111
00001","11100001","11100001","11100010","11100010",
"11100010","11100010","11100010","11100011","11100011","11100011","11100011","111
00011","11100011","11100100","11100100","11100100",
"11100100","11100100","11100101","11100101","11100101","11100101","11100101","111
00101","11100110","11100110","11100110","11100110",
"11100110","11100110","11100111","11100111","11100111","11100111","11100111","111
00111","11101000","11101000","11101000","11101000",
"11101000","11101000","11101001","11101001","11101001","11101001","11101001","111
01001","11101010","11101010","11101010","11101010",
"11101010","11101010","11101010","11101011","11101011","11101011","11101011","111
01011","11101011","11101100","11101100","11101100",
"11101100","11101100","11101100","11101101","11101101","11101101","11101101","111
01101","11101101","11101101","11101110","11101110",
"11101110","11101110","11101110","11101110","11101110","11101111","11101111","111
01111","11101111","11101111","11101111","11101111",
"11101111","11110000","11110000","11110000","11110000","11110000","11110000","111
10000","11110001","11110001","11110001","11110001",
"11110001","11110001","11110001","11110001","11110010","11110010","11110010","111
10010","11110010","11110010","11110010","11110010",
"11110011","11110011","11110011","11110011","11110011","11110011","11110011","111
10011","11110100","11110100","11110100","11110100",
"11110100","11110100","11110100","11110100","11110100","11110101","11110101","111
10101","11110101","11110101","11110101","11110101",
"11110101","11110101","11110110","11110110","11110110","11110110","11110110","111
10110","11110110","11110110","11110110","11110111",
"11110111","11110111","11110111","11110111","11110111","11110111","11110111","111
Generator sinusnog signala 16
10111","11111000","11111000","11111000","11111000",
"11111000","11111000","11111000","11111000","11111000","11111001","11111001","111
11001","11111001","11111001","11111001","11111001",
"11111001","11111001","11111001","11111010","11111010","11111010","11111010","111
11010","11111010","11111010","11111010","11111010",
"11111010","11111010","11111010","11111010","11111010","11111010","11111011","111
11011","11111011","11111011","11111011","11111011",
"11111011","11111011","11111011","11111011","11111011","11111011","11111011","111
11011","11111100","11111100","11111100","11111100",
"11111100","11111100","11111100","11111100","11111100","11111100","11111100","111
11100","11111100","11111100","11111101","11111101",
"11111101","11111101","11111101","11111101","11111101","11111101","11111101","111
11101","11111101","11111101","11111101","11111101",
"11111101","11111101","11111101","11111101","11111101","11111101","11111110","111
11110","11111110","11111110","11111110","11111110",
"11111110","11111110","11111110","11111110","11111110","11111110","11111110","111
11110","11111110","11111110","11111110","11111110",
"11111110","11111110","11111110","11111110","11111110","11111110","11111111","111
11111","11111111","11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111","11111111","11111111","111
11111","11111111", "11111111","11111111","11111111",
"11111111","11111111","11111111","11111111","11111111","11111111","11111111","111
11111","11111111","11111111", "11111111","11111111",
"11111111","11111111","11111111","11111111");
Begin
data<=rom(conv_integer(addr));
4.5. KOMPLEMENTATOR
--Vhdl opis komplementatora.Ovo kolo je osmobitni dvojicni komplementator.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
kom plem entator
output(8:0)
entity komplementator is
port(input: in std_logic_vector(7 downto 0); --ulaz u
input(7:0)
begin
4.6. MULTIPLEKSER
library ieee;
use ieee.Std_logic_1164.all;
entity mux is
port(ulaz1:in std_logic_vector(7 downto 0); --ulaz direktno U6
sa rom-a
ulaz2:in std_logic_vector(8 downto 0); -- ulaz sa
komplementatora broj1 izlaz(8:0)
izlaz:out std_logic_vector(8 downto 0); --izlaz iz ulaz1(7:0)
mux-a.Ujedno i izlaz celok sistema
broj1:in std_logic --signal sa brojaca,koji definise koji ulaz2(8:0)
signal je na izlazu
);
end entity; mux
end process;
library ieee;
Generator sinusnog signala 18
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity test_blok is
U8
port(Pocetak_testiranja: in std_logic; --signal sa ulaza za
pocetak testiranja
TestiranjeUToku
reset: in std_logic; -- signal za reset
clk: in std_logic; --kolok signal clk
TestiranjeUToku: out std_logic); --izlazni signal ovok
Pocetak_testiranja
bloka
end entity; reset
begin
end process;
--Vhdl opis izlaznog test bloka.Ovo kolo generise posle isteka testiranja
--na izlazu logicku jedinicu ako je kolo ispravno,u suprotnom je logicka nula
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.std_logic_unsigned.all;
Generator sinusnog signala 19
entity izlazni_testbl is
port(clk : in std_logic; --klok signal
muxout : in std_logic_vector(8 downto 0); --ulaz sa mux-a
reset : in std_logic; --signal za reset
testUtoku : in std_logic; --signal iz bloka za test,odredjuje trajanje testa
outtest : out std_logic --izlaz ovog kola,i izlaz celog sistema
);
end izlazni_testbl;
begin
pom<=(others=>muxout(8));
process(clk, reset) is
begin
if reset='1' then suma<=(others=>'0'); --reset
elsif clk'event and clk='1' then
if (testUtoku='1') then suma<=suma+(pom&muxout); --test u toku
end if;
end if;
end process;
end izlazni_testbl;
4.9. GENERATOR
---------------------------------------------------------------------------------------------------
--
-- Title : generator
-- Design : signal_generator
-- Author :0
-- Company :0
--
---------------------------------------------------------------------------------------------------
--
-- File : d:\vlsi projekat\New Folder\signal_generator\compile\generator.vhd
-- Generated : Thu Apr 24 12:31:30 2008
-- From : d:\vlsi projekat\New U7
Folder\signal_generator\src\generator.bde
-- By : Bde2Vhdl ver. 2.01
clk outtest
--
--------------------------------------------------------------------------------------------------- muxout(8:0)
--
reset
-- Description :
-- testUtoku
---------------------------------------------------------------------------------------------------
izlazni_testbl
Generator sinusnog signala 20
entity generator is
port(
clk : in std_logic;
en_korak : in std_logic;
poctes : in std_logic;
reset : in std_logic;
test : in std_logic;
korak : in std_logic_vector(6 downto 0);
outtest : out std_logic;
izlaz : inout STD_LOGIC_VECTOR(8 downto 0)
);
end generator;
component brojac
port (
clk : in STD_LOGIC;
en_brojac : in STD_LOGIC;
reset : in STD_LOGIC;
broj : out STD_LOGIC_VECTOR(1 downto 0)
);
end component;
component izlazni_testbl
port (
clk : in STD_LOGIC;
muxout : in STD_LOGIC_VECTOR(8 downto 0);
reset : in STD_LOGIC;
testUtoku : in STD_LOGIC;
outtest : out STD_LOGIC
);
end component;
component komplementator
port (
input : in STD_LOGIC_VECTOR(7 downto 0);
output : out STD_LOGIC_VECTOR(8 downto 0)
);
end component; U9
component kontrola_kvadranata
port ( clk izlaz(8:0)
brojac : in STD_LOGIC_VECTOR(1 downto 0); en_korak outtest
clk : in STD_LOGIC;
korak : in STD_LOGIC_VECTOR(6 downto 0); korak(6:0)
reset : in STD_LOGIC; poctes
en_brojac : out STD_LOGIC;
new_addr : out STD_LOGIC_VECTOR(9 downto 0) reset
); test
end component;
component mux
port (
generator
Generator sinusnog signala 21
broj1 : in STD_LOGIC;
ulaz1 : in STD_LOGIC_VECTOR(7 downto 0);
ulaz2 : in STD_LOGIC_VECTOR(8 downto 0);
izlaz : out STD_LOGIC_VECTOR(8 downto 0)
);
end component;
component rom1023x8
port (
addr : in STD_LOGIC_VECTOR(9 downto 0);
data : out STD_LOGIC_VECTOR(7 downto 0)
);
end component;
component test_blok
port (
Pocetak_testiranja : in STD_LOGIC;
clk : in STD_LOGIC;
reset : in STD_LOGIC;
TestiranjeUToku : out STD_LOGIC
);
end component;
component ulazno_kolo
port (
clk : in STD_LOGIC;
en_korak : in STD_LOGIC;
korak_in : in STD_LOGIC_VECTOR(6 downto 0);
poctes : in STD_LOGIC;
reset : in STD_LOGIC;
test : in STD_LOGIC;
korak_out : out STD_LOGIC_VECTOR(6 downto 0)
);
end component;
begin
U1 : ulazno_kolo
port map(
clk => clk,
en_korak => en_korak,
korak_in => korak,
korak_out => out_korak,
poctes => poctes,
reset => reset,
test => test
);
Generator sinusnog signala 22
U2 : brojac
port map(
broj => broj,
clk => clk,
en_brojac => en_brojac,
reset => reset
);
U3 : kontrola_kvadranata
port map(
brojac => broj,
clk => clk,
en_brojac => en_brojac,
korak => out_korak,
new_addr => new_addr,
reset => reset
);
U4 : rom1023x8
port map(
addr => new_addr,
data => data
);
U5 : komplementator
port map(
input => data,
output => datakomp
);
U6 : mux
port map(
broj1 => broj(1),
izlaz => izlaz,
ulaz1 => data,
ulaz2 => datakomp
);
U7 : izlazni_testbl
port map(
clk => clk,
muxout => izlaz,
outtest => outtest,
reset => reset,
testUtoku => testUtoku
);
U8 : test_blok
port map(
Pocetak_testiranja => poctes,
TestiranjeUToku => testUtoku,
clk => clk,
reset => reset
);
end generator;
Generator sinusnog signala 23
5. FUNKCIONALNI OPIS
Kao što je već napomenuto ranije, ovaj uređaj se nešto razlikuje u načinu generisanja sinusoide
od onih opisanih u uvodnom delu.On je sačinjen od ulaznok kola (kolo U1 na slici 5.1), brojaca
(kolo U2 na slici 5.1), kontrole kvadranata (kolo U3 na slici 5.1), rom memorije (kolo U4 na slici
5.1), komplementatora (kolo U5 na slici 5.1), multipleksera (kolo U6 na slici), izlaznog test
bloka (koloU7 na slici 5.1), i bloka za testiranje (kolo U8 na slici 5.1). Sa slike 5.1 se vidi da je
blok šema znatno drugačija od blok šeme 3.2. prikazane u uvodnom izlaganju ali su osnovni
principi dosta slični. Ova razlika je rezultat specifičnih zahteva projektnog zadatka koji se
moraju ispuniti u okviru projekta, za razliku od uvodnog dela gde posbni zahtevi nisu od
suštinskog značaja već su princip prikazan na slici 3.2 i predstava o metodama sinteze
prioritetni. Kolo se postavlja u pocetno stanje reset signalom: Ovaj signal ne mora se aktivirati
pri promeni koraka u normalnom radnom režimu. Sistem generiše željeni signal i bez njega.
Ulazno kolo je prvi izdvojeni blok u okviru generatora sinusnog signala. Ovo kolo služi da
prihvati ulaznu programabilnu reč (korak), kojom se definise frekvencija izlaznog signala. Kolo
omogućava dva režima rada i to: normalni režim rada, i režim testiranja. U režimu testiranja
kolo prosledjuje tačno definisanu vrednost koraka na svoj izlaz. Ova vrednost iznosi 0000001.
Ove se vrednosti sa izlaza ulaznog kola prosledjuje dalje, drugim delovima generatora, u
zavisnosti od toga koji su ulazni signali potrebni kom kolu, tako da nisu sva kola direktno vezana
sa ulaznim kolom. Osnovne delove ovog kola čine: ili kolo,multiplekser i registar. Sa ili kola
dolazi dozvola za upis vrednosti koraka na registar. Multiplekser određuje koja će vrednost biti
upisana u registar, u zavisnosti od režima rada. U registru se skladišti vrednost koraka do upisa
nove vrednosti za korak.
Generator sinusnog signala 24
5.2. BROJAČ
Sledeće po redu kolo u okviru generatora je brojač. Ovo kolo je brojač osnove dva, i služi da
definiše kada je nastupio koji kvadrant. Vrednost 00 na izlazu brojača određuje prvi kvadrant,
vrednost 01 drugi, vrednost 10 treći, i vrednost 11 četvrti (slika 5.2). Brojač je povezan sa
multiplekserom i u zavisnosti od vrednosti brojača na izlazu kontroliše rad multipleksera. Ako je
brojač(1)=0 sprovodi pomoću multipleksera na izlaz generatora vrednost sa izlaza rom-a, a ako
je brojač(1)=1 onda na izlaz sprovodi vrednosti sa izlaza komplementatora. Takođe je povezan i
sa kolom kontrola kvadranata sa kojim čini osnovni deo generatora. U ovom kolu brojac
kontrolise kada se primenjuje sabiranje (uvećanje adrese) a kada oduzimanje (smanjenje
vrednosti adrese).
00 01 10 11
0 1 1 1
Q 0 Q 1
Slika 5.2
Modul za kontrolu kvadranata je kontrolna logika koja služi za izračunavanje adrese rom-a
(adresiranje) i generisanje dozvole za brojanje brojača. Ovo kolo vrši uvećanje ili smanjenje
vrednosti adrese za vrednost koraka u zavisnosti od vrednosti na izlazu brojača. Ako je
brojač(0)=0 vrši se sabiranje (uvećanje adrese), a ako je brojač(0)=1 vrši se oduzimanje
(smanjenje adrese). Samo sabiranje i oduzimanje nije dovoljno za generisanje vrednosti za novu
adresu, zato što se javlja prekoračenje za vrednost adrese,u plus i minus. U trenucima kada se
javi prekoračenje ovo kolo generiše signal dozvole za brojanje brojača uz čiju pomoć, na taj
način definiše o kom je kvadrantu reč. Istovremeno definiše i novu početnu vrednost adrese.
Radi lakšeg razumevanja šta se u ovom kolu dešava odnosno šta zapravo radi blok za kontrolu
kvadranata posmatraćemo tri primera na slici 5.3. Uzmimo proste primere da korak uzima
vrednosti UDR=1, UDR=2, UDR=3, i izlazna adresa ima dužinu n=3.
Generator sinusnog signala 26
CLK
UDR=1
111
110
101
100
011
010
001
000
UDR=2
111 0
110
7 1
101
100
6
011
2
010
5
001 3
4
000
UDR=3
111
110
101
100
011
010
001
000
Slika 5.3
Sa slike 5.3 se vidi da za UDR=1 registar menja vrednost od 000 do 111 i da se prekoračenje
rom-a dešava nakon 111 u kom slučaju kolo kontrole kvadranata generiše dozvolu za brojanje
brojača, takođe izračunava vrednost sledeće adrese. Nakon pojave nove početne adrese dozvola
brojanja se ukida. To je trenutak kada je nastala promena kvadranta. Potom kolo kontrole
kvadranata adresira rom unazad dok se ne desi prekoračenje u minus, kada se opet generiše
dozvola brojanja brojača i sledeća adresa i ciklus se na dalje ponavlja. Pošto je ovde korak=001
klok uvećava izlaznu fazu za .
Generator sinusnog signala 27
Za UDR=2, imamo prekoračenje posle 110, a postupak je isti kao u predhodnom slučaju. Modul
za kontrolu kvadranata generiše dozvolu brojanja i novu adresu koja iznosi 110. Zatim nastavlja
sa adresiranjem u nazad sve do narednog negativnog prekoračenja odnosno promene kvadranata
kada opet generiše dozvolu brojanja i novu adresu koja iznosi 000. Na dalje se postupak ponavlja
naizmenično. Ovde promena faze iznosi .
U slučaju kada je UDR=3, prekoračenje nastupa posle 110, modul za kontrolu kvadranata
generiše dozvolu za brojanje brojača i novu vrednost adrese koja iznosi 101. Potom kreće
adresiranje rom-a unazad do ponovnog prekoračenja u minus i promene kvadranta. U tom
trenutku se generiše dozvola za brojanje i nova vrednost adrese koja iznosi 001. Nadalje se
postupak nastavlja i opisane radnje se ponavljaju naizmenično. Slika 5.3, takođe, ilustruje
zavisnost izlazne frekvencije od vrednosti koraka UDR ( o ovom problemu je bilo više reči u
uvodnom delu ).
Kontrola kvadranata služi za izračunavanje faze izlaznog signala, a koja je definisana sa 7-bitnim
korakom (na slici 5.3 označen sa UDR), i frekvencijom referentnog klok signala fclkin sa kojom je
ceo generator sinhronizovan. Vrednost koraka se sabira/oduzima sa vrednošću koja se
generisane unutar ovog kola pri svakom ciklusu klok signala, pa je frekvencija na izlazu:
fout=
gde je: UDR vrednost programibilne reči na ulazu, odnosno koraka koji ima dužinu 7 (D6-D0),
fout izlazna frekvencija i fclkin frekvencija klok signala.
Δf = za UDR=1 pa je
∆f = = fmin
Niže izlazne frekvencije dobijaju se upotrebom niže frekvencije klok signala fclkin.
foutmax=
Za bolje razumevanje zašto su ove vrednosti takve kakve jesu prikazaćemo sinusni signal kao
vektor koji rotira po faznom krugu. Svaka tačka na krugu odgovara ekvivalentnoj tački na
sinusnom signal (vidi sliku 5.4).
Generator sinusnog signala 28
C C
B D
B
D
E UDR A
A 00...0 E A
11...1
F F H
G G
Na slici rastojanje između tačaka B i C ili D i E ili bilo koje dve susedne tačke predstavlja a
Radi ilustracije zavisnosti broja tačaka na krugu od dužine izlazne adrese iz kontrole kvadranata
pogledajmo tabelu 5.1 gde je ova zavisnost prikazana za neke proizvoljne vrednosti indeksa n.
7 128
8 256
12 4096
16 65535
20 1048576
24 16777216
28 268435456
Jedan obrt oko faznog kruga, sa konstantnom brzinom, rezultira u jednom kompletnom ciklusu
izlaznog sinusnog signala.Adresa rom-a u direktnoj je vezi sa tačkama na faznom krugu i sa
tačkama na izlaznom sinusnom signalu. Broj diskretnih tačaka na faznom krugu definisan je
rezolucijom n, kontrole kvadranata. Izlaz kontrole kvadranata je linearan i ne može se direktno
upotrebiti za generisanje sinusnog signala, ili bilo kog drugog signala jer su u principu signali
nelinearni, za to služi sledeći stepen.
Sinusna funkcija je nelinearna i nije je lako generisati. S druge strane, informacija o uglu (fazi) je
po prirodi linearna. Fazni ugao rotira kroz fiksne tačke u svakoj jedinici vremena a vrednost ugla
zavisi od frekvencije signala i data je izrazom ω=2πf. LUT ( “look up” tabela) koja je smeštena u
ROM-u, je upotrebljena za pretvaranje informacije o fazi u informaciju o amplitudi sinusnog
signala. Celokupna informacija o sinusnoj amplitudi potrebna za generisanje sinusnog signala
( do 360° ) je sadržana u prvih 90°. Zato se u ROM smešta samo informacija o prvih 90° (vidi
sliku 5.5). Ovo omogućava ekonomičnije korišćenje ROM-a. Ujedno to predstavlja glavnu
razliku između sistema na slici 3.2 i 5.1.
11...1
DATA
BUS
ADRESS
00...0 BUS 11...1
Takvo korišćenje ROM-a, u ovom projektu, omogućava modul za kontrolu kvadranata, brojač,
komplementator i multiplekser.
5.5. KOMPLEMENTATOR
Generator sinusnog signala 30
Ovaj blok se nalazi između rom-a i multipleksera i vrši komplementiranje izlazne vrednosti iz
rom-a. Ovo kolo predstavlja devetobitni komplementator zato što MSB bit (bit najveće težine)
predstavlja znak.
5.6. MULTIPLEKSER
Test blok je kolo koje služi za određivanje trenutka do kojeg traje test. Drugačije rečeno određuje
trajanje jedne periode sinusnog signala za ulazni korak jednak 0000001. Ovo kolo na svom
izlazu generiše dozvolu za testiranje, za rad izlaznog testbl-a. Osnovni deo ovog kola čine RS
flip-flop I brojač osnove brojanja 12.
Izlazni test blok predstavlja akumulator (akumulacioni sabirač). Ovo kolo vrši sabiranje
vrednosti izlaznog signala od nulte do zadnje vrednosti definisane trajanjem testa i to za vrednost
koraka jednaku 0000001. Praktično kolo vrši određivanje srednje vrednosti izlaznog sinusnog
signala a ona je jednaka nuli. Na izlazu ovog kola nakon vremena potrebnog za testiranje se
generiše logička jedinica ako je suma jednaka nuli (kolo ispravno), u suprotnom se generiše
logička nula.
Kod ovog generator je predviđen paralelan upis informacije o koraku,zato što ceo sistem nema
mnogo ulaznih i izlaznih pinova pa nemamo potrebu za njihovom redukcijom. Ova rdukcija
može se izvršiti serijskim upisom vrednosti koraka ali bismo na taj način znatno redukovali
frekventni opseg generator a izlazna frekvencija bi znatno zavisila od vremena potrebnog za
serijski upis koraka.
Referentni klok signal za generator predviđen je da se dovede spolja, što je jednostavnije. Znamo
da se referentni klok signal dobija od kristalnog oscilatora paralelnog tipa zbog dobrih
karakteristika koje on ima (tačnost, opseg, drift, i dr.). Kada bi se radilo o unutrašnjem kristalu,
on bi morao biti smešten između CLKIN i DGND (pina za masu digitalnog dela kola).
Generator sinusnog signala 31
Testni vektor sadrži sve kombinacije promene ulaznih signala koje su potrebne za testiranje kola.
Redosled promene ulaznih signala može da se zadaje konkurentno, direktnim dodeljivanjem
vrednosti pojedinim signalima ili sekvencijalno, u okviru procesa.
U ovom projektu primenili smo dva test bench-a, za dva odvojena procesa koji se testiraju i to:
test bench za generator u normalnom radu i test bench za generator u režimu testa.
---------------------------------------------------------------------------------------------------
--
-- Title : Test Bench for generator
-- Design : signal_generator
-- Author : Borisav Jovanovic
-- Company : Elektronski fakultet Nis
--
---------------------------------------------------------------------------------------------------
--
-- File : $DSN\src\TestBench\generator_TB.vhd
-- Generated : 4/22/2008, 3:06 PM
-- From : $DSN\compile\generator.vhd
-- By : Active-HDL Built-in Test Bench Generator ver. 1.2s
--
---------------------------------------------------------------------------------------------------
--
-- Description : Automatically generated Test Bench for generator_tb
--
---------------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity generator_tb is
end generator_tb;
component generator
port(
clk : in std_logic; --klok signal
en_korak : in std_logic; --dozvola za upis koraka
poctes : in std_logic; --dozvola za pocetak testiranja
reset : in std_logic; --signal za reset
test : in std_logic; --izbor rezima testiranja
korak : in std_logic_vector(6 downto 0); --vrednost koraka
outtest : out std_logic; --izlaz za testiranje
izlaz : inout std_logic_vector(8 downto 0) ); --izlaz sistema( za sinusoidu)
end component;
Generator sinusnog signala 33
-- Stimulus signals - signals mapped to the input and inout ports of tested entity
signal clk : std_logic:='0'; --definisanje klok signala i njegove pocetne vrednosti
signal en_korak : std_logic:='0'; --definisanje dozvole za upis i pocetne vrednosti
koju ima
signal poctes : std_logic:='0'; --definisanje pocetka testiranja i njegove pocetne
vrednosti
signal reset : std_logic:='0'; --definisanje reset signala i njegove pocetne vrednosti
signal test : std_logic:='0'; --definisanje test signala i njegove pocetne vrednosti
signal korak : std_logic_vector(6 downto 0):="0000001"; --definisanje prve
vrednosti za korak
signal izlaz : std_logic_vector(8 downto 0); --definisanje izlaznog signala za
sinusoidu
-- Observed signals - signals mapped to the output ports of tested entity
signal outtest : std_logic; --definisanje izlaznog signala za test
begin
ENDSIM<=true;
wait;
end process;
end TB_ARCHITECTURE;
Slika 6.1. Sam početak rada (odmah nakon prestanka reset signala)
Generator sinusnog signala 36
Slika 6.2. Trenutak promene frekvencije (levi deo korak=0000001, desni deo korak=0011111)
Generator sinusnog signala 37
Poređenjem slika 6.3 i 6.4 kao i delova na slici 6.2 može se uočiti razlika u frekvenciji izlaznog
signala u zavisnosti od koraka na ulazu.
Generator sinusnog signala 39
library ieee;
use ieee.std_logic_1164.all;
entity generator_tb is
end generator_tb;
component generator
port(
clk : in std_logic; --klok signal
en_korak : in std_logic; --dozvola za upis koraka
poctes : in std_logic; --dozvola za pocetak testiranja
reset : in std_logic; --signal za reset
test : in std_logic; --izbor rezima testiranja
korak : in std_logic_vector(6 downto 0); --vrednost koraka
outtest : out std_logic; --izlaz za testiranje
izlaz : inout std_logic_vector(8 downto 0) ); --izlaz sistema( za sinusoidu)
end component;
-- Stimulus signals - signals mapped to the input and inout ports of tested entity
begin
ENDSIM<=true;
wait;
end process;
end TB_ARCHITECTURE;
Iz ovih dijagrama i mnogih provera koje su vršene tokom projektovanja, može se zaključiti da
kolo ispravno radi i obavlja ono za šta je dizajnirano.
7.ZAKLJUČAK
8. LITERATURA
I drugi.
Generator sinusnog signala 44
SADRŽAJ
Str.
1.PROJEKTNI ZADATAK…………………………………………………………………… 2
2.UVOD……………………………………………………………………………………….. 3
2.1.NASTANAK I ULOGA VHDL-a……………………………………………………… 3
3.METODE SINTEZE GENERATORA SINUSNOG SIGNALA RAZLIČITIH
FREKVENCIJA………………………………………………………………………………. 4
3.1.INDIREKTNA METODA……………………………………………………………… 5
3.2.DIREKTNA METODA…………………………………………………………………. 6
3.3.PREDNOSTI DDS-a U ODNOSU NA TRADICIONALNU PLL SINTEZU…………. 8
3.4.METODI ZA POBOLJŠANJE DDS-a………………………………………………….. 8
4.OPIS SVIH BLOKOVA U VHDL-u……………………………………………………….... 9
4.1.ULAZNO KOLO……………………………………………………………………….. 9
4.2.BROJAČ………………………………………………………………………………… 10
4.3.KONTROLA KVADRANATA………………………………………………………... 11
4.4.ROM…………………………………………………………………………………….. 13
4.5.KOMPLEMENTATOR………………………………………………………………… 16
4.6.MULTIPLEKSER………………………………………………………………………. 17
4.7.BLOK ZA TEST………………………………………………………………………… 17
4.8.IZLAZNI TEST BLOK…………………………………………………………………. 18
4.9.GENERATOR…………………………………………………………………………... 19
5.FUNKCIONALNI OPIS…………………………………………………………………….. 23
5.1.ULAZNO KOLO………………………………………………………………………... 23
5.2.BROJAČ………………………………………………………………………………… 25
5.3.KONTROLA KVADRANATA………………………………………………………... 25
5.4.ROM ili FAZNO-AMPLITUDSKI KONVERTOR……………………………………. 29
5.5.KOMPLEMENTATOR…………………………………………………………………. 30
5.6.MULTIPLEKSER……………………………………………………………………….. 30
5.7.TEST BLOK…………………………………………………………………………….. 30
5.8.IZLAZNI TEST BLOK…………………………………………………………………. 30
5.9.BITNE NAPOMENE……………………………………………………………………. 30
6.TEST BENCH I TALASNI OBLICI………………………………………………………… 31
6.1.VHDL KOD ZA TEST BENCH GENERATORA U NORMALNOM RADU………… 32
6.2.VHDL KOD ZA TEST BENCH GENERATORA U TESTNOM REŽIMU…………… 39
7.ZAKLJUČAK………………………………………………………………………………… 42
Generator sinusnog signala 45
8.LITERATURA………………………………………………………………………………...43