UDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM...

Preview:

Citation preview

BME-MIT

FPGA labor

Digitális rendszerek tervezése

FPGA áramkörökkel

SRAM FPGA Architektúrák

BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM

VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR

MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK

Fehér Béla

Szántó Péter, Lazányi János, Raikovich Tamás

BME MIT

FPGA laboratórium

BME-MIT

FPGA labor

FPGA – tipikus alkalmazások

• ASIC prototípus

• Hálózati infrastruktúrák

• Switch, router, bázisállomás; csomagfeldolgozás

• Titkosítás

• Űrkutatás, katonaság (pl. UAV)

• Ipari alkalmazások

• Vezérlés (motor, erőművek, …)

• Adatgyűjtés, monitorozás

• Jelfeldolgozás

• Orvosi képfeldolgozás (röntgen, ultrahang, CT, …)

• Nagy felbontású videó feldolgozás

• Ipari képfeldolgozás (objektum detektálás, sztereó kamerák, …)

• Tradicionális szűrési feladatok, FFT

• High Performance Computing

BME-MIT

FPGA labor

„Standalone” FPGA

• Dedikált HW funkciók túlzottan komplex

vezérlés nélkül

• „Glue logic”: kis erőforrásigényű, kiegészítő

feladatok ellátása, egyszerű interfészek

• Pl. Lattice ICE FPGA-k mobiltelefonokban

• Adatfolyam jellegű hardveres feldolgozás

• Pl. képernyő fal vezérlés: HDMI bemenetek

kép demultiplexálás/multiplexálás HDMI

kimenetek

BME-MIT

FPGA labor

HPC: FPGA alapú gyorsító kártya

• Legelterjedtebb a PCIe interfész

• De van QPI (Intel), CAPI (IBM)

• Dedikált, jól párhuzamosítható funkciók HW

megvalósítása

• Adatközpontok, szerverek, pl. Microsoft Catapult

• Pl. AI,

adatbázis

keresés (Google)

BME-MIT

FPGA labor

Beágyazott rendszerek (1)

• Külső processzor + FPGA

• Interfész: CPU saját

busza (pl. LocalBus),

vagy PCI/PCI Express

• CPU: tipikusan vezérlés,

sztenderd interfészek

(ETH, USB)

• FPGA: párhuzamos

adatfeldolgozás,

időkritikus feladatok

BME-MIT

FPGA labor

Beágyazott rendszerek (2)

• Processzor is az FPGA-ban

System on Chip

• CPU lehet hard-core vagy soft-core

• Hard-core ma tipikusan ARM

magokat jelent (Xilinx Zynq,

Altera SoC), korábban PowerPC

• Nagy sebességű kapcsolat a CPU

és az FPGA rész között, könnyen

módosítható

• CPU relatív költsége magasabb

lehet

BME-MIT

FPGA labor

HPC – szuperszámítógépek

BME-MIT

FPGA labor

FPGA áramkörök felépítése

• Az alapvető erőforrások

– Logikai blokkok

– I/O blokkok

– Huzalozás

• Felhasználói szinten közvetlenül csak az első kettő

jelenik meg

• A huzalozás nem direkt erőforrás, de kritikus

esetekben az eszköz használati értékének igen

fontos eleme

BME-MIT

FPGA labor

FPGA felépítés

• Egyszerűsített általános kép

BME-MIT

FPGA labor

Technológia és piac

• Az FPGA flexibilis eszköz, ez költségekkel jár

• Költség/szolgáltatás optimalizálása fontos

• Technológiai lehetőségek/elfogadható ár

• A VLSI félvezető technológia szempontjából az

SRAM FPGA kedvező eszköztípus

– Sok egyszerű, azonos modul

– Szabályos ismétlődés, szimmetrikus struktúra

– Az I/O meghajtók és néhány PLL kivételével

„egyszerű, közönséges” CMOS logika

BME-MIT

FPGA labor

FPGA gyártók részesedése

• Megemlítendő még: Achronix

Xilinx

49%

Altera

40%

Lattice

6%

Microsemi

4% Egyéb

1%

BME-MIT

FPGA labor

Technológiai háttér

• Az SRAM FPGA-k jellemzően a technológiai élvonalban

vannak

– Altera Stratix 10 14 nm, Arria 10 & Cyclone 10 20nm,

– Altera Cyclone V, Stratix V 28 nm

– Altera Cyclone-IV 60 nm (TSMC)

– Xilinx UltraScale (20 nm), UltraScale+ (16 nm)

– Xilinx Artix-7/Kintex-7/Virtex-7 28 nm

– Xilinx Spartan-6 45 nm (TSMC)

– Lattice SC/M 90 nm

• Ezek a technológiák költségesek

– Ezt nem minden alkalmazás viseli el

BME-MIT

FPGA labor

Xilinx FPGA családokSpartan-3 Spartan-6 Virtex-6 Artix-7 Kintex-7 Virtex-7

Logikai

cella

33k 150k 760k 215k 480k 2000k

BRAM 0,65 Mb 4,8 Mb 38 Mb 13 Mb 34 Mb 68 Mb

DSP 36 180 2016 740 1920 3600

GMAC/s* 7,2 140 2419 929 2845 5335

Transciever - 8 72 16 32 96

Tr. Bit rate - 3,2 Gb/s 11,18 Gb/s 6.6 Gb/s 12.5 Gb/s 28 Gb/s

Serdes - 1080 Mb/s 1400 Mb/s 1250 Mb/s 1600 Mb/s 1600 Mb/s

PCIe - 1.0 x1 2.0 x8 2.0 x4 2.0 x8 3.0 x8

Mem.

vezérlő

166 MT/s 800 MT/s 1066

MT/s

1066

MT/s

1866

MT/s

1866

MT/s

Ár (USD) ~70 ~240 ~14.000 380 2.000-

3.000

~24.000

BME-MIT

FPGA labor

Xilinx FPGA családok (2.)Kintex

UltraScale

Virtex

UltraScale

Kintex

UltraScale+

Virtex

UltraScale+

Virtex

UltraScale+

Logikai cella 1,4M 5,5M 1,14M 3,78M 2,85M

BRAM 75,9 Mb 88,6Mb 34,6Mb 94,5+360 70+270

DSP 5520 2880 1968 (3528) 12.288 9024

GMAC/s* 4000 2100 1750/3140 10.936 8000

Transciever 64 60

60

44

32

128 96

Tr. Bit rate 16,3 Gb/s 16,3 Gb/s

30,5 Gb/s

16,3 Gb/s

32,75 Gb/s

32,75 Gb/s 32,75 Gb/s

Serdes 1600 Mb/s 1600 Mb/s 1600 Mb/s 1600 Mb/s 1600 Mb/s

PCIe 6 Gen3 x8 6 Gen3 x8 5 Gen3 x16

Gen4 x8

4 Gen3 x16

Gen4 x8

6 Gen3 x16

Gen4 x8

Mem. Vezérlő 2400 MT/s 2400 MT/s 2666 MT/s 2666 MT/s 8 GB HBM2

Ár (USD) ~9000 ~55.000 ~6000 N/A N/A

BME-MIT

FPGA labor

Xilinx Zynq SOC

BME-MIT

FPGA labor

Xilinx UltraScale+ MPSOC

BME-MIT

FPGA labor

Altera FPGA-k

• Cyclone: költséghatékony - ALM

• E, GX (3.125 Gbps), GT (5 Gbps) sorozat

• Max. 300k LE

• Arria: közepes teljesítményű - ALM

• GX (6,5 Gbps), GT (10,3125 Gbps), SX (SoC), ST (SoC)

• Max 500k LE

• Startix: nagy teljesítményű - ALM

• E (logika), GS (DSP), GX (14.1 Gbps), GT (28,05 Gbps)

• Max 1M LE

• SoC: Arria V SoC, Cyclone V, Arria 10, Stratix 10 SoC

• 2 magos ARM Coretx A9 (Stratix 10: 4 magos A53)

BME-MIT

FPGA labor

Microsemi (ACTEL) FPGA-k

• Alacsony fogyasztás, flash alapú

• VersaTile

• LUT3, D-FF, Latch

• RAM/FIFO

• ARM Cortex M1 opció egyes típusokban

• IGLOO

• Max. 75k VersaTile (IGLOO/e)

• ProASIC3

• Max. 75k VersaTile (ProASIC3/e)

BME-MIT

FPGA labor

Lattice FPGA-k

• Lattice ECP3

• Sztenderd LUT4 alapú architektúra

• RAM, DSP, SerDes, PLL

• iCE40 (ex-SiliconBlue) – LP és HX sorozat

• Akkumulátoros üzemhez – telefon, tablet

• Szinte 0 statikus fogyasztás

• Egyébként ~3-12 mA @ 32 MHz

• LUT4 alapú; RAM blokkok; PLL

• Pl. Samsung Galaxy S5: Lattice iCE40 LP1K; LG

C900: iCE65

BME-MIT

FPGA labor

FPGA belső felépítés

• SRAM FPGA mindig LUT alapú (kivétel MOT †)

• A LUT egy 1 bit széles memória

• Mélysége (címvonalak száma ) változó

– Korai elemzések alapján a 4 bit tűnt optimálisnak

• Kompromisszum a huzalozás és granularitás között

– Egy logikai egység 2 – 4 LUT „közelségére” épít

• Lokális belső kapcsolatok a késleltetést csökkentik

– Xilinx Virtex-5 óta

• alapelem mérete x4, azaz LUT6

BME-MIT

FPGA labor

Példa eszköz: Xilinx Spartan3E

• Általános felépítés egyszerű

• Homogén logikai struktúra

– Egyenletes CLB réteg

– Funkcionális blokkok

• BRAM

• MULT

• DCM

– I/O gyűrű

BME-MIT

FPGA labor

A logikai elemek

• Enyhe aszimmetria a CLB felépítésben

• 1 CLB = 2 x 2 Szelet

• Bal és jobb szelet eltérő

– Extra LUT módok

• Független függőleges

kapcsolatok

– speciális logika

– aritmetika

BME-MIT

FPGA labor

A CLB struktúra

• Megosztott elrendezés

• „Független” belső blokkok

• Szempontok nem ismertek

– 4 bit számláló/aritmetika

– Kedvezőbb huzalozás?

• Az extra memória funkciók hasznosak

– A konfigurációs memória

részletei felhasználói

memóriaként is elérhetők

BME-MIT

FPGA labor

A CLB erőforrása

• Az eredeti koncepció nem változott (Spartan-3, Virtex-4 FPGA-kig)

• Az alap erőforrás az Logic Cell LC = 1 LUT + 1 FF

• LUT4

– tetszőleges 4 változós fgv.

– 1 változóra hazárdmentes

– Működési idő bemenet és

logikai komplexitás invariáns

• DFF

– Élvezérelt, ↑↓, órajel eng.

– Szink/Aszink. SET/RESET

• Független kombinációs és regiszteres kimenet

BME-MIT

FPGA labor

A CLB erőforrása

• 1 Slice-ban az eddigi 2 helyett 4 LUT és 2*4

tárolóelem

• A LUT-ok 6 bemenetűek

• Elsősorban az FPGA-ban megvalósított, egyre

bonyolultabb logikák indokolták (huzalozás!)

• A Slice-ok felében továbbra is megvalósítható

extra funkció: shift regiszter, RAM

BME-MIT

FPGA labor

Dedikált CLB erőforrások

• Az egységes alapkoncepció finomítása

– A LUT4 természetesen mindenre jó, de

• A sokváltozós logikai függvények, a legegyszerűbbek is

túl sok szintet igényelnek → lassú

• Az aritmetikai műveletekben kell átvitel jel. Ez egy fontos,

de csak belül szükséges, időkritikus jel. LUT4 alapon

100% redundancia lép fel (3 bemeneti jel 2 függvénye)

• Hagyományos tömbszorzónál egy-egy szinten kell lokális

bitszorzat (AND2) és összeadás a részszorzatokhoz

BME-MIT

FPGA labor

A gyors átvitelképzés

• Az aritmetikai műveletek hatékonysága alapvető

• Sebességük a használhatóságot egyértelműen jellemzi

• Az elemei művelet:

– Sj = Aj xor Bj xor Cij

– Coj = AjBj + AjCij + BjCij

– A teljes művelet végrehajtási ideje a Ci0 → Con-1 út terjedési ideje, n-1 az adatméret függvénye

• A beépített egyszerű átvitel lánc feleslegessé tesz bármilyen más CLA, CS módszert

BME-MIT

FPGA labor

A gyors átvitel logika

• A műveletet 1 bites fél összeadókra bontja

• A szelet Cin bejövő bitje BX input vagy alsó CLB Cout vagy fix 0 / 1

• Összeg bit

– Fout= A0 xor B0

– Xout = Fout xor Cin

• Átvitel

– Bit helyiértékenként

átvitelterjesztés vagy

átvitel generálás

– A CYMUXF vezérlése

az Fout jellel

– Tehát ha Fout=1,

terjeszt, ezért CoutF=Cin,

egyébként CoutF=AB,

vagyis generál, ha AB=1

– Az erőforrások más logika

megvalósítására is használhatók

BME-MIT

FPGA labor

A gyors átvitel logika

• Aritmetika ADD/SUB/INC/DEC művelet

– SUM=A xor B xor Ci

– Átvitel terjesztés

és/vagy generálás

– Co = AB + ACi + BCi

– Co = (A xor B) ? Ci : A;

BME-MIT

FPGA labor

Több bemenetű összeadók

• 3:2 Compressor + összeadó(k): Add3 LUT6-ban

ABUS=X^Y^Z

BBUS=(X&Y)|(X&Z)|(Y&Z)

1011_1001

^0010_1010

^0011_1001

1010_1010

0011_1001

10001_1100

BME-MIT

FPGA labor

Szorzás logikával

• A szorzás erőforrás igényes

• Bitszorzás AND2

• Összegzés FA

• Kezdőszinten

egyszerűsítés

lehetséges,

egyből 2 szint

összegezhető

BME-MIT

FPGA labor

Szorzás CLB logikával

• Aritmetika MUL művelet

– Bitszintű szorzat és összegzés

– PPij=PPij-1 + Aik*Bkj

– XOR kapu felső ága általában PPij-1

– Az ábra az első szintet mutatja, itt 2 bitszorzat

összegezhető

BME-MIT

FPGA labor

Belső multiplexerek

• Szélesebb logikai kifejezésekhez

• A „független” szeletek

kombinálhatók

• MUX4, MUX8, MUX16 egy CLB-ben

BME-MIT

FPGA labor

MUX használat logikához

• Más lehetőségek

– LUT5 generálása

– Tetszőleges 5 vált. fv.

– Egyedi 6 – 9 változós függvények

• Pl. MUX4 6 bemenettel

BME-MIT

FPGA labor

CYMUX használat logikához

• A MUX általános elem, lehet AND vagy OR kapu

• Ennek megfelelően a LUT4

részlet logikák összevonhatók

szélesebb függvényekké

BME-MIT

FPGA labor

A részletes struktúra

• Egyszerűsített SliceM felső és alsó logikai cellája

BME-MIT

FPGA labor

Virtex-6 SLICEM

BME-MIT

FPGA labor

Stratix IV ALM

BME-MIT

FPGA labor

Memória funkciók a CLB-ben

• Elosztott memóriának hívják

• LUT méretű blokkokból építhető a szükséges méret

– Lehet természetesen ROM (alapvetően mindig az)

– RAM-nál szétválasztott adat be és kimeneti vonal

– Lehet szinkron beírású RAM

– Lehet szinkron beírású dual-port RAM• 2x erőforrásigény

– Szinkron olvasás a CLB FF használatával

– Kezdőérték minden esetben megadható

– Sebesség illeszkedik a rendszerhez

– Kiváló elem regiszter készletek

megvalósítására

BME-MIT

FPGA labor

Előzmények

• Ez a funkció a 4000-es családban jelent meg először

– A memória hagyományos aszinkron SRAM volt

– Ez nem kezelhető megbízhatóan az időzítések miatt

• Ezután lett az írás szinkron

– Ennek megfelelően az írás a WCLK jel élére történik

– Az olvasás azonos idejű, aszinkron

BME-MIT

FPGA labor

LUT RAM

• LUT RAM csak a SliceM oldalon realizálható

• 1 Slice 1db RAM16x1D vagy 1db RAM32x1S

BME-MIT

FPGA labor

LUT RAM

• Nagyobb méret relatív lokális elhelyezéssel

• A rendszer a RAM32x8S

elemet 8 szeletben helyez el

• Használat

– HDL forrásnyelvi szintről

– Beépítés könyvtári

primitívként

BME-MIT

FPGA labor

LUT RAM – Verilog

RAM16X1S #(.INIT(16'h0000)

) RAM16X1S_inst (.O(O),.A0(A0),.A1(A1),.A2(A2),.A3(A3),.D(D),.WCLK(WCLK),.WE(WE)

);

module ram16 (input clk, we,input [3:0] a, input [7:0] d,output [7:0] o);

reg [7:0] mem[15:0];always @ (posedge clk)if (we)

mem[a] <= d;

assign o = mem[a];

endmodule

BME-MIT

FPGA labor

LUT RAM – VHDL primitív

• UNISIM library-ben definiált

Library UNISIM;use UNISIM.vcomponents.all;.......................

RAM16X1S_1_inst : RAM16X1S_1generic map (

INIT => X"0000")port map (

O => O, -- RAM output

A0 => A0, -- RAM address[0] input

A1 => A1, -- RAM address[1] input

A2 => A2, -- RAM address[2] input

A3 => A3, -- RAM address[3] input

D => D, -- RAM data input

WCLK => WCLK, -- Write clock input

WE => WE -- Write enable input

);

BME-MIT

FPGA labor

LUT RAM – VHDL

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;

entity ram16 isport (

clk : in std_logic;we : in std_logic;addr : in std_logic_vector

(3 downto 0);din : in std_logic_vector

(7 downto 0);dout : out std_logic_vector

(7 downto 0));end;architecture rtl of ram16 istype marray is array (15 downto 0)of std_logic_vector(7 downto 0);signal memory : marray;………………….

………………………………….

begin

process(clk)beginif (clk'event and clk='1') then

if (we='1') thenmemory(CONV_INTEGER(addr)) <=

din;end if;

end if;end process;

dout <= memory(CONV_INTEGER(addr));

end;

BME-MIT

FPGA labor

LUT shift regiszter

• Érdekes elem, igen flexibilisen használható

• Származtatható a konfigurációs mechanizus ismeretében

– A konfigurációs bitek bekapcsoláskor egy nagy shiftregiszterbe léptetődnek be

– Minden konfigurációs elem egy-egy poziciója a konfigurációs tárnak

– 1 LUT 16 bitet foglal el

– Az SRL16 módban ezt a 16 bitet „átemeljük” a felhasználói logikába

BME-MIT

FPGA labor

LUT shift regiszter

• A megvalósítás

• Tulajdonságok

– Dinamikusan változtatható hosszúságú soros késleltető (1 – 16) Kaszkádosítható CLB-ken át

– Nincs SET/RESET, párhuzamos D/Q, van CE

BME-MIT

FPGA labor

LUT SRL használat

• Alapvetően mint késleltő, aszinkron dinamikus

címzéssel

• Szinkron címzés FF használattal

BME-MIT

FPGA labor

LUT SRL – Verilog

SRLC16E #(.INIT(16'h0000)

) SRLC16E_inst (.Q(Q),.Q15(Q15),.A0(A0),.A1(A1),.A2(A2),.A3(A3),.CE(CE),.CLK(CLK),.D(D)

);

module SRL(input clk, ce, d,input [3:0] a,output q, q15);

reg [15:0] shr = 16’h0000;always @ (posedge clk)if (ce)

shr <= {shr[14:0], d};

assign q15 = shr[15];assign q = shr[a];

endmodule

BME-MIT

FPGA labor

LUT SRL – VHDL

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;

entity ram16 isport (

clk : in std_logic;ce : in std_logic;addr : in

std_logic_vector(3 downto 0);d : in std_logic;q, q15 : out std_logic;);

end;architecture rtl of ram16 issignal shr : std_logic_vector(15 downto 0);……………………………….

begin

process(clk)beginif (clk'event and clk='1') then

if (ce='1') thenshr <= shr(14 downto 0) & d;

end if;end if;end process;q <= shr(CONV_INTEGER(addr));q15 <= shr(15);end;

BME-MIT

FPGA labor

LUT SRL használat

• Műveleti láncok belső pontjaiban pipe-line késleltetések kiegyenlítése

• Adatméretnek megfelelő számú LUT kell

• Kis méretű FIFO

– Adatok SRL-ben

– Kiegészítő logika, címszámláló, státusz jelzők

BME-MIT

FPGA labor

LUT SRL használat

• Véletlensorozat generátor LFSR használatával

• XAPP211, LFSR visszacsatoló

polinomok n=3 és n=168 között

• Pl. Gold Code Generator for

BME-MIT

FPGA labor

LUT SRL használat

• Számlálók

• Gyűrűs számláló (one hot v. Johnson) max. 16

modulusig

– Konfigurációs inicializálás a 100..000 értékre

– Modulus választható a LUT címbemeneten

keresztül

– Szabadon futó, nincs RESET, de van CE

BME-MIT

FPGA labor

LUT SRL számláló

• Nagyobb modulus

– SRL16-ok sorba kötve

– Relatív prím hosszú SRL16-ok

kimenetei AND kapcsolatban

• Példa: 3465 modulusú osztó

– Legyen az SRL16-ok egyedi

modulusa a 3465 faktorizációja

alapján 11, 9, 7 és 5.

– A TC csak minden 5x7x9x11=

385. ciklusban lesz aktív

5

7

9

11

BME-MIT

FPGA labor

LUT FF

• A szekvenciális logika alaperőforrása

– Megjegyzés: Néhány FPGA-ban nincs dedikált

regiszter erőforrás, azt az általános logikai cellából

alakítják ki

– Az SRAM FPGA-ak mindig tartalmaznak FF-ot

– Élvezérelt DFF órajel engedélyezéssel

– Alaphelyzet beállítás

• SET/RESET, szinkron/aszinkron

• Inicializálás: INIT0/INIT1

BME-MIT

FPGA labor

További erőforrások

• Huzalozás

– Bőven túlméretezett huzalozási erőforrások

– Történelmi okokból

BME-MIT

FPGA labor

Huzalozás

• Különböző huzalozási erőforrások

• Hosszú vonalak az IC

teljes felületén

– Minden 6. CLB-hez

• A hatos csoportok között

egyszintű átugrás

• Kapcsolat a második szomszédokhoz

• Alapvető szomszédos, direkt kapcsolatok

• Speciális globális hálózatok (Nem CLK!)

– GSR Globális SET/RESET vonal

– GTS Globális Hiz az I/O kimenetekre

• Az órajel hálózat más!

BME-MIT

FPGA labor

Egyéb erőforrások

• Többféle memória modul

• DSP blokk teljes MAC struktúrával

• Beépített CPU mag/magok

• Nagysebességű soros interfészek (max ~32Gbit/s)

• PCIe IP (Gen3, Gen4 nem végleges)

• 1G/10G/100G Ethernet MAC

BME-MIT

FPGA labor

Speciális blokkok az FPGA-ban

• Blokk RAM elhelyezése

BME-MIT

FPGA labor

Blokk RAM

• 2 – 4 kbyte dual port szinkron RAM

• Mérettől függő számban 4 – 36 db

• Adatméret rugalmasan választható

– 16kx1, 8kx2, 4kx4, nincs paritás

– 2kx(8+1), 1kx(16+2), 512x(32+4)

BME-MIT

FPGA labor

Blokk RAM

• Használati módok

– Igazi dual port, teljesen független CLKA és CLKB

• Kiváló elem független órajeltartományok közötti

szinkronizációra, adatcserére

• Teljesen szinkron működés

– Írás: cím, adat és WE aktív, művelet CLK élére

– Olvasás: cím, RE aktív, CLK élére az adat a

kimeneti regiszterbe kerül

BME-MIT

FPGA labor

Blokk RAM

• Beállítások

– NO_CHANGE a kimeneten az írást követően

BME-MIT

FPGA labor

Blokk RAM

• Beállítások

– READ_FIRST

BME-MIT

FPGA labor

Blokk RAM

• Beállítások

– WRITE_FIRST

BME-MIT

FPGA labor

Blokk RAM konfliktusok

• Természetesen, a dual portos működés miatt, egy cella

írásakor, ugyanahhoz a cellához fordulva problémák

adódnak

• Dual port módban egyidőben azonos címre írás eltérő

adatokkal, az adat bizonytalan lesz (nincs prioritás)

• Aszinkron órajeleknél, írás és azonos idejű olvasás

hozzáférés esetén az olvasás eredménye bizonytalan

– Az új belső adat még nem stabil az olvasás idején

• WRITE_FIRST vagy NO_CHANGE esetén egyik port

írásakor a másik kimeneti latch tartalma módosul

BME-MIT

FPGA labor

BlokkRAM használat

• Tetszőleges memória funkció

• Adatméret átalakítás átvitel előtt

– PAR → SER soros átvitel SER→PAR,

– 32 bit → 2 bit, 2 bit → 32 bit

• A tartalom fele függetlenül használható, mint 2 db

egy portos memória

• Ugyanígy fele akkora 72 bit széles memória is

kialakítható

• Bufferek, késleltető vonalak, videó sor tároló

BME-MIT

FPGA labor

Blokk RAM használat

• Általános logika, mint egy „nagyobb LUT”

– n bemenet, m kimenet REGISZTERES!

– Függvénytáblázat sin/cos, stb.

• Mikroprogramozott vezérlő programtár és

következő utasítás logika

• Tulajdonságok:

– Inicializálható felkonfiguráláskor

– RESET csak a kimeneti regisztert befolyásolja

BME-MIT

FPGA labor

Blokk RAM használat

• Újabb eszközökben további tulajdonságok

– Széles adatformátum esetén bájtonkénti írás

engedélyezés

• Beágyazott rendszerek megvalósítása során fontos lehet

• CPU buszrendszere kínálja / igényli

• Operációs rendszer meglévő forrása használ rövid

változókat (újrafordítható, ….)

BME-MIT

FPGA labor

BlokkRAM FIFO

• FIFO használat támogatása

– Közvetlen HW kiegészítő logika

– Rendszer elem sebessége nem csökken

– Üzemmódok:

• Normál

• FWFT az első adat

átesik a kimenetre

– Jelzések:

• Full, AlmostFull

• Empty, AlmostEmpty

BME-MIT

FPGA labor

FIFO használat

• Xilinx: Core Generator

• Altera: MegaWizard (vagy scfifo/dcfifo

komponens)

BME-MIT

FPGA labor

BRAM példányosítás (Verilog)RAMB16_S36_S36 #(

.WRITE_MODE_A("WRITE_FIRST")) RAMB16_S36_S36_inst (

.DOA(DOA), // Port A 32-bit Data Output

.DOB(DOB), // Port B 32-bit Data Output

.DOPA(DOPA), // Port A 4-bit Parity Output

.DOPB(DOPB), // Port B 4-bit Parity Output

.ADDRA(ADDRA), // Port A 9-bit Address Input

.ADDRB(ADDRB), // Port B 9-bit Address Input

.CLKA(CLKA), // Port A Clock

.CLKB(CLKB), // Port B Clock

.DIA(DIA), // Port A 32-bit Data Input

.DIB(DIB), // Port B 32-bit Data Input

.DIPA(DIPA), // Port A 4-bit parity Input

.DIPB(DIPB), // Port-B 4-bit parity Input

.ENA(ENA), // Port A RAM Enable Input

.ENB(ENB), // Port B RAM Enable Input

.SSRA(SSRA), // Port A Synchronous Set/Reset Input

.SSRB(SSRB), // Port B Synchronous Set/Reset Input

.WEA(WEA), // Port A Write Enable Input

.WEB(WEB) // Port B Write Enable Input

);

BME-MIT

FPGA labor

BRAM példányosításRAMB16_S36_S36_inst : RAMB16_S36_S36generic map (

WRITE_MODE_A => "WRITE_FIRST",WRITE_MODE_B => "WRITE_FIRST")

port map (DOA => DOA, -- Port A 32-bit Data OutputDOB => DOB, -- Port B 32-bit Data OutputDOPA => DOPA, -- Port A 4-bit Parity OutputDOPB => DOPB, -- Port B 4-bit Parity OutputADDRA => ADDRA, -- Port A 9-bit Address InputADDRB => ADDRB, -- Port B 9-bit Address InputCLKA => CLKA, -- Port A ClockCLKB => CLKB, -- Port B ClockDIA => DIA, -- Port A 32-bit Data InputDIB => DIB, -- Port B 32-bit Data InputDIPA => DIPA, -- Port A 4-bit parity InputDIPB => DIPB, -- Port-B 4-bit parity InputENA => ENA, -- Port A RAM Enable InputENB => ENB, -- PortB RAM Enable InputSSRA => SSRA, -- Port A Synchronous Set/Reset InputSSRB => SSRB, -- Port B Synchronous Set/Reset InputWEA => WEA, -- Port A Write Enable InputWEB => WEB -- Port B Write Enable Input

);

BME-MIT

FPGA labor

BRAM példányosítás (2)RAMB16BWER_inst : RAMB16BWER

generic map (

-- DATA_WIDTH_A/DATA_WIDTH_B: 0, 1, 2, 4, 9, 18, or 36

DATA_WIDTH_A => 0,

DATA_WIDTH_B => 0,

WRITE_MODE_A => "WRITE_FIRST",

WRITE_MODE_B => "WRITE_FIRST")

port map (

DOA => DOA, -- 32-bit output: A port data output

DOPA => DOPA, -- 4-bit output: A port parity output

DOB => DOB, -- 32-bit output: B port data output

DOPB => DOPB, -- 4-bit output: B port parity output

ADDRA => ADDRA, -- 14-bit input: A port address input

CLKA => CLKA, -- 1-bit input: A port clock input

ENA => ENA, -- 1-bit input: A port enable input

REGCEA => REGCEA, -- 1-bit input: A port register clock enable input

RSTA => RSTA, -- 1-bit input: A port register set/reset input

WEA => WEA, -- 4-bit input: Port A byte-wide write enable input

DIA => DIA, -- 32-bit input: A port data input

DIPA => DIPA, -- 4-bit input: A port parity input

ADDRB => ADDRB, -- 14-bit input: B port address input

CLKB => CLKB, -- 1-bit input: B port clock input

ENB => ENB, -- 1-bit input: B port enable input

REGCEB => REGCEB, -- 1-bit input: B port register clock enable input

RSTB => RSTB, -- 1-bit input: B port register set/reset input

WEB => WEB, -- 4-bit input: Port B byte-wide write enable input

DIB => DIB, -- 32-bit input: B port data input

DIPB => DIPB -- 4-bit input: B port parity input

);

BME-MIT

FPGA labor

Altera RAM

• „Régebbi” eszközökben csak BRAM, pl.

• Cyclone IV: M9K

• Cyclone V: M10K

• Stratix-III és IV: M9K és M144K

• Stratix-V: M20K

• ALM alapú eszközök (Cyclone V és Stratix-III-

tól)

• MLAB – 640 bites LUT alapú memória (10

ALM/MLAB)

BME-MIT

FPGA labor

Altera RAM példányosításCOMPONENT altsyncram

GENERIC (

……………………

numwords_a : NATURAL;

numwords_b : NATURAL;

widthad_a : NATURAL;

widthad_b : NATURAL;

width_a : NATURAL;

width_b : NATURAL;

…………………);

PORT (

clock0 : IN STD_LOGIC ;

wren_a : IN STD_LOGIC ;

address_b : IN STD_LOGIC_VECTOR (ADDR_WIDTH-1 DOWNTO 0);

clock1 : IN STD_LOGIC ;

data_b : IN STD_LOGIC_VECTOR (DATA_WIDTH-1 DOWNTO 0);

q_a : OUT STD_LOGIC_VECTOR (DATA_WIDTH-1 DOWNTO 0);

wren_b : IN STD_LOGIC ;

address_a : IN STD_LOGIC_VECTOR (ADDR_WIDTH-1 DOWNTO 0);

data_a : IN STD_LOGIC_VECTOR (DATA_WIDTH-1 DOWNTO 0);

q_b : OUT STD_LOGIC_VECTOR (DATA_WIDTH-1 DOWNTO 0);

aclr0 : IN STD_LOGIC;

aclr1 : IN STD_LOGIC

);

END COMPONENT;

BME-MIT

FPGA labor

BlockRAM – Read First

module sp_ram(input clk, input we, input en,input [10:0] addr, input [ 7:0] din,output [7:0] dout);

reg [7:0] memory[2047:0];reg [7:0] dout_reg;

always @ (posedge clk)if (en)begin

if (we)memory[addr] <= din;

dout_reg <= memory[addr];end

assign dout = dout_reg;

endmodule

BME-MIT

FPGA labor

BlockRAM – Read First

library IEEE;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;

entity ram isport (

clk, ce, we : in std_logic;addr : in std_logic_vector(8 downto 0);din : in std_logic_vector(35 downto 0);dout : out std_logic_vector(35 downto 0));

end;

architecture rtl of ram istype marray is array (511 downto 0) of

std_logic_vector(35 downto 0);signal memory : marray;

begin

process(clk)beginif (clk'event and clk='1') thenif (ce='1') thenif (we='1') thenmemory(CONV_INTEGER(addr)) <=

din;end if;dout <=

memory(CONV_INTEGER(addr));end if;

end if;end process;

end;

BME-MIT

FPGA labor

BlockRAM – Write First

module sp_ram(input clk, input we, input en,input [10:0] addr, input [ 7:0] din,output [7:0] dout);

reg [7:0] memory[2047:0];reg [7:0] dout_reg;

always @ (posedge clk)if (en)begin

if (we)memory[addr] = din;

dout_reg = memory[addr];end

assign dout = dout_reg;

endmodule

BME-MIT

FPGA labor

BlockRAM – Write First

library IEEE;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;

entity ram isport (

clk, ce, we : in std_logic;addr : in std_logic_vector(8 downto 0);din : in std_logic_vector(35 downto 0);dout : out std_logic_vector(35 downto 0));

end;

architecture rtl of ram istype marray is array (511 downto 0) of

std_logic_vector(35 downto 0);signal memory : marray;

process(clk)beginif (clk'event and clk='1') thenif (ce='1') thenif (we='1') thenmemory(CONV_INTEGER(addr)) <=

din;dout <= din;

elsedout <=

memory(CONV_INTEGER(addr));end if;

end if;end process;

end;

BME-MIT

FPGA labor

BlockRAM – No Change

module sp_ram(input clk, input we, input en,input [10:0] addr, input [ 7:0] din,output [7:0] dout);

reg [7:0] memory[2047:0];reg [7:0] dout_reg;

always @ (posedge clk)if (en)begin

if (we)memory[addr] <= din;else

dout_reg <= memory[addr];end

assign dout = dout_reg;

endmodule

BME-MIT

FPGA labor

BlockRAM – No Change

library IEEE;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_arith.ALL;USE ieee.std_logic_unsigned.ALL;

entity ram isport (

clk, ce, we : in std_logic;addr : in std_logic_vector(8 downto 0);din : in std_logic_vector(35 downto 0);dout : out std_logic_vector(35 downto 0));

end;

architecture rtl of ram istype marray is array (511 downto 0) of

std_logic_vector(35 downto 0);signal memory : marray;

process(clk)beginif (clk'event and clk='1') thenif (ce='1') thenif (we='1') thenmemory(CONV_INTEGER(addr)) <=

din;elsedout <=

memory(CONV_INTEGER(addr));end if;

end if;end process;

end;

BME-MIT

FPGA labor

DP BlockRAMmodule dp_ram(input clk_a, we_a, en_a, clk_b, we_b, en_b,

input [10:0] addr_a, addr_b,input [ 7:0] din_a, din_b, output [7:0] dout_a, dout_b);

reg [7:0] memory[2047:0];reg [7:0] dout_reg_a, dout_reg_b;

always @ (posedge clk_a)if (en_a)begin

if (we_a)memory[addr_a] <= din_a;

dout_reg_a <= memory[addr_a];endassign dout_a = dout_reg_a;

always @ (posedge clk_b)if (en_b)begin

if (we_b)memory[addr_b] <= din_b;

dout_reg_b <= memory[addr_b];endassign dout_b = dout_reg_b;endmodule

BME-MIT

FPGA labor

DP BlockRAM – VHDL (1)entity bram isgeneric(

ADDR_WIDTH : integer := 12;DATA_WIDTH : integer := 18

);port(

clk_a : in std_logic;rst_a : in std_logic;ce_a : in std_logic;we_a : in std_logic;addr_a : in std_logic_vector(ADDR_WIDTH-1 downto 0);din_a : in std_logic_vector(DATA_WIDTH-1 downto 0);dout_a : out std_logic_vector(DATA_WIDTH-1 downto 0);

clk_b : in std_logic;rst_b : in std_logic;ce_b : in std_logic;we_b : in std_logic;addr_b : in std_logic_vector(ADDR_WIDTH-1 downto 0);din_b : in std_logic_vector(DATA_WIDTH-1 downto 0);dout_b : out std_logic_vector(DATA_WIDTH-1 downto 0)

);end bram;………………………………………………………

BME-MIT

FPGA labor

DP BlockRAM – VHDL (2)

architecture rtl of bram is

type array_WbyD is array ((2**ADDR_WIDTH)-1 downto 0) of std_logic_vector(DATA_WIDTH-1 downto 0);shared variable memory : array_WbyD := (others=>CONV_STD_LOGIC_VECTOR(0,DATA_WIDTH));

signal dout_reg_a0 : std_logic_vector(DATA_WIDTH-1 downto 0);signal dout_reg_a1 : std_logic_vector(DATA_WIDTH-1 downto 0);

signal dout_reg_b0 : std_logic_vector(DATA_WIDTH-1 downto 0);signal dout_reg_b1 : std_logic_vector(DATA_WIDTH-1 downto 0);

begin

…………………………………

BME-MIT

FPGA labor

DP BlockRAM – VHDL (3)-- PORT A

process(clk_a)beginif (clk_a'event and clk_a='1') then

if (ce_a='1') thenif (rst_a='1') then

dout_reg_a0 <= (others=>'0');dout_reg_a1 <= (others=>'0');

elsedout_reg_a0 <= memory(CONV_INTEGER(addr_a));dout_reg_a1 <= dout_reg_a0;

end if;if (we_a='1') then

memory(CONV_INTEGER(addr_a)) := din_a;end if;

end if;end if;end process;dout_a <= dout_reg_a1;

BME-MIT

FPGA labor

DP BlockRAM – VHDL (4)-- PORT B

process(clk_b)beginif (clk_b'event and clk_b='1') then

if (ce_b='1') thenif (rst_b='1') then

dout_reg_b0 <= (others=>'0');dout_reg_b1 <= (others=>'0');

elsedout_reg_b0 <= memory(CONV_INTEGER(addr_b));dout_reg_b1 <= dout_reg_b0;

end if;if (we_b='1') then

memory(CONV_INTEGER(addr_b)) := din_b;end if;

end if;end if;end process;dout_b <= dout_reg_b1;

end rtl;

BME-MIT

FPGA labor

Implementációs constraint-ek

• Szintézer függő a constraint-ek elnevezése

• XST (ISE) többnyire támogatja a Synplify

constraint-eket is

• Verilog: kommentben, „synthesis” kulcsszó

• VHDL: attributum megadás

• UCF file-ban

reg [31:0] reg_a /* synthesis KEEP=„TRUE” */;

(* KEEP=„TRUE” *) reg [31:0] reg_a;

signal reg_a: std_logic_vector(31 downto 0);attribute keep : string;attribute keep of reg_a: signal is „TRUE”;

BME-MIT

FPGA labor

XST RAM constraint-ek

• Globálisan a project-ben megadható

• Változónként is felüldefiniálható

• RAM implementáció

• RAM_EXTRACT: „yes” vagy „no”

• RAM_STYLE: „auto”, „block”, „distributed”,

„pipe_distributed”reg [7:0] memory[511:0] /* synthesis RAM_EXTRACT=„YES”

RAM_STYLE=„BLOCK” */;

type marray is array (511 downto 0) of std_logic_vector(35 downto 0);signal memory : marray;attribute RAM_EXTRACT : string;attribute RAM_STYLE : string;attribute RAM_EXTRACT of memory : signal is „YES”;attribute RAM_STYLE of memory : signal is „BLOCK”;

BME-MIT

FPGA labor

Szorzó

• A felhasználók régi vágya

• Teljes párhuzamos tömbszorzó 18x18 bites

• Illeszkedik a BlokkRAM 18 bites konfigurációjához

• A fizikai beépítés is támogatja az együttes

használatot, pl. FIR szűrő

• 2’s komplemens, előjeles művelet

• 36 bites teljes eredmény

BME-MIT

FPGA labor

Xilinx szórzó (DSP) áramkörök

• V2, V2P, SP3:

• MULT18x18 és MULT18x18S: 18x18 bit, előjeles, kimeneti regiszter

• SP3E, SP3A

• MULT18x18SIO: 18x18 bit, előjeles, be- és kimeneti regiszterek

• SP3A DSP (SP6: SDP48A1)

• DSP48A: 18x18 bit + pre-adder + akkumulátor

• V4

• DSP48: 18x18 bit + akkumulátor

• V5

• DSP48E: 25x18 bit MUL, akkumulátor, ALU (+/-, logikai műveletek)

• V6, 7-es sorozat

• DSP48E1: 25x18 bit MUL, akkumulátor, ALU (+/-, logikai

műveletek), pre-adder

BME-MIT

FPGA labor

Szorzó

• Működési sebessége a nagy, illeszkedik a RAM-hoz

• Megőrizhető az opcionális pipe-line regiszterekkel

• Használható

– Önállóan

– Kaszkádosítva

BME-MIT

FPGA labor

Szorzó – HDLmodule mul_s (input clk, en, input signed [17:0] a, b,

output reg signed [35:0] p);always @ (posedge clk)if (en)

p <= a*b;endmodule

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all;

entity mul_s is port(clk, en : in std_logic;a : in std_logic_vector(17 downto 0); b : in std_logic_vector(17 downto 0);

p : out std_logic_vector(35 downto 0));end mul_s;architecture rtl of mul_s is beginprocess(clk)beginif rising_edge(clk) then

if (en)p <= a * b;end if;

end if;end process;end rtl;

BME-MIT

FPGA labor

Szorzó – HDL

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;

entity mul_s is port(clk, en : in std_logic;a : in std_logic_vector(17 downto 0); b : in std_logic_vector(17 downto 0);p : out std_logic_vector(35 downto 0));

end mul_s;architecture rtl of mul_s is beginprocess(clk)beginif rising_edge(clk) then

if (en)p <= a * b;end if;

end if;end process;end rtl;

BME-MIT

FPGA labor

Szorzó

• Kibővítés nagyobb pontosságra, pl. 35 x 35 bit

• 4 db keresztszorzat,

• MSW x MSW

• LSW x LSW

• MSW x LSW

• LSW x MSW

• Előjel kiterjesztés!

BME-MIT

FPGA labor

Xilinx DSP48A

BME-MIT

FPGA labor

Xilinx DSP48

BME-MIT

FPGA labor

Xilinx DSP48E

• Max. 600 MHz működési frekvencia

• MAC (multiplay-and-accumulate) művelethez

optimalizált architektúra

• Pl. FIR szűrő

• Műveletvégzők

• 48 bites összeadó/kivonó (2x24, 2x12 SIMD)

• 48 bites logikai egység (AND, OR, NOT, …..)

• 25x18 bites szorzó

• 25 bites elő-összeadó

BME-MIT

FPGA labor

Xilinx DSP48E1

BME-MIT

FPGA labor

35x35 bites szorzó (SP6)

BME-MIT

FPGA labor

DSP – Adder Tree vs. kaszkád

BME-MIT

FPGA labor

Több bemenetű összeadók

• 3:2 Compressor + összeadó(k): Add3 LUT6-ban

ABUS=X^Y^Z

BBUS=(X&Y)|(X&Z)|(Y&Z)

BME-MIT

FPGA labor

6 bementű összadó

• 6:3 Compressor + 2 db 2 bemenetű összeadó

X = A^B^C^C^D^E^F

Y = AB^AC^AD^AE^AF^

BC^BD^BE^BF^

CD^CE^CF^DE^DF^EF

Z = ABCD | ABCE | ABCF | ABDE | ABDF | ABEF |

ACDE | ACDF | ACEF | ADEF | BCDE | BCDF |

BCEF | BDEF | CDEF

BME-MIT

FPGA labor

1-MAC FIR

BME-MIT

FPGA labor

Párhuzamos FIR

• Mintavételi frekvencia ~= működési frekvencia

BME-MIT

FPGA labor

Részben párhuzamos FIR

BME-MIT

FPGA labor

Interpoláció (1)

• Bemeneti mintavételi frekvencia egész számú

többszörözése (N-szerezése)

• Új minták beillesztése (N-1 db 0)

• Aluláteresztő szűrő Fout/2/N vágási frekvenciával

BME-MIT

FPGA labor

Interpoláció (2)

• Kimeneti minták generálása:

• Ez a Polyphase filter

BME-MIT

FPGA labor

Párhuzamos interpoláló FIR

BME-MIT

FPGA labor

Decimálás (1)

• Mintavételi frekvencia N-ed részére csökkentése

• Aluláteresztő szűrés Fin/2/N-re

• Minden N mintából N-1 eldobása

• Azt eldobott mintákat felesleges kiszámolni!

BME-MIT

FPGA labor

Decimálás (2)

• Kimeneti minták generálása:

BME-MIT

FPGA labor

Párhuzamos decimáló FIR

BME-MIT

FPGA labor

Xilinx constarint-ek

• MULT_STYLE: auto, block, pipe_block, kcm,

csd, lut, pipe_lut

• KCM: constant coefficient multiplier

• CSD: canonic signed digit (konstansok átkódolása

hatékonyabb műveletvégzéshez)

• USE_DSP48: auto, yes, no

• Szorzáshoz automatikusan használja

• Összeadáshoz nem

BME-MIT

FPGA labor

Összeadó DSP48-cal

module add(input clk,input signed [47:0] a,input signed [47:0] b,output signed [47:0] p

)/* synthesis USE_DSP48="yes" */;

reg signed [47:0] a_reg;reg signed [47:0] b_reg;reg signed [47:0] p_reg;always @ (posedge clk)begin

a_reg <= a;b_reg <= b;p_reg <= a_reg + b_reg;

endassign p = p_reg;

endmodule

BME-MIT

FPGA labor

Összeadó DSP48-callibrary IEEE; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL;USE ieee.std_logic_signed.ALL;

entity dsp isport (

clk : in std_logic; d0, d1 : in std_logic_vector(47 downto 0);q : out std_logic_vector(47 downto 0)

);attribute USE_DSP48 : string;attribute USE_DSP48 of dsp : entity is "YES";end;

architecture rtl of dsp isbegin

process(clk)beginif (clk'event and clk='1') then

q <= d0 + d1;end if;end process;

end;

BME-MIT

FPGA labor

Órajel erőforrások

• Az FPGA tervek legfontosabb szempontja az

órajelezés

• Alapvető a szinkron tervezés

– Egy modulon/blokkon belül egy órajelet használunk

– Lassabb ütemezést órajel engedélyezésen keresztül

valósítunk meg.

• Természetesen egy teljes terven belül lehet több

órajel tartomány

– Ezek között a kommunikációt igen gondosan kell

megtervezni !!!

BME-MIT

FPGA labor

Órajel erőforrások

• Globális órajel terjesztő hálózat (minden szinkron

elemhez) - BUFGMUX

• Globális órajel bemenet (GCK láb)

• Órajel menedzsment modulok (DCM, PLL)

• Belső logika

• Clock-capable I/O

• BUFIO – I/O órajel buffer – CSAK I/O-hoz

• BUFR – Regionális órajel buffer – adott régióhoz

BME-MIT

FPGA labor

Globális órajel hálózatok

• A teljes felület negyedekre osztva

– Negyedenként 8-8 globális órajel hálózat

– Ezek „globalizálhatók” vagy függetlenül

használhatók (fogyasztás!)

– Meghajtás csak globális órajel bufferekről

• MUX funciója is van, az órajel forrás átkapcsolható

– Órajel forrás lehet

• Közvetlenül külső dedikált GCLK láb

• Órajel kezelő modul kimenet

• Belső jel

BME-MIT

FPGA labor

Órajel hálózatok tulajdonságai

• A teljes felületen minimális késleltetés

– Globális szinkron paradigma

• Csak FF, RAM, vagy más elem órajel bemenetére

csatlakoztatható

– Nem használható, mint általános logikai jel

– A FF órajel bemenet meghajtható általános jelekről, de ez

egy nem ajánlott tervezési stílus

• BUFGMUX átkapcsolás glitch mentesen két tetszőleges

frekvenciájú aszinkron órajel

között

– S vált, I0 ciklus végét megvárja, kimenet 0,

ezután vár I1 alacsony értékére és átkapcsol rá

BME-MIT

FPGA labor

Verilog leírás

• Az órajelként használt külső jelek bufferelése

automatikus (IBUFG, IBUFGDS nem!)

• Az FPGA-ban generált órajelekre ez nem igaz!!

IBUFGDS IBUFGDS_inst (.O(O), // Clock output

.I(I), // Diff_p input

.IB(IB) // Diff_n input

);

BUFGMUX BUFGMUX_inst (.O(O), // Clock output

.I0(I0), // Clock0 input

.I1(I1), // Clock1 input

.S(S) // Clock select

);

BME-MIT

FPGA labor

VHDL leírás

• Az órajelként használt külső jelek bufferelése

automatikus (IBUFG, IBUFGDS nem!)

• Az FPGA-ban generált órajelekre ez nem igaz!!

IBUFGDS_inst : IBUFGDSgeneric map (

IOSTANDARD => "DEFAULT")port map (

O => O, -- Clock buffer output

I => I, -- Diff_p clock buffer input

IB => IB -- Diff_n clock buffer input);

BUFGMUX_inst : BUFGMUXport map (

O => O, -- Clock MUX output

I0 => I0, -- Clock0 input

I1 => I1, -- Clock1 input

S => S -- Clock select input

);

BME-MIT

FPGA labor

Regionális órajelek (1.)

• FPGA mérettől függő számú órajel régió (6…18)

BME-MIT

FPGA labor

Regionális órajelek (2.)

• BUFIO/BUFR használat

BME-MIT

FPGA labor

Órajel multiplexálás logikával

BME-MIT

FPGA labor

Órajel multiplexálás logikával

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity clock_mux isport (

clk_i0 : in std_logic;clk_i1 : in std_logic;sel : in std_logic;clk_o : out std_logic

);end clock_mux;

architecture rtl OF clock_mux is

signal ff_clk0 : std_logic_vector(2 downto 0) := "000";signal ff_clk1 : std_logic_vector(2 downto 0) := "000";signal clk_o : std_logic;begin

process(clk_i0)beginif (clk_i0'event and clk_i0='1') then

ff_clk0(0) <= not sel and not ff_clk1(2);ff_clk0(1) <= ff_clk0(0);

end if;end process;

process(clk_i0)beginif (clk_i0'event and clk_i0='0') then

ff_clk0(2) <= ff_clk0(1);end if;end process;

process(clk_i1)beginif (clk_i1'event and clk_i1='1') then

ff_clk1(0) <= sel and not ff_clk0(2);ff_clk1(1) <= ff_clk1(0);

end if;end process;

process(clk_i1)beginif (clk_i1'event and clk_i1='0') then

ff_clk1(2) <= ff_clk1(1);end if;end process;

clk_o <= (clk_i0 and ff_clk0(2)) or(clk_i1 and ff_clk1(2));

BME-MIT

FPGA labor

Órajel generálás

• Spartan-3: DCM

• Spartan-6: DCM, DCM_CLKGEN, PLL

• Virtex-5, Virtex-6: MMCM (PLL)

• Artix-7, Kintex-7, Virtex-7: MMCM, PLL

BME-MIT

FPGA labor

Órajel kezelő modul

• Általános célú órajel kezelő

– Szinkronizáló,

– Frekvencia osztó

– 2x szorzó

– Fázistoló / fázis hasító

– DFS frekvencia szintézer

• Tipikus alkalmazás

BME-MIT

FPGA labor

Órajel kezelő modul

• Fázis toló egység

– Beállítható késleltetés, 20 – 40 ps lépésben

– Belső felépítés: Visszacsatolt szabályozó kör,

ami kompenzálja a késleltetést

BME-MIT

FPGA labor

Órajel kezelő egység

• Belső / külső késleltetés kompenzáció

• Azonos késleltetésű komponensek beépítésével az

egyes késleltetések kompenzálhatók

• A külső és belső órajel események

szinkronizálhatóak

BME-MIT

FPGA labor

Órajel kezelő egység

• Órajel kondicionálás

– Szinkronizáció

– Frekvencia kétszerezés

– 4 fázisú órajelezés

– Különböző leosztott

késleltetés kompenzált

CLKDIV frekvenciák:

1.5, 2, 2.5, 3, …..8, 9, ..

10, … 16

(CLK2x/K, ahol K = 3 …32)

BME-MIT

FPGA labor

Órajel kezelő egység

• Frekvencia szintézer

– Lényegében egy frekvencia szorzó egység

– Fout = F_CKin * FX_Mult/FX_Div, ahol

• FX_Mult 2…32

• FX_Div 1…32

– A kimeneti CK_FX lehet fáziszárt vagy független a

referenciától (CLK_FB használata)

• Frekvencia szintézis lehetséges független és fáziszárt üzemmódban

• A használható frekvencia tartomány eltérő

• Spartan 3E 5MHz – 250MHz, ha szinkronizált (DLL is kell)

• Spartan 3E 200kHz – 333MHz, ha nem kell szinkronizáció

BME-MIT

FPGA labor

DCM példányosítás

DCM_SP #(.CLKDV_DIVIDE(2.0),.CLKFX_DIVIDE(1),.CLKFX_MULTIPLY(4),.CLKIN_DIVIDE_BY_2("FALSE"),.CLKIN_PERIOD(0.0),.CLKOUT_PHASE_SHIFT("NONE"),.CLK_FEEDBACK("1X"),.DLL_FREQUENCY_MODE("LOW"),.DUTY_CYCLE_CORRECTION("TRUE"),.PHASE_SHIFT(0),.STARTUP_WAIT("FALSE")

) ……………………………………

……… DCM_SP_inst (.CLK0(CLK0),.CLK180(CLK180),.CLK270(CLK270),.CLK2X(CLK2X),.CLK2X180(CLK2X180),.CLK90(CLK90),.CLKDV(CLKDV),.CLKFX180(CLKFX180),.LOCKED(LOCKED),.PSDONE(PSDONE),.STATUS(STATUS),.CLKFB(CLKFB),.CLKIN(CLKIN),.PSCLK(PSCLK),.PSEN(PSEN),.PSINCDEC(PSINCDEC),.RST(RST));

BME-MIT

FPGA labor

DCM kaszkádosítás

• DCM kényes a reset-reprocess(clk0_fx_bufg, rst, dcm_locked(0))beginif (rst='1' or dcm_locked(0)='0') then

rst_cnt <= (others=>'0');dcm_rst <= '1';

elsif (clk0_fx_bufg'event and clk0_fx_bufg='1') thenif (rst_cnt(23)='0') then

rst_cnt <= rst_cnt+1;elsif (rst_cnt(23)='1' and dcm_locked(1)=‘0') then

rst_cnt <= (others=>'0');end if;

if (rst_cnt(23 downto 22)="00") thendcm_rst <= '1';

elsedcm_rst <= '0';

end if;end if;end process;

BME-MIT

FPGA labor

DCM időzítési kritériumok

• Spartan-6, -2, DLL

• Bemenet: 5…250 MHz

• Kimenet: 5…250 MHz

• Spartan-6, -2, DFS

• Bemenet: 0,5…333 MHz

• Kimenet: 5…333 MHz

BME-MIT

FPGA labor

PLL

• Phase Locked Loop (6-os sorozattól)

• 6 kimenet, egyedi fázissal és osztási aránnyal

• Újrakonfigurálható

D

MFCLKIN VCOF

OFVCO

1FOUT

BME-MIT

FPGA labor

PLL időzítési kritériumok

• Spartan-6, -2

• Bemenet (BUFIO): 19…450 MHz

• Bemenet (BUFG): 19…375 MHz

• PFD: 19…400 MHz

• VCO: 400…1000 MHz

• Kimenet (BUFG): 3,125…375 MHz

• Kimenet (BUFPLL): 3,125…950 MHz

BME-MIT

FPGA labor

Altera órajel kezelés

• Hasonló a Xilinx-hoz,

picit több megkötés

BME-MIT

FPGA labor

Altera Clk Control + PLL

BME-MIT

FPGA labor

Altera Cyclone IV PLL

BME-MIT

FPGA labor

Altera PLL időzítési kritériumok

• Cyclone IV, -8

• Bemenet: 5…472,5 MHz

• PFD: 5…325 MHz

• VCO: 600…1300 MHz

• Kimenet: 0…402,5 MHz

BME-MIT

FPGA labor

Összefoglalás

• FPGA belső erőforrások

– Logikai blokk sokféle lehet

• SRAM-nál tipikus a LUT4 + DFF

• Kiegészítő tulajdonságok:

– Átvitelgyorsító

– Elosztott memória

– SRL16

– Speciális modulok

• Órajel kezelő

• Szorzó

• BlokkRAM

BME-MIT

FPGA labor

I/O erőforrások

Több I/O szabvány támogatása

– Aszimmetrikus („Single ended”)

• LVCMOS, LVTTL, HSTL, SSTL, PCI

– Differneciális

• LVDS, RSDS, TMDS, Differential HSTL & SSTL

– Vccaux (bankonként)

• IOB pre-drivers, differencális bem. erősítő/komparátor, LVDS bias

generators, egyéb belső áramköri elemek

– Vcco (bankonként)

• I/O feszültség

– Kimeneti meghajtás erősség &

slew rate állítás

– PULLUP, PULLDOWN, KEEPER

BME-MIT

FPGA labor

IOB

IOB

– Kapcsolat a láb (PAD) és az FPGA belső

erőforrásai között

BME-MIT

FPGA labor

IOB attributumok

• PULLUP: gyenge felhúzó ellenállás

• PULLDOWN: gyenge lehúzó ellenállás

• KEEPER: gyenge fel/lehúzás, az utolsó logikai

szintet tartja a meghajtás után is (nem lebeg)

• DRIVE_STRENGTH: meghajtás erősség (amper)

• SLEW_RATE: jelváltási sebesség (FAST/SLOW)

BME-MIT

FPGA labor

I/O referencia feszültség

• I/O bankonként állítható

• Megegyezik az adott bankban használt I/O

feszültséggel

• Lehet külső forrás (VREF lábak)

• Egyes FPGA-knál belül is előállítható

BME-MIT

FPGA labor

Termináció

• Ki/bemenet impedancia illesztése

• Külső ellenállás

• DCI – Digitally Controlled Impedance

BME-MIT

FPGA labor

DCI

• Digitally Controlled Impedance

• On-Die Termination

• Egy (külső) referencia ellenállás értékét „másolja”

• VRN/VRP lábak

• Folyamatosan változik (pl. hőmérséklet,

tápfeszültség változás kompenzációja)

• Soros vagy párhuzamos lezáró ellenállás

BME-MIT

FPGA labor

DCI példa: DDR2 adatvonal

• Külső ellenállásokkal

• DCI a bemeneten

• DCI mindkét oldalon

BME-MIT

FPGA labor

I/O primitívek

• Single ended

– IBUF, IBUFG, OBUF, OBUFT, IOBUF

• Differenciális

– IBUFDS, IBUFGDS, OBUFDS, OBUFTDS, …

BME-MIT

FPGA labor

Spartan-3 IOB

BME-MIT

FPGA labor

Spartan-6 IO Tile

BME-MIT

FPGA labor

Bemenetek

• Standard lehetőségek

• Kombinációs; regiszterezett; latch bemenet

• DDR bemeneti FF

– OPPOSITE_EDGE, SAME_EDGE,

SAME_EDGE_PIPELINED

BME-MIT

FPGA labor

DDR bemeneti FF

• DDR OPPOSITE_EDGE

BME-MIT

FPGA labor

DDR bemeneti FF

• DDR SAME_EDGE

• DDR SAME_EDGE_PIPELINED

BME-MIT

FPGA labor

Kimenetek

• Standard lehetőségek

• Kombinációs, FF, latch

• FF rendelkezésre áll a a tri-state vezérlőjelhez is

• DDR kimeneti regiszter

BME-MIT

FPGA labor

DDR kimeneti FF

• OPPOSITE_EDGE

• SAME_EDGE

BME-MIT

FPGA labor

Órajel kimenet

• Belső, nagy frekvenciás órajel osztása

• ODDR FF

reg [1:0] clk_div;always @ (posegde clk)

clk_div <= clk_div + 1;

assign clk_d2 = clk_div[0];assign clk_d4 = clk_div[1];

ODDR2 ODDR2_clk (.Q(clk_pin),.C0(clk),

.C1(~clk),

.CE(1'b1),

.D0(1'b1),

.D1(1'b0),

.R(1'b0),

.S(11b0));

BME-MIT

FPGA labor

I/O Delay

• Programozható késleltetővonal (SP6, V4, V5, V6)

• CE & INC

• késleltetés állítás

• CINVCTRL:

• órajel invertálás

• IDELAYCTRL

• Kalibráció

• V4, V5, V6

• Fix 200 MHz-ről üzemel

• Példányosítás, automatikus

replikáció (általában…)

BME-MIT

FPGA labor

ISERDES

• Soros-párhuzamos átalakító

• SP6

• SDR:2,3,4 bites kimenet, kaszkádosítható (5,6,7,8)

• V4, V5, V6

• SDR: 2,3,4,5,6 bites kimenet, kaszkádosítható (7,8)

• DDR: 4,6,8,10 bites kimenet, kaszkádosítható (8, 10)

BME-MIT

FPGA labor

ISERDES (SP6)

BME-MIT

FPGA labor

Forrás szinkron bemenetek

• Forrás szinkron (source synchronous): az adatküldő fél

küldi az órajelet is

• „Edge aligned”: az órajel él az adatváltással egy

időpontban van

• „Center aligned”: az órajel éle az adatváltások között

„félidőben”, azaz stabil adatnál van

• Órajel frekvencia

• Az adatsebességgel azonos (vagy DDR esetben a fele) –

pl. RAM, MIPI

• Az adatsebesség valahányad része, pl HDMI

BME-MIT

FPGA labor

DDR S. Sync. BUFIO

BME-MIT

FPGA labor

Kalibráció és fázis detektálás

• IDELAY kalibráció (adat): egy órajel periódus hány

delay tap-nek felel meg (hőmérséklet & tápfeszültség

függő)

• Init CAL master & slave

• Reset

• CAL slave (periodikusan, de viszonylag ritkán)

• Master-t nem, mert CAL alatt invalid a kimenet

• Fázis detektálás (IDELAY állítás ISERDES alapján)

• 2-4 adatváltást vár ISERDES „VALID” kimenet

• Fázis módosítás irány ISERDES „INCDEC” kimenet

• BitSlip: adat szón belüli bit igazítás

BME-MIT

FPGA labor

OSERDES

• Párhuzamos-soros átalakító

• Adat és háromállapotú vezérlőjel bemenet

• SP6

• SDR: 2,3,4 bites bemenet

• V5, V6

• SDR, DDR: 2,3,4,5,6 bites bemenet (háromállapotú:

max 4)

BME-MIT

FPGA labor

Xilinx UltraScale

• 1 Slice = 8 LUT + 16 FF, 1 Slice/CLB

• 4 CE/CLB, több kimenet/Slice: LUT, MUX, FF

• F9MUX

• Distributed RAM

• Független írási/olvasási CE

• BRAM: Dedikált kaszkádosítás

• UltraRAM: 4Kx72 bit, dual-port

• DSP: 27x18 szorzó

• Transciever: 16 – 32 Gb/s

• Megnövelt huzalozási kapacitás

• Átdolgozott órajel terjesztés kisebb skew

BME-MIT

FPGA labor

BME-MIT

FPGA labor

Gyors összehasonlítás

• Altera Stratix III

– 11.168 USD

• Xilinx Virtex4

– 10.558 USD

• Lattice SC/M

– 2.275 USD

BME-MIT

FPGA labor

Gyors összehasonlítás

• Altera Stratix IV: 800 – 18.000 USD

BME-MIT

FPGA labor

Gyors összehasonlítás

Xilinx Virtex-6: 900 – 10.000 USD

BME-MIT

FPGA labor

Gyors összehasonlítás

• Altera Cyclone IV

– 10 - 600 USD

• Xilinx Spartan6

– 16 – 200 USD

• Lattice ECM

– 11 - 273 USD

• Actel IGLOO

– 13 – 295 USD

Recommended