BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK
Digitális rendszerek tervezése FPGA áramkörökkel SRAM FPGA Architektúrá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 á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 Lattice Microsemi 6% 4%
Egyéb 1%
Xilinx 49%
Altera 40%
• Megemlítendő még: Achronix BME-MIT FPGA labor
Technológiai háttér • Az SRAM FPGA-k jellemzően a technológiai élvonalban vannak – 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ádok Spartan-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
PCIe
-
1.0 x1
2.0 x8
2.0 x8
3.0 x8
Mem. vezérlő
166 Mb/s
800 Mb/s
1066 Mb/s 1066 Mb/s 1866 Mb/s 1866 Mb/s
Ár (USD)
~70
~240
~14.000
2.0 x4
380
2.0003.000
~24.000
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 SoC • 2 magos ARM Coretx A9 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
– Legújabb irányzat a drágább termékvonalban • 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_1 generic 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 is port ( 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 is type marray is array (15 downto 0) of std_logic_vector(7 downto 0); signal memory : marray; …………………. BME-MIT
………………………………….
begin process(clk) begin if (clk'event and clk='1') then if (we='1') then memory(CONV_INTEGER(addr)) <= din; end if; end if; end process; dout <= memory(CONV_INTEGER(addr));
end;
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 is port ( 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 is signal shr : std_logic_vector(15 downto 0); ……………………………….
begin
process(clk) begin if (clk'event and clk='1') then if (ce='1') then shr <= 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 • Az alacsony árfekvésű elemekben – Nagyobb méretű memória blokkok – Dedikált szorzó modulok • Prémium kategóriában – Többféle memória modul – DSP blokk teljes MAC struktúrával – Beépített CPU mag/magok – Nagysebességű soros interfészek 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)
BME-MIT
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 ); FPGA labor
BRAM példányosítás RAMB16_S36_S36_inst : RAMB16_S36_S36 generic map ( WRITE_MODE_A => "WRITE_FIRST", WRITE_MODE_B => "WRITE_FIRST") port map ( 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, -- PortB 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ás (2)
BME-MIT
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 );
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-IIItól) • MLAB – 640 bites LUT alapú memória (10 ALM/MLAB) BME-MIT FPGA labor
Altera RAM példányosítás COMPONENT 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 is port ( 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 is type marray is array (511 downto 0) of std_logic_vector(35 downto 0); signal memory : marray;
begin process(clk) begin if (clk'event and clk='1') then if (ce='1') then if (we='1') then memory(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 is port ( 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 is type marray is array (511 downto 0) of std_logic_vector(35 downto 0); signal memory : marray;
process(clk) begin if (clk'event and clk='1') then if (ce='1') then if (we='1') then memory(CONV_INTEGER(addr)) <= din; dout <= din; else dout <= 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 is port ( 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 is type marray is array (511 downto 0) of std_logic_vector(35 downto 0); signal memory : marray;
process(clk) begin if (clk'event and clk='1') then if (ce='1') then if (we='1') then memory(CONV_INTEGER(addr)) <= din; else dout <= memory(CONV_INTEGER(addr)); end if; end if; end process;
end;
BME-MIT FPGA labor
DP BlockRAM module 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]; end assign dout_a = dout_reg_a;
BME-MIT
always @ (posedge clk_b) if (en_b) begin if (we_b) memory[addr_b] <= din_b; dout_reg_b <= memory[addr_b]; end assign dout_b = dout_reg_b; endmodule
FPGA labor
DP BlockRAM – VHDL (1) entity bram is generic( 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 rst_b ce_b we_b addr_b din_b dout_b
: in std_logic; : in std_logic; : in std_logic; : in std_logic; : in std_logic_vector(ADDR_WIDTH-1 downto 0); : in std_logic_vector(DATA_WIDTH-1 downto 0); : 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_WIDTH1 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) begin if (clk_a'event and clk_a='1') then if (ce_a='1') then if (rst_a='1') then dout_reg_a0 <= (others=>'0'); dout_reg_a1 <= (others=>'0'); else dout_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) begin if (clk_b'event and clk_b='1') then if (ce_b='1') then if (rst_b='1') then dout_reg_b0 <= (others=>'0'); dout_reg_b1 <= (others=>'0'); else dout_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ó reg [31:0] reg_a /* synthesis KEEP=„TRUE” */; (* KEEP=„TRUE” *) reg [31:0] reg_a;
• VHDL: attributum megadás signal reg_a: std_logic_vector(31 downto 0); attribute keep : string; attribute keep of reg_a: signal is „TRUE”;
BME-MIT
• UCF file-ban 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ó – HDL module 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 begin process(clk) begin if 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 begin process(clk) begin if 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 DSP48E
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
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; end assign p = p_reg; endmodule
BME-MIT FPGA labor
Összeadó DSP48-cal library IEEE; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_signed.ALL; entity dsp is port ( 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 is begin process(clk) begin if (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, CKa ciklus végét megvárja, kimenet 0, ezután vár CKb 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!! BUFGMUX BUFGMUX_inst ( .O(O), // Clock output .I0(I0), // Clock0 input .I1(I1), // Clock1 input .S(S) // Clock select );
IBUFGDS IBUFGDS_inst ( .O(O), // Clock output .I(I), // Diff_p input .IB(IB) // Diff_n input );
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!! BUFGMUX_inst : BUFGMUX port map ( O => O, -- Clock MUX output I0 => I0, -- Clock0 input I1 => I1, -- Clock1 input S => S -- Clock select input );
IBUFGDS_inst : IBUFGDS generic map ( IOSTANDARD => "DEFAULT") port map ( O => O, -- Clock buffer output I => I, -- Diff_p clock buffer input IB => IB -- Diff_n clock buffer 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 is port ( 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) begin if (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) begin if (clk_i0'event and clk_i0='0') then ff_clk0(2) <= ff_clk0(1); end if; end process; process(clk_i1) begin if (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) begin if (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-re process(clk0_fx_bufg, rst, dcm_locked(0)) begin if (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') then if (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;
BME-MIT
if (rst_cnt(23 downto 22)="00") then dcm_rst <= '1'; else dcm_rst <= '0'; end if; end if; end process; 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ó
FVCO FOUT
M FCLKIN D 1 FVCO O
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
– Vcco (kimeneti feszültség) és Vccaux • I/O bankonként
– 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
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 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];
• ODDR FF
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
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
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 BME-MIT FPGA labor