Komme i gang med FPGA: Utviklingsmiljøet og "Hello World"

✅ Mira lo que Hacen estas Tarjetas PCBWay, las voy a... (Juli 2019).

$config[ads_text] not found
Anonim

Komme i gang med FPGA: Utviklingsmiljøet og "Hello World"


Å komme i gang med FPGA-utviklingen er mye som å komme i gang med noe annet programmerbart silisium. Først, velg maskinvaren som skal brukes. Deretter sette opp utviklingsmiljøet. Endelig opprett ditt første "Hello World" -program. I denne artikkelen tar jeg deg gjennom alle tre trinnene, og forhåpentligvis får du deg forbi de vanligste MCU-til-FPGA-gotkaene.

støttende informasjon

  • Papilio Loader-programvaren
  • Xilinx ISE utviklingsmiljø
  • Spartansk 6 emballasje og pinout datablad

Tidligere artikler i denne serien

En mikrocontroller entusiastens første titt på programmerbar logikk

Velge et utviklingsråd

Mens mikrokontroller utviklingsbrett kan bli hatt for så lite som noen få dollar, har jeg ikke sett en FPGA styret for mindre enn rundt $ 50, 00 USA. Når det er sagt, er det fortsatt mange gode valg i $ 50 til $ 100-serien.

Min erfaring har hittil vært begrenset til Spartan og Zynq-familien FPGA fra Xilinx. Av de forskjellige brettene jeg eier, det enkleste å bruke og mest fleksible er Papilio-brettene fra Gadget Factory. I denne opplæringen bruker jeg Papilio Pro med noen tilbehørskort kalt vinger.

Oppsettet mitt, som av denne skrivingen, koster 74, 99 dollar for Papilio Pro FPGA-bordet, og 7, 99 kr for Button / LED-vingen.

Den spartanske 6-brikken som er brukt på dette forumet har eksistert siden 2009, så det er ikke den nyeste Xilinx-brikken. Det ble introdusert som en billig, lav-effekt FPGA for høyvolum, kostnadssensitive applikasjoner. Selv med sin alder er det et kraftig og økonomisk valg som startbilde FPGA.

Papilio bruker sitt eget ekspansjonssystem, med 48 I / O-pinner hentet ut. Brettet bruker 3.3VI / O, så du trenger logikknivåomformere hvis du vil kommunisere med 5V-enheter.

Den har en innebygd LED som er tilgjengelig for brikken. Tilkobling til en verts PC kommer via en USB mini-B-kontakt og en FTDI-brikke. FTDI-brikken betyr at drivere ikke er et problem med de fleste nyere OS-versjoner. Konfigurasjonsbitfiler holdes i en 64Mbit SPI flash-chip. Endelig har den en 64Mbit SDRAM-brikke ombord, for bruk med mer avanserte prosjekter enn vi ser på en stund.

Utviklingsmiljøet

Med FPGA-kortet i hånden er det på tide å sette opp utviklingsmiljøet. Utviklingsmiljøet består av to ting: Papilio-lasteren fra Gadget Factory og ISE-utviklingsmiljøet fra Xilinx.

Xilinx har et par forskjellige utviklingsmiljøer. Den du trenger til Spartan 6-brikken på Papilio Pro heter ISE. Som ved denne skrivingen holder den på versjon 14.7. Webpack-utgaven er gratis å laste ned, så det er det du vil ha.

Finn ISE Design Suite på Xilinx nettside / Landingsside / Utvikler Zone / Maskinvare Zone / ISE Design Suite / WebPACK Design Software. Du må kanskje opprette en konto med Xilinx, men det er en gratis nedlasting. Det er gratis i form av penger, men ikke nødvendigvis når det gjelder tid. Det er en ganske stor nedlasting, med en filstørrelse på 6+ GB. Du kan imidlertid laste den ned i mindre biter, som jeg vil anbefale hvis du ikke har rask eller pålitelig internett.

Papilio Loader er vert på Gadget Factory nedlastingsforum. Som i denne skrivingen er den nåværende versjonen 2, 8. Koblingene til begge deler av programvaren er inkludert i delen "Støtteinformasjon" i denne artikkelen.

Med programvaremiljøet lastet ned og installert, er det på tide å se noe skje. Vår FPGA "Hello World" vil blinke en LED, som er konvensjonen i maskinvareverdenen. At 8-brev ordet, "hardware", er veldig viktig å huske på. Vi skriver kode som ser ut som et gammelt mikrokontroller språk, men det er ikke programvare. Det er et HDL (maskinvarebeskrivelsesspråk) kalt Verilog.

Fra verre kan Verilog enkelt forveksles med noen av mange programmeringsspråk, men det gjør det veldig annerledes. I C eller Python kan du redusere en LED-blinkfrekvens til en synlig hastighet med en loop som øker en variabel og sammenligner den med et angitt nummer. I Verilog skal vi lage et register og bruke det registeret som en maskinvarefrekvensdeler.

Strukturen til en FPGA-konfigurasjon

Kildekoden for Hello World kommer til å ende opp i to tekstfiler: "HelloWorld.v", Verilog-koden og "HelloWorld.ucf", brukerbegrensningsfilen (UCF). Verilog-koden kabler opp internene til FPGA for å lage maskinvaren. Verilog, som de fleste språk, bruker etiketter for I / O-tilkoblinger. UCF er vant til å fortelle Verilog litt om den spesifikke brikken, som for eksempel Verilog-etiketter kobler til hvilke brikkepinner og forskjellige andre parametere og begrensninger. Tabellen nedenfor viser veien som signaler tar fra innsiden til utsiden.

Verilog kodeUCFPC bordUtvidelsesoverskrift
Oppretter maskinvaren. Bruker etiketter for I / OOversetter mellom Verilog I / O-etiketter og FPGA-chippinneneKobler spennepinnene til ekspansjonshodepinnene (og innebygd LED)Kobler til omverdenen

Se på følgende fotografi for en bildevisning. PC-kortet kobler chippinnen P112 til den innebygde LED-en, som har referansesignalatoren LED1. Kretskortet kobler chippinnen P114 til utvidelseshode C, pin 0. Jeg har bare kalt ut to pinner, men det samme skjemaet følger for hver pinne som brukes.

UCF vil tillate oss å legge til etiketter på disse pinnene. I UCF finner vi følgende linje:

 NET OnBoardLED LOC = "P112" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=SLOW; 

"OnBoardLED" er etiketten jeg valgte å representere den innebygde komponenten, LED1. "P112" refererer til chippinnen, og er en reservert pinidentifikator for denne spesifikke brikken.

Pin-identifikatorene er angitt av konfigurasjonsinnstillingene i ISE-utviklingsmiljøet og matcher tappene i chipdatabladet. Hvis du ser på side 31 i "Spartan 6 Packaging and Pinout" databladet (lenken er i delen Støtteinformasjon ovenfor), finner du det i TQG144-pakken, som er Spartan 6 på min utviklingstavle, P112 kobles til I / O-betegnet "IO_L66P_SCP1_0". Hvis styret mitt brukte BGA formfaktor Spartan 6 chip, CPG196 (side 36), ville samme I / O koble til BGA-brikken på pin "D11", og jeg ville bruke "D11" i stedet for "P112" i dette linje i UCF.

De andre betingelsene er reserverte ord som jeg dekker på et senere tidspunkt. Hver del av linjen er avgrenset med den vertikale linjeskilden "|", og linjen er avsluttet med et semikolon.

Hvis du bytter til Verilog-koden, vises "OnBoardLED" først i modulportdeklarasjonen, som vist nedenfor:

 module HelloWorld( input wire clk_in, output wire OnBoardLED ); 

I koden ovenfor er "clk_in" og "OnBoardLED" etiketter av mitt valg. Som er modulnavnet "HelloWorld". I motsetning er "modul", "input", "output" og "wire" alle Verilog reserverte ord. Hver portdeklarasjon er skilt med et komma, bortsett fra det siste. Erklæringsdelen er i parentes og slutter med et semikolon. Verilog er bokstavsfølsom, så "onboardled" er ikke lik "OnBoardLED".

Så, i Verilog, refererer jeg til det med etiketten "OnBoardLED". UCF tilordner den etiketten til chip pin P112. Det trykte kretskortet kobler pin P112 til en LED merket "LED1".

"HelloWorld" -prosjektet

For å se alt dette i aksjon, åpne ISE Design Suite. Du bør ha et ISE-ikon på skrivebordet ditt. Hvis ikke, finn den i startmenyen i Windows. Xilinx startmenyoppføring vil ha mange alternativer. Du vil ha "Project Navigator".

Når Prosjektnavigatoren er åpen, velg "Nytt prosjekt", som vil hente en dialog som vist på følgende bilde:

Legge til kildekoden

Fra "Prosjekt" -menyen, velg "Ny kilde". Du får se en liste over filtyper. Velg "Verilog Module", og skriv "HelloWorld" som filnavn. Trykk Neste ved å komme til dialogboksen Definer modul. Dette er hvor du skriver inn etikettene for modulportdeklarasjonen, som jeg dekket over.

Skriv inn "clk_in" som det første portnavnet, med inngang som retning. Deretter skriver du "OnBoardLED", med utgang som retning.

Hvis alt går bra, har du følgende som det nesten tomme rammen av Verilog-filen.

 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 20:34:56 04/05/2017 // Design Name: // Module Name: HelloWorld // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module HelloWorld( input clk_in, output OnBoardLED ); endmodule 

Du kan legge merke til at begrepet "wire" som jeg har tatt med i kodeseksjonen lenger opp, har blitt utelatt av den automatisk genererte koden; "wire" er underforstått her, så det er valgfritt å bruke det. Jeg liker å sette den der for klarhet. Det gjør ikke vondt, og på et tidspunkt har vi andre alternativer som vil gi ekstra klarhet velkommen.

For å fullføre Verilog-filen, legg til den nye koden etter ");" på slutten av deklarasjonsseksjonen, og før ordet "endmodule". Når du er ferdig, bør koden din, fra begynnelse til slutt, se ut som følgende:

 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 14:34:46 04/01/2017 // Design Name: // Module Name: HelloWorld // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module HelloWorld( input wire clk_in, output wire OnBoardLED ); reg (21:0) freq_div; // 22-bit register used as the frequency dividing counter assign OnBoardLED = freq_div(21); // Connects the onboard LED to register bit 21 always @(posedge clk_in) begin // Clocked on the rising clock edge freq_div <= freq_div + 1'd1; // Increment the register by 1 end endmodule 

Legge til UCF

En ekstra fil å legge til, og vi vil være klare til å prøve det og se hva som rister ut.

Igjen, gå til Prosjekt-menyen og velg Ny kilde. Denne gangen har du noen ekstra muligheter. Velg "Implementeringsbegrensninger File" og gi den navnet "HelloWorld". Trykk Neste, og Fullfør, og du vil ha et tomt kodevindu med navnet HelloWorld.ucf. Kopier og lim inn følgende kode i kodevinduet. Det er bare to linjer (og en valgfri kommentar) i denne.

Merk at pundskiltet "#" indikerer en kommentar i UCF. Du kan starte en kommentar hvor som helst i linjen. I Verilog er kommentarer angitt med et dobbelt slash "//" eller et par sett med "/ *" og "* /", som i C-språket.

 # UCF for our first FPGA "Hello World" NET clk_in LOC = "P94" | IOSTANDARD=LVTTL | PERIOD=31.25ns; # System clock setting NET OnBoardLED LOC="P112" | IOSTANDARD=LVTTL | DRIVE=8 | SLEW=SLOW; # on board LED 

Lagre prosjektet, og du er klar til å gjøre noe. Din ISE Project Navigator-skjerm bør se ut som følgende:

Opprette .bit-filen

Systemet har mye å gjøre for å lage .bit-filen (også kalt konfigurasjons- eller programmeringsfilen), men du trenger bare å gi den en kommando: dobbeltklikk på linjen "Generer programmeringsfil". Dette er den grove ekvivalenten av kompilering og kobling i mikrokontroller verden. Hvis alt går bra, vil du få noen grønne merker ved siden av linjene "Synthesize - XST", "Implement Design" og "Generate Programming File" som vist på bildet nedenfor.

Hvis du har de tre grønne merkene, er du klar til å åpne Papilio Loader og sette konfigurasjonen i FPGA. Loader er installert i Windows Start-menyen, under "Gadget Factory". Ta den opp, og trykk på Velg-knappen. Naviger til .bit-filen din. Hvis du har lagt til "arbeid" i arbeidskatalogen, som jeg gjorde, er det her du finner .bit-filen.

Kontroller at Papilio er koblet til USB-porten din og trykk Kjør. Når Papilio-lasteren rapporterer tilbake som Ferdig, i vinduet "Informasjon", bør du se lysdioden på Papilio blinker.

Konklusjon

Hvis du kommer fra Arduino-verdenen, kan dette virke som mange skritt for å gå gjennom bare for å blinke en LED. Hvis du kommer fra Eclipse IDEs verden og en ARM-prosessor, er dette sannsynligvis færre trinn enn du gikk gjennom for å få det oppe. I alle fall vil mulighetene som lurer i FPGA, gjøre det veldig mye verdt innsatsen.

I etterfølgende artikler i denne serien kommer jeg inn i detaljene av hva disse Verilog-uttalelsene gjør, mer om hvordan en FPGA virkelig skiller seg fra en mikrokontroller, og til mer komplekst kretsdesign.