Xilinx System Generator blokk med kontroller for LCD-skjerm på Virtex II-Pro Development Board

Like dokumenter
Bruk av PicoBlaze mikrokontroller i Xilinx System Generator (Matlab - Simulink)

MIK 200 Anvendt signalbehandling, Lab. 5, brytere, lysdioder og logikk.

LabVIEW seriekommunikasjon med mikrokontroller

DM6814/DM5814 User s Manual

SIE 4005, 9/10 (4. Forelesn.)

Dagens temaer. Sekvensiell logikk: Kretser med minne. D-flipflop: Forbedring av RS-latch

SRAM basert FPGA INF H10 1

WORKSHOP BRUK AV SENSORTEKNOLOGI

Avanserte byggeblokker (Maxfield kap.13 og 17)

Dagens temaer. Architecture INF ! Dagens temaer hentes fra kapittel 3 i Computer Organisation and

Laget av Atle Hybertsen Høst 2017

Software versjon 0.3

Forelesning 5. Diverse komponenter/større system

Steg 1: Installere programvaren

Dagens temaer. Dagens temaer hentes fra kapittel 3 i læreboken. Oppbygging av flip-flop er og latcher. Kort om 2-komplements form

Fys 3270/4270 høsten Laboppgave 2: Grunnleggende VHDL programmering. Styring av testkortets IO enheter.

HONSEL process monitoring

CodevisionAVR. Start CodevisionAVR. Velg Settings Terminal og sett opp kommunikasjonsparametrene som figur 1 viser. avrlab07a.doc HVE RI Arnfinn Lunde

Dagens temaer. temaer hentes fra kapittel 3 i Computer Organisation. av sekvensielle kretser. and Architecture. Tilstandsdiagram.

Blinkende lysdiode Introduksjon Arduino Lærerveiledning

TDT AUGUST, 2013, 09:00 13:00. Norwegian University of Science and Technology Engineering The Department of Computer and Information Science

SIE 4005, 8/10 (3. Forelesn.)

1: { 2: Display functions 3: ============================================================= 4: Instruction DB5 DB4 DB3 DB2 DB1 DB0 5:

Overordnet maskinarkitektur. Maskinarkitektur zoomet inn. I CPU: Kontrollenheten (CU) IT1101 Informatikk basisfag, dobbeltime 11/9

INF2270. Datamaskin Arkitektur

SIE 4005, 2/10 (2. Forelesn.)

INF1400 Kap4rest Kombinatorisk Logikk

Neural Network. Sensors Sorter

Løsningsforslag til eksamen i INF2270

1. Arduino Bluetooth 2 HC-05 modul

Exercise 1: Phase Splitter DC Operation

Design med ASIC og FPGA (Max kap.7 og 18)

Tips! OMRON ELECTRONICS NORWAY AS

Digital logic level: Oppsummering

MAX MIN RESET. 7 Data Inn Data Ut. Load

En mengde andre typer som DVD, CD, FPGA, Flash, (E)PROM etc. (Kommer. Hukommelse finnes i mange varianter avhengig av hva de skal brukes til:

Hvorfor lære om maskinvare*?

Dagens temaer. Architecture INF ! Dagens temaer hentes fra kapittel 3 i Computer Organisation and. ! Kort repetisjon fra forrige gang

Design med ASIC og FPGA (Max kap.7 og 18)

TDT DESEMBER, 2014, 09:00 13:00. Norwegian University of Science and Technology Engineering The Department of Computer and Information Science

Synkron logikk. Sekvensiell logikk; to typer:

Arduino med Atmel studio 6.x (6.1)

INF3430/4430. Funksjoner og prosedyrer Standardbiblioteker Komplekse sekvensielle systemer

Introduksjon til DARK assembly

Moving Objects. We need to move our objects in 3D space.

TDT DESEMBER, 2008, 09:00 13:00

Dagens temaer. Dagens temaer hentes fra kapittel 3 i Computer Organisation and Architecture. Sekvensiell logikk. Flip-flop er

TFE4101 Krets- og Digitalteknikk Høst 2016

Dagens temaer. Dagens temaer er hentet fra P&P kapittel 3. Motivet for å bruke binær representasjon. Boolsk algebra: Definisjoner og regler

Oppsummering Assemblerkode Hopp Multiplikasjon Kode og data Array Oppsummering

Erik Grindheim - fagprøve Kildekode til mikrokontroller << led_ctrl.asm >> side 1/6.

Emnenavn: Datateknikk. Eksamenstid: 3 timer. Faglærere: Robert Roppestad. Hele oppgavesettet består av 8 oppgaver, samt 1 vedlegg.

Du må håndtere disse hendelsene ved å implementere funksjonene init(), changeh(), changev() og escape(), som beskrevet nedenfor.

INF3430/4430. Funksjoner og prosedyrer Standardbiblioteker Komplekse sekvensielle systemer

C:\web\service-elektronikk\fagprover\Anders\flashlite_program_Anders.pas Page 1

INF1400 Kap 1. Digital representasjon og digitale porter

Antall vedlegg O Tillatte hjelpemidler:

TwidoSuite kommunikasjon

Tilstandsmaskiner (FSM) Kapittel 5

Innhold. 2 Kompilatorer. 3 Datamaskiner og tallsystemer. 4 Oppsummering. 1 Skjerm (monitor) 2 Hovedkort (motherboard) 3 Prosessor (CPU)

INF3430. Funksjoner og prosedyrer Standardbiblioteker Komplekse sekvensielle systemer

Rapport Øving 1 TDT4258 Mikrokontroller Systemdesign

TDT DESEMBER, 2012, 09:00 13:00. Norwegian University of Science and Technology Engineering The Department of Computer and Information Science

Debugging. Tore Berg Hansen, TISIP

INF2270. Datamaskin Arkitektur

Vera-W15. WiFi Termostat Kontakt. Bruksanvisning. Manual version 1.0

7) Radix-sortering sekvensielt kode og effekten av cache

LABORATORIEOPPGAVE NR 6. Logiske kretser - DTL (Diode-Transistor Logic) Læringsmål: Oppbygning

MIK 200 Anvendt signalbehandling, 2012.

BRUKERVEILEDNING FOR MC50.

Oversikt over SMS kommandoer for Holars 2020G

Bruk av interrupt og Timer i Arduino-program.

Institutt for biovitenskap

Elektronisk termostat med spareprogram. Lysende LCD display øverst på ovnen for enkel betjening.

Innhold. Oppgave 1 Oversettelse (vekt 15%)

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

RF Power Capacitors Class kV Discs with Moisture Protection

TDT DESEMBER, 2013, 09:00 13:00. Norwegian University of Science and Technology Engineering The Department of Computer and Information Science

MAT1030 Plenumsregning 3

Prosessoren. Bakgrunnen Innhold LMC. Assemblerkode Oppsummering instruksjonene [Englander kap 6] Hva inneholder den? Hvordan utføres instruksjonene?

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

EKSAMEN I TDT4160 DATAMASKINER GRUNNKURS

Dagens tema. Dagens tema hentes fra kapittel 3 i Computer Organisation and Architecture. Sekvensiell logikk. Flip-flop er. Tellere og registre

Zelio Soft grunnkurs. Zelio Logic reléerstatter programmering

Løsningsskisse til avsluttende eksamen i TDT4105 Informasjonsteknologi, grunnkurs Torsdag 8. desember :00 13:00

Løsningsforslag til EKSAMEN

hvor mye hurtigminne (RAM) CPU en kan nyttiggjøre seg av. mens bit ene betraktet under ett kalles vanligvis et ord.

Dagens temaer. Fra kapittel 4 i Computer Organisation and Architecture. Kort om hurtigminne (RAM) Organisering av CPU: von Neuman-modellen

UNIVERSITETET I OSLO

Innhold. Introduksjon til parallelle datamaskiner. Ulike typer parallelle arkitekturer. Prinsipper for synkronisering av felles hukommelse

Gruppe(r): 2EY Eksamenstid, fra-til: Eksamensoppgaven består av. Antall sider: 4 (Inkludert denne)

Bokmål / Nynorsk / English NORGES TEKNISK- NATURVITENSKAPELIGE UNIVERSITET INSTITUTT FOR FYSIKK. Eksamen TFY4185 Måleteknikk

UNIVERSITETET I OSLO

Beskrivelse av styresystem for aktiv likeretter. Versjon 1.0.

SCE1106 Control Theory

RF Power Capacitors Class , 20 & 30 mm Barrel Transmitting Types

Rapport Øving 2 TDT4258 Mikrokontroller Systemdesign

UNIVERSITETET I OSLO

RF Power Capacitors Class1. 5kV Discs

Dataveier og optimalisering. Kapittel 9

Transkript:

Xilinx System Generator blokk med kontroller for LCD-skjerm på Virtex II-Pro Development Board Kristian Thorsen April 2010 T-02

Sammendrag Sammendrag I faget Anvendt Signalbehandling ved Institutt for Data- og Elektroteknikk ved UiS, brukes Matlab og Xilinx System Generator sammen med et Virtex II-Pro utviklingskort for enkelt implementering av digitale filtre i maskinvare. Fordelen ved å bruke denne kombinasjonen av programvare er at systemene kan implementeres blokkskjematisk i Simulink. Dette gjør at studentene kan fokusere på selve utviklingen av signalbehandlingssystemene uten å tenke så mye på at dette skal implementeres i en programmerbar logisk krets. Blokkskjemaene oversettes automatisk av Xilinx System Generator til logisk kode. Utviklingskortet som brukes er fra Memec Design og er avbildet nedenfor. LCDskjermen på kortet har til nå desverre ikke vært brukt i signalbehandlingsfagene, dette fordi det ikke finnes noen blokk for skjermen som kan brukes i Matlab (Simulink). Det er ofte interessant å studere bitverdier inne i selve signalbehandlinsgssystemene, noe som til nå har blitt gjort ved skrive disse ut taktvis, bit for bit, på de små LED-lysene nederst på kortet. Det har vært et lite irritasjonsmoment at bitverdiene må leses av på en slik uhensiktsmessig måte, spesielt siden det er en LCD-skjerm rett ovenfor diodene. Instituttet har derfor selv utviklet en blokk for LCD-skjermen til bruk i Matlab (Simulink) sammen med Xilinx System Generator. Denne blokken bruker en PicoBlaze 8-bits, logisk programmerbar, mikrokontroller som styrer grensesnittet mot LCD-skjermen. Samtidig leser den 4 forskjellige 16-bits verdier fra andre steder i systemet. Disse verdiene printes ut på skjermen i heksadesimalt format. Denne rapporten vil forklare oppbyggningen og virkemåten til denne blokka. Figur 0.1: Virtex II-Pro LC Utviklingskort 2 T-02

Overordnet systemdesign 1 Overordnet systemdesign Kjernen i dette systemet er en PicoBlaze 8-bits myk 1 mikrokontroller, levert av Xilinx Inc. Dette er er en enkel 8-bits mikrokontroller som i tillegg til prosessorkjerne inneholder internt programminne, arbeidsminne, mulighet for avbrudd samt et sett med inn- og utporter 2. PicoBlaze og bruken av denne sammen med Xilinx System Generator (Matlab-Simulink) forutsettes kjent. Det er tidligere skrevet en utmerket rapport om akkurat dette, se [3]. Mikrokontrolleren leser bitverdien på inngangssignalene, konverterer disse til utkrivbar ASCII-kode og printer verdien ut på LCD-skjermen (heksadesimalt). Blokkskjematisk kan prosessen som utføres illustres som vist i figur 1.1. Figur 1.1: Blokkskjema som viser systemets hovedoppgaver 2 Grensesnitt mot LCD-skjerm LCD-skjermen på utviklingskortet er en 2x16 karakteres skjerm som er funksjonsmessig ekvivalent med den kjente Hitachi HD44780 3. Skjermen har et parallellt grensesnitt og kan enten kjøres i 8-, eller 4-bits modus. Da det her brukers en 8-bits mikrokontroller er det fordelaktivt å kjøre LCD-skjermen i 4-bits modus. Dette gjør at man slipper ekstra logikk for kontrollsignalene, E (Enable), RS (Register Select) og R/W 4 (Read/Write). Selve grensesnittet vises i figur 2.1 på neste side. Ved å bruke et enkelt programmert grensesnitt kan en utgangsport (8-bit) styre kontrollsignaler og sende data til LCD-skjermen. Da LCD-skjermen er levert montert på utviklingskortet vil det her ikke bli gitt noen analyse av signalnivåer og støynivårer for overføringen. Det taes for gitt av produsenten av utviklingskortet, Memec Design, leverer et produkt som virker. Xilinx har publisert et eksempelprogram [1] for bruk av 4-bits kommunikasjon mellom PicoBlaze og LCD-panel, dette har dannet utgangspunkt for det programmerte grensesnittet som brukes i dette prosjektet. 1 Myk, betyr at den er laget i en programmerbar logisk krets, FPGA 2 Å kalle PicoBlaze for en mikrokontroller er muligens å overdrive, PicoBlaze veldig simpel og mangler en god del funksjonalitet som en normalt vil ha i en mikrokontroller 3 Andre skjermer som er like inkluderer Samsung S6A0069X/KS0066U/KS0070B og SMOS SED1278. 4 R/W er på utviklingskortet lagt til jord (0), lesing fra skjermen ikke er derfor ikke mulig. 3 T-02

2.1 Overføringssyklus 4-bits modus Figur 2.1: Grensesnitt mot LCD 2.1 Overføringssyklus 4-bits modus Figur 2.2, som er hentet fra [2] viser en overføringssyklus mot LCD-skjermen. I figuren sendes det først en instruksjon til LCD-skjermen (RS er lav). D7-D4 sendes ved første puls på E-signalet, deretter sendes D3-D0 ved neste puls. Figuren viser videre en lesesyklus (R/W er høy), noe som ikke vil brukes i dette prosjektet. Til slutt sendes det en ny instruksjon over til LCD-skjermen. Som man ser holdes RS-linja lav ved instruksjoner. Dersom man skal sende data over til skjermen settes RS-linja høy. For mer om timing, oppsett av LCD, tilgangstider etc. vises det til [1] og [2]. Figur 2.2: 4-bits overføringssykluser mot LCD 4 T-02

Oppsett i Xilinx System Generator 3 Oppsett i Xilinx System Generator LCD-kontrolleren fremstår i System Generator som en enkel blokk med 4 innganger. Hver av disse inngangene har en bredde på 16-bit. LCD-kontrolleren leser bitverdien på disse og skriver den ut på LCD-skjermen. Figur 3.1 viser hvordan blokka ser ut i Xilinx System Generator (Matlab-Simulink). Blokka er lagt til i biblioteket som brukes i faget Anvendt Signalbehandling, UiS_2VP4LC. Figur 3.1: Blokk for LCD-kontrolleren Kontrolleren behandler hver inngang som unsigned 16_0, altså et 16-bits tall uten desimaler. Bitverdien skrives ut direkte i heksadesimalt format. Utskriftsoppsettet er som vist nedenfor: V1:xxxx V2:xxxx V3:xxxx V4:xxxx Der xxxx er bitverdien (hex) til den respektive inngangen. Selve oppsettet i System Generator er vist i figur 3.2 på neste side, i senter av figuren ser vi mikrokontrolleren, PicoBlaze. På inngangssiden (venstre) blir først hvert av de 16-bits brede inngangssignalene splittet opp i de høyeste og laveste 8 bittene. Disse blir videre gjennom en multiplekser sendt inn på mikrokontrollerens inngangsport. Multiplekseren velger signal etter hvilken port_id som sendes ut fra PicoBlaze. For enkelhetsskyld brukes de tre laveste bitene fra port_id-signalet, multiplekseren velger signal etter tabell 1 på side 7. For å redusere faren for feilmeldinger under kompilering er det satt inn en Assert-blokk som eksplisitt setter sampleraten på innporten lik systemets klokkerate (100 MHz). En slipper dermed at kompilatoren «klager» på at inngangssignaler ikke har samme samplerate som klokkeraten til PicoBlaze. På utgangssiden vil signalene til LCD-skjermen bli oppdatert hver gang det settes ut en ny verdi på port 255 (0xFF) fra PicoBlaze. Dette ordnes ved hjelp av en multiplekser som setter verdien på utgangsporten fra PicoBlaze videre til LCDskjermen dersom portnummeret stemmer og WriteStrobe er høy. Ellers beholder 5 T-02

Oppsett i Xilinx System Generator Figur 3.2: LCD-kontroller satt opp i System Generator 6 T-02

Oppsett i Xilinx System Generator Signal port_id Signal port_id V1 høy 00 V3 høy 04 V1 lav 01 V3 lav 05 V2 høy 02 V4 høy 06 V2 lav 03 V4 lav 07 Tabell 1: Multipleksing av innsignaler multiplekseren forrige verdi sendt til LCD-skjermen. Selve LCD-subblokka sender signalene ut fra FPGA-en ved hjelp av Gateway-out blokker, dette er vist i figur 3.3. Figur 3.3: LCD-subblokk Den faktiske plasseringen av linjene er for Virtex II-Pro utviklingskortet som følger: LCD_RW = na 5 LCD_RS = V2 LCD_E = V1 LCD_D7 = P1 LCD_D6 = P2 LCD_D5 = R1 LCD_D4 = R2 Når det gjelder systemets klokkerate er kontrolleren tilpasset Virtex II-Pro, og en klokkerate på 100 MHz. Det brukes her et programmert grensesnitt der lengden på venteløkkene er avhengig av klokkeraten. For å unngå at overføringen går raskere enn LCD-skjermen kan registere er det derfor viktig at klokkeraten ikke settes høyere i Xilinx System Generator. Lavere klokkerate vil i teorien bare føre til at overføringene går tregere og LCD-skjermen vil fortsatt kunne lese dataene som sendes. 5 Satt til jord permanent. 7 T-02

Programvare 4 Programvare Mikrokontrolleren kjører som nevnt et program som kontinuerlig leser inngangsportene, konverterer verdiene til utskrivbare ASCII-kodede tegn og skriver disse ut på LCD-skjermen. Koden i seg selv er ganske triviell og bygger videre på [1], en innføring om PicoBlaze og programmering av denne i Xilinx System Generator er gitt i [3], så man vil her anta at dette er kjent for leseren. Programmet følger flytskjemaet som er vist i figur 4.1, metoden for å konvertere til ASCII-kode er tatt med i rapporten, mens det for resten av programmet vises til selve kildekoden som er lagt ved. Figur 4.1: Flytskjema for program 4.1 Konvertering til ASCII Et 16-bits tall representeres med 4 heksadesimale siffer, hvert av disse sifferene vil inneholde 4-bit fra det opprinnelige tallet. Å konvertere 4-bits verdier til heksadesimale verdier kodet i ASCII er relativt enkelt. De heksadesimale sifferene har tegnene fra 0-9 og A-F. Der 0 reprsenterer bitkoden 0000, og F reprsenterer 1111. Tegnene 0-9 har ASCII-kode fra 0x30 til 0x39 6, og tegnene fra A til F kode 0x41-0x46. For en bitsekvens med lengde 4, som altså har verdier fra 0x0 til 0xF er det da bare å legge til 0x30 dersom det er et tallsiffer, eller 0x37 dersom det er et bokstavsiffer. 6 0x viser at dette er heksadesimale tall. 8 T-02

4.1 Konvertering til ASCII Algoritmen for konvertering av et 4-bits talt til ASCII-kode blir da: Dersom verdien er mindre enn 10 (0xA): Returner verdi + 0x30 Ellers Returner verdi + 0x37 Implementert i PicoBlaze blir koden som følger: ***************************************** Rutiner for ASCII konvertering ***************************************** Denne rutinen konverterer de 4 siste bittene i register s11 fra heksadesimalt til ascii kode for representasjon av heksadesimal verdi. altså: 0->9 ===> 30-39 (ascii kode for 0-9) og : A->F ===> 41-46 (ascii kode for A-F) to_ascii: AND sb, 0F bare nederste 4 bit COMPARE sb, 0A setter carry = 1 dersom vi har fra 0-9 JUMP NC, letter skal skrive ut bokstav ADD sb, 30 letter: ADD sb, 37 9 T-02

Oppsummering 5 Oppsummering Rapporten viser prinsippet bak og oppbygningen av en LCD-kontroller laget i en blokk for bruk i Matlab (Simulink), sammen med Xilinx System Generator. Ved hjelp av denne blokka kan studenter og andre brukere av Xilinx System Generator enkelt skrive ut verdier på LCD-skjermen til utviklingskortet, uten å måtte bry seg om hvordan grensesnittet mot LCD-skjermen fungerer. På grunn av det lave ressursbehovet til PicoBlaze kan denne blokka inkluderes uten at det legges nevneverdige begrensninger på signalbehandlingssystemene. I vedlegg A er det lagt med et eksempel på hvordan blokka kan inkluders i et større signalbehandlingssystem. Eksempelet er tatt fra laboratorieoppgave 9c (2010) i faget Anvendt Signalbehandling. Dette eksempelet kan selvfølgelig utvides videre. LCDskjermen vil være ypperlig til å vise hvilket signal som er valgt, dersom man har flere signaler gjennom et digitalt filter. Den kan også vise forsterkningsnivå dersom man har mulighet til å forsterke signalene. Alternativt kan man også vise bitverdier som har sammenheng mellom filternes pol og nullpunkter dersom det brukes adaptiv filtrering. Selv om skjermen bare viser 4-verdier om gangen er det enkelt å lage et sett med multipleksere i Xilinx System Generator slik at man kan variere signalene som går inn til kontrolleren ved hjelp av en trykknapp og en teller. 10 T-02

REFERANSER REFERANSER Referanser [1] Ken Chapman. PicoBlaze Initial Design for Spartan-3E Starter Kit (LCD Display Control). Xilinx, San Jose, CA, Februar 2006. [2] Samsung Electronics. LCD Datasheet KS0070B 16COM 80SEG Driver & Controller For Dot Matrix. [3] Kristian Thorsen. Bruk av PicoBlaze mikrokontroller i Xilinx System Generator (Matlab-Simulink). T-01, Intern Rapport Institutt for Data- og Elektroteknikk UiS, April 2010. 11 T-02

Eksempel på bruk A Eksempel på bruk I dette eksempelet tar det utgangspunkt i laboratorieoppgave 9c (2010) fra faget Anvendt Signalbehandling. Det skal i denne oppgaven implementeres et sett med forskjellige digitale filtre, og man skal studere hvordan forskjellige filtre påvirker signalenes maksimalverdi. Figur A.1 viser oppsettet Simulink. Hva som skjer i systemet er relativt uinteressant for dette eksempelet. Hovedpoenget er at FinnMax blokka nederst finner maksimal signalverdi, denne 12-bits verdien blinkes ut på lysdiodene (Blokka: Blinker ut Lysdioder). Figur A.1: Systemet i laboppgave 9c Istedenfor å lese verdien av på lysdiodene kan en nå inkludere LCD-kontrollerblokka. Siden vi bare trenger en utverdi kobles denne til V4 på LCD-kontrollerblokka, de andre innverdiene (V1-V3) kobles til konstanter. Siden maksimalverdien bare er på 12-bit legges det til 4 nullere på toppen, dette skjer ved hjelp av en Concatblokk. Selve utvidelsen vises i figur A.2. Figur A.2: Systemet i laboppgave 9c med LCD kontroller tilkoblet 12 T-02

Kildekode B Kildekode PicoBlaze 3 Program for kontroll av LCD-skjerm Kristian Thorsen UIS Vår 2010 Basert på eksempelprogram av Ken Chapman - Xilinx Ltd Versjon 0.2 (4-16bit verdier inn) Dette er programkoden for PBLCD_4bit_v_inn.mdl der man leser fra signallinjer og skriver ut verdien på disse heksadesimalt. *********************************************** Definisjon av porter *********************************************** Innporter for datalinjene Leser inn 4 16 bit verdier som deles opp i high og low (8 bit hver) CONSTANT v1_high_inn, 00 CONSTANT v1_low_inn, 01 CONSTANT v2_high_inn, 02 CONSTANT v2_low_inn, 03 CONSTANT v3_high_inn, 04 CONSTANT v3_low_inn, 05 CONSTANT v4_high_inn, 06 CONSTANT v4_low_inn, 07 Grensesnitt mot LCD CONSTANT LCD_output_port, FF Utgangsport 255 (0xFF) CONSTANT LCD_E, 01 active High Enable E - bit0 CONSTANT LCD_RW, 02 Read=1 Write=0 RW - bit1 CONSTANT LCD_RS, 04 Instruction=0 Data=1 RS - bit2 CONSTANT LCD_drive, 08 Ikke tilkoblet CONSTANT LCD_DB4, 10 4-bit Data DB4 - bit4 CONSTANT LCD_DB5, 20 interface Data DB5 - bit5 CONSTANT LCD_DB6, 40 Data DB6 - bit6 CONSTANT LCD_DB7, 80 Data DB7 - bit7 ************************************************* Konstanter ************************************************* Konstant for venteløkker (disse er kopiert direkte fra eksempeldesign) Constant to define a software delay of 1us. This must be adjusted to reflect the clock applied to KCPSM3. Every instruction executes in 2 clock cycles making the calculation highly predictable. The 6 in the following equation even allows for CALL delay_1us instruction in the initiating code. 13 T-02

Kildekode delay_1us_constant = (clock_rate - 6)/4 Where clock_rate is in MHz Example: For a 50MHz clock the constant value is (10-6)/4 = 11 (0B Hex). For clock rates below 10MHz the value of 1 must be used and the operation will become lower than intended. Har 100 MHz => 23,5 ~18 hex CONSTANT delay_1us_constant, 18 ASCII tabell CONSTANT character_a, 61 CONSTANT character_b, 62 CONSTANT character_c, 63 CONSTANT character_d, 64 CONSTANT character_e, 65 CONSTANT character_f, 66 CONSTANT character_g, 67 CONSTANT character_h, 68 CONSTANT character_i, 69 CONSTANT character_j, 6A CONSTANT character_k, 6B CONSTANT character_l, 6C CONSTANT character_m, 6D CONSTANT character_n, 6E CONSTANT character_o, 6F CONSTANT character_p, 70 CONSTANT character_q, 71 CONSTANT character_r, 72 CONSTANT character_s, 73 CONSTANT character_t, 74 CONSTANT character_u, 75 CONSTANT character_v, 76 CONSTANT character_w, 77 CONSTANT character_x, 78 CONSTANT character_y, 79 CONSTANT character_z, 7A CONSTANT character_a, 41 CONSTANT character_b, 42 CONSTANT character_c, 43 CONSTANT character_d, 44 CONSTANT character_e, 45 CONSTANT character_f, 46 CONSTANT character_g, 47 CONSTANT character_h, 48 CONSTANT character_i, 49 CONSTANT character_j, 4A CONSTANT character_k, 4B CONSTANT character_l, 4C 14 T-02

Kildekode CONSTANT character_m, 4D CONSTANT character_n, 4E CONSTANT character_o, 4F CONSTANT character_p, 50 CONSTANT character_q, 51 CONSTANT character_r, 52 CONSTANT character_s, 53 CONSTANT character_t, 54 CONSTANT character_u, 55 CONSTANT character_v, 56 CONSTANT character_w, 57 CONSTANT character_x, 58 CONSTANT character_y, 59 CONSTANT character_z, 5A CONSTANT character_0, 30 CONSTANT character_1, 31 CONSTANT character_2, 32 CONSTANT character_3, 33 CONSTANT character_4, 34 CONSTANT character_5, 35 CONSTANT character_6, 36 CONSTANT character_7, 37 CONSTANT character_8, 38 CONSTANT character_9, 39 CONSTANT character_colon, 3A CONSTANT character_stop, 2E CONSTANT character_semi_colon, 3B CONSTANT character_minus, 2D CONSTANT character_divide, 2F / CONSTANT character_plus, 2B CONSTANT character_comma, 2C CONSTANT character_less_than, 3C CONSTANT character_greater_than, 3E CONSTANT character_equals, 3D CONSTANT character_space, 20 CONSTANT character_cr, 0D CONSTANT character_question, 3F CONSTANT character_dollar, 24 CONSTANT character_exclaim, 21 CONSTANT character_bs, 08 carriage return ************************************************* Minneplasseringer i RAM (vi har en 64 bytes RAM innebygget i PicoBlaze) ************************************************* CONSTANT v1_high, 00 CONSTANT v1_low, 01 CONSTANT v2_high, 02 CONSTANT v2_low, 03 CONSTANT v3_high, 04 CONSTANT v3_low, 05 CONSTANT v4_high, 06 Back Space command character 15 T-02

Kildekode CONSTANT v4_low, 07 ----------------------------------------- Hovedprogram ----------------------------------------- Initialiserer LCD-skjermen CALL LCD_reset LOAD s5, 10 CALL LCD_cursor LOAD s5, character_s LOAD s5, character_t LOAD s5, character_a LOAD s5, character_r LOAD s5, character_t CALL delay_1s CALL delay_1s CALL delay_1s CALL LCD_reset Hovedløkke laster inn data, behandler og skriver ut last_v: INPUT s9, v1_high_inn Leser øverste 8 bit fra verdi 1 STORE s9, v1_high Lagrer øverste bittene til RAM INPUT s9, v1_low_inn Leser nederste 8 bit fra verdi 1 STORE s9, v1_low Lagrer nederste bittene til RAM INPUT s9, v2_high_inn OSV STORE s9, v2_high INPUT s9, v2_low_inn STORE s9, v2_low INPUT s9, v3_high_inn STORE s9, v3_high INPUT s9, v3_low_inn STORE s9, v3_low INPUT s9, v4_high_inn STORE s9, v4_high INPUT s9, v4_low_inn STORE s9, v4_low skrivlcd: LOAD s5, 10 Linje 1 posisjon 0 CALL LCD_cursor Går til linje 1 posisjon 0 LOAD s5, character_v LOAD s5, character_1 LOAD s5, character_colon FETCH sb, v1_high Starter skriving verdi 1 (high) Skifter ned de øverste bittene 16 T-02

Kildekode FETCH sb, v1_high Så de nederste bittene FETCH sb, v1_low Begynner verdi 1 (low) Skifter ned de øverste bittene FETCH sb, v1_low Ferdig å skrive verdi 1 LOAD s5, character_space LOAD s5, character_v LOAD s5, character_2 LOAD s5, character_colon FETCH sb, v2_high Begynner verdi 2 (high) Skifter ned de øverste bittene FETCH sb, v2_high Så de nederste bittene FETCH sb, v2_low Begynner verdi 2(low) Skifter ned de øverste bittene FETCH sb, v2_low Ferdig å skrive verdi 2 LOAD s5, 20 Linje 2 posisjon 0 17 T-02

Kildekode CALL LCD_cursor Går til linje 2 posisjon 0 LOAD s5, character_v LOAD s5, character_3 LOAD s5, character_colon FETCH sb, v3_high Begynner verdi 3 (high) Skifter ned de øverste bittene FETCH sb, v3_high Så de nederste bittene FETCH sb, v3_low Begynner verdi 3 (low) Skifter ned de øverste bittene FETCH sb, v3_low Ferdig å skrive verdi 3 LOAD s5, character_space LOAD s5, character_v LOAD s5, character_4 LOAD s5, character_colon FETCH sb, v4_high Begynner verdi 4 (high) Skifter ned de øverste bittene FETCH sb, v4_high Så de nederste bittene FETCH sb, v4_low Begynner verdi 4 (low) Skifter ned de øverste bittene 18 T-02

Kildekode FETCH sb, v4_low Ferdig å skrive verdi 4 JUMP last_v ********************************************* Venteløkker (kopi fra eksempel) ********************************************* Registre brukt s0-s4 Delay of 1us. Registers used s0 delay_1us: LOAD s0, delay_1us_constant wait_1us: SUB s0, 01 JUMP NZ, wait_1us Delay of 40us. Registers used s0, s1 delay_40us: LOAD s1, 28 40 x 1us = 40us wait_40us: CALL delay_1us SUB s1, 01 JUMP NZ, wait_40us Delay of 1ms. Registers used s0, s1, s2 delay_1ms: LOAD s2, 19 25 x 40us = 1ms wait_1ms: CALL delay_40us SUB s2, 01 JUMP NZ, wait_1ms Delay of 20ms. Delay of 20ms used during initialisation. 19 T-02

Kildekode Registers used s0, s1, s2, s3 delay_20ms: LOAD s3, 14 20 x 1ms = 20ms wait_20ms: CALL delay_1ms SUB s3, 01 JUMP NZ, wait_20ms Delay of approximately 1 second. Registers used s0, s1, s2, s3, s4 delay_1s: LOAD s4, 32 50 x 20ms = 1000ms wait_1s: CALL delay_20ms SUB s4, 01 JUMP NZ, wait_1s ***************************************** LCD Rutiner (Kopi fra eksempel) ***************************************** LCD module is a 16 character by 2 line display but all displays are very similar. The 4-wire data interface will be used (DB4 to DB7). The LCD modules are relatively slow and software delay loops are used to slow down KCPSM3 adequately for the LCD to communicate. T The delay routines are provided in a different section (see above). Pulse LCD enable signal E high > 230ns (1us is used). Register s4 should define the current state of the LCD output port. Registers used s0, s4 LCD_pulse_E: XOR s4, LCD_E OUTPUT s4, LCD_output_port CALL delay_1us XOR s4, LCD_E OUTPUT s4, LCD_output_port E=1 E=0 Write 4-bit instruction to LCD display. The 4-bit instruction should be provided in the upper 4-bits of register s4. Note that this routine does not release the master enable but as it is only used during initialisation and as part of the 8-bit instruction write it should be acceptable. 20 T-02

Kildekode Registers used s4 LCD_write_inst4: AND s4, F8 Enable=1 RS=0 Inst., RW=0 Write, E=0 OUTPUT s4, LCD_output_port set up RS, RW >40ns before e. pulse CALL LCD_pulse_E Write 8-bit instruction to LCD display. The 8-bit instruction should be provided in register s5. Instructions are written using the following sequence Upper nibble wait >1us Lower nibble wait >40us Registers used s0, s1, s4, s5 LCD_write_inst8: LOAD s4, s5 AND s4, F0 Enable=0 RS=0 Inst., RW=0 Write, E=0 OR s4, LCD_drive Enable=1 CALL LCD_write_inst4 write upper nibble CALL delay_1us wait >1us LOAD s4, s5 select lower nibble with SL1 s4 Enable=1 SL0 s4 RS=0 Instruction SL0 s4 RW=0 Write SL0 s4 E=0 CALL LCD_write_inst4 write lower nibble CALL delay_40us wait >40us LOAD s4, F0 Enable=0 RS=0 Inst., RW=0 Write, E=0 OUTPUT s4, LCD_output_port Release master enable Write 8-bit data to LCD display. The 8-bit data should be provided in register s5. Data bytes are written using the following sequence Upper nibble wait >1us Lower nibble wait >40us Registers used s0, s1, s4, s5 LCD_write_data: LOAD s4, s5 AND s4, F0 Enable=0 RS=0 Inst., RW=0 Write, E=0 OR s4, 0C Enable=1 RS=1 Data, RW=0 Write, E=0 OUTPUT s4, LCD_output_port set up RS and RW >40ns before e. pulse CALL LCD_pulse_E write upper nibble CALL delay_1us wait >1us 21 T-02

Kildekode LOAD s4, s5 select lower nibble with SL1 s4 Enable=1 SL1 s4 RS=1 Data SL0 s4 RW=0 Write SL0 s4 E=0 OUTPUT s4, LCD_output_port set up RS and RW >40ns before e. pulse CALL LCD_pulse_E write lower nibble CALL delay_40us wait >40us LOAD s4, F0 Enable=0 RS=0 Inst., RW=0 Write, E=0 OUTPUT s4, LCD_output_port Release master enable Reset and initialise display to communicate using 4-bit data mode Includes routine to clear the display. Requires the 4-bit instructions 3,3,3,2 to be sent with suitable delays following by the 8-bit instructions to set up the display. 28 = 001 Funct. set, 0 4-bit, 1 2-line, 0 5x7 dot matrix, xx 06 = 000001 Entry mode, 1 increment, 0 no displ shift 0C = 00001 Disp control, 1 disp on, 0 cursor off, 0 blink off 01 = 00000001 Display clear Registers used s0, s1, s2, s3, s4 LCD_reset: CALL delay_20ms wait >15ms for disp. to be ready LOAD s4, 30 CALL LCD_write_inst4 send 3 CALL delay_20ms wait >4.1ms CALL LCD_write_inst4 send 3 CALL delay_1ms wait >100us CALL LCD_write_inst4 send 3 CALL delay_40us wait >40us LOAD s4, 20 CALL LCD_write_inst4 send 2 CALL delay_40us wait >40us LOAD s5, 28 Function set CALL LCD_write_inst8 LOAD s5, 06 Entry mode CALL LCD_write_inst8 LOAD s5, 0C Display control CALL LCD_write_inst8 LCD_clear: LOAD s5, 01 Display clear CALL LCD_write_inst8 CALL delay_1ms CALL delay_1ms wait >1.64ms for display to clear Position the cursor ready for characters to be written. The display is formed of 2 lines of 16 characters and each position has a corresponding address as indicated below. Character position 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 22 T-02

Kildekode Line 1-80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F Line 2 - C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF This routine will set the cursor position using the value provided in register s5. The upper nibble will define the line and the lower nibble the character position on the line. Example s5 = 2B will position the cursor on line 2 position 11 Registers used s0, s1, s2, s3, s4 LCD_cursor: TEST s5, 10 test for line 1 JUMP Z, set_line2 AND s5, 0F make address in range 80-8F for line 1 OR s5, 80 CALL LCD_write_inst8 instruction write to set cursor set_line2: AND s5, 0F make address in range C0-CF for line 2 OR s5, C0 CALL LCD_write_inst8 instruction write to set cursor ***************************************** Rutiner for ASCII konvertering ***************************************** Denne rutinen konverterer de 4 siste bittene i register s11 fra heksadesimalt til acii kode for representasjon av heksadesimal verdi. altså: 0->9 ===> 30-39 (ascii kode for 0-9) og : A->F ===> 41-46 (ascii kode for A-F) to_ascii: AND sb, 0F bare nederste 4 bit COMPARE sb, 0A setter carry = 1 dersom vi har fra 0-9 JUMP NC, letter ADD sb, 30 letter: ADD sb, 37 skal skrive ut bokstav om vi har bokstav 23 T-02