1 Rejestry przesuwne, PamięciErnest Jamro Kat. Elektroniki AGH
2 Multiplekser Mux 2:1 Mux 4:1
3 Multiplekser 2:1 na bramkachSel\In1, In0 00 01 11 10 1 Out= SelIn0 + Sel In1
4 Multiplekser na bramkach – postać ogólnaMux 4:1
5 Multiplekser na buforach trójstanowychVHDL (wewnątrz FPGA): Ch(1)<= In1 when Tn(1)=‘1’ else ‘Z’; Ch(2)<= In2 when Tn(2)=‘1’ else ‘Z’; VHDL (testbench): Y<= ch(1); Y<= ch(2); Aby uniknąć krótkotrwałego zwierania buforów stosuje się krótki czas martwy w którym wszystkie bufory są w stanie wysokiej impedancji. Wymaga to użycia automatu zamiast prostego dekodera kodu binarnego na 1 z n.
6 Multiplekser na bramkach OC*.ucf NET "ch<1>" LOC = "T3" ; NET "ch<1>" PULLUP; VHDL bramka OD/OC: Ch(1) <= ‘0’ when D0=‘0’ else ‘Z’; Ch(2)<= ‘0’ when D1=‘0’ else ‘Z’; Y= S’D0 + SD multiplekser A + B= (A’B’)’ - prawo De Morgana, (Wired AND) Y= ( (S’D0)’ (SD1)’ )’
7 Demultiplekser
8 Multipleksowanie w czasieWyświetlacz 7-segmentowy Tylko jeden wyświetlacz jest aktywny w danej krótkiej chwili czasowej W układach scalonych z reguły bardziej kosztowne jest dodanie dodatkowego wyprowadzenia niż dodatkowej logiki
9 SIPO (Serial-In Parallel-Out)process(clk) begin if clk'event and clk1=‘1' then Q(N-1 downto 0)<= Q(N-2 downto 0) & Din; end if; end process;
10 SIPO (Clock Enable) – błędne użyciePrzykład taktowania co drugi takt zegara modułu SIPO i złego użycia bramki AND na sygnale zegarowym – powstaje wyścig!!!
11 SIPO (Clock Enable) – poprawne użyciePrzykład taktowania co drugi takt zegara SIPO – sygnał zegarowy jest wyjściem Q przerzutnika (Uwaga wyścig może powstać pomiędzy sygnałem Din a Clk2).
12 SIPO (CE - Clock Enable)
13 SISO (Serial-In Serial-Out)
14 Parallel-In Serial-Out (PISO)
15 PISO - VHDL process(clk) begin if clk'event and clk1=‘1' thenif load=‘1’ then Q <= D; else Q(N-1 downto 0)<= Q(N-2 downto 0) & Din; end if; end process; Qout<= Q(N-1);
16 Przesyłanie danych szeregowoSposób 1 Sposób 2 PISO Clk SIPO D clk takt
17 Incrementator (S=A+1) Si Ci si = ai ci-1 ci= ai ci-1 ci-1\ai 11 ci-1\ai 1 HA Half Adder si = ai ci-1 ci= ai ci-1
18 Incrementator: ExampleA=10112= 1110=0xB S=A+1= 11002=1210=0xC
19 Dodawanie z szeregową propagacją przeniesienia (Ripple Carry) Adder: S= A+Bai + bi+ci-1 = si + 2·ci si = ai bi ci-1 ci= ai bi + ai ci-1 + bi ci-1= ai bi + ci-1 (ai bi) ci-1\ai,bi 00 01 11 10 1 ci ci-1\ai,bi 00 01 11 10 1 Propagate Generate
20 Odejmowanie / Subtraction (a-b)Direct Two’s Complement (2C) ai - bi-ci-1 = si - 2·ci si = ai bi ci-1 Add 1 to the LSB (Least Significant Bit) Sign bit negation si Instead of employing dedicated subtraction we can use a standard adder convert B to 2C code Example: 1111 in 2C= 0000+1= (minus one) ci-1\ai,bi 00 01 11 10 1 ci ci-1\ai,bi 00 01 11 10 1 Red color – difference between addition and subtraction
21 Add/Subtract Logic S<= A+B when Sub=‘0’ else A-B;Convert B to Two’s Complement when Sub=1
22 Dodaj,Odejmij, Przepełnienie, PrzykładyAdd: 9+1= 10 = 9 = 1 = 10 Add: 9+8= 17 = 9 = 8 = -15 Overflow Add: -9+8= -1 = -9 = 8 = -1 Overflow= CarryOutN xor CarryOutN-1 Subtract: 9-1= 8 = 9 = -1 = 8 Subtract: 9-8= 1 = 9 = -8 = 1 Subtract: -9-8= -17 = -9 = -8 01111= 15 Overflow
23 Counter mod 2N Qn+1= Qn+1 architecture Beh of counter_2N issignal Q: std_logic_vector(3 downto 0); begin process(clk, reset_asynch) begin if reset_asynch=‘1’ then Q<= (others=>’0’); elsif clk’event and clk=‘1’ then Q<= Q + 1; end if; end process; Count<= Q end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity counter_2N is port(clk, reset_asynch: in std_logic; count : out std_logic_vector (3 downto 0)); end counter_2N; architecture Behavioral of race_ce is signal p: std_logic_vector(4 downto 0);
24 Counter mod N architecture Beh of counter_N issignal Q: std_logic_vector(3 downto 0); begin process(clk) begin if clk’event and clk=‘1’ then if reset_synch=‘1’ or Q=N-1 then Q<= (others=>’0’); else Q<= Q + 1; end if; -- not reset end if; -- clk end process; end Beh;
25 Up/Down Counter mod 2N architecture Beh of counter_up_down issignal Q: std_logic_vector(3 downto 0); begin process(clk) begin if clk’event and clk=‘1’ then if Up_DownN=‘1’ then Q<= Q + 1; else Q<= Q - 1; end if; -- up / downN end if; -- clk end process; Count <= Q; end Beh;
26 Up/Down Counter mod N process(clk) begin if clk’event and clk=‘1’ thenif Up_DownN=‘1’ then if Q = N-1 then Q<= (others=>’0’) else Q<= Q + 1; end if; else -- counting down if Q = 0 then Q<= conv_std_logic_vector(N-1, vec_width); Q<= Q - 1; end if; -- up / downN end if; -- clk end process;
27 Rotacja, Przesunięcie logiczne i ArytmetyczneWejście: a3a2a1a0 W lewo Rot: a2a1a0a3 B<= A(2 downto 0) & A(3); Log: a2a1a00 B<= A(2 downto 0) & ‘0’; Arith: a2a1a00 B<= A(2 downto 0) & ‘0’; W prawo Rot: a0a3a2a1 B<= A(0) & A(3 downto 1); Log: 0a3a2a1 B<= ‘0’ & A(3 downto 1); Arith: a3a3a2a1 B<= A(3) & A(3 downto 1); Logiczne –mnożenie/dzielenie przez 2 dla nieujemnych liczb Arytmetyczne: mnożenie/dzielenie przez 2 dla uzupełnień do dwóch Przykład: –1= 1111; -1/2= 1111= -1
28 Rejestr przesuwny w prawo lub lewoSLEFT=0 – przesuń w prawo SLEFT=1 – przesuń w lewo
29 Rejestr przesuwny w prawo i w lewo z wpisem równoległymprocess(clk) begin if clk’event and clk=‘1’ then if S(1)= ‘1’ then -- load Q<= D; elsif S(0)= ‘0’ then – shift right Q<= Dleft & Q(3 downto 1); else -- shift left Q<= Q(2 downto 0) & Drigth; end if; end if; end process; S= 0 - przesuń w prawo S=1 - przesuń w lewo S=2 - wpis równoległy S=3 - wpis równoległy
30 Rejestr przesuwny: rotujący, logiczny, arytmetycznyMnożenie/dzielenie przez 2 Kopiowanie bity znaku przy dzieleniu w kodzie U2
31 Barrel Shifter (szybkie przesunięcie o dowolną liczbę bitów)Mnożenie Dzielenie (kod U2 - uzupełnień do dwóch)
32 Barrel Shifter - wielopoziomowyKażdy z n poziomów przesuwa o 0 lub 2i-bitów (i=0..(n-1)) bitów w ten sposób można przesunąć o dowolną liczbę bitów w zakresie od (0..2n-1)-bitów używając prostych multiplekserów 2:1.
33 Pamięci - klasyfikacjaROM (Read Only Memory) - nieulotne (non-volatile) ROM (programowany podczas produkcji układu scalonego) PROM (programowane jednorazowo u użytkownika) EPROM (Erasable PROM – możliwa ale uciążliwa wielokrotna programowalność EEPROM (Electrically Erasable and Programmable ROM) Flash (błysk-awiczne EEPROM) RAM (Random Access Memory), Ulotne Pamięci specjalizowane
34 Pamięci ROM Pamięci ROM powstają bezpośrednio w procesie produkcji układu scalonego dlatego mają następujące cechy: Stan pamięci określony na poziomie produkcji układu scalonego Brak możliwości zmiany zawartości pamięci Tanie w produkcji ale wymagają dużych nakładów (wykonania w milionach sztuk – drogie przy małej liczbie sztuk) Długi okres produkcji – kilkanaście tygodni. Pamięci coraz rzadziej stosowane
35 Schemat pojedynczej komórki ROM
36 Wybieranie 2 wymiarowe Sposób wybierania np. klawiszy, komórek pamięci, itd
37 Dwuwymiarowe wybieranie komórki pamięci
38 Pamięci PROM Programmable Read Only Memory:Programowanie pamięci wykonywane jest przez użytkownika w specjalnym urządzeniu programującym. Programowanie następuje poprzez przepalenie tzw. bezpieczników (ang. fuse) i jest nieodwracalne. Pamięci te są dzisiaj rzadko stosowane
39 Pamięci EPROM Erasable Programmable ROMKasowanie pamięci wymaga użycie promieni UV i specjalnego okienka kwarcowego – co zdecydowanie podraża koszt produkcji. Czas kasowania to około 30min. Pamięci dzisiaj raczej nie stosowane
40 Tranzystor w EPROM Swobodna bramka (floating gate)
41 Pamięci EEPROM Electrically Erasable Programmable Read-OnlyMożliwość elektrycznego wielokrotnego kasowania pamięci. Łatwość kasowania, nie potrzeba użycia promieni UV Kasowanie całej pamięci lub pojedynczego sektora Liczba kasowań około razy
42 Programowanie i kasowanie EEPROM
43 Pamięć EEPROM Flash Struktura działania podobna do EEPROM.Bardzo szybki proces kasowania (rzędu 1ms) w porównaniu z pamięcią EEPROM (rzędu 15min.). Szybkość pracy pamięci Flash polega głównie na kasowaniu całego bloku na raz a nie jak to ma miejsce w pamięci EEPROM pojedynczych bajtów. Potrzebny tylko 1 tranzystor na 1 bit pamięci
44 Flash – kasowanie i programowanie
45 Struktura NOR i NAND pamięci Flashb) NAND
46 Flash: NOR i NAND W strukturze NAND napięcia wszystkich (oprócz jednej) bramek WL0-WL15 są na tyle wysokie że tranzystory szeregowe zawsze przewodzą. Natomiast napięcie jednej bramki jest takie, że stan pracy tranzystora zależy od zaprogramowania. Cechy struktury NOR: Swobodny odczyt, ale wolny zapis i kasowanie Preferowane jako pamięci o dostępie swobodnym (BIOS, ROM procesora) Cechy struktury NAND Preferowany odczyt całego bloku danych Tańsze w produkcji od NOR (zajmują mniej powierzchni krzemu) Szybszy zapis i kasowanie Liczba kasowań około 10 razy większa niż w przypadku NOR Preferowany dla pamięci masowych (pendrive, karty CF/SD, SSD- Solid State Drive)
47 Wielopoziomowe pamięci Flash Multiple Level Cell (MLC)Alternatywa: Single Level Cell (SLC)
48 Pamięci Flash i Interface szeregowy:I2C (Inter Integrated Circuit) – 2 przewody (100, 400kHz, 3.4MHz) (Philips) SPI (Serial Peripherial Interface) – 3 przewody (1-50MHz) (Motorola) Microwire – 3 przewody (1-3MHz) (National Semiconductor)
49 Przykład pamięci ROM w VHDLlibrary ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rom is port ( ADDR : in std_logic_vector(5 downto 0); DATA : out std_logic_vector(19 downto 0)); end rom; architecture syn of rom is type rom_type is array (63 downto 0) of std_logic_vector (19 downto 0); signal ROM : rom_type:= (X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A", X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002", X"08201", X"00500", X"04001", X"02500", X"00340", X"00241", X"04002", X"08300", X"08201", X"00500", X"08101", X"00602", X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021", X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B", X"00900", X"00302", X"00102", X"04002", X"00900", X"08201", X"02023", X"00303", X"02433", X"00301", X"04004", X"00301", X"00102", X"02137", X"02036", X"00301", X"00102", X"02237", X"04004", X"00304", X"04040", X"02500", X"02500", X"02500", X"0030D", X"02341", X"08201", X"0400D"); begin data <= ROM(conv_integer(ADDR)); end syn;
50 Pamięci ROM (Read Only Memory) RAM (Random Access Memory)Statyczne (SRAM) Asynchroniczne Synchroniczne Dynamiczne (DRAM) -Asynchroniczne (historia) - Synchroniczne SDRAM, DDR, DDR2, DDR3, RAM-BUS (RDRAM), XDR-DRAM Specjalizowane FIFO (First-In First-Out) LIFO (Last-In First-Out – stos) CAM (Content-Addressable Memory) LUT (Look-Up Table) (pamięć ROM/RAM)
51 Podstawowa komórka pamięci SRAMLinia wiersza Linia kolumny (bit B) U’DD T1 T5 T3 T2 T6 T4 Przerzutnik bistabilny – dwa inwertery Przerzutnik RS – przejście w inny stan poprzez zwarcie Przerzutnik RS
52 Alternatywna (już nie stosowana) postać komórki SRAMLinia wiersza Linia kolumny (bit B) U’DD T1 RD T3 T2 T4
53 Synchroniczny zapis, asynchroniczny odczyt
54 Dwukierunkowa transmisja danych po jednym przewodzie
55 Schemat Blokowy układ: AS7C4096 512k×8bit
56 Tablica prawdy
57 Przykładowe przebiegi
58 Parametry czasowe pamięci
59 Przykładowe przebiegi (zapis)
60 Przykład zapisu i odczytu pamięci
61 Zerowanie pamięci Brak resetu umożliwiającego zerowanie całej pamięci – konieczne jest zerowanie wszystkich komórek po kolei „0” Licznik n –bitowy Clk DIN RAM 2nx1 WE O A[n:0] wejście taktujące
62 Łączenie Pamięci, pamięć duża 128x1 z 4 pamięci 32x1 Użycie multiplekseradekoder 2-na-4 A0:A4 D WE Bloki pamięci RAM32x1 O Multiplekser D0 D1 D2 D3 S[1:0] E
63 Łączenie pamięci Zwiększenie szerokości magistrali danych (preferowane) Zwiększenie szerokości magistrali adresowej
64 Pamięci synchroniczne SRAM - odczyttCHCH tCH tCL CLK tAVCH tCHAX A0 – A16 Adres n Adres n + 1 Adres n + 2 tCEVCH tCHCEX CE tOEVCH tOHCEX OE WE tWEVCH tCHWEX tCHQV tCHQZ Dane wyjściowe Dane z komórki o adresie n Dane z komórki o adresie n+1 Hi - Z tCHQX2 tCHQX1
65 Synchroniczny zapis, asynchroniczny odczyt
66 Synch. zapis / asynch. odczyt - VHDLprocess (
67 Pamięci synchroniczne SRAM - zapistCHWEX tCEVCH tCHCEX Adres n Adres n + 1 Adres n + 2 tCHCH tCH tCL tCHAX tAVCH tWEVCH CLK A0 – A16 CE WE tCHDX Dn Dn + 1 tDVCH Dane
68 SSRAM - Zapis i odczyt jedna magistrala danych
69 Niezależne magistrale danych do zapisu i odczytu Read before Write lub Write Before ReadSSRAM, opóźnienie - 1 clk
70 Pamięć - VHDL architecture syn of rams_01 is library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rams_01 is port (CLK : in std_logic; WE : in std_logic; ADDR : in std_logic_vector(9 downto 0); DI : in std_logic_vector(15 downto 0); DO : out std_logic_vector(15 downto 0)); end rams_01; architecture syn of rams_01 is type ram_type is array (1023 downto 0) of std_logic_vector (15 downto 0); signal RAM: ram_type; signal ADDR_Q: std_logic_vector(9 downto 0); -- write before read begin process (CLK) if CLK'event and CLK = '1' then if WE = '1' then RAM(conv_integer(ADDR)) <= DI; end if; DO <= RAM(conv_integer(ADDR)) ; -- read before write ADDR_Q<= ADDR; -- write before read end process; DO <= RAM(conv_integer(ADDR_Q)) ; -- write before read end syn;
71 Synchroniczny zapis, asynchroniczny odczyt
72 Synchroniczny zapis, asynchroniczny odczyt
73 Pamięci wieloportowe Dwa takie same niezależne interface’y do pamięci – ale ta sama pamięć!
74 Pamięć quasi dwuportowaPamięć quasi dwuportowa? Jeden port do zapisu synchronicznego, dwa porty do odczytu asynchronicznego
75 1 port zapis, 2 porty odczyt - VHDLprocess (
76 Konflikty w pamięci dwuportowejZapis na dwóch portach pod ten sam adres – konflikt (stan nieokreślony) – Adr= A2
77 Komórka pamięci wieloportowejPamięć jednoportowa dwuportowa czteroportowa
78 Optymalizacja komórki pamięci dwuportowejLiteratura: Area-Efficient Dual-Port Memory Architecture for Multi-Core Processors - Hassan Bajwa and Xinghao Chen
79 Dynamic RAM Pierwsze tranzystory-kondensatory Dzisiejsze kondensatory są budowane w 3 wymiarach aby zmniejszyć rozmiar powierzchni i zwiększyć pojemność C
80 Pamięci dynamiczne DRAMФ1 Ф2 Ф3 Odczyt 1 Odczyt 0 US1 US0 UB1 UB0 UM UB US 1 Linia kolumny (bitu) Linia wiersza CB CS W T B Ф1 Ф3 T2 T1 I1 I2
81 Odczyt pamięci DRAM RAS – Raw Address StrobeStan nieistotny RAS CAS Adres tRCD tRC WE H Hi - Z Q R tRAC RAS – Raw Address Strobe CAS – Column Address Strobe
82 Zapis pamięci DRAM R C RAS CAS Adres WE D
83 Odświeżanie Odświeża się cały wiersz podczas pojedynczego odczytuRAS Adres CAS R CAS before RAS Jeśli /CAS jest ustawiany w stan niski (aktywny) prezzd sygnałem /RAS to pamięć DRAM ignoruje adres podany na magistrali adresowej i używa swojego wewnętrznego licznika odświeżeń aby odświeżyć kolejny wiersz
84 Fast Page Mode R C RAS CAS Adres Hi - Z Q
85 Pamięć SDRAM Synchronouse DRAM (Single Data Rate)tCAS
86 Parametry czasowe tCAS-tRCD-tRP-tRAS przykład: 2.5-3-3-8CL = CAS Latency time: The time it takes between a command having been sent to the memory and when it begins to reply to it. It is the time it takes between the processor asking for some data from the memory and it returning it. TRCD = DRAM RAS# to CAS# Delay: The number of clock cycles performed between activating the Row Access Strobe and the Column Access Strobe. This parameter relates to the time it takes to access stored data. TRP = DRAM RAS# Precharge: The amount of time between the 'precharge' command and the 'active' command. The precharge command closes memory that was accessed and the active command signifies that a new read/write cycle can begin. TRAS = Active to Precharge delay: The total time that will elapse between an active state and precharge state. This is the sum of the previous timings: CL + TRCD + TRP
87 SDRAM
88 SDRAM – różne banki
89 DDR SDRAM- Double Date RateTransfer danych następuje 2 razy na takt zegara – na narastające i opadające zbocze Komendy akceptowane są co takt zegara (w pierwszym przybliżeniu) i są podobne jak dla sdram Obniżono napięcie zasilania z 3.3V (sdr sdram) na 2.5V (DDR) Szybkość transmisji: 2(ddr) * 8 (bajtów) *f
90 DDR2 Transfer danych na narastającym i opadającym zboczu (błędem jest twierdzenie że 4 razy na takt zegara) Częstotliwość wewnętrzna pamięci 2 razy mniejsza od częstotliwości magistrali zewnętrznej – dlatego podczas jednego odczytu z pamięci wewnętrznej odczytywane są 4 bity, które są kolejno transferowane pojedynczo Obniżone napięci zasilania na 1.8V Aby osiągnąć wyższą wydajność od pamięci DDR pamięci DDR2 są taktowane wyższą częstotliwością Pamięci te mają większe opóźnienie (latency), np. Dla DDR typowe to 2 do 3, dla DDR2 typowe to 4 do 6 taktów zegara – opóźnienie to jest częściowo rekompensowane większą częstotliwością taktowania
91 DDR3 Częstotliwość wewnętrzna pamięci 4 razy mniejsza od częstotliwości zewnętrznej – dlatego podczas jednego odczytu wewnętrznego czytanych jest 8 bitów, które z kolei są transmitowane pojedynczo w 4 taktach zegara Zwiększono częstotliwość taktowania Zwiększono opóźnienie (latency) Zmniejszono napięcie zasilania do 1.5V
92 Dual-Channel Memory Zwiększona szerokość magistrali danych z 64-bitów do 128-bitów
93 First-In First-Out (FIFO)Wejście: A, B, - ,C, - , D, E Wyjście: - , A, - , B, - , - , C, - , D , E empty full
94 Last-In First-Out (LIFO) (stos)Wejście: A, B, - ,C, - , D, E Wyjście: - , B, - , C, - , - , E, - , D , A Zapis Odczyt Licznik (Qn+1) 0 0 Qn 1 0 Qn +1 0 1 Qn -1 1 1 Qn
95 Bufor opóźniający na rejestrze przesuwnym
96 Bufor opóźniający na pamięci
97 Content-addressable memory (CAM)Podajemy wartość danej a pamięć CAM zwraca adres (lub adresy) pod którymi znajduje się podane dana W konsekwencji należy przeszukać całą pamięć aby otrzymać adres pod którym znajduje się podana dana Przykład pamięci: Adres: Dana: Dana: 4, wynik: 1; Dana 3, wynik: 2, (6, 7)
98 Look-Up Table (LUT) Kwadrat: Adres: 0, 1, 2, 3, 4...Dana: 0, 1, 4, 9, 16...
99 Obliczanie histogramu
100 Zadania lab na 3.0 1. Zaprojektować układ zapełniający po kolei wszystkie komórki pamięci kolejnymi wartościami używając a) pamięci RAM16x?S, b) RAMB16_?S 2. Z pamięci o szerokości danych N-bitowej skonstruować pamięć o większej szerokości magistrali danych 2N-bitowej, 4N-bitowej (uŜywając pamięci a) RAM16x?S, b) RAMB16_S?). 3. Z pamięci o mniejszej pojemności zaprojektuj pamięci o a) 2, b) 4 razy większej pojemności, przy tej samej szerokości magistrali danych (używając pamięci a) RAM16x?S, b) 4. Zaprojektuj układ zapisujący (i później odczytujący) konkretną wartość pod konkretną lokację adresową (używając pamięci a) RAM16x?S, b) RAMB16_S?). 5. Używając pamięci dwuportowej RAMB16_S?_S? zaprojektuj układ zapisujący (i później odczytujący) konkretną wartość pod konkretną lokację adresową na dwóch portach. Zaobserwuj co się stanie w przypadku zapisu i odczytu spod tego samego adresu równocześnie na dwóch portach.
101 Interface DDR
102 Ważne okno czasowe
103 Literatura: Qimonda GDDR5 – White Paper,
104 Szybkość transferu
105 GDDR5
106 GDDR5 – inwersja bitów
107 GDDR – I/O GDDR5 SGRAMs offer several features that let the controller perfectly adapt the device’s input and output characteristics to the actual system impedance and thus improve the data eye for a reliable data transmission. Auto calibration for process, voltage and temperature drift compensation Software controlled adjustable drive strengths Software controlled adjustable data, address and command termination impedances Software controlled adjustable data input reference voltage