Practicum 1: Combinatorische schakelingen Groep A.6: Lennert Acke Pieter Schuddinck Kristof Vandoorne Steven Werbrouck
Inhoudstabel 1. Doelstellingen... 2 2. Voorbereiding... 3 3. Hardware-practicum... 6 3.1 Vertragingstijden... 6 3.2 Logic Analyser... 6 3.3 Capacitaire belasting... 8 1
1. Doelstellingen Dit practicum handelt over combinatorische schakelingen en heeft de volgende doelstellingen: De eerste doelstelling is op een systematische manier een eenvoudig combinatorisch ontwerp te maken, dit te minimaliseren en te implementeren. Een tweede doelstelling is concreet kennis te maken met een logische familie, in dit geval standaardlogica in CMOS-technologie, in SSI- en MSI-functies. De derde doelstelling is het fysisch gedrag van de schakeling te observeren met de meetapparatuur, en eventuele afwijkingen van het ideaal theoretisch of gesimuleerd gedrag te observeren en te interpreteren. We beschikken over een synchrone 4-bit teller. Doel is om een combinatorisch circuit op te bouwen dat drie uitgangen heeft: Een uitgang die hoog is wanneer de teller op 1 of 3 staat. Een uitgang die hoog is wanneer de teller op 7 of 8 staat. Een uitgang die hoog is wanneer de teller groter is dan 4. Het ontwerp moet de vorm aannemen van een (optimaal) 2-niveau circuit, waarbij alleen NAND-poorten en invertoren mogen gebruikt worden. Invertors die de uitgangen van de teller inverteren tellen we niet mee als niveau. Een schema van het ontwerp staat in figuur 1. Figuur 1: Omgeving van het te ontwerpen circuit 2
2. Voorbereiding Op voorhand werden de datasheets van de gebruikte componenten bestudeerd. De 74HC162 geeft de specificaties van de 4-bit BCD teller. Op het practicum zelf wordt (bij gebrek aan BCD-tellers) een 4-bit teller gebruikt die van 0 (0000) tot 15 (1111) telt. De waarden groter dan 9 zijn voor ons bijgevolg irrelevant. De 74HC00 en 74HC10 beschrijven NAND-poorten met respectievelijk 2 en 3 inputs. De 74HC04 geeft informatie omtrent de gebruikte invertoren. De in de doelstelling omschreven schakeling werd onmiddellijk met de hand ontworpen en geminimaliseerd. Controle werd gedaan a.d.h.v. de implicantenmethode, geïllustreerd in het meegeleverde Excelbestand "realisatie.xls". Het resultaat is te vinden in figuur 2. Figuur 2: Poortschema van de gevraagde schakeling 3
De schakeling werd beschreven in VHDL en gesimuleerd in Aldec. De code is eveneens met dit practicumverslag meegegeven. De vertragingstijden die we implementeerden, werden berekend a.d.h.v. de gepaste datasheets van de gebruikte poorten. Aangezien in de datasheets vertragingstijden gegeven worden voor 2V, 4.5V en 6V en de voeding een waarde van 3V aanneemt, hebben we een waarde tussen de gegevens moeten kiezen. Daarbij werd gekeken naar de kolom met "typische" waarden, omdat we niet in extreme situatie aan het werken zijn. Op die manier kwamen we tot de volgende waarden: Invertor: 15 ns 2-input NAND-poort: 15 ns 3-input NAND-poort: 15 ns De simulaties geven aan dat de schakeling goed opgebouwd werd. Een eerste simulatie, waarbij de vertragingstijden uitgeschakeld waren, gaf exacte resultaten. Met de propagatie delays merken we (inderdaad) dat de uitgangen een bepaalde vertraging kennen. De tweede uitgang (die hoog moet staan bij 7 en 8) heeft een merkwaardig gedrag. Tussen de 7 en de 8 in wordt gedurende een korte periode (15 ns) even naar een laag niveau gesprongen (zie figuur 3). We vermoeden dat dit een "race-effect" is: niet alle poorten hebben immers dezelfde vertraging. Figuur 3: Simulatie van de uitgangen (op de tweede uitgang wordt kort tussen 7 en 8) 4
Tot slot wordt, als voorbereiding op het hardwaregedeelte, een lay-out schema getekend op een breadbord. Hierbij wordt het structuurschema uit figuur 2 afgebeeld op poorten in de effectief gebruikte componenten, zodanig dat de uiteindelijke bedrading zo eenvoudig en overzichtelijk mogelijk wordt. Figuur 4: Technology mapping: afbeelding van het structuurschema op een breadboard 5
3. Hardware-practicum We bouwen de schakeling op ons breadboard op a.d.h.v. figuur 4. De functiegenerator wordt ingesteld om een blokgolf te genereren tussen 0V en 3.3V. Om dit te realiseren wordt een DC-offset spanning gebruikt. We gebruikten een parallelweerstand van 50Ω om reflecties van het kloksignaal te vermijden. De frequentie stellen we aanvankelijk in op de voorgestelde 10MHz. Wanneer de FPGA geprogrammeerd is, kunnen we de werking van de teller controleren door de uitgangen ervan te verbinden met de pinnen PA1, PA3, PA5 en PA7. We merken inderdaad dat we geen BCD teller gebruiken, aangezien er t.e.m. 15 wordt geteld. Dit beïnvloedt echter onze resultaten niet. 3.1 Vertragingstijden Met de oscilloscoop worden de vertragingstijden opgemeten van Q A tot elk van de drie uitgangen. De meetpunten werden genomen halverwege de stijgende flank van elk signaal. De resultaten staan in tabel 1. functie 1 functie 2 functie 3 vertraging [ns] 23,0 26,0 20,8 Tabel 1: Vertragingstijden Deze waarden komen nogal overeen wat de simulatie laat blijken. In Aldec verkregen we voor de drie functies vertragingstijden van 30 ns. De verschillende poorten hebben in praktijk echter verschillende vertragingstijden. Ook binnen een chip kunnen zelfde poorten lichtjes variëren in vertraging. 3.2 Logic Analyser De meetingangen van de logic analyser in de FPGA verbinden we nu met de klok, de vier telleruitgangen en de drie circuituitgangen. Een schermafdruk van het programma Xilinx staat afgebeeld in figuur 5. De functies zijn op de figuur respectievelijk aangegeven door UIT1, UIT2 en UIT3. De telleruitgangen zijn Q A, Q B, Q C en Q D. Op de figuur werden markeringen aangebracht bij telleruitgang 0 en 10. Hiertussen liggen de relevante waarden. Functies 1 en 2 werken naar behoren. Bij de 3 de uitgang merken we echter een fout: wanneer de teller op 6 staat krijgen we een laag niveau i.p.v. het verwachte hoog niveau. Na herhaaldelijk nazicht van onze schakeling vonden we de fout niet. Uit de methode van de priemimplicanten blijkt dat de fout enkel kan liggen in de realisatie van NAND(B,C) (zie figuur 6, omkaderd in rood). We vermoeden dat de connectie van de uitgang van deze poort constant op 1 bleef staan. De reden hiervoor kan zijn dat er een stuck-at-1 fout tussen de 2-NAND en de 3-NAND zat. De 6
berekening gaf inderdaad aan dat 6 (0110) het patroon is dat deze fout kan detecteren! Ofwel was dus de uitgang van de 74HC00-component verkeerd, ofwel een ingang van de 74HC10- component. Zulke fouten worden normaliter wel opgemerkt bij de fabrikant Figuur 5: Logic Analyser Figuur 6: Fout bij derde functie: stuck-at-1? 7
3.3 Capacitaire belasting We bekijken nu de tweede uitgang als de teller zeven en acht is in detail. We belasten de twee ingangen van de laatste poort in deze schakeling om beurt met een capaciteit van 15 pf. Wegens tijdsgebrek konden we de verkregen waarden niet meer naar behoren in een Excelwerkblad invoegen. Op de oscilloscoop zelf merkten we enkele (kleine) verschillen. Wanneer geen condensator gebruikt werd, vonden we een glitch tussen 7 en 8. Dit is hetgeen onze simulatie al aangaf. Het plaatsen van een condensator aan de bovenste en onderste ingang ("boven" en "onder" volgens figuur 2) veranderde de diepte en breedte van deze glitch. Indien de condensator geplaatst wordt op de verbinding met de kleinste vertraging (bovenste ingang), dan is het relatieve tijdsverschil tussen de beide ingangen kleiner. Bijgevolg zal de glitch tussen 7 en 8 smaller worden, wat ook op de oscilloscoop bleek. Plaatsen we de condensator echter op de onderste ingang, dan vergroten we de vertraging. Het onderling tijdsverschil wordt dus nog groter, waardoor de glitch breder wordt, dan bij de toestand zonder condensator. De condensator lost dus bij het gebruik ervan op de bovenste ingang blijkbaar het glitch-probleem niet volledig op. Om die glitch volledig te verwijderen is misschien een grotere condensator nodig. 8