Examens arbete 10-poäng C-nivå Mälardalens Högskola Testbed for a semi-full-custom mixed signal ASIC

Relevanta dokument
LABORATION DATORKONSTRUKTION TSEA83 UART. Namn och personnummer. Version: (OS)

DESIGN AV SEKVENTIELL LOGIK

LABORATIONSINSTRUKTION LABORATION

Vad är en UART? Universal Asynchronous Receiver Transmitter parallella seriella parallell åttabitars signal mest signifikant bit

VHDL2. Sekvensnätsexemplet

Hjälpmedel: Appendix A. VHDL-syntax. (bifogas detta prov) Appendix B.2. IEEE-package (bifogas detta prov)

VHDL2. Sekvensnätsexemplet

Digital elektronik CL0090

Digitalteknik, fortsättningskurs Föreläsning VHDL Very High Speed Integrated Circuit Hardware Description Language

Konstruktionsmetodik för sekvenskretsar

VHDL och laborationer i digitalteknik

FÖRELÄSNING 8 INTRODUKTION TILL DESIGN AV DIGITALA ELEKTRONIKSYSTEM

Design av mindre digitala system. Föreläsning Digitalteknik, TSEA52 Mattias Krysander Institutionen för systemteknik

Simulering med ModelSim En kort introduktion

D2 och E3. EDA321 Digitalteknik-syntes. Fredag den 13 januari 2012, fm i M-salarna

KALKYLATOR LABORATION4. Laborationens syfte

Digital- och datorteknik, , Per Larsson-Edefors Sida 1

Angående buffer. clk clear >=1 =9?

std_logic & std_logic_vector

-c wc. Pre- Next state Out- Vi ser att tillstånden är redan sorterade i grupper med olika utsignaler,

Lösningförslag till Exempel på tentamensfrågor Digitalteknik I.

Konstruktionsmetodik för sekvenskretsar. Föreläsning 7 Digitalteknik, TSEA22 Mattias Krysander Institutionen för systemteknik

Programmerbara kretsar och VHDL 2. Föreläsning 10 Digitalteknik, TSEA22 Oscar Gustafsson Institutionen för systemteknik

Sensorsystem till hinderhanterande robot

Introduktion till Xilinx CPLD och ISE WebPack 6.2 Version NV

Konstruktion av digitala system - VHDL

LiTH Lab1: Asynkron seriell dataöverföring via optisk länk Laboration 1. Asynkron seriell dataöverföring via optisk länk

Programmerbara kretsar och VHDL. Föreläsning 9 Digitalteknik Mattias Krysander Institutionen för systemteknik

Programmerbara kretsar och VHDL. Föreläsning 9 Digitalteknik Mattias Krysander Institutionen för systemteknik

Programmerbara kretsar och VHDL. Föreläsning 10 Digitalteknik, TSEA22 Mattias Krysander Institutionen för systemteknik

Tentamen i IE1204/5 Digital Design onsdagen den 5/

LABORATIONSINSTRUKTION LABORATION. Räknare och skiftregister med sekvensiell VHDL. LAB NR Ver KURS. Digitalteknik INNEHÅLL. 1.

VHDL testbänk. Mall-programmets funktion. Låset öppnas när tangenten 1 trycks ned och sedan släpps. William Sandqvist

Laboration 1: Styrning av lysdioder med en spänning

Sekvensnät. William Sandqvist

Datakommunikation med IR-ljus.

Digitala projekt Elektro- och informationsteknik

Chalmers ekniska Högskola Institutionen för Data- och Informationsteknik. EDA 321 Digitalteknik syntes Laboration 2 - VHDL

VHDL 1. Programmerbara kretsar

Digital elektronik CL0090

Laboration D159. Sekvensnät beskrivna med VHDL och realiserade med PLD. Namn: Datum: Epostadr: Kurs:

Tentamen i IE1204/5 Digital Design onsdagen den 5/

Projektlaboration 4, synkronisering av klockan

Programmerbar logik och VHDL. Föreläsning 4

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Digitalteknik: CoolRunner-II CPLD Starter Kit Med kommentarer för kursen ht 2012

Avkoppla rätt en kvantitativ undersökning av parasitinduktans hos olika layoutalternativ

Tentamen i Digitala system - EITA15 15hp varav denna tentamen 4,5hp

Digitalteknik: CoolRunner-II CPLD Starter Kit

Du har följande material: 1 Kopplingsdäck 2 LM339 4 komparatorer i vardera kapsel. ( ELFA art.nr datablad finns )

Strukturell VHDL. Grundläggande kunskaper om. och TESTBÄDD. UMEÅ UNIVERSITET Tillämpad fysik och elektronik Lars Wållberg ver 1.

Tentamen i IE1204/5 Digital Design måndagen den 15/

Digitala elektroniksystem

Laboration D184. ELEKTRONIK Digitalteknik. Sekvensnät beskrivna med VHDL och realiserade med PLD

DIGITALTEKNIK I. Laboration DE2. Sekvensnät och sekvenskretsar

PARALLELL OCH SEKVENTIELL DATABEHANDLING. Innehåll

LABORATION TSEA22 DIGITALTEKNIK D TSEA51 DIGITALTEKNIK Y. Konstruktion av sekvenskretsar med CPLD. Version: 2.2

LAB VHDL-programmering

IE1205 Digital Design: F8: Minneselement: Latchar och Vippor. Räknare

PROJEKT STAFFAN STALLEDRÄNG

Tenta i Digitalteknik

Elektro och Informationsteknik LTH. Laboration 6 A/D- och D/A-omvandling. Elektronik för D ETIA01

Tentamen i Digitala system - EDI610 15hp varav denna tentamen 4,5hp

Sekvensnät i VHDL del 2

Programmerbara kretsar och VHDL 1. Föreläsning 9 Digitalteknik, TSEA22 Oscar Gustafsson, Mattias Krysander Institutionen för systemteknik

PROJEKT LJUD. KOPIERINGSUNDERLAG Martin Blom Skavnes, Staffan Melin och Natur & Kultur Programmera i teknik ISBN

Digitala projekt - Radiostyrd bil

VHDL3. Angående buffer

Generering av analoga signaler från XSV300

DIGITAL ELEKTRONIK. Laboration DE3 VHDL 1. Namn... Personnummer... Epost-adress... Datum för inlämning...

Lödinstruktion, RiboCop(tm) v1.0

L15 Introduktion modern digital design

Systemkonstruktion LABORATION LOGIK

Ingång Utgång - anslutningstyp Specifikationer Mätområde (1) AC (växelström) DC (likström) Spänning. ström 10 V AC 0.1 V AC

Dataöverföring på Parallell- och serieform MOP 11/12 1

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

WL-2. WL-2 V1.0 monterad

Systemkonstruktion SERIEKOMMUNIKATION

Omtentamen med lösningar i IE1204/5 Digital Design Fredag 10/

(2B1560, 6B2911) HT08

Spänningsstyrd Oscillator

Lösningsföslag till Exempel på tentamensuppgifter i Digitalteknik I

Lödövning, likriktare och zenerstabilisering

TSEA22 Digitalteknik 2019!

F5 Introduktion till digitalteknik

Disposition av prototypkort

Lödinstruktion, JoyFi(tm) v1.0

Översikt, kursinnehåll

GPIO - General Purpose Input Output

Simulering med ModelSim En kort introduktion

Programmerbar logik (PLD) Programmeringsspråket VHDL Kombinatoriska funktioner i VHDL för PLD Sekvensfunktioner i VHDL för PLD

Digitala projekt rapport

Avant BRUKSANVISNING. FAKTARUTA AVANT Hög utnivå med förstärkning upp till 57 db. Automatiska funktioner för tilt och förstärkning

Montering av kretskort 10-40X

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Mät kondensatorns reaktans

Manual AC Lastcellsmatning : 12 VDC +- 5 % 280 ma (Max) = 8 st 350 ohms lastceller

Vad är kommunikation? Vad är datorkommunikation? Dataöverföring; Inledning

TENTAMEN Datorteknik (DO2005) D1/E1/Mek1/Ö1

LABORATION TSEA22 DIGITALTEKNIK D

Transkript:

Examens arbete 10-poäng C-nivå Mälardalens Högskola Testbed for a semi-full-custom mixed signal ASIC Februari 2007 Institutionen för Datavetenskap och Elektronik Mälardalen Högskola Västerås

INLEDNING... 2 BAKGRUND OCH SYFTE... 2 HUVUDDEL... 2 BAKGRUNDSBESKRIVNING... 2 REDOGÖRELSE AV ARBETE... 2 Planering... 2 Design och tillverkning av mönsterkort... 3 Programmering och simulering... 4 Testning... 5 Slutsats... 5 UART... 6 VÅR UART... 6 Transmittern... 7 Receivern... 7 TESTPROGRAM... 8 TEST AV AD-OMVANDLARNA... 8 Från kort... 8 Till kort... 9 Koden... 10 TEST AV FASSKIFTAREN... 11 Från kort... 11 Till kort... 11 Koden... 12 PCB... 13 PROGRAMKOD... 17 TEST AV AD-OMVANDARNA... 17 Testad.vhdl... 17 testad.ucf... 20 test.do... 21 Simulering... 22 TEST AV FASSKIFTAREN... 23 Phaser.vhdl... 23 Phaser.ucf... 26 test.do... 27 Simulering... 28 UART:EN... 29 uart.vhdl... 29 rcvr.vhdl... 30 txmit.vhdl... 31 REFERENSER... 32 1

Inledning Testbed for a semi-full-custom mixed signal ASIC Bakgrund och syfte I ett tidigare examensarbete vid MDH har en ASIC designats, den har nu tillverkats. För att testa denna ASIC krävs en testbänk, bestående av ett mönsterkort med testpunkter för oscilloskop och en CPLD för hantering av alla styrsignaler. All kommunikation med denna ASIC sker genom ett mångt skiftregister. Huvuddel Bakgrundsbeskrivning Patrick Fallbergs exjobb gick ut på att man med minimala resurser och tid skull konstruera en ASIC. På 20 veckor utfördes detta och denna ASIC har nu tillverkats. En simulering av denna ASIC är allt för komplicerad och skulle kräva enorm datorkraft, alternativet blir att konstruera en testbänk. Denna testbänk ska ha testpunkter för att med oscilloskop kunna kontrollera de analoga utgångar och kontakter på ingångarna. För att kunna testa de digitala delarna används en CPLD till kommunikationen mellan ASIC och dator via USB. All kommunikation med denna ASIC sker genom ett mångt skiftregister. Redogörelse av arbete Planering Det första vi gjorde var att lägga upp en strategi på hur vi skulle lösa uppgiften. Eftersom examensarbetet går ut på att testa den ASIC Patrick Fallberg designat beslutade vi oss för att först läsa in oss på hans rapport, (Fallberg,2005). Nästa steg var att designa ett mönsterkort i Eagle. Första tanken var att vi skulle skicka iväg kortet på tillverkning, därför valde vi att först designa kortet innan vi började programmera. Under tiden kortet skulle vara på tillverkning tänkte vi programmera testprogrammet. När kortet sedan kommit tillbaka från tillverkning skulle vi löda alla komponenter på plats och utföra tester. När alla tester var utförda skulle vi sammanställa en rapport. 2

Design och tillverkning av mönsterkort Efter att vi hade studerat Patrick Fallbergs rapport planerade vi utformning av mönsterkortet och letade lämpliga komponenter. För att göra kortet så användarvänligt som möjligt valde vi att ha en kontakt för matningsspänning och sedan dela upp i de fem olika spänningsnäten som ASIC: en och CPLD: n krävde. På ASIC: en finns det fyra ingångar och fyra utgångar som går till fyra olika förstärkarsteg. Dessa valde vi att sätta BNC-kontakter på så att det skulle vara lätt att koppla in till oscilloskop och signalgenerator. Vi beslutade även att fräsa kretskortet själva istället för att skicka iväg det på tillverkning för att lättare kunna korrigera felaktigheter vid designen. Programvaran som användes till kretskortslayouten var Cadsoft Eagle. Många av de komponenter som vi använde fanns inte med i standardbiblioteken vilket medförde att vi var tvungna att rita dessa själva. På den första versionen på kortet hade vi missat en del designregler. Eftersom vi aldrig tidigare designat ett kretskort kände vi inte till dessa. Det var till exempel att inte ha några 90º böjar på ledningar, att signalledningarna kunde göras tunnare samt att matningsledningarna skulle vara bredare. För att inte behöva fräsa bort all koppar på kortet som inte används måste man koppla detta till jord för att undvika störning. Vid fräsning av kortet, som även det var nytt för oss, stötte vi på ytterligare problem. När första sidan var fräst och kortet vändes uppstod en förskjutning längs y-axeln. Denna förskjutning var på nästan 1mm. Detta problem kunde enkelt lösas genom att borra ett hål innan vändningen på kortet och sedan borra ett nytt hål på samma koordinat efter vändningen och därefter korrigera förskjutningen i datorn. Vid lödning på det första kortet utan förskjutning släppte kopparlaminatet, detta på grund av att fräsen hade tagit för djupt. Ett nytt kort frästes och alla komponenter löddes dit. När matningsspänningen kopplades in på kortet gick spänningsregulatorerna som delar upp i de fem olika spänningsnäten sönder. Vid mätning med multimeter visade det sig att denna DC-adapter ej var stabiliserad. Den levererade 19V istället för de 12V den var specificerad att leverera. En stabilisering som var justerbar från ungefär 1V till ungefär 12V konstruerades. Vid test med en last som motsvarade kortets last kunde vi konstatera att denna var mycket stabil. Vid fortsatta mätningar på kortet konstaterades att det var kortslutning mellan 3 av de 5 matningsspänningarna och jordplanet. Detta kan troligtvis ha orsakats av kopparspån som blir kvar mellan ledningar efter fräsningen. För att undvika detta bör alla banor skrapas med en liten kniv och sedan lägga kortet i ett K-sprit bad och dra med en pensel för att alla lösa kopparspån ska sköljas bort. Efter detta bör kortet granskas under mikroskåp för att se att alla banor är rena från kopparspån. För att få en bättre översikt på funktionen på kretskortet och dess komponenter valde vi att fräsa ett nytt kort och noggrant granska alla banor på kopparspån. När alla banor var rena från kopparspån löddes spänningsregulatorerna på plats samt avkopplingskondensatorer till dessa. Då samtliga spänningsnät fungerade som planerat löddes CPLD: n, JTAG-kontakt, resetknapp samt oscillatorn på plats. Vid inkoppling av strömmen så oscillatorn började svänga gick en av spänningsregulatorerna sönder. När vi läste i databladet för spänningsregulatorerna visade det sig att vi hade förväxlat den kapsel dessa hade med en annan som kunde leverera mer ström. Den kapsel som vi använde klarade bara av att leverera 250 ma och inte de 380 ma som CPLD:n drar vid 40 MHz. 3

Vi letade efter någon annan spänningsregulator med samma kapsel som kunde leverera mer ström. Dessvärre hittade vi ingen spänningsregulator med samma kapsel som klarade av att leverera tillräckligt med ström. Då det inte fanns någon passande spänningsregulator med samma kapsel ritades kortet om med andra kraftigare spänningsregulatorer. De nya spänningsregulatorerna klarade av att leverera 800mA. Ett nytt kort kunde tillverkas med spänningsregulatorer som kunde leverera tillräckligt med ström. För att vara säkra på att inte överbelasta spänningsregulatorerna löddes även kylflänsar i koppar fast på dessa. Nu när kretskortet fungerade kunde vi fokusera på mjukvarudesignen. Eftersom oscillatorkretsen i ASIC: en inte fungerade, mer om detta under testning, valde vi även att byta ut 40 MHz oscillatorn till CPLD:n mot en 16 MHz. Programmering och simulering För att testa att CPLD: n gick att programmera skrev vi ett program som omvandlade systemklockan till en 200 khz klocka som lades ut på en I/O-pinne. Detta fungerade utan problem och vi kunde nu fokusera på att få den seriella kommunikationen mellan kortet och datorn att fungera. Först använde vi en UART som kom från Opencores.org. Efter att vi pratat med handledaren och kom vi fram till att den var onödigt komplicerad och använde sig av flera kontroll- och statussignaler som inte behövdes. Därför tittade vi på en UART från xilinx. Vi fick inte den att fungera med kommunikation. Den hittade startbiten men sedan var de någon form av fördröjning som gjorde att de två nästa bitarna inte lästes in, detta medförde att de två sista bitarna alltid blev ettor då stoppbiten redan var satt. Problemet visade sig inte då vi simulerade utan bara vid det verkliga testet. Vi beslutade oss då för att skriva en egen UART. Det resulterade i en väl fungerande UART som bara har de nödvändigaste funktionerna. De tester som skulle göras var att se om AD-omvandlarna och phaseshiftern fungerade. När vi hade skrivit ett program för att kontrollera funktionen på AD-omvandlarna upptäckte vi att det skulle bli svårt att få plats med testet för phaseshiftern i samma program i CPLD: n. Därför beslutade vi oss för att göra två olika program. Båda programmen innehåller UART: en och har en systemklocka på 16 MHz som även läggs ut till ASIC: en. 4

Testning Det första testet som utfördes var att kontrollera den seriella kommunikationen mellan kortet och datorn. Detta gjordes med hjälp av ett program som skickade det decimala värdet 82. Vårat program skulle då skicka tillbaka värdet 83 om det var 82 som kom in i CPLD:n annars skulle det skicka 81. Nästa test var på ASIC: ens AD-omvandlare. För att kunna läsa från AD-omvandlarna behövs ett program som styr CPLD: n genom att välja vilken av AD-omvandlarna som ska läsas ifrån. Programmet sätter signalen AD_conv_request hög varannan gång. När vi nu testade lägga på en spänning på ingången till AD 1 för att se om AD-omvandlaren arbetade eftersom vi inte fick något värde på datorn började vi felsöka. Vi konstaterade att testsignalerna från AD-omvandlaren ständigt var låga och att det inte uppstod någon upp- och urladdningskurva på kondensatorn till AD 1. Vi fortsatte felsökningen och konstaterade att den keramiska resonatorn inte svängde. När vi mätte på in- och utgången till oscillatorn låg dessa på olika nivåer vilket indikerade att motståndet som ska ligga mellan dessa signaler inte fungerade. Vi testade då löda dit ett 1MΩ motstånd. När vi nu mätte på in- och utgångarna låg dessa på samma nivå men utan att resonatorn svängde. Vi testade då lägga på en spänning på ingången i serie med ett motstånd på 100kΩ och mätte om det gick någon ström genom kretsen, vilket det inte gjorde. Om det hade gjort det hade transistorerna i inverteraren varit trasiga. Efter detta testade vi med en kristall istället för resonatorn men inte heller detta kunde få klockan att svänga. Slutsats Det verkar som att ASIC: en inte får ström som den ska. Vi har kontrollerat de olika spänningsnäten och de fungerar. Oscillatorkretsen startar t.ex. inte och utan en systemklocka går det inte att testa om AD-omvandlarna fungerar. Det finns en backupingång där man kan koppla in en systemklocka men inte ens med en systemklocka kopplade till denna fungerar AD-omvandlarna. 5

UART UART är en förkortning för Universal Asynchronous Receiver/Transmitter. UART bygger på asynkron kommunikation och med det menas då två eller fler enheter, med av varandra oberoende klockor, kommunicerar. Överföringshastigheten för asynkron kommunikation mäts i baud. En UART består av två block. Det första blocket är en receiver som tar emot informationen i seriell form och levererar den vidare i parallell form. Det andra blocket är en transmitter som tar data i parallell form för att sedan skicka den vidare i seriell form. Eftersom inga handskakningar används vid asynkron kommunikation lägger transmittern till en startbit framför de åtta databitarna och en stoppbit efter dessa. Startbit Databitar Stopbit Bild 1: Datapaket Startbiten används för att uppmärksamma receivern på att en byte är på väg att skickas. Efter startbiten skickas de åtta databitarna med den minst signifikanta (LSB) biten först. För att få en så säker receiver som möjligt bör man testa varje databit 16 gånger och om hälften av dessa är höga ska den mottagna biten tolkas som en hög bit. För att kunna göra en mer komprimerad men inte lika säker mottagardel kan man välja att vänta tills 8 av klockpulser har gått och tolka den mottagna biten som det den är vid den klockpulsen. Anledningen till att man ska vänta några klockpulser är att signalen då hunnit stabilisera sig efter eventuellt omslag. Efter att alla databitar har skickats lägger transmittern till en stoppbit. Vår UART Den UART vi skrivit kommunicerar med en baud rate på 9600. Kommunikationen med dator sköts via signalerna rxd och txd. Typ Namn Beskrivning In Rst System reset In Clk16x Den är 16 gånger 9600Hz = 153 600 Hz In Rxd Signal från datorn. Som läggs till dout. In Send Sätter startbit aktiv hög. In Din Vektor med den data som man vill skicka till datorn. Åtta bitar lång. Ut Dout Vektor som UART:en sätter ihop av den data som kommer från datorn. Åtta bitar lång. Ut Txd Signal till datorn. Som kommer från din. Ut Tbe Hög när buffern är tom och UART:en är redo att skicka data från CPLD till datorn. Tabell 1: Signaltabell för UART:en 6

Transmittern Eftersom startbiten är aktivt låg kommer transmittern att lägga signalen txd hög om det inte finns någon data som ska skickas. När det finns information i din att skicka kommer transmittern lägga över den informationen i vektorn tmpdin och ändra signalen txd till låg för att uppmärksamma den mottagande UART: en att en byte är på väg att skickas. De åtta databitarna skickas nu seriellt med en frekvens om 9600 Hz. Eftersom stoppbiten är aktivt hög sätts txd till hög efter att alla åtta databitar har skickats. Receivern Vi valde på grund av utrymmesskäl att göra en enklare receiver som inte kontrollerar varje bit 16 gånger utan istället läser av rxd efter 8 klockpulser vilket blir mitt i varje bit. Så länge ingen information finns att ta emot ligger signalen rxd hög. Då rxd går låg tillräckligt länge för att receivern ska tolka den som en låg bit kommer den tolkas som en startbit. Receivern kommer nu att samla de åtta databitarna som följer i vektorn dout. När en datasekvens tagits emot går rxd hög för att indikera en stoppbit. Rxd kommer att kvarstå hög till nästa startbit kommer. 7

Testprogram All kommunikationen mellan dessa testprogram och datorn sköts via vår UART. Test av AD-omvandlarna Programmets uppgift är att kontrollera hur AD-omvandlaren arbetar. Typ Namn Beskrivning In Clk System klocka In Rst System reset In Power_on_reset Från ASIC läggs i Din(2) i andra paketet In Sw_input Från ASIC läggs i Din(3) i andra paketet In Sw_op Från ASIC läggs i Din(4) i andra paketet In Comp Från ASIC läggs i Din(5) i andra paketet In Trip Från ASIC läggs i Din(6) i andra paketet In Data_pending Från ASIC läggs i Din(7) i andra paketet In Rxd Seriell signal från datorn In Clk200kHz Signalen testas In Clk16_out Används ej In AD0_serial_out Seriell utgång från AD-omvandlare In AD1_serial_out Seriell utgång från AD-omvandlare Ut Clk16_in 16 MHz Från CPLD:n Ut Txd Seriell signal till datorn Ut Reset_n Reset signal till ASIC:en Ut Serial_input Data från CPLD:n Ut Serial_clock 2 MHz från CPLD:n Ut Ad_conv_request Sätts från datorn på bit 3 Tabell 2: Signaltabell till testprogrammet för test av AD-omvandlarna Från kort I ASIC:en finns en AD-omvandlaren på 10-bitar, denna skiftas in till vektorn AD som är tio bitar. Från kortet vill vi skicka AD-omvandlarens 10-bitar samt sex statussignaler. UART:en kan bara skicka 8-bitar åt gången därför måste vi skicka värdena i två byte. Den första byten innehåller bit 0 till 7 från AD-omvandlaren. Den andra byten innehåller de sista två bitarna från AD-omvandlaren samt statussignalerna från ASIC:en Den ser ut på följande sätt: AD (9-0) = Tilldelas av vald AD-omvandlare Din(2) = power_on_reset Din(3) = sw_input Din(4) = sw_op Din(5) = comp Din(6) = trip Din(7) = data_pending 8

Till kort Man styr detta program från en dator genom att skicka in vektor på åtta bitar till UART:en. Bit 0 till 2 i denna vektor från datorn sätter värdet på vektorn state. Här väljer man vilken ADomvandlare man vill läsa ifrån. State 001 = AD0 State 010 = AD1 När dessa är satta uppdateras inte värdet för än kortet har skickat klart allt till datorn och åter står i läge för att ta nya order. Bit 3 från dout tilldelar signalen ad_conv_request. Bit 4 tilldelar signalen serial_input. Övriga bitar används ej. Clk2= 1 dout(2downto0)= 001 Synkar med AD0 Läser från AD0 Default Bitcount< 1001 dout(2downto0)= 010 tbe= 1 Sänder Bitcount= 1001 Synkar AD1 tbe= 0 Synkar sändning Bitcount< 1001 Clk2= 1 Bitcount= 1001 Läser från AD1 9

Koden Tillståndsmaskinen i första processen börjar i state others, det är i detta tillstånd data läses in från datorn. Från detta tillstånd hoppar man till state 001 eller 010 beroende på vilken AD-omvandlare man ska titta på. De enda som skiljer dessa två state ifrån varandra är att de tittar på olika AD-omvandlare. De första som händer i state 001 eller state 010 är att man väntar på att serial_clock går hög för att då hoppa till state 011 eller 100 beroende på vilken AD-omvandlare man tittar på. Detta är för att AD-omvandlaren uppdaterar värdet på utgången när serial_clock går hög. För att synkronisera AD-omvandlaren i ASIC:en med CPLD:n väntar vi till serial_clock går låg för att där skifta in värdet i vektorn AD. När ett värde är inläst från AD-omvandlaren räknas räknaren bitcount upp. Om inte alla bitar är inlästa hoppar man tillbaka till föregående tillstånd för att där invänta nästa värde. När alla inläsningar av värden är klara fortsätter programmet till state 111. State 111 är tillståndet som lägger över data till UART:en som ska skickas till datorn. Innan data kan läggas över till vektorn din kontrolleras signalen tbe som är en kontrollsignal från UART:en. När tbe är hög är bufferten tom och UART:en är redo att skicka data. Först sänder man de första 8-bitarna ur vektor AD genom att lägga över dem i vektorn din till UART:en. När dessa har skickats och tbe åter går hög läggs de sista två bitarna från ADomvandlaren in samt de statussignaler som ska skickas till datorn. De sista som händer där är att man nollställer räknaren bitcount och hoppar till state others för att invänta nya kommandon från datorn. Nästa process är till för att generera klocksignalen clk16x som ska styra UART:en. Den överförings hastighet vi har på UART:en är 9600 baud. 10

Test av Fasskiftaren Programmets uppgift är att från en dator kunna mata in värden till fasskiftaren för att se att fasskiftning sker och att rätt förstärkarsteg väljs. Typ Namn Beskrivning In Clk System klocka In Rst System reset In Rxd Seriell signal från datorn Ut Clk16_in 16 MHz Från CPLD:n Ut Txd Seriell signal till datorn Ut Reset_n Reset signal till ASIC:en Ut Serial_input Data från CPLD:n Ut Serial_clock 2 MHz från CPLD:n Ut Ad_conv_request Sätts från datorn på bit 3 Tabell 3: Signaltabell till testprogrammet för test av fasskiftningen Från kort Ingen information från ASIC: en kommer att läsas in i CPLD: n. För att kontrollera fasskiftningen och att rätt förstärkare är vald finns det åtta stycken bnc-kontakter. Fyra av dessa är ingångar till förstärkarstegen och resterande fyra är utgångar från dessa förstärkarsteg. Genom att koppla en känd spänning till ingången på ett förstärkarsteg kan man kontrollera på utgången att förstärkarsteget fungerar. För att styra vilket förstärkarsteg som ska användas samt fasskiftningen för de fyra stegen måste CPLD: n få fyra byte från datorn som sedan skiftas vidare in till ASIC: en. När dessa fyra bytes har skiftats vidare till ASIC: en returneras en byte till datorn för att rapportera att ett nytt värde nu kan skickas. Till kort Detta program styrs från en dator genom att först skicka in vektor på åtta bitar till UART: en. Bit 1 till 0 i denna vektor från datorn sätter värdet på vektorn start. För att programmet ska ta emot de fyra byte som ska skiftas in till ASIC: en måste vektorn start måste start vara 01. 11

Start= 01 Kopierar dout State= 10 Default Tar emot data tbe= 1 Nollställer tmpreg(7)='z' AND byte="11" Koden Den första processen i programmet består av en tillståndsmaskin med fyra tillstånd. Vid reset kommer programmet att starta från state others, det är i detta tillstånd som information från datorn läses in. För att kunna mata in värden till fasskiftaren måste programmet först ta emot en byte där bit 1 till 0 är 01. Bit 1 till 0 läggs över till vektorn start och signalen first går låg för att indikera att programmet nu mottagit byten med styrsignalen för programmet. Nästa gång vektorn dout uppdateras kommer programmet hoppa till state 01 där värdet i dout läggs över till vektorn tmpreg. Programmet hoppar vidare till tillståndet 01 för att där vänta på att signalen puls ska gå hög. När puls går hög läggs värdet från bit sju i vektorn tmpreg över till signalen serial_input. Slutligen skiftas bit 6 till 0 till bit 7 till 1 och Z läggs till i bit 0 i vektorn tmpreg. Signalen puls ser till att värdet i serial_input uppdateras med en frekvens på 2MHz. Under tiden kontrolleras även varje klockpuls om bit sju i vektorn tmpreg är Z och räknaren byte är mindre än 3. När bit sju är Z har alla åtta databitar skiftats in till ASIC: en och räknaren byte räknas upp ett steg. Programmet hoppar nu till state 00 för att ta emot en ny byte från UART: en. När räknaren byte = 11 har tre byte skiftats in till ASIC: en. Nästa gång bit sju i vektorn tmpreg är Z nollställs räknaren byte och signalen AD_conv_request sätts hög för att indikera till ASIC: en att nu bestämma vilket förstärkarsteg som ska arbeta samt fasskiftningen för dessa. Programmet hoppar sedan vidare till state 11. State 11 är tillståndet som lägger över den data till UART:en som ska skickas till datorn. Innan data kan läggas över till vektorn din kontrolleras signalen tbe som är en kontrollsignal från UART:en. När tbe är hög är bufferten tom och UART:en är redo att skicka data. Värdet 00000001 läggs in i vektorn din för att indikera till datorn att alla fyra byten nu har skiftats in till ASIC: en. Signalen send sätts hög för att kunna skicka och signalen first sätts hög för att nu vänta på styrsignal från datorn. Programmet hoppar nu till tillståndet others och vektorn start sätts till 00. Nästa process är till för att generera klocksignalen clk16x som ska styra UART:en. Den överförings hastighet vi har på UART:en är 9600 baud. Den sista processen är till för att generera en klocksignal på 2 MHz. Denna signal, serial_clock, styr när information kan skiftas in och ut från ASIC: en. 12

Pcb Testbed for a semi-full-custom mixed signal ASIC För att testkortet ska vara så enkelt som möjligt att använda har vi valt att endast ansluta en spänningskälla och utifrån denna dela upp till de fem olika spänningsnäten till ASIC: en och CPLD: n. Alla fem spänningsregulatorerna är försedda med kopparkylning, se bild nedan, men för att inte överbelasta dessa bör matningsspänningen till kortet ligga på ungefär 6,5 7 volt. Bild 2: Undersida av testkort 13

Det finns även kortslutningsbyglar direkt efter spänningsregulatorerna för att kunna koppla bort valfritt spänningsnät vid olika tester. Kortslutningsbyglarna är de blåa komponenterna till vänster i bilden nedan. Bild 3: Ovansida av testkort 14

Kommunikationen med dator sköts via usbkontakten som är placerad till höger om kontakten för matningsspäning. Till vänster om ASIC: en finns sju testpunkter. Till en av dessa testpunkter, full charge som indikerar när batteriet är fulladdat, är även en lysdiod kopplad. Anslutning för batteriet finns längst ner till vänster på kortet. Ovanför testpunkterna finns även en jordpinne placerad för att underlätta vid mätningar med mätprob till oscilloskop. Ovanför ASIC: en finns ingången till AD1. I Ovankant av kortet är in och utgångarna till de fyra förstärkarstegen som finns i ASIC: en samlade. Vi valde att använda BNC-kontakter här eftersom det gör det enkelt att koppla in en spänning från en spänningskälla samt att det även underlättar vid mätning på utgångarna med oscilloskop. Till höger om ASIC: en är CPLD: n placerad och ovanför denna är resetknappen. Den fungerar som restknapp till både ASIC och CPLD. På högra sidan om CPLD: n är JTAG anslutningarna som används vid programmering av CPLD: n. 15

16

Programkod Testbed for a semi-full-custom mixed signal ASIC Test av AD-omvandarna Testad.vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity testad is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; power_on_reset : in Std_Logic; sw_input : in Std_Logic; sw_op : in Std_Logic; comp : in Std_Logic; trip : in Std_Logic; data_pending : in Std_Logic; rxd : in Std_Logic; Clk16_In : out Std_Logic; txd : out Std_Logic; reset_n : out Std_Logic; Serial_input : out Std_Logic; Serial_clock : out Std_Logic; AD_conv_request : out Std_Logic; AD1_serial_out : in Std_Logic; -- läggs i AD AD0_serial_out : in Std_Logic); -- läggs i AD end testad; architecture Behavioral of testad is component UART is Port ( rst : in Std_Logic; clk16x : in Std_Logic; send : in std_logic; rxd : in Std_Logic; Rd : in std_logic; din : in Std_Logic_Vector(7 downto 0); dout : out Std_Logic_Vector(7 downto 0); txd : out Std_Logic; tbe : out std_logic; da : out std_logic); end component; signal din :Std_Logic_Vector(7 downto 0); signal dout :Std_Logic_Vector(7 downto 0); signal clk16x signal clk16div :std_logic_vector(5 downto 0); signal send signal Bitcount :Std_Logic_Vector(3 downto 0); signal State :Std_Logic_Vector(2 downto 0):="000"; signal AD :Std_Logic_Vector(9 downto 0); signal tbe signal delay signal Rd signal da signal ready signal clk2div :std_logic_vector(2 downto 0); signal clk2 17

begin UARTdev : UART port map (rst,clk16x,send,rxd,rd,din,dout,txd,tbe,da); process(clk,rst) --skickar till dator begin if rst='0' then Bitcount <= "0000"; din <= "00000000"; delay <= '0'; Rd <= '0'; elsif clk'event AND clk = '1' then case State is when "001" => if clk2 = '1' then state <= "011"; when "011" => -- Skickar från AD0 till dator if clk2 = '0' then if bitcount < "1001" then AD(9 downto 0)<= AD(8 downto 0) & AD0_serial_out; bitcount <= bitcount + 1; state <= "001"; elsif bitcount = "1001" then AD(9 downto 1)<= AD(8 downto 0); AD(0) <= AD0_serial_out; state <= "111"; when "010" => if clk2 = '1' then state <= "100"; when "100" => -- Skickar från AD1 till dator if clk2 = '0' then if bitcount < "1001" then AD(9 downto 0)<= AD(8 downto 0) & AD1_serial_out; bitcount <= bitcount + 1; state <= "010"; elsif bitcount = "1001" then AD(9 downto 1)<= AD(8 downto 0); AD(0) <= AD1_serial_out; state <= "111"; when "111" => --Send if tbe = '1' AND delay = '0' then din <= AD(7 downto 0); send <= '1'; delay <= '1'; elsif tbe = '0' then send <= '0'; state <= "101"; delay <= '0'; when "101" => if tbe = '1' AND delay = '0' then din(0) <= AD(8); din(1) <= AD(9); din(2) <= power_on_reset; din(3) <= sw_input; din(4) <= sw_op; din(5) <= comp; din(6) <= trip; din(7) <= data_pending; bitcount <= "0000"; send <= '1'; state <= "000"; delay <= '1'; 18

when others => if tbe = '0' then send <= '0'; delay <= '0'; if ready = '0' then Rd <= '0'; if ready = '1' AND da = '1' then State <= dout(2 downto 0); AD_conv_request <= dout(3); Serial_input <= dout(4); Rd <= '1'; ready <= '0'; elsif da = '0' then ready <= '1'; end case; end process; Testbed for a semi-full-custom mixed signal ASIC process(clk,rst) -- Genererar en klocka som är 16x9600 (153846 Hz) begin if rst='0' then clk16div<="000000"; clk16x<='1'; elsif clk'event AND clk = '1' then clk16div<=clk16div+1; if clk16div="110100" then clk16x<= NOT clk16x; clk16div<="000000"; end process; process(clk,rst) -- Genererar en klocka som är 2MHz begin if rst='0' then clk2div <= "000"; clk2 <= '1'; elsif clk'event AND clk = '1' then clk2div <= clk2div + 1; if clk2div = "100" then clk2 <= NOT clk2; elsif clk2div = "100" then clk2 <= NOT clk2; clk2div<="000"; end process; Clk16_In <= Clk; serial_clock <= clk2; reset_n <= rst; end Behavioral; 19

testad.ucf #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments NET "AD0_serial_out" LOC = "P10" ; NET "AD1_serial_out" LOC = "P9" ; NET "AD_conv_request" LOC = "P15" ; NET "clk" LOC = "P24" ; NET "Clk16_In" LOC = "P16" ; #NET "Clk16_Out" LOC = "P17" ; #NET "Clk200kHz" LOC = "P14" ; NET "comp" LOC = "P99" ; NET "data_pending" LOC = "P11" ; NET "power_on_reset" LOC = "P94" ; NET "reset_n" LOC = "P96" ; NET "rst" LOC = "P1" ; NET "rxd" LOC = "P38" ; NET "Serial_clock" LOC = "P12" ; NET "Serial_input" LOC = "P13" ; NET "sw_input" LOC = "P97" ; NET "sw_op" LOC = "P98" ; NET "trip" LOC = "P8" ; NET "txd" LOC = "P37" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE Testbed for a semi-full-custom mixed signal ASIC 20

test.do restart -force destroy.wave add wave /* force clk 0 0, 1 12 -repeat 25 run 10 force rst 0 run 40 force rst 1 run 5000 force rxd 1 force ad0_serial_out 1 force ad1_serial_out 1 force power_on_reset Z force sw_input Z force sw_op Z force comp Z force trip Z force data_pending Z run 50000 force rxd 0 run 42400 force rxd 1 run 42400 force rxd 0 run 42400 run 42400 run 42400 run 42400 run 42400 run 42400 run 42400 force rxd 1 run 42400 run 1000000 21

Simulering Bild 4: Simuleringsförlopp för testad 22

Test av Fasskiftaren Phaser.vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity phaser is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; rxd : in Std_Logic; Clk16_In : out Std_Logic; txd : out Std_Logic; reset_n : out Std_Logic; Serial_input : out Std_Logic; Serial_clock : out Std_Logic; AD_conv_request : out Std_Logic); end phaser; architecture Behavioral of phaser is component UART is port ( rst : in Std_Logic; clk16x : in Std_Logic; send : in std_logic; rxd : in Std_Logic; Rd : in std_logic; din : in Std_Logic_Vector(7 downto 0); dout : out Std_Logic_Vector(7 downto 0); txd : out Std_Logic; tbe : out std_logic; da : out std_logic); end component; signal din :Std_Logic_Vector(7 downto 0); signal dout :Std_Logic_Vector(7 downto 0); signal clk16x signal clk40div :std_logic_vector(7 downto 0); signal send signal tbe signal Rd signal da signal ready signal State :Std_Logic_Vector(1 downto 0):="00"; signal clk2div :std_logic_vector(4 downto 0); signal clk2 signal puls signal byte :std_logic_vector(1 downto 0); signal tmpreg :std_logic_vector(7 downto 0); signal start :std_logic_vector(1 downto 0); signal first signal clk16 23

begin UARTdev : UART port map (rst,clk16x,send,rxd,rd,din,dout,txd,tbe,da); process(clk,rst) begin if rst='0' then din <= "00000000"; Rd <= '0'; byte <= "00"; first <= '1'; clk16 <= '0'; elsif clk'event AND clk = '1' then clk16 <= NOT clk16; case State is when "01" => tmpreg <= dout; state <= "10"; when "10" => if puls = '1' then serial_input <= tmpreg(7); tmpreg(7 downto 0) <= tmpreg(6 downto 0) & 'Z'; if tmpreg(7) = 'Z' AND byte < "11" then serial_input <= 'Z'; byte <= byte + 1; state <= "00"; elsif tmpreg(7) = 'Z' AND byte = "11" then byte <= "00"; serial_input <= 'Z'; AD_conv_request <= '1'; state <= "11"; when "11" => if tbe = '1' then din <= "00000001"; send <= '1'; start <= "00"; first <= '1'; state <= "00"; when others => if clk16x = '1' then AD_conv_request <= '0'; if tbe = '0' then send <= '0'; if ready = '0' then Rd <= '0'; if ready = '1' AND da = '1' AND first = '1' then Start <= dout(1 downto 0); Rd <= '1'; ready <= '0'; first <= '0'; elsif ready = '1' AND da = '1' AND first = '0' then if start = "01" then ready <= '0'; Rd <= '1'; state <= "01"; else first <= '1'; ready <= '1'; Rd <= '1'; elsif da = '0' then ready <= '1'; end case; end process; 24

process(clk,rst) -- Genererar en klocka som är 16x9600 (153846 Hz) begin if rst='0' then clk40div<="00000000"; clk16x<='1'; elsif clk'event AND clk = '1' then clk40div<=clk40div+1; if clk40div="10000010" then clk16x<= NOT clk16x; clk40div<="00000000"; end process; process(clk,rst) -- Genererar en klocka som är 2MHz begin if rst='0' then clk2div <= "00000"; clk2 <= '1'; elsif clk'event AND clk = '1' then clk2div <= clk2div + 1; puls <= '0'; if clk2div = "01010" then clk2 <= NOT clk2; elsif clk2div = "10100" then clk2 <= NOT clk2; puls <= '1'; clk2div<="00000"; end process; reset_n <= rst; serial_clock <= clk2; clk16_in <= clk16; end Behavioral; 25

Phaser.ucf #PACE: Start of Constraints generated by PACE #PACE: Start of PACE I/O Pin Assignments #NET "AD0_serial_out" LOC = "P10" ; #NET "AD1_serial_out" LOC = "P9" ; NET "AD_conv_request" LOC = "P15" ; NET "clk" LOC = "P24" ; NET "Clk16_In" LOC = "P16" ; #NET "Clk16_Out" LOC = "P17" ; #NET "Clk200kHz" LOC = "P14" ; #NET "comp" LOC = "P99" ; #NET "data_pending" LOC = "P11" ; #NET "power_on_reset" LOC = "P94" ; NET "reset_n" LOC = "P96" ; NET "rst" LOC = "P1" ; NET "rxd" LOC = "P38" ; NET "Serial_clock" LOC = "P12" ; NET "Serial_input" LOC = "P13" ; #NET "sw_input" LOC = "P97" ; #NET "sw_op" LOC = "P98" ; #NET "tmp0" LOC = "P54" ; #NET "tmp1" LOC = "P55" ; #NET "tmp2" LOC = "P56" ; #NET "tmp3" LOC = "P57" ; #NET "tmp4" LOC = "P58" ; #NET "trip" LOC = "P8" ; NET "txd" LOC = "P37" ; #PACE: Start of PACE Area Constraints #PACE: Start of PACE Prohibit Constraints #PACE: End of Constraints generated by PACE Testbed for a semi-full-custom mixed signal ASIC 26

test.do restart -force destroy.wave add wave /* force clk 0 0, 1 12 -repeat 25 run 10 force rst 0 run 40 force rst 1 run 5000 force rxd 1 run 50000 force rxd 0 run 104800 force rxd 1 run 104800 force rxd 0 run 104800 run 104800 run 104800 run 104800 run 104800 run 104800 run 104800 force rxd 1 run 104800 run 100000 27

Simulering Bild 5: Simuleringsförlopp för fasskiftningen 28

UART:en uart.vhdl library ieee; use ieee.std_logic_1164.all ; use ieee.std_logic_arith.all ; use ieee.std_logic_unsigned.all ; entity uart is PORT (rst,clk16x,send,rxd,rd : in std_logic; din : in std_logic_vector(7 downto 0); dout : out std_logic_vector(7 downto 0); txd,tbe,da : out std_logic); end uart; architecture v1 of uart is component txmit port (reset_n,clk16x,send : in std_logic; din : in std_logic_vector(7 downto 0); txd,tbe: out std_logic); end component ; component rcvr port (reset_n,clk16x,rxd,rd: in std_logic; da : out std_logic; dout : out std_logic_vector(7 downto 0)); end component ; begin u1 : txmit PORT MAP (reset_n => rst, clk16x => clk16x, send => send, din => din, txd => txd, tbe => tbe); u2 : rcvr PORT MAP (reset_n => rst, clk16x => clk16x, rxd => rxd, da => da, Rd => Rd, dout => dout); end v1 ; 29

rcvr.vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity rcvr is Port ( clk16x : in std_logic; reset_n : in std_logic; rxd : in std_logic; da : out std_logic; Rd : in std_logic; dout : out std_logic_vector(7 downto 0)); end; architecture rtl of rcvr is signal count : std_logic_vector(3 downto 0); signal bitcount : std_logic_vector(3 downto 0); signal state : std_logic; signal tmpdout : std_logic_vector(7 downto 0); begin process(clk16x,reset_n) begin if reset_n = '0' then count <= "0000"; bitcount <= "0000"; state <= '0'; da <= '0'; elsif clk16x'event AND clk16x = '1' then if state = '0' AND Rd = '0' then da <= '0'; if state = '0' AND rxd = '0' AND Rd = '0' then count <= count + 1; if count = "0111" then bitcount <= bitcount + 1 ; state <= '1'; count <= "0000"; elsif state = '1' then if count = "1111" AND bitcount < "1001" then tmpdout(6 downto 0) <= tmpdout(7 downto 1); tmpdout(7) <= rxd; bitcount <= bitcount + 1; elsif count = "1111" AND bitcount = "1001" then tmpdout(6 downto 0) <= tmpdout(7 downto 1); tmpdout(7) <= rxd; if Rd = '0' then ------ dout <= tmpdout; da <= '1'; tmpdout <= "ZZZZZZZZ"; state <= '0'; bitcount <= "0000"; if count = "1111" then count <= "0000"; else count <= count +1; else count <= "0000"; end process; end rtl; Testbed for a semi-full-custom mixed signal ASIC 30

txmit.vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity txmit is Port ( clk16x : in std_logic; reset_n : in std_logic; send : in std_logic; --kan kanske lösa i blocket txd : out std_logic; tbe : out std_logic; din : in std_logic_vector(7 downto 0)); end; architecture rtl of txmit is signal clkcount : std_logic_vector(3 downto 0); signal bitcount : std_logic_vector(3 downto 0); signal tmpdin : std_logic_vector(7 downto 0); signal clk1x : std_logic; begin process (reset_n,clk16x) begin if reset_n = '0' then clkcount <= "0000" ; elsif clk16x'event and clk16x = '1' then clkcount <= clkcount + "0001" ; end if ; end process ; clk1x <= clkcount(3) ; process (reset_n,clk1x) begin if reset_n = '0' then txd <= '1'; tmpdin <= "ZZZZZZZZ"; bitcount <= "0000"; tbe <= '1'; elsif clk1x'event and clk1x = '1' then if send = '1' AND bitcount = "0000" then txd <= '0'; tbe <= '0'; tmpdin <= din; bitcount <= "0001"; elsif bitcount >= "0001" AND bitcount <= "1000" then txd <= tmpdin(0); tmpdin(6 downto 0) <= tmpdin(7 downto 1); bitcount <= bitcount + 1; elsif bitcount = "1001" then tbe <= '1'; txd <= '1'; bitcount <= "0000"; end process; end rtl; 31

Referenser Fallberg, P; 2005; Implementation studies of a semi-full-custom mixed signal ASIC from a SoC perspective. 32