Stap 2: Componenten van het circuit
Ontwerpen van de componenten:
Oog op de uitvoering van een synthesizer op het bord Nexys 2 FPGA, moeten verschillende onderdelen worden ontworpen. Beginnend met de uitgangen, zullen modules moeten omgaan met LED's inschakelen en outputting vierkante golffuncties aan de spreker. Modules zal ook nodig zijn om de debounce knop ingangen en een interne klok-puls van een druk op de knop genereren. Ten slotte zal modules zoals tellers, slippers en multiplexers nodig zijn om de resterende logica van notities opslaan en afspelen van sequenties correct verwerken.
De volgende lijst bevat een korte beschrijving van wat elk onderdeel in dit project doet, hoe ieder onderdeel wordt gebruikt, en hoe deze onderdelen in VHDL implementeert:
Knop/uitschakelen: In het geval van de afspeel-/ pauzeknop willen we om te schakelen tussen twee staten precies één keer wanneer de knop wordt ingedrukt. Om dit te doen, we gebruiken een eindige toestandsmachine (FSM). Deze manier, na de overgang tussen staten zodra, het circuit van de toggle knop zal niet toestaan dat een andere staat overgang optreden totdat de knop is vrijgegeven en vervolgens opnieuw ingedrukt. Een diagram vertegenwoordigen deze FSM is hierboven weergegeven.
De eindige toestandsmachine bevat twee staten voor elke mogelijke uitvoer. Begin aan de bovenkant van het FSM-diagram, is het circuit in de pauze. Zodra de toets wordt ingedrukt, gaat het circuit naar het spel staat. Het blijft in dit eerste spelen staat tot de knop wordt vrijgegeven. Nu, het circuit is nog in het spel staat, maar het is klaar voor de knop opnieuw ingedrukt worden om de overgang naar de staat van de pauze. Ook zal het circuit opnieuw wachten voor de knop moet worden vrijgegeven voordat het wordt klaar om over te schakelen naar de spelen staat.
Klok Divider: Het circuit van de scheidingslijn klok gewoon omgezet van de 50 MHz-frequentie van de Nexys-2 een veel kleinere frequentie. Dit wordt gebruikt om de BPM (beats per minute) van de synthesizer. In dit project zijn we met behulp van een VHDL-module geschreven door Bryan Mealy van de California Polytechnic State University, San Luis Obispo.
Teller: Een teller uitgangen gewoon een binair getal. Wanneer de uitmonding hoog is, wordt dit nummer bij de stijgende rand van klok met 1 verhoogd. De counters gebruikt in dit circuit gebruikt T slippers om te slaan van een 3 bits-getal. Elke flip-flop vertegenwoordigt een beetje worden opgeslagen. De flip-flop vertegenwoordigen de minst significante bits zal wisselen elke keer dat de teller wordt verondersteld te verhogen. De andere flip-flops zal wisselen wanneer bits onder hen allemaal gelijk is aan een. Dit probleem maakt het bovendien zo wanneer de teller op de hoogst mogelijke aantal, 111(binary), het gaat terug naar nul wanneer volgende verhoogd.
In dit project, wordt een teller gebruikt voor het bijhouden van de huidige beat zodat de spreker weet welke Toon om te spelen, en dus de juiste LED kan worden ingeschakeld. Een teller wordt ook gebruikt om de huidige Toon die kan worden ingevoerd door de gebruiker bij te houden.
Debouncer: De drukknoppen op het bord Nexys 2 FPGA zijn niet perfect. Ideaal, wanneer ingedrukt de contacten zou raken samen slechts éénmaal, en samen blijven totdat de knop wordt vrijgegeven. In werkelijkheid hebben de contactpersonen een neiging om "bounce" meerdere malen, in dat wanneer de knop wordt ingedrukt de contacten binnen en buiten contact meerdere malen voordat steken komt. In termen van onze synthesizer, kan dit leiden tot een play/pauze knop die schakelt tussen de twee staten meerdere keren wanneer de knop wordt gedrukt, en is niet gegarandeerd om het land op de juiste is. Om dit tegen te gaan, zal een ontdendering circuit een bepaalde hoeveelheid tijd voor de input te 'settelen' wachten.
In dit project gebruikten we een VHDL-module geschreven door Scott Larson voor Digi-key, oorspronkelijk gepubliceerd op de Digi-key EE wiki.
Pulse Generator: De counters gebruikt in dit project zal verhogen samen met een bepaalde klokfrequentie, zolang ze zijn ingeschakeld. Voor sommige functies, zoals het verhogen van de frequentie bij het indrukken van de knop verandert de huidige Toon, zouden we willen om een teller slechts eenmaal ophogen met elke druk op de knop. Dit vereist een input te nemen en te converteren naar een puls met een duur van één klokcyclus. De pulse generator circuit zal dit doen. Wanneer de uitmonding naar hoog gaat, gaat de uitvoer hoog voor precies één klokcyclus. Dit wordt bereikt door het bijhouden van de huidige ingang voor een bepaalde stijgende rand van klok, evenals de vorige input voor de laatste stijgende rand van klok. In het geval waar de huidige ingang is hoog en de vorige input is laag, is de output hoog. Anders is de productie laag. In VHDL, wordt dit gedaan met behulp van een gedrags model. Een blok proces controleert de waarden van de invoerwaarde incr en de vorige ingang incr_prev aan de stijgende rand van de klok. Als incr behoort en incr_prev gelijk is aan nul, is de uitvoer q ingesteld op één. Anders, q is ingesteld op nul. Tot slot wordt incr_prev de waarde van incr.
sseg_dec: Dit circuit neemt een binaire ingang met maximaal acht bits en weergegeven als decimaal getal op het Nexys2 zeven segment display. In dit project gebruiken we een VHDL-module geschreven door Bryan Mealy van de California Polytechnic State University, San Luis Obispo.
Square Wave Generator: Dit onderdeel genereert een blokgolf op basis van de input van een 3-bits. Zij doet dit door het input kloksignaal te delen door een specifiek nummer aan het bereiken van de gewenste frequentie. De uitvoer is dan van een knevel gevoorzid in- en uitschakelen volgens deze frequentie. Er zijn zeven vooraf bepaalde frequenties, gebaseerd op de pentatonische toonladder, die de notities van A4 tot C6 vertegenwoordigt. De frequenties voor deze tinten variëren van 440 Hz tot 1046.5 Hz. Als de input 000(binary) is, wordt dan geen blokgolf gespeeld.