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 atórium
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
FPGA felépítés Egyszerűsített általános kép
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
FPGA gyártók részesedése Lattice 6% Microsemi 4% Egyéb 1% Altera 40% Xilinx 49% Megemlítendő még: Achronix
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
Xilinx FPGA családok Logikai cella Spartan-3 Spartan-6 Virtex-6 Artix-7 Kintex-7 Virtex-7 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 x4 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 380 2.000-3.000 ~24.000
Xilinx Zynq SOC
Xilinx UltraScale+ MPSOC
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
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)
Lattice ECP3 Lattice FPGA-k 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
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
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ű
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
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
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
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
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
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: S j = A j xor B j xor C ij C oj = A j B j + A j C ij + B j C ij A teljes művelet végrehajtási ideje a C i0 C on-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
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
A gyors átvitel logika Aritmetika ADD/SUB/INC/DEC művelet SUM=A xor B xor C i Átvitel terjesztés és/vagy generálás C o = AB + AC i + BC i C o = (A xor B)? C i : A;
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
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ő
Szorzás CLB logikával Aritmetika MUL művelet Bitszintű szorzat és összegzés PP ij =PP ij-1 + A ik *B kj XOR kapu felső ága általában PP ij-1 Az ábra az első szintet mutatja, itt 2 bitszorzat összegezhető
Belső multiplexerek Szélesebb logikai kifejezésekhez A független szeletek kombinálhatók MUX4, MUX8, MUX16 egy CLB-ben
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
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é
A részletes struktúra Egyszerűsített SliceM felső és alsó logikai cellája
Virtex-6 SLICEM
Stratix IV ALM
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
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
LUT RAM LUT RAM csak a SliceM oldalon realizálható 1 Slice 1db RAM16x1D vagy 1db RAM32x1S
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
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
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, A1 => A1, A2 => A2, A3 => A3, ); -- RAM address[0] input -- RAM address[1] input -- RAM address[2] input -- RAM address[3] input -- RAM data input D => D, WCLK => WCLK, -- Write clock input WE => WE -- Write enable input
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;.. 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;
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
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
LUT SRL használat Alapvetően mint késleltő, aszinkron dinamikus címzéssel Szinkron címzés FF használattal
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
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;
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
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
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
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
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
További erőforrások Huzalozás Bőven túlméretezett huzalozási erőforrások Történelmi okokból
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!
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
Speciális blokkok az FPGA-ban Blokk RAM elhelyezése
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)
Használati módok Blokk RAM 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
Blokk RAM Beállítások NO_CHANGE a kimeneten az írást követően
Blokk RAM Beállítások READ_FIRST
Blokk RAM Beállítások WRITE_FIRST
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
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ó
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
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ó,.)
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
FIFO használat Xilinx: Core Generator Altera: MegaWizard (vagy scfifo/dcfifo komponens)
BRAM példányosítás (Verilog) RAMB16_S36_S36 #(.WRITE_MODE_A("WRITE_FIRST") ) RAMB16_S36_S36_inst (.DOA(DOA),.DOB(DOB),.DOPA(DOPA),.DOPB(DOPB), // Port A 32-bit Data Output // Port B 32-bit Data Output // Port A 4-bit Parity Output // 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 // Port B Write Enable Input.WEB(WEB) );
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 );
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 );
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)
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;
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
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;
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
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;
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
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;
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; 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
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 : 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;
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
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;
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;
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 ; UCF file-ban
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 ;
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
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) V4 V5 DSP48A: 18x18 bit + pre-adder + akkumulátor DSP48: 18x18 bit + akkumulátor 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
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
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;
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;
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!
Xilinx DSP48A
Xilinx DSP48
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ó
Xilinx DSP48E
Xilinx DSP48E1
35x35 bites szorzó (SP6)
DSP Adder Tree vs. kaszkád
Több bemenetű összeadók 3:2 Compressor + összeadó(k): Add3 LUT6-ban ABUS=X^Y^Z BBUS=(X&Y) (X&Z) (Y&Z)
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
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
Ö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
Ö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;
Ó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!!!
Ó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
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
Ó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á
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),.I0(I0),.I1(I1),.S(S) ); // Clock output // Clock0 input // Clock1 input // Clock select IBUFGDS IBUFGDS_inst (.O(O),.I(I),.IB(IB) ); // Clock output // Diff_p input // Diff_n input
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, I0 => I0, -- Clock0 input I1 => I1, -- Clock1 input S => S -- Clock select input ); -- Clock MUX output 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 );
Regionális órajelek (1.) FPGA mérettől függő számú órajel régió (6 18)
Regionális órajelek (2.) BUFIO/BUFR használat
Órajel multiplexálás logikával
Ó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));
Ó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
Ó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
Ó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
Ó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
Ó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)
Ó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ó
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) );
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; if (rst_cnt(23 downto 22)="00") then dcm_rst <= '1'; else dcm_rst <= '0'; end if; end if; end process;
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
PLL Phase Locked Loop (6-os sorozattól) 6 kimenet, egyedi fázissal és osztási aránnyal Újrakonfigurálható F VCO F OUT F CLKIN 1 F VCO O M D
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
Altera órajel kezelés Hasonló a Xilinx-hoz, picit több megkötés
Altera Clk Control + PLL
Altera Cyclone IV PLL
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
Ö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
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
IOB IOB Kapcsolat a láb (PAD) és az FPGA belső erőforrásai között
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)
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ó
Termináció Ki/bemenet impedancia illesztése Külső ellenállás DCI Digitally Controlled Impedance
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
DCI példa: DDR2 adatvonal Külső ellenállásokkal DCI a bemeneten DCI mindkét oldalon
I/O primitívek Single ended IBUF, IBUFG, OBUF, OBUFT, IOBUF Differenciális IBUFDS, IBUFGDS, OBUFDS, OBUFTDS,
Bemenetek Standard lehetőségek Kombinációs; regiszterezett; latch bemenet DDR bemeneti FF OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED
DDR bemeneti FF DDR OPPOSITE_EDGE
DDR bemeneti FF DDR SAME_EDGE DDR SAME_EDGE_PIPELINED
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
DDR kimeneti FF OPPOSITE_EDGE SAME_EDGE
Ó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) );
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 )
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)
ISERDES (SP6)
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)
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
Altera Stratix III 11.168 USD Gyors összehasonlítás Xilinx Virtex4 10.558 USD Lattice SC/M 2.275 USD
Gyors összehasonlítás Altera Stratix IV: 800 18.000 USD
Gyors összehasonlítás Xilinx Virtex-6: 900 10.000 USD
Altera Cyclone IV 10-600 USD Xilinx Spartan6 16 200 USD Lattice ECM 11-273 USD Gyors összehasonlítás Actel IGLOO 13 295 USD