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