Wikipendium

Share on Twitter Create compendium Add Language
Edit History
Tools
  • Edit
  • History
  • Share on Twitter

  • Add language

  • Create new compendium
Log in
Table of Contents
  1. Introduksjon
    1. Hvorfor bruker vi programmerbare kretser?
  2. Hvordan virker en FPGA?
    1. Oppslagstabell (LUT)
  3. VHDL
    1. Kodepraksis
    2. Operander
    3. Navnekonvensjon
    4. Designflyt i VHDL
    5. Oppbygning av et VHDL-design
      1. Entity
      2. Generic
      3. Architecture
    6. Samtidige versus sekvensielle kodesetninger
    7. Objektklasser i VHDL
      1. Signal
      2. Variable
      3. Signal versus variable
    8. Datatyper
    9. Klasser av datatyper
      1. std_logic
    10. Aggregation and concatenation
    11. Concurrent Statements
  4. Tilstandsmaskiner
  5. Testbenker
    1. Assert
    2. Dealing with Time in VHDL
  6. Greit å vite
    1. Vanlige problemstillinger i tidligere eksamener
      1. Latches
      2. Sensitivitetslister
    2. Heksadesimal
  7. Tips til eksamen
‹

IELS3012: Innvevde systemer

Tags:
  • HDL
  • innvevde systemer
  • FPGA
  • VHDL
+

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 bilde som illustrerer RTL-abstraksjon

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.

Et illustrasjon av en modul med submoduler og sammenkoblinger mellom disse

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.

Et illustrajon av et logikkelement med en LUT, et register og en MUX

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

En illustrasjon over hvordan minne brukes til å implementere en LUT

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.

Navnekonvensjon

Navn på signaler, variabler, entiteter og pakker osv. har et sett med regler for hvordan de kan skrives.

  • Kan inneholde bokstaver mellom a-z (A-Z), siffer(0-9)
  • Må starte med en bokstav
  • Må være ulike de reserverte ordene
  • Kan ikke inneholde to eler flere understreker ved siden av hverandre og kan ikke ende med en understrek.("__")

Designflyt i VHDL

  1. Analyse og bearbaiding: Koden sjekkes for feil og skaper en representasjon på RTL-nivå

  2. Simulering: Test at kretsen oppfører seg som den skal

  3. Syntese: Oversettelse til kretsrepresentasjon

  4. Place and Route (P&R): Implementasjon, kretsen tilpasses enheten som skal brukes (De10-Lite)

  5. Timing analyse

  6. Programmering

  7. test på hardware(HW)

Oppbygning av et VHDL-design

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

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

Entity

Deklarasjonen av en entity

Generic

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

Architecture

Deklarasjonen av en 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.

En illustrasjon av eksempler på sekvensiell og samtidig kode i VHDL

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

En tabell som viser de viktigste forskjellene mellom signaler og variabler

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.

Illustrasjon av strukturen til en testbenk'

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 for The process waits for a specific time.

  • after An action is scheduled after a specific time.

  • now Returns 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_event Attribute, 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.

Et eksempel av en enkel testbenk i VHDL

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.

Written by

SassyBuns
Last updated: Sun, 7 Dec 2025 19:38:29 +0100 .
  • Contact
  • Twitter
  • Statistics
  • Report a bug
  • Wikipendium cc-by-sa
Wikipendium is ad-free and costs nothing to use. Please help keep Wikipendium alive by donating today!