Knihovny DCE/Library2014 a DCE/Sound2014 The Department of Control Engineering Libraries for Altera Quartus Richard Šusta, 2014, verze 1.0 (11. září 2014), - popis publikován pod GNU Free Documentation License a knihovny samotné pod GNU General Public License
Obsah Obvody pro organizace vodičů v knihovně DCE/Library2014 ........................................................................................... 2 join* - obvody - spojení vodičů ve sběrnici ................................................................................................................... 2 split* - obvody - rozdělení sběrnice na jednotlivé vodiče............................................................................................. 2 Kombinační obvody v knihovně DCE/Library2014 ............................................................................................................ 3 onehot* - dekodéry 1 z N -............................................................................................................................................ 3 mux* - multiplexory neboli výběr jednoho z N vstupů ................................................................................................. 3 convert* - převody mezi binárními a BCD čísly............................................................................................................. 3 display* - zobrazení na 7segmentovém displeji ........................................................................................................... 5 Synchronní obvody v knihovně DCE/Library2014 ............................................................................................................. 6 divider* - Děliče frekvence ........................................................................................................................................... 6 counter* - čítače ........................................................................................................................................................... 6 shift* - posuvné registry ............................................................................................................................................... 8 Obvody zvukového výstupu v knihovně DCE/Sound2014 .............................................................................................. 10
Seznam obrázků Obrázek 1 - Onehot8 bez join* a split* ............................................................................................................................. 2 Obrázek 2 - Onehot8 s join* a split* ................................................................................................................................. 2 Obrázek 3 - Automatické vložení propojek mezi obvody ................................................................................................. 2 Obrázek 4 - Nezapojené výstupy u split* a vstupy u join* ............................................................................................... 2 Obrázek 5 - Použití multiplexoru mux4to1 ....................................................................................................................... 3 Obrázek 6 - Převodník 9bitového binárního čísla na 3 BCD číslice ................................................................................... 4 Obrázek 7 - Převodník 2 BCD číslic na 7bitové binární číslo ............................................................................................. 4 Obrázek 8 - Přidání souboru DE2.sdc ................................................................................................................................ 6 Obrázek 9 - Obvod Divider50M dělící vstupní frekvenci 50 miliony ................................................................................. 6 Obrázek 10 - Ukázka zapojení BCD čítače a binárního čítače ........................................................................................... 7 Obrázek 11 - Čítač counter8bitsStartStop se Start Stop vstupy ....................................................................................... 7 Obrázek 12 - Běhající světlo s obousměrným posuvným registrem shift18bidirload ...................................................... 8 Obrázek 13 - Osmibitový jednosměrný posuvný registr shift8 ......................................................................................... 9 Obrázek 14 - Generování zvuku 750 Hz pomocí de2beep750Hz .................................................................................... 10 Obrázek 15 - Generování zvuku s proměnnou frekvencí pomocí de2beep.................................................................... 10 Obrázek 16 - Použití automatického generování špiček (pins) pro vstupy a výstupy..................................................... 10
1
Obvody pro organizace vodičů v knihovně DCE/Library2014 Obvody organizující vodiče nevytvářejí žádné logické funkce, ale pomáhají zjednodušit kreslení schématu sloučením (join) vodičů (wires) ve sběrnici (bus), nebo naopak rozdělením (split) sběrnice na jednotlivé vodiče.
join* - obvody - spojení vodičů ve sběrnici Obvody: join4wires join8wires join16wires join18wires
split* - obvody - rozdělení sběrnice na jednotlivé vodiče Obvody: split4bus split8bus split16bus split18bus Příklad zapojení: Pomocí organizátorů vodičů lze snadno snížit počet vložených vstupních (input) a výstupních (output) kontaktů (pins/ports). Pokud nějaký obvod potřebuje připojit vstupy/výstupy, které jsou definované jako sběrnice, avšak sám má jednotlivé vstupy/výstupy, pak se musí připojit mnoho konektorů input/output a pojmenovat je, viz obrázek vlevo. Využijeme-li však split* nebo join*, pak všechny vstupy/výstupy spojíme ve sběrnici a připojíme pouze jeden vstup/výstup, viz obrázek vpravo. onehot8 SW[0] SW[1] SW[2] SW[3]
INPUT VCC INPUT VCC INPUT VCC INPUT VCC
A0 A1 A2 EN
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
OUTPUT
LEDR[0] LEDR[1] LEDR[2] LEDR[3] LEDR[4] LEDR[5] LEDR[6] LEDR[7]
OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
Obrázek 2 - Onehot8 s join* a split*
inst1
Obrázek 1 - Onehot8 bez join* a split*
Vkládáme sice dva obvody navíc, ale ty spolu rychle propojíme, pokud využijeme automatické vytvoření propojek, které funguje pro všechny obvody bez rozdílu. Například, vložme split4bus a posuňme ho těsně k obvodu onehot8. Poté překontrolujme, zda máme zapnuté gumové vodiče, tlačítko na liště nástrojů "Use Rubberbanding", a obvod split4bus oddálíme, buď tažením myší, nebo šipkami na klávesnici. Obvody se nám propojily. Use Rubberbanding
Obrázek 3 - Automatické vložení propojek mezi obvody
U obvodů split* nemusíte použít všechny jejich výstupy Wx a u join* lze zase vynechat některé vstupy Wx, viz Obrázek 4. Nutno však poznamenat, že překladač zpravidla nezapojené vstupy připojí na logickou jedničku (Vcc), takže nepoužité LED diody LEDR[1] a LEDR[5] budou trvale svítit. split8bus SW[7..0]
INPUT VCC
B[7..0]
inst
onehot8 W0 W1 W2 W3 W4 W5 W6 W7
A0 A1 A2 EN
join8wires Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
inst1
W0 B[7..0] W1 W2 W3 W4 W5 W6 W7
OUTPUT
LEDR[7..0]
inst3
Obrázek 4 - Nezapojené výstupy u split* a vstupy u join*
Poznámka: Skoro všechny logické obvody dovolují obecně nezapojení svých výstupů, ale naproti tomu jen některé obvody povolují, a to zpravidla jen u vybraných vstupů, aby ty zůstaly nezapojené. Obvody join* jsou výjimkami, u nich lze nezapojit cokoliv.
2
Kombinační obvody v knihovně DCE/Library2014 Výstup kombinačních obvodu závisí pouze na momentálních vstupech, tj. obvody nemají paměť a hodinový signál, ke každé kombinaci hodnot na vstupech existuje právě jedna kombinace hodnot na výstupech.
onehot* - dekodéry 1 z N Obvody: onehot4 onehot8 onehot16 Použití: Přepínač vstupů, demultiplexor. Adresní vstupy A2 A1 A0, kde A2 je nevyšší bit, A0 nejnižší, vybírají číslo n, kódované jako binární, viz tabulka: A2 A1 A0
000
001
010
011
100
101
110
111
Vstup
0
1
2
3
4
5
6
7
Pokud je EN (enable) v logické 1, pak právě jeden výstup, a to Qn, bude v logické 1. Pokud je EN v logické 0, pak jsou všechny výstupy vždy v logické 0. Bereme-li EN jako vstup signálu, pak se jeho stav posílá/připojí na výstup Qn.
Příklad zapojení:
Viz Obrázek 1 nebo Obrázek 2.
mux* - multiplexory neboli výběr jednoho z N vstupů Obvody: mux2to1 mux4to1 mux8to1 mux16to1 Použití: Multiplexory propouštějí na výstup právě jeden vstup, určený hodnotami vstupů adresy SELn, které popisují číslo v binárním kódování, princip je stejný jako u dekodéru onehot*. Multiplexory se hodí jako přepínače, resp. voliče, signálů. Vykonávají opačnou funkci než onehot* dekodéry.
Příklad zapojení: split4bus SW[3..0]
INPUT VCC
B[3..0]
mux4to1 W0 W1 W2 W3
inst2
C0 Y C1 C2 C3 SEL0 SEL1
OUTPUT
LEDR[0]
split4bus KEY[3..0]
INPUT VCC
inst
NOT
inst4
B[3..0]
W0 W1 W2 W3
inst3
Obrázek 5 - Použití multiplexoru mux4to1
Na obrázku nahoře ovlivňuje výstup přepínač SW[n], jehož číslo n je určené stiskem tlačítek KEY[1] a KEY[0], které zadávají binární číslo. LEDR[0] ovlivňuje: a) SW[0], pokud nejsou tlačítka stisknutá (adresa 0); b) SW[1] při stisku jen KEY[0] (adresa 1); c) SW[2]při stisku jen KEY[1] (adresa 2); d) SW[3] při stisku obou tlačítek. Poznámka: Sběrnice KEY[3..0] je celá negovaná invertorem NOT, protože na rozdíl od přepínačů SW dávají tlačítka KEY na výstupu logickou 0, pokud jsou stisknutá, zatímco v uvolněném stavu jsou v logické 1. Kdybychom invertor vynechali, v nestisknutém stavu by výstupy W1 a W0 dolní split4bus obvodu (inst3) měly hodnoty: 1 1 = adresa 3.
convert* - převody mezi binárními a BCD čísly Obvody: convert9bits3BCD convert12bits4BCD convert16bits5BCD - _N_bits_M_BCD převádějí binární číslo o šířce _N_ bitů na _M_ číslic BCD kódu convert2BCD7bits convert3BCD10bits convert4BCD14bits - _M_BCDs_N_bits převádějí _M_ číslic BCD kódu na binární číslo o šířce _N_ bitů Použití:
vzájemný převod mezi BCD a binárním kódováním čísel. BCD čísla dovolují snazší volbu a zobrazení, protože kódují dekadické číslo po číslicích - každá je napsána jedním čtyřbitovým binárním číslem. 3
Například číslo 1234 je v BCD tvaru zapsáno jako 0001 0010 0011 0100 zatímco v binárním tvaru jako 10011010010, ten je sice kratší, ale nedává přímou představu o hodnotě.
Příklady zapojení: display7segBCD
bus16wire SW[15..0]
INPUT VCC
A0 A1 A2 A3 BLANK_IN
convert9bits3BCD
B[15..0]
W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15
B0 B1 B2 B3 B4 B5 B6 B7 B8
BCD0_0 BCD0_1 BCD0_2 BCD0_3 BCD1_0 BCD1_1 BCD1_2 BCD1_3 BCD2_0 BCD2_1 BCD2_2 BCD2_3
BLANK_OUT HEX[6..0]
OUTPUT
HEX0[6..0]
inst3
display7segBCD A0 A1 A2 A3 BLANK_IN
BLANK_OUT HEX[6..0]
OUTPUT
HEX1[6..0]
BLANK_OUT HEX[6..0]
OUTPUT
HEX2[6..0]
inst4
display7segBCD A0 A1 A2 A3 BLANK_IN
inst2
inst
inst5 GND
Obrázek 6 - Převodník 9bitového binárního čísla na 3 BCD číslice
Převodník převede devítibitové binární číslo na 3 BCD číslice, které se zobrazí na 7segmentových displejích. split8bus SW[7..0]
INPUT VCC
B[7..0]
inst4
display7segHex
convert2BCD7bits W0 W1 W2 W3 W4 W5 W6 W7
BCD0_0 BCD0_1 BCD0_2 BCD0_3 BCD1_0 BCD1_1 BCD1_2 BCD1_3
A0 A1 A2 A3
B0 B1 B2 B3 B4 B5 B6
hex[6..0]
OUTPUT
HEX0[6..0]
OUTPUT
HEX1[6..0]
inst display7segHex A0 A1 A2 A3
inst13
hex[6..0]
inst1 GND
Obrázek 7 - Převodník 2 BCD číslic na 7bitové binární číslo
Převodník na Obrázek 7 převádí dvě BCD číslice zadané na přepínačích SW na binární číslo. Horní číslice je na SW[7] až SW[4] a dolní na SW[3] až SW[0]. Binární číslo se zobrazí pomocí převodníků pro 7segmentové displeje v hexadecimálním formátu. Na čtveřicích přepínačů SW jednotlivých BCD číslic se musí zadat jen kombinace vyhovující BCD kódu, tj. binární čísla v rozsahu 0000 (BCD 0) až 1001 (BCD 9). Kombinace 1010 až 1111 jsou zakázané. Pokud se objeví zakázaná kombinace, pak výstup není definovaný. Bude-li stav přepínačů např. SW[7..0] 0111 1001 (= BCD 78), pak na displeji bude správná hodnota 4E, tj. hexadecimální zobrazení dekadického čísla 78. Pokud ale bude na přepínačích SW[7..0] například 0111 1010, kde dolní číslice 1010 není číslo v BCD kódování, pak výsledek bude nesmyslná hodnota 7E (dekadicky 126). Poznámka: Poměrně jednoduchý algoritmus převodu mezi BCD a binárními čísly se vysvětluje na první přednášce předmětu Struktury počítačových systému.
4
display* - zobrazení na 7segmentovém displeji Obvody: display7segBCD display7segHex Použití: zobrazení čísel na BCD displeji. Obvod display7segHex zobrazuje 4bitová čísla jako hexadecimální číslice 0 až F. Naproti tomu obvod display7segBCD má jako vstup čtyřbitové BCD číslo, tj. zobrazuje pouze číslice 0 až 9, binární čísla mimo tento rozsah ukazuje jako nesmyslné symboly. Obsahuje navíc funkci potlačení levých nul, a to při propojení vstupů BLANK_IN a BLANK_OUT. Bez ní by se na dvoumístném displeji zobrazilo číslo 9 jako "09", zatímco při využití potlačení levé nuly se 9 zobrazí jako " 9", tj. první nula zhasne. Čísla větší než 9 se vždy zobrazí celá. Pokud nechcete potlačování levých nul použít, zapojte všechny BLANK_IN na logickou 1 (Vcc). Příklady zapojení: Ukázku zapojení display7segBCD najdete na Obrázek 6, kde jsou využité i vstupy BLANK_IN a BLANK_OUT. Obvod pro nejvyšší číslici má BLANK_IN připojený na logickou nulu, neboť nad ním již nejsou číslice, tj. jsou tam hypotetické 0. Další obvody se pak řadí do řetězce BLANK_OUT a BLANK_IN. Velmi jednoduché zapojení obvodu display7segHex najdete na Obrázek 7. Oba převodníky pro displej jsou pak použité i na Obrázek 10 - Ukázka zapojení BCD čítače a binárního čítače, na straně 7.
5
Synchronní obvody v knihovně DCE/Library2014 Pokud použijete jakýkoliv synchronní obvod, Váš projekt by měl obsahovat Synopsys Design Constraint (.sdc) soubor s definicemi frekvencí hodin, aby se obvod správně přeložil. Bez nich se bude sestavovat pro výchozí frekvenci 1 GHz, kterou však deska DE2 nezvládne, takže výsledek nebude funkční. Soubor DE2.sdc najdete v ZIP souboru s knihovnami - ten jenom zkopírujte do složky svého projektu a poté ho do něho přidejte následujícím postupem. V okně Projekt Navigator otevřete na jeho záložce [Hierarchy] pravou myší kontextové menu řádku "Cyclone:.." a zvolte "Settings…". Vyberte ve stromu Category položku TimeQuest Timing Analyzer. V okně vpravo, dolní obrázek, vyhledejte tlačítkem […] na disku soubor DE2.sdc a tlačítkem [Add] ho přidejte do seznamu souborů SDC., které má analyzátor použít. Poté dialog "Settings" zavřete tlačítkem [OK], aby se změny uložily.
Obrázek 8 - Přidání souboru DE2.sdc
divider* - Děliče frekvence Obvody: divider2 divider3asyn divider5asyn divider7asyn divider10asyn divider11asyn divider13asyn divider100asyn Funkce: Dovolují zmenšit frekvenci hodinového signálu. Jejich dělicí poměr je uvedený číslem v názvu. Příklad použití: divider5asyn CLK
INPUT VCC
CLK DIV5
inst
divider10asyn CLK DIV10
inst4
divider100asyn CLK DIV100
inst1
divider100asyn CLK DIV100
inst2
divider100asyn CLK DIV100
OUTPUT
Q50M
inst3
Obrázek 9 - Obvod Divider50M dělící vstupní frekvenci 50 miliony
Poznámka: S dělicím poměrem klesá maximální vstupní frekvence, kterou dělič správně zpracuje, takže se doporučuje při sériovém řazení děličů pro dosažení vyššího dělicího poměru dávat obvody s nejnižším dělicím poměrem na začátek řetězce.
counter* - čítače Obvody: counter8bits...counter16bits - osmibitový a šestnáctibitový binární čítač counter2BCD counter4BCD - čítač v kódu BCD, pro dvě a čtyři BCD číslice counter8bitsStartStop - osmibitový binární čítač s funkcí Start a Stop pro úlohu Maják Použití: Čítače zvýší svůj stav o 1 s každou hranou CLK hodin, počítají tedy hodinové pulsy. Binární čítače dávají jako svůj výstup souvislou řadu binárně kódovaných čísel, např. counter8bits bude mít na výstupu řadu 0, 1, 2 až 254, 255, pak začne počítat zas od 0, binárně: 0000 0000, 0000 0001,0000 0010, ..., 1111 1110, 1111 1111, poté opět 0000 0000. Šestnáctibitový čítač se chová stejně, jen má větší rozsah. BCD čítače počítají v desítkové soustavě, např. counter2BCD má výstup: 00, 01..09, 10,11 ...19, 20, 21...98, 99, pak opět 00. Binárně 0000 0000, 0000 0001,... 0000 1001,0001 0000, 0001 0001... 0001 1001, (00, 01..09, 10,11 ...19,) 0010 0000, 0010 0001..., 1001 1000, 1001 1001, pak znovu 0000 0000. (20, 21...98, 99, 00) Obvod counter4BCD se chová stejně, pouze má větší rozsah, a to 4 BCD číslice. Čítač counter8bitsStartStop je upravený counter8bits, viz popis v příkladech. U čítačů counter8bits, counter16bits, counter2BCD, counter4BCD ENABLE vstup musí být v 1, aby čítač počítal; je-li v 0, pak si čítač setrvává v posledním stavu. CLRN - je synchronní nulování, čítač se vynuluje až při první náběžné hraně hodin.
6
Příklady použití: Obrázek 10 ukazuje zapojení 8bitového čítače binárního a BCD, použití obvod divider50M je z Obrázek 9. display7segHex
counter8bits SW[0] KEY[0]
INPUT VCC INPUT VCC
ENABLE CLRN CLK
A0 A1 A2 A3
A0 A1 A2 A3 B0 B1 B2 B3
hex[6..0]
OUTPUT
HEX0[6..0]
hex[6..0]
OUTPUT
HEX1[6..0]
BLANK_OUT HEX[6..0]
OUTPUT
HEX2[6..0]
BLANK_OUT HEX[6..0]
OUTPUT
HEX3[6..0]
inst4 display7segHex A0 A1 A2 A3
inst1
inst5
counter2BCD ENABLE Q0 CLRN Q1 CLK Q2 Q3 Q4 Q5 Q6 Q7
divider50M CLOCK_50
INPUT VCC
CLK
display7segBCD
Q50M
inst3
VCC
A0 A1 A2 A3 BLANK_IN inst6
display7segBCD
inst VCC
A0 A1 A2 A3 BLANK_IN inst8
Obrázek 10 - Ukázka zapojení BCD čítače a binárního čítače
Čítač counter8bitsStartStop , navržený pro úlohu Maják, je vytvořený z obvodu counter8bits přidáním možnosti ho synchronně spustit a nulovat tlačítky START a STOP. Má tedy stejný výstup jako counter8bits, liší se jen ovládáním. Stav logické 1 musí na vstupech START a STOP trvat nejméně 1 hodinový takt, protože jde o synchronní vstupy, nicméně vstupy mohou být v logické 1 déle, třeba i trvale, je-li tak někde potřeba. counter8bitsStartStop SW[0] SW[1]
INPUT VCC INPUT VCC
KEY[0]
INPUT VCC
START STOP CLK ACLRN divider50M Q50M
instcount
CLK inst4 CLOCK_50
join8wires
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
OUTPUT
W0 B[7..0] W1 W2 W3 W4 W5 W6 W7 inst1 A3 A2 A1 A0 display7segHex
inst2 A3 A2 A1 A0
LEDR[7..0]
inst
display7segHex
INPUT VCC
hex[6..0]
hex[6..0]
OUTPUT OUTPUT
HEX1[6..0] HEX0[6..0]
Obrázek 11 - Čítač counter8bitsStartStop se Start Stop vstupy
Po stisku STOP se čítač zastaví a vynuluje. Zůstane ve stavu zastavení, dokud se znovu nespustí tlačítkem START. Vstup STOP má vyšší prioritu než START, jsou-li oba vstupy v logické 1, čítač bude stát. Vstup ACLRN slouží pouze pro inicializaci po zapnutí napájení. Po jeho aktivaci bude čítač ve stavu STOP. Na desce DE2 by měl ACLRN být připojen na některé tlačítko KEY[n]. Poznámka: Tlačítka KEY[n] slouží k inicializaci, protože po aktivaci desky DE2 zůstávají zhruba ještě půl sekundy na logické 0. Poté samy přejdou do logické 1 (stav uvolněného tlačítka). Jejich zpožděný náběh do logické 1 ponechává desce DE2 dost času k ustálení signálů, například oscilátoru, takže obvod dostane již správně definované vstupy. Vynecháme propojení ACLRN na KEY[n], obvod může po napájení skončit v nedefinovaném náhodném stavu.
7
shift* - posuvné registry Obvody: shift2 shift4 shift8 shift16 shift18 jednosměrné posuvné registry posouvající svůj obsah doleva shift2bidirload shift4bidirload shift8bidirload shift16bidirload shift18bidirload obousměrné posuvné registry posouvající svůj obsah doleva i doprava, které mají navíc předvolbu, tj lze do nich nahrát výchozí obsah. Použití:
pomocí registrů lze například vytvořit zpoždění, nebo běhající světlo
Příklady použití: Směr doleva a doprava je brán podle zobrazení čísel v počítači, každým logickým posunem doleva se binární číslo vlastně násobí dvěma, každým logickým posunem doprava zase dělí 2. Je-li například u shift8bidirload nejnižším bitem Q0 a nejvyšším Q7, pak posun doleva u něho znamená, že s náběžnou hranou hodin se provede posun obsahu naznačený šipkami: LeftIn → Q0 → Q1 → Q2 → Q3 → Q4 → Q5 → Q6 → Q7 - posuny se přitom provádějí současně. Pokud propojíme Q7 se vstupem LeftIn, vznikne kruhový registr. Posun doprava bude opačný Q0 ← Q1 ← Q2 ← Q3 ← Q4 ← Q5 ← Q6 ← Q7<-RightIn. Zde se může propojit Q0 s RightIn pro kruhový registr. Vstup ACLRN registr nuluje a opět se připojuje na KEY[n] Zapojení na Obrázek 13 ukazuje obousměrné běhající světlo. Po zapnutí napájení budou všechny LED zhasnuté, protože registr obsahuje nuly díky inicializaci přes KEY[0] na ACLRN. Po stisku KEY[1] trvajícím aspoň jednu sekundu, tj. periodu hodin, se objeví na Q0 logická jednička, neboť se provede inicializace přes SLOAD z datových vstupů D17..D0. Všimněte si, že KEY[1] je negovaný invertorem Not, neboť KEY dávají v klidovém stavu 1. Logická lednička se v registru bude posouvat doleva, nebo doprava podle stavu přepínače SW[0]. Když při posunu doleva dojede na Q17, pak skočí na Q0. Naopak, pokud při posunu doprava z Q0 skočí na Q17.
SW[0]
INPUT VCC
KEY[0]
INPUT VCC
KEY[1]
INPUT VCC
VCC
NOT
inst8
GND
divider50M CLOCK_50
INPUT VCC
CLK
inst
Q50M
shift18bidirload
join18wires
RightIn LeftIn DirRight CLK ACLRN SLOAD D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17
W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 W16 W17
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17
B[17..0]
OUTPUT
LEDR[17..0]
inst4
inst1
P
Obrázek 12 - Běhající světlo s obousměrným posuvným registrem shift18bidirload
Poznámka: Směr posunu se uvažuje vzhledem k binárnímu číslu, nikoliv geometricky podle nakreslení obvodu. Zde jde o tak zvaný logický posun, kterému v jazycích C, C# či Java odpovídají ekvivalentní operátory << a >> aplikované na číslo typu unsigned. Zde si nutno pamatovat, že bitové posuny čísel typu signed se vyšších programovacích jazycích překládají jako aritmetické posuny zachovávající zápornost čísla. Blíže viz pozdější přednášky ze Struktur počítačových systémů.
8
Jednosměrné registry mají pouze jediný směr, a to doleva. NOT
shift8
inst3
divider50M CLOCK_50
INPUT VCC
CLK
Q50M
join8wires
LeftIn CLK ACLRN
inst
KEY[0]
INPUT VCC
inst6
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
W0 B[7..0] W1 W2 W3 W4 W5 W6 W7
OUTPUT
LEDR[7..0]
inst7
Obrázek 13 - Osmibitový jednosměrný posuvný registr shift8
Zapojení s registrem shift8 na Obrázek 13 bude postupně naplňovat registr negací nejvyššího bitu Q7. Q7 bude na začátku 0, takže jeho negací bude logická 1. Až se jednička dostane do nejvyššího bitu Q7, registr se bude vyprazdňovat od Q0. Jeho výstup se bude měnit každou sekundu a postupně se na LED objeví tyto stavy, bity uvedené v pořadí Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0: 0000000→00000001→00000011→00000111→00001111→00011111→00111111→01111111→11111111→ 11111110→11111100→11111000→11110000→11100000→11000000→10000000→00000000→00000001...atd.
9
Obvody zvukového výstupu v knihovně DCE/Sound2014 Obvody: de2beep750Hz de2beep Použití: Pomocí nich můžeme z obvodu generovat zvukové signály, které lze slyšet na připojených sluchátkách, třeba hned v první úloze maják.. Příklad zapojení: Oba obvody jsou prakticky stejné a ukázka jejich zapojení je na dolních obrázcích. de2beep750Hz AUD_ADCDAT CLOCK_50 KEY[0]
INPUT VCC INPUT VCC INPUT VCC
SW[0]
INPUT VCC
AUD_ADCDAT CLOCK_50 ACLRN SoundON
I2C_SDAT AUD_ADCLRCK AUD_DACLRCK AUD_DACDAT AUD_XCK AUD_BCLK I2C_SCLK
BIDIR VCC OUTPUT OUTPUT OUTPUT
I2C_SDAT AUD_ADCLRCK AUD_DACLRCK AUD_DACDAT AUD_XCK AUD_BCLK I2C_SCLK
OUTPUT OUTPUT OUTPUT
inst Obrázek 14 - Generování zvuku 750 Hz pomocí de2beep750Hz de2beeper INPUT VCC INPUT VCC INPUT VCC
AUD_ADCDAT CLOCK_50 KEY[0] INPUT VCC INPUT VCC
SW[0] SW[4..1]
BIDIR VCC OUTPUT
AUD_ADCDAT I2C_SDAT CLOCK_50 AUD_ADCLRCK ACLRN AUD_DACLRCK SoundON AUD_DACDAT Divider1500Hz[3..0] AUD_XCK AUD_BCLK I2C_SCLK
I2C_SDAT AUD_ADCLRCK AUD_DACLRCK AUD_DACDAT AUD_XCK AUD_BCLK I2C_SCLK
OUTPUT OUTPUT
OUTPUT OUTPUT OUTPUT
inst
Obrázek 15 - Generování zvuku s proměnnou frekvencí pomocí de2beep
Zatímco jednodušší de2beep750Hz má pevnou frekvenci 750 Hz, tak de2beeper má navíc vstup pro změnu frekvence, kterou určuje vzorec F = 1500Hz/( Divider1500Hz +1), kde Divider1500Hz je hodnota čísla na stejnojmenném vstupu, a F je frekvence tónu ve sluchátcích, viz tabulka: Divider1500Hz F [Hz]
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14 15
1500 750 500 375 300 250 214 187,5 166,5 150 136 125 115 107 100 94
V Obrázek 15 frekvenci určují přepínače SW[4..1]. U obou zvukových obvodů si můžeme pevně zvolit jedině, co přivedeme na inicializační ACLRN, řídicí SoundOn a volič frekvence Divider1500Hz. Ostatní vstupy a výstupy jsou pevně dané - jejich názvy přesně odpovídají přiřazení příslušných vývodů (Assignments) desky DE2. Ty však nemusíme vkládat po jednom, lze je automaticky vložit naráz.
Obrázek 16 - Použití automatického generování špiček (pins) pro vstupy a výstupy
Umístíme obvod vložený do schématu na volné místo tak, aby měl dost prostoru vlevo i vpravo. Pravou myší na jeho symbol vyvoláme kontextové menu, ve kterém zvolíme "Generate Pins for Symbol Ports" 10
Editor nám automaticky vloží všechny vstupy a výstupy a pojmenuje je podle názvů v symbolu obvodu
Smažeme připojené vstupní porty ACLRN, SoundON a Divider1500Hz a přivedeme na vstupy vlastní signály. Poznámka: Schémat mohou příslušnou špičku (port) pro vstup nebo výstup obsahovat nejvýše jedenkrát. Pokud v jiné části zapojení také používáme CLOCK_50, máme dvě možnosti 1/ buď vstupní port vstup CLOCK_50 smažeme zde a připojíme na již existující port CLOCK_50; 2/ nebo CLOCK_50 necháme zde, ale připojíme sem další vstupy všech obvodů, které používají CLOCK_50. ~o~
11