VHDLwhiz UART Test Interface Generator
Produktinformation
Specifikationer:
- Produktnavn: VHDL registrerer UART-testgrænsefladegenerator
- Version: 1.0.4
- Dato: 18. august 2024
- Forfatter: Jonas Julian Jensen
- Produkt URL: Produktlink
- Kontakt email: jonas@vhdlwhiz.com
Beskrivelse
Dette produkt giver dig mulighed for at generere brugerdefinerede grænseflader til læsning og skrivning af FPGA-registerværdier ved hjælp af UART. Det genererede VHDL-modul og Python-script giver mulighed for at interagere med forskellige typer registre i dit FPGA-design.
Krav
- Python 3 tolk
- pyseriel pakke
Protokol
Produktet bruger en datarammeprotokol med fire kontroltegn:
- Navn: READ_REQ, Værdi: 0x0A - Kommando fra værten til FPGA'en for at starte en skrivesekvens for at sende alle registre tilbage over UART
- Navn: START_SKRIV, Værdi: 0x0B – Markerer begyndelsen af en skrivesekvens i begge retninger
- Navn: END_WRITE, Værdi: 0x0C – Markerer slutningen af en skrivesekvens i begge retninger
- Navn: FLUGT, Værdi: 0x0D – Escape-tegn, der bruges til at undslippe kontrolord
Produktbrugsvejledning
Kørsel af scripts
For at bruge produktet skal du sikre dig, at du har Python 3 installeret og Pyserial-pakken. Kør scripts gennem en Python 3-fortolker.
Generering af brugerdefinerede grænseflader
Brug gen_uart_regs.py-scriptet til at generere brugerdefinerede grænseflader til læsning og skrivning af FPGA-registerværdier. Du kan angive sammensætningen af input- og outputregistre og typer, når du genererer output files.
Interaktion med registre
Du kan læse fra eller skrive til et vilkårligt antal registre i dit FPGA-design ved hjælp af det genererede VHDL-modul og Python-script. De tilgængelige registre kan have typer såsom std_logic, std_logic_vector, signed eller unsigned.
Licens
- MIT-licensen dækker kildekodens krav til ophavsret og brugsbetingelser. Se LICENSE.txt file i Zip file for detaljer.
Ændringslog
- Disse ændringer refererer til projektet files, og dette dokument er opdateret i overensstemmelse hermed
Version | Bemærkninger |
1.0.0 | Første udgivelse |
1.0.1 | Rettet manglende «selv» referencefejl ved import som uart_regs.py som et Python-modul. Ændret skrivefejl udskrift til undtagelse til
undgå at udskrive til konsollen, når du kører som et importeret modul. |
1.0.2 | Ret for Vivado [Synth 8-248]-fejl, når der ikke er nogen udgangstilstande. |
1.0.3 | Fix Vivado Linter-advarsel: Register har aktiveret drevet af
synkron nulstilling |
1.0.4 | Ret sagen i hjørnet, når du modtager et forkert udformet ord med escape-tegnet som sidste byte. Det næste ord ville også gå tabt, fordi vi ikke ryddede recv_data_prev_is_escape, da vi vendte tilbage til IDLE.
Gen_uart_regs.py-scriptet tillader nu kun unikke reg-navne. |
Beskrivelse
- Dette dokument beskriver følgende files og mapper:
- gen_uart_regs.py
- genereret/uart_regs.vhd
- genereret/uart_regs.py
- genereret/instantiation_template.vho
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- demo/lattice_icestick/
- demo/xilinx_arty_a7_35/
- demo/xilinx_arty_s7_50/
- Gen_uart_regs.py-scriptet og understøttende VHDL files i dette projekt giver dig mulighed for at generere brugerdefinerede grænseflader til at læse og skrive FPGA-registerværdier af forskellige typer og bredder ved hjælp af UART.
- Du kan bruge det genererede VHDL-modul og Python-script til at læse fra eller skrive til et vilkårligt antal registre i dit design. De UART tilgængelige registre kan have typerne std_logic, std_logic_vector, signed eller unsigned.
- Du kan bestemme den præcise sammensætning af input- og outputregistre og typer, når du genererer output files ved hjælp af gen_uart_regs.py scriptet.
- Python-scripts blev skabt delvist ved hjælp af ChatGPT kunstig intelligens-værktøjet, mens VHDL-koden er håndlavet.
Krav
- Scripts i dette projekt skal køres gennem en Python 3-fortolker, og Pyserial-pakken skal være installeret.
- Du kan installere pyserial gennem Pip ved hjælp af denne kommando: pip install pyserial
Protokol
- VHDL files og Python script bruger en data-framing protokol med fire kontrol
Navn | Værdi | Kommentar |
READ_REQ | 0x0A | Kommando fra værten til FPGA'en for at starte en skrivning
sekvens for at sende alle registre tilbage over UART |
START_SKRIV | 0x0B | Markerer begyndelsen af en skrivesekvens i enten
retning |
END_SKRIV | 0x0C | Markerer slutningen af en skrivesekvens i begge retninger |
FLUGT | 0x0D | Escape-tegn bruges til at escape ethvert af kontrolordene, inklusive selve ESCAPE-tegnet, når de vises som data mellem START_WRITE- og END_WRITE-markørerne. |
Enhver unescaped READ_REQ-byte, der sendes til FPGA'en, er en instruktion om at sende alle dens UART-tilgængelige registre (input og output) tilbage til værten over UART. Denne kommando udstedes normalt kun af scriptet uart_regs.py.
Efter modtagelse af denne kommando vil FPGA'en svare ved at sende indholdet af alle registre tilbage til værten. Først indgangssignalerne, derefter udgangssignalerne. Hvis deres længder ikke summer op til et multiplum af 8 bit, vil de nederste bits af den sidste byte være polstrede nuller.
En skrivesekvens starter altid med START_WRITE-byten og slutter med END_WRITE-byten. Enhver bytes mellem disse anses for at være databytes. Hvis nogen databytes har samme værdi som et kontroltegn, skal databyten escapes. Det betyder, at der sendes et ekstra ESCAPE-tegn før databyten for at angive, at det faktisk er data.
Hvis en unescaped START_WRITE ankommer hvor som helst i strømmen af bytes, betragtes det som starten på en skrivesekvens. Uart_regs_backend-modulet bruger disse oplysninger til at resynkronisere, hvis kommunikationen bliver ude af sync.
gen_uart_regs.py
- Dette er scriptet, du skal starte med for at generere grænsefladen. Nedenfor er et skærmbillede af hjælpemenuen, som du kan få ved at køre: python gen_uart_regs.py -h
- For at generere en brugerdefineret grænseflade skal du køre scriptet med hvert af dine ønskede UART-kontrollerbare registre opført som argumenter. De tilgængelige typer er std_logic, std_logic_vector, unsigned og signed.
- Standardtilstanden (retningen) er i, og standardtypen er std_logic_vector, medmindre registret har længden: 1. Derefter vil det som standard være std_logic.
- Så hvis du vil oprette et std_logic inputsignal, kan du bruge et af disse argumenter:
- min_sl=1
- my_sl=1:in
- my_sl=1:in:std_logic
- Alle ovenstående varianter vil resultere i, at scriptet genererer dette UART-tilgængelige signal:
- Lad os køre scriptet med argumenter for at generere en grænseflade med flere registre af forskellige retninger, længder og typer
Genereret files
- En vellykket kørsel af gen_uart_regs.py-scriptet vil producere en outputmappe med navn, genereret med de tre fileer anført nedenfor. Hvis de allerede findes, vil de blive overskrevet.
- genereret/uart_regs.vhd
- genereret/uart_regs.py
- genereret/instantiation_template.vho
- uart_regs.vhd
- Dette er det brugerdefinerede interface-modul, der genereres af scriptet. Du skal instansiere det i dit design, hvor det kan få adgang til de registre, du vil kontrollere ved hjælp af UART.
- Alt over "– UART tilgængelige registre" sektionen vil være identisk for hvert uart_regs modul, mens sammensætningen af portsignaler under den linje afhænger af argumenterne givet til generatorscriptet.
- Listen nedenfor viser entiteten for uart_regs-modulet, der er et resultat af genereringskommandoen example vist i gen_uart_regs.py secti
- Du behøver ikke at synkronisere uart_rx-signalet, da det håndteres i uart_rx. modul.
- Når modulet modtager en læseanmodning, vil det fange værdierne af alle input- og outputsignaler inden for den aktuelle clock-cyklus. Det øjeblikkelige snapshot sendes derefter til værten over UART.
- Når der sker en skrivning, opdateres alle udgangsregistre med de nye værdier inden for samme clock-cyklus. Det er ikke muligt at ændre udgangssignalværdierne individuelt.
- Imidlertid tillader scriptet uart_regs.py brugeren kun at opdatere udvalgte output ved først at læse de aktuelle værdier af alle registre tilbage. Den skriver derefter alle værdier tilbage, inklusive de opdaterede.
- uart_regs.py
- Den genererede/uart_regs.py file genereres sammen med uart_regs VHDL-modulet og indeholder de brugerdefinerede registeroplysninger i overskriften på file. Med dette script kan du nemt læse fra eller skrive til dine brugerdefinerede registre.
Hjælp menu
- Skriv python uart_regs.py -h for at udskrive hjælpemenuen:
Indstilling af UART-porten
- Scriptet har muligheder for at indstille UART-porten ved hjælp af -c-switchen. Dette virker på Windows og Linux. Indstil den til en af de tilgængelige porte, der er angivet i hjælpemenuen. For at indstille en standardport kan du også redigere UART_PORT-variablen i scriptet uart_regs.py.
Listeregistre
- Oplysninger om registertilknytningen placeres i headeren af uart_regs.py-scriptet af gen_uart_regs.py-scriptet. Du kan liste de tilgængelige registre med -l-kontakten, som vist nedenfor. Dette er en lokal kommando og vil ikke interagere med mål-FPGA
Skrivning til registre
- Du kan skrive til et hvilket som helst af ud-tilstandsregistrene ved at bruge -w-kontakten. Angiv registernavnet efterfulgt af "=" og værdien angivet som en binær, hexadecimal eller decimal værdi, som vist nedenfor.
- Bemærk, at VHDL-implementeringen kræver, at scriptet skriver alle outputregistre samtidigt. Derfor, hvis du ikke angiver et komplet sæt af outputregistre, vil scriptet først udføre en læsning fra mål-FPGA'en og derefter bruge disse værdier til de manglende. Resultatet vil være, at kun de angivne registre ændres
- Når du udfører en skrivning, vil alle specificerede registre ændre sig i den samme clock-cyklus, ikke så snart de modtages over UART.
Læsning af registre
- Brug knappen -r til at læse alle registerværdier, som vist nedenfor. Værdierne markeret med gult er dem, vi ændrede i forrige skriveeksample
- Hver læsning viser et øjeblikkeligt snapshot af alle input- og outputregistre. De er alle sampledet i samme urcyklus
Fejlretning
Brug -d switchen med en af de andre switche, hvis du har brug for at fejlfinde kommunikationsprotokollen. Derefter vil scriptet udskrive alle sendte og modtagne bytes og tag dem, hvis de er kontroltegn, som vist nedenfor.
Brug af grænsefladen i andre Python-scripts
- Scriptet uart_regs.py indeholder en UartRegs-klasse, som du nemt kan bruge som kommunikationsgrænseflade i andre brugerdefinerede Python-scripts. Du skal blot importere klassen, oprette et objekt af den og begynde at bruge metoderne som vist nedenfor.
- Se docstrings i Python-koden for metode og beskrivelser og returværdityper.
instantiation_template.vho
- Instantiationsskabelonen genereres sammen med uart_regs-modulet for din bekvemmelighed. For at spare kodningstid kan du kopiere modulets instansiering og signalerklæringer ind i dit design.
Statisk RTL files
- Du skal inkludere følgende files i dit VHDL-projekt, så de kompileres i det samme bibliotek som uart_regs-modulet:
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- Uart_regs_backend-modulet implementerer finite-state maskiner, der klokker ind og ud af registerdataene. Den bruger modulerne uart_rx og uart_tx til at håndtere UART-kommunikationen med værten.
Demo projekter
- Der er tre demoprojekter inkluderet i Zip file. De lader dig styre periferiudstyret på de forskellige tavler samt et par større, interne registre.
- Demo-mapperne inkluderer præ-genererede uart_regs.vhd og uart_regs.py fileer lavet specielt til disse designs.
Gitter iCEstick
- Demo/icecube2_icestick-mappen indeholder en demoimplementering med registeradgang for Lattice iCEstick FPGA-kortet.
- For at køre gennem implementeringsprocessen skal du åbne demo/lattice_icestick/icecube2_proj/uart_regs_sbt.project file i Lattice iCEcube2 designsoftwaren.
- Efter indlæsning af projektet i iCEcube2 GUI, skal du klikke på Værktøjer → Kør alle for at generere programmeringsbitmap file.
- Du kan bruge værktøjet Lattice Diamond Programmer Standalone til at konfigurere FPGA'en med den genererede bitmap file. Når Diamond Programmer åbner, skal du klikke på Åbn et eksisterende programmeringsprojekt i velkomstdialogboksen.
- Vælg projekt file findes i Zip: demo/lattice_icestick/diamond_programmer_project.xcf, og klik på OK.
- Når projektet er indlæst, skal du klikke på de tre prikker i File Navn kolonne, som vist ovenfor. Gennemse for at vælge bitmap file som du har genereret i iCEcube2
- demo/lattice_icestick/icecube2_proj/uart_regs_Implmnt/sbt/outputs/bitmap/top_icestick_bitmap.bin
- Til sidst, med iCEstick-kortet tilsluttet en USB-port på din computer, skal du vælge Design→Program for at programmere SPI-flashen og konfigurere FPGA.
- Du kan nu fortsætte med at læse og skrive registre ved at bruge demo/lattice_icestick/uart_regs.py scriptet som beskrevet i uart_regs.py sektionen.
Xilinx Digilent Arty A7-35T
- Du kan finde demoimplementeringen for Artix-7 35T Arty FPGA-evalueringssættet i mappen demo/arty_a7_35.
- Åbn Vivado og naviger til det udpakkede files ved at bruge Tcl-konsollen, der findes i bunden af GUI-grænsefladen. Indtast denne kommando for at gå ind i demoprojektmappen:
- cd /demo/arty_a7_35/vivado_proj/
- Udfør create_vivado_proj.tcl Tcl-scriptet for at genskabe Vivado-projektet:
- kilde ./create_vivado_proj.tcl
- Klik på Generer bitstrøm i sidebjælken for at køre gennem alle implementeringstrinene og generere programmeringsbitstrømmen file.
- Til sidst skal du klikke på Åbn Hardware Manager og programmere FPGA'en gennem GUI'en.
- Du kan nu fortsætte med at læse og skrive registre ved at bruge demo/arty_a7_35/uart_regs.py scriptet som beskrevet i uart_regs.py sektionen.
Xilinx Digilent Arty S7-50
- Du kan finde demoimplementeringen til Arty S7: Spartan-7 FPGA-udviklingskortet i mappen demo/arty_s7_50.
- Åbn Vivado og naviger til det udpakkede files ved at bruge Tcl-konsollen, der findes i bunden af GUI-grænsefladen. Indtast denne kommando for at gå ind i demoprojektmappen:
- cd /demo/arty_s7_50/vivado_proj/
- Udfør create_vivado_proj.tcl Tcl-scriptet for at genskabe Vivado-projektet:
- kilde ./create_vivado_proj.tcl
- Klik på Generer bitstrøm i sidebjælken for at køre gennem alle implementeringstrinene og generere programmeringsbitstrømmen file.
- Til sidst skal du klikke på Åbn Hardware Manager og programmere FPGA'en gennem GUI'en.
- Du kan nu fortsætte med at læse og skrive registre ved at bruge demo/arty_s7_50/uart_regs.py scriptet som beskrevet i uart_regs.py sektionen.
Implementering
- Der er ingen specifikke implementeringskrav.
Begrænsninger
- Ingen specifikke tidsbegrænsninger er nødvendige for dette design, fordi UART-grænsefladen er langsom og behandles som en asynkron grænseflade.
- Uart_rx-inputtet til uart_regs-modulet er synkroniseret i uart_rx-modulet. Det behøver således ikke at være synkroniseret i top-level modulet.
Kendte problemer
- Du skal muligvis nulstille modulet, før det kan bruges, afhængigt af om din FPGA-arkitektur understøtter standardregisterværdier.
Mere info
- Copyright VHDLwhiz.com
Ofte stillede spørgsmål
Q: Hvad er formålet med UART-testinterfacegeneratoren?
A: UART-testgrænsefladegeneratoren gør det muligt at oprette brugerdefinerede grænseflader til at interagere med FPGA-registerværdier ved hjælp af UART-kommunikation.
Q: Hvordan installerer jeg Pyserial-pakken?
A: Du kan installere Pyserial gennem Pip ved at bruge kommandoen: pip install pyserial
Dokumenter/ressourcer
![]() |
VHDLwhiz UART Test Interface Generator [pdfBrugermanual UART Test Interface Generator, Test Interface Generator, Interface Generator, Generator |