IELS3012: Innvevde systemer
Introduksjon
Tidligere har vi jobbet en del med mikrokontrollere i innebygde systemer. Vi har jobbet med RTOS, (Real Time Operating System) som gjør at vi kan lage enda mer tidskritiske applikasjoner. Nå gjenstår det å dyppe å programmerbare kretser. Vi jobber enda mer spesifikt med Field Programmable gate Array (FPGA). Disse er kretser hvor man kan bestemme programvaren. PLA og PAL er eksempler på tidlige programmerbare kretser som kunne implementereenkel kombinatorisk logikk.
NB: Må ikke forveksles med Applikasjonsspesifikke Integreerte Kretser (ASIC), som også designes med et HDL, men som ikke kan endres etter de er produserte.
Hvorfor bruker vi programmerbare kretser?
Mikrokontrollere er billige, ganske fleksible, kan designes til å være veldig strømgerrige og er enkle bruk. Ulemper med mikrokontrollere er at de er sekvensielle, og har en begrenset beregningshastighet. De har sjeldent mulig til å håntere store mengder data og er laget til å være veldig generelle, som på den ene sisten gjør de allsidige, men de kan ikke brukes til mer spesialiserte applikasjoner.
Spesielt i systemer som video- og lydprosessering (grafikk), kryptografi og AI (matriseoperasjoner) er det viktig å designe systemer som er rustet til å håndtere større mengde beregnnger.
Programmerbare kretser er brikker hvor maskinvaren kan programmeres.
Fordeler med disse er at de er svært fleksible, og egnet til en lang rekke applikasjoner. De er raske og er gode for å implementere parallelisering. Ulempene med disse er at de er relativt dyre, mer komplekse og har høyere strømforbruk.
Hvordan virker en FPGA?
I programmerbare kretser beskriver man sammenhengen av kretselemeter for å få gitt oppførsel. I et system som designes vil man forklare den overordnede strukturen til systemet, med grensensittet, og så beskrive hver individuelle del av systemet. man skriver kode som beskriver systemet, og syntesiserer dette. Dette betyr at koden tolkes og de gitte kretselementene implementeres. Vi analyserer så systemet om det gir gitt ønsket oppførsel i en iterativ prosess.
Dette gjør vi som oftest med Registeroverføringsnivå, "Register-transfer Level (RTL), et abstraksjonsnivå hvor vi representerer et system med kombinatorisk logikk og vipper(registre).

Et digitalt system har et grensensitt, moduler og forbindelser mellom disse modulene. De kan beskrives med deres grensensitt (entity), deres moduler og oppførsel (architecture) og sammenkoblingen mellom moduler(structural). Designet er hierarkisk bygd opp slik at hver modul igjen har sitt grensesnitt og oppførselskode eller eventuelt sammenkobling av moduler med sine grensesnitt og oppførselskode.

Vi bruker maskinbeskrivende språk (HDL, Hardware Description Language) til å beskrive elektroniske systemer. Det er ikke et programmeringsspråk, men et kodespråk. Dette er pga man ikke lager et program, men beskriver heller den fysiske programvaren. De mest utbredte HDL-språkene er VHDL og Verilog. Vi bruker VHDL i dette faget for å beskrive digitale systemer. VHDL står får VHSIC(Very High Speed Integrated Cicuit) Hardware Description Language. VHDL er ikke case sensitive. VHDL brukes til kretsysntesisering (konstruksjon av kretser) og kretsimulering (testing av kretser). Første versjon av VHDL var VHDL 87. VHDL brukes for blant annet CPLDS (Complex Programmable Logic Devices) og FPGA (Field Programmable Gate Arrays).
Et typisk logikkelement i en FPGA består av: - en oppslagstabell (LUT) - et register - et register for å velge mellom de tidligere nevnte enhetene - en adderer (vansligvis)
Oppslagstabell (LUT)
Oppslagstabellen, LUT(LookUp Table) brukes til å implementere logiske funskjoner, altså kombinatoriske kretser. En "LUT" (lookup table) er en oppslagstabell som er en realisering av et kombinatorisk utrykk hvor hvert ord i Oppslagstabellen / minnet angir utgansverdien, og hvor inngangsverdiene velger riktig bit-verdi ved hjelp av en multiplexerstruktur.

Minneceller (RAM) brukes for å "lagre" sannhetstabellen til en logisk funksjon. Adressen til minnet representerer inngangsverdier til funksjonen.

VHDL
Kodepraksis
Man tilorndet et signal og variabel henholdsvis slik:
Signal: <=, eks. sig <= 0;
Variabel: :=, eks. `var := 0;
Kodelinjer begynner med --, blokkommentarer er skrevet med /* */
`
Operander
- Highest precedence first, left to right within same precedence group, use parenthesis to control order.
- Unary operators take an operand on the right.
- "result same" means the result is the same as the right operand.
- Binary operators take an operand on the left and right.
- "result same" means the result is the same as the left operand.
** exponentiation, numeric ** integer, result numeric
abs absolute value, abs numeric, result numeric
not complement, not logic or boolean, result same
* multiplication, numeric * numeric, result numeric
/ division, numeric / numeric, result numeric
mod modulo, integer mod integer, result integer
rem remainder, integer rem integer, result integer
+ unary plus, + numeric, result numeric
- unary minus, - numeric, result numeric
+ addition, numeric + numeric, result numeric
- subtraction, numeric - numeric, result numeric
& concatenation, array or element & array or element, result array
sll shift left logical, logical array sll integer, result same
srl shift right logical, logical array srl integer, result same
sla shift left arithmetic, logical array sla integer, result same
sra shift right arithmetic, logical array sra integer, result same
rol rotate left, logical array rol integer, result same
ror rotate right, logical array ror integer, result same
= test for equality, result is boolean
/= test for inequality, result is boolean
< test for less than, result is boolean
<= test for less than or equal, result is boolean
> test for greater than, result is boolean
>= test for greater than or equal, result is boolean
and logical and, logical array or boolean, result is same
or logical or, logical array or boolean, result is same
nand logical complement of and, logical array or boolean, result is same
nor logical complement of or, logical array or boolean, result is same
xor logical exclusive or, logical array or boolean, result is same
xnor logical complement of exclusive or, logical array or boolean, result is same
Tatt fra University of Maryland. En annen nyttig kilde.
Designflyt i VHDL
-
Analyse og bearbaiding: Koden sjekkes for feil og skaper en representasjon på RTL-nivå
-
Simulering: Test at kretsen oppfører seg som den skal
-
Syntese: Oversettelse til kretsrepresentasjon
-
Place and Route (P&R): Implementasjon, kretsen tilpasses enheten som skal brukes (De10-Lite)
-
Timing analyse
-
Programmering
-
test på hardware(HW)
Oppbygning av et VHDL-design

Illustrasjon som viser et VHDL-design delt opp i pakker, grensesnitt(enitity) og kretsbeskrivelse(architecture).
Entity

Generic
Kan hjelpe med å gi bedre organisering i koden, gjøre koden mer lesbar og gjenbrukbar.
Architecture

Samtidige versus sekvensielle kodesetninger
Et viktig prinsipp i maskinvarebeskrivende språk, inklusive VHDL, er samtidighet. - I digitale kretser foregår alt samtidig. - Dette er reflektert i VHDL ved at kodesetninger kan skrives i den rekkefølgen man ønsker. - Men et gitt signal kan kun få en verdi én gang. - Unntak: Visse kodestrukturer (prosesser og subprogrammer) tolkes linje for linje, men er alltid samtidige i relasjon til resten av koden.

Objektklasser i VHDL
Et objekt er en enhet som har en verdi av en datatype. Det er fire objeklasser i VHDL. • Constant: Only readable, cannot be changed. • Signal: Used for signaling between processes. • Variable: Only for internal use in a process, procedure or function. • File: Only used in testbenches (not hardware).
Signal
- Capable of passing values in and out of the circuit or between internal parts (wires).
- Declared (created) in the declaration part of entity, architecture, package, generate or block.
signal signal_name: signal_type [:= default_value];
Remark: Default value for signals should be avoided in code for synthesis (reset- signal should be used to initialise registered signals).
Variable
- Only used in sequential code.
- Declared (created) in processes and functions/procedures.
- Updated immediately.
- Initial value optional, but more meaningful than for signals.
- Do not use shared variable (use signals instead).
variable variable_name: variable_type [:= initial_value];
variable count: natural range 0 to 2**NUM_BITS-1;
count := count + 1;
Signal versus variable

Datatyper
- VHDL: Strongly typed language.
- Does not allow data transfer between objects of different types (even if they are identically declared).
- Appropriate casting functions must be used.
- Does not allow implicit type conversion.
- Every operator is constructed for specific data types.
- Types can be predefined or user-defined.
Klasser av datatyper
- Scalar (integers, enumaration types, floating point, physical)
- Composite (array/record)
- Access (simulation only)
- File (simulation only)
- Proteced (simulation only)
std_logic
Aggregation and concatenation
- Putting data pieces together to form or enlarge data arrays.
signal s1, s2, s3, s4: std_logic_vector(3 downto 0);
s1 <= ('1','0','1','0') -- Aggregation: s1="1010"
s2 <= ('1','0',others => 'Z'); -- Aggregation: s2="10ZZ"
s3 <= "11" & "00"; -- Concatenation: s3="1100"
s4 <= '1' & s3(3 downto 1); -- Concatenation: s3="1110"
Concurrent Statements
Processes are concurrent with respect to all other statements, but internally a process is sequential (only statements in (b)).
Tilstandsmaskiner
Testbenker
Testbenker er VHDL-kode som verifiserer at kretsimplementasjonen (DUV/DUT (Device under Verification/Test)) beskrevet av VHDL-kode har ønsket opprsel.
'
Oppgavene til en testbenk er som følgende:
- Skap stimuli på inngangen til systemet (DUV/DUT)
- Sammenlign responsen fra DUV/DUT med fasit
- Rapporter resultatene fra verifikasjonsprosessen.
Man kan teste med en funskjonell simulasjon, som er uten delays, eller med en timing simulation som inkluderer propagasjonsdelay.
Assert
- Main purpose: Checking the design.
- Used in testbenches.
- Does not infer any hardware.
- Can be used in both sequential and combinatorial code.
- The message (static and/or dynamic) is displayed when the condition is false.
[label:] assert condition [report message] [severity level];
Dealing with Time in VHDL
-
Major difference between code for synthesis and simulation: The presence of time in the latter.
-
Useful constructions for testbenches related to time:
-
wait forThe process waits for a specific time. -
afterAn action is scheduled after a specific time. -
nowReturns the current simulation time. -
S'stable(t)Attribute, returns true if no events have occured on signal S during the last t time units (looks backwards). -
S'last_eventAttribute, returns the time since last event on S.
-S'transaction Attribute, causes a bit to toggle when a transaction (future event) on signal S is scheduled.

Greit å vite
Vanlige problemstillinger i tidligere eksamener
Latches
Sensitivitetslister
En sensitivitetsliste er en opplisting av de signalene som prosessen skal reagere på. Prossesen kjøres når det skjer en endring i signalene i sensitivitetslisten. I f.eks Quartus Prime Lite kan syntetiseringen gjenkjenne mangler i sensitivitetslisten og legge de til, mens i en simulering vil dette skape feil. Dette er gjerne noe man må være obs på når man får en oppgaver som beskriver et system som oppfører seg ulikt i syntese versus simulering.
Heksadesimal
Heksadesimal er et tallsystem som inneholder 16 ulike måter å representere tall på, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Dette kalles et base-16 system.
Desimal 15 beskrives dermed som heksadesimal F. Når man skal beskrive f.eks 16 eller 17, begynner man på nytt i heksidesimalrekken, med 10(deismal 16) og 11(desimal 17).
Desimal 15 kan beskrives som '1111' i binær, og dette gjør at heksadesimal brukes som en metode for å forkorte utrykk i binær. Dette er mye brukt for å analysere signaler for å spare plass og skrive kortere.
I VHDL kan man skrive et heksadesimaltall som X"AD", som er lik den mer vanlige navnekonvensjonen i C, 0xAD.
Dekoding av heksadesimal til binær var et eksamenspørsmål fra et tidligere lignende fag, og måten man gjør det er som følgende:
Man deler opp tallet "AD" i hver sin del, A og D. Disse kan man så bruke til å konvertere til desimaltall, 10 og 13. representerer man 10 i binær, får man 1010 (8 + 2), og representer man 13 i binær får man 1101 (8 + 4 +1). Dette kan så settes sammen til "10101101", som er det binære tallet.
Tips til eksamen
- Øv på tildigere eksamener, se gjennom øvinger og ERT-økter og gjør oppgaver fra boka.