8-stegs FPGA Sequencer och Synthesizer (2 / 6 steg)
Steg 2: Komponenter i kretsen
Designa komponenterna:
För att genomföra en synt i Nexys 2 FPGA styrelsen, måste flera komponenter utformas. Börjar med utgångarna, kommer moduler att behöva hantera tända lysdioder och mata kvadrat vinkar fungerar högtalaren. Modulerna kommer också att behövas till Dämpningstid knappen ingångar och skapa en enda klocka puls från en knapptryckning. Slutligen, moduler som räknare, flip-flops och multiplexorer kommer att behövas att hantera återstående logik lagra anteckningar och spela upp sekvenser korrekt.
Följande lista innehåller en kort beskrivning av vad varje komponent i detta projekt gör, hur varje komponent används och implementera dessa komponenter i VHDL:
Knappen Växla: Om knappen Spela/pausa vill vi växla mellan de två staterna exakt en gång när du trycker på knappen. För detta använder vi en ändlig tillståndsmaskin (FSM). Detta sätt, efter övergången mellan stater när knappen Växla kretsen inte kommer att tillåta en annan stat övergången till inträffar förrän knappen har släppt och då tryckte igen. Ett diagram som representerar denna Mikronesiens visas ovanför.
Finite tillståndsdatorn innehåller två stater för varje möjligt utgång. Början på toppen av Mikronesien diagrammet, är kretsen i tillståndet paus. När knappen trycks, kommer att kretsen gå att spela staten. Det förblir i detta första spela tillstånd tills knappen släpps. Nu, gå runt är fortfarande i stadiet spela, men det är redo för knappen vara intryckt igen att övergången till paus staten. På samma sätt väntar kretsen återigen på knappen att släppas innan det blir redo att byta till play staten.
Klocka Divider: Klockan divider kretsen helt enkelt konverterar från 50 MHz frekvensen av Nexys 2 till en mycket mindre frekvens. Detta används för att ange BPM (slag per minut) av syntet. I detta projekt använder vi en VHDL modul skriven av Bryan Mealy av Kalifornien Polytechnic State University, San Luis Obispo.
Counter: En räknare utgångar helt enkelt ett binärt tal. När dess ingång är hög, ökar det detta antal med 1 på stigande kanten av klockan. Räknarna används i denna krets använder T Flip-Flops spara ett 3 bitars. Varje flip-flop representerar en bit lagras. Flip-flop som representerar den minst signifikanta biten att växla varje gång räknaren är tänkt för att öka. Andra vippor att växla när alla bitar under dem är lika med ett. Detta beteende gör det också så när räknaren når den högsta möjliga antal, 111(binary), det kommer att gå tillbaka till noll när ökas nästa.
I detta projekt används en räknare för att hålla reda på i nuvarande takt så att talaren vet vilken tonen att spela, och så rätt LED kan vara påslagen. En räknare används också för att hålla reda på den aktuella tonen som kan vara matas in av användaren.
Debouncer: Tryckknappar i Nexys 2 FPGA styrelsen är inte perfekta. Helst när du trycker på kontakterna skulle röra ihop exakt en gång och hålla ihop tills knappen släpps. I själva verket har kontakterna en tendens att "studsa" flera gånger, eftersom när knappen trycks kontakterna kommer in och ut i kontakt flera gånger innan fast. När det gäller våra synthesizer, kan detta leda till en play/pause-knappen som växlar mellan två staterna flera gånger när knappen trycks, och kan inte garantera att landa på rätta. För att motverka detta, kommer att en debounce krets vänta en viss tid för input att "bosätta".
I detta projekt använde vi en VHDL modul skriven av Scott Larson av Digi-key, ursprungligen publicerad på Digi-key EE wiki.
Pulse Generator: Räknarna används i detta projekt ökar värdet tillsammans med en viss klockfrekvens så länge de har aktiverats. För vissa funktioner, som ökar frekvensen när du trycker på knappen för att ändra den aktuella tonen, kanske vi vill öka en räknare för endast en gång med varje knapptryckning. Detta kräver att indata och konvertera den till en puls med en löptid på exakt en klockcykel. Pulse generator kretsen kommer att göra. När dess ingång går till hög, går sin produktion hög för exakt en klockcykel. Detta sker genom att hålla reda på aktuella indata för en viss stigande kanten av klockan, samt tidigare ingång för sista stigande kanten av klockan. I fall där den nuvarande ingången är hög och vars tidigare är låg är produktionen hög. Annars, produktionen är låg. I VHDL sker detta med hjälp av en beteendevetenskaplig modell. En process block kontrollerar värdena indatavärde incr och den tidigare ingående incr_prev på stigande kanten av klockan. Om incr är en och incr_prev är noll, sätts utgång q till en. Annars sätts q till noll. Slutligen, incr_prev får värdet av incr.
sseg_dec: Denna krets tar en binär ingång med upp till åtta bitar och visar den som ett decimalt tal på Nexys2 sju segment display. I detta projekt använder vi en VHDL modul skriven av Bryan Mealy av Kalifornien Polytechnic State University, San Luis Obispo.
Square Wave Generator: Denna komponent kommer att generera en fyrkantsvåg baserat på en 3-bitars input. Detta sker genom att dividera insatsen klocksignalen med ett visst nummer att uppnå önskad frekvens. Produktionen ska sedan växlas på och av enligt denna frekvens. Det finns sju förutbestämd frekvenser, baserat på den pentatoniska skalan, som representerar tonerna från A4 till C6. Frekvenserna för dessa toner spänner från 440 Hz till 1046.5 Hz. Om inljudet är 000(binary), är sedan ingen fyrkantsvåg spelade.