Bärbar spelkonsol (ARM MCU Team) (4 / 6 steg)
Steg 4: MCU gränssnitt - FPGA Xilinx Spartan 6
Vi utformade MCU gränssnittet på ett sätt att dela data mellan STM32 mikrokontroller och Nexys 3 FPGA. För att försäkra en fullt fungerande grafikerna kort, måste uppgifter från STM32 vara riktad mot rätt registret eller mot DMA controller utan någon diskontinuitet eller förlorade data. STM32 bör också kunna läsa data från register utan att äventyra skrivprocessen.
MCU gränssnitt protokoll
LCD-kontakt för att ansluta STM32 mikrokontroller till Nexys 3 FPGA är en 17 av 2 styrelsen att styrelsen kontakter.
För att använda FSMC asynkron SRAM protokollet, behöver vi:
- En 16-bitars databuss, tillgänglig direkt från LCD-kontakten (D0 till D15)
- NOE, NWE och NE4 signaler, finns även från LCD-kontakten (RD, WR och CS)
- En 26 bitars adress inte tillgänglig på LCD-kontakten, där endast A [0] lite. Detta varför vi var tvungna att skapa våra egna protokoll så att vi kan använda FSMC för att överföra data från STM32 mikrokontroller.
För att täcka för avsaknaden av 26 bit adress bussen, beslutat vi att dela en transaktion (läsa och skriva) i tre på varandra följande transaktioner. Den första är en skriva transaktion som innehåller registret vi vill läsa eller skriva adress. Den andra är en läsa eller skriva transaktion beroende på vilken typ av operation som vi behöver göra. Vid en skriva transaktion, databussen kommer att vara som innehåller de data som vi vill skriva i registren vilken adress har angetts i den föregående transaktionen. Eftersom GPU registren är 32-bitars register, vi behöver två skriva (eller Läs) 16-bitars transaktion.
Om du vill återuppta i protokollet, för att skriva i ett register, behöver vi tre skriva transaktion. Den första som innehar adress och de två andra som innehåller 32 bit data (LSB sedan MSB). Om vi vill läsa data från registren, kommer att den första transaktionen vara en skriva en som innehåller adressen. De andra två håller data från register (LSB sedan MSB).
Data- och buss management
Data- och buss management blocket
uppdaterar databufferten 32-bitars och 16-bitars adress bufferten. På den första transaktionen från STM32 överförs 16-bitars data till adress bufferten. Följande två transaktioner överförs till 32-bitars databufferten.
Vid en DMA controller dataöverföring finns det inget behov av en tre skriva transaktionen eftersom det finns ingen adress och databussen är endast 16-bitars. I så fall STM32 16 bitars databuss överförs till databussen DMA. Vi använde LSB av 26 bit adress bussen av FSMC, heter RS, för att identifiera platsen för överföringen av uppgifter (DMA-styrenheten eller registrera karta).
Data överförs från buffertar till den tillgängliga bussen beroende på typ av överföring, detekteras med hjälp av NOE, NWE signaler från FSMC, som visas i föregående avsnitt. Eftersom dessa signaler är asynkron som, vi lagt till MCU gränssnittet en synkron signalgenerator som kan användas för att synkronisera andra block, men med en fördröjning på 10 till 20 ns.
Buss hantering av ändringsförfrågan
Vid en dataöverföring till eller från blocket registrerar karta har databussen för transaktionen behandlas framgångsrikt. Om bussen inte är tillgänglig, en begäran skall skickas till RegisterMap och STM32 måste förbli sysslolösa till bussen blir tillgänglig.
Det är därför använda en av de generella indata/utdata (GPIO), tillgänglig från LCD-kontakten, är konfigurerad för att skicka en signal som heter upptagen som berättar STM32 att FPGA är upptagen och inte kan fullfölja transaktionen tills upptagetton sätts igen på '0'. Detta enkla förfarande garanterar att varje överföring till eller från registrerar karta kommer att behandlas framgångsrikt och utan förlust av data. När bussen är tillgängliga, skickas en output enable till registren en Läs transaktion. Om det är en skriva transaktion, är belastning en signal till register i samtidigt som adress bussen.
Demo
I denna demo visas hur vi lyckades slå på och av lysdioder på Nexys 3 styrelsen från MCU styrelsen.