CAD Specyfika projektowania Mariusz Rawski rawski@tele.pw.edu.pl http://rawski.zpt.tele.pw.edu.pl/
System cyfrowy pierwsze skojarzenie Urządzenia wprowadzania danych: klawiatury czytniki urządzenia przetwarzania dokumentów manipulatory Urządzenia wyprowadzania danych: monitory drukarki urządzenia foniczne urządzenia graficzne Urządzenia przetwarzania i przechowywania danych: pamięć operacyjna procesor kanały WE/WY urządzenia pamięci zewnętrznej: taśmy dyski (elastyczne, twarde, optyczne) 2
Projekt do realizacji Konwerter kodu binarnego na kod BCD W kodzie BCD (Binary Coded Decimal) każda cyfra liczby zapisanej w kodzie dziesiętnym jest przedstawiana czterobitową liczbą binarną Np. liczba 489 zostanie zapisana jako wektor binarny z wykorzystaniem 12 bitów (3 4 bity) 4 8 9 0100 1000 1001 BIN/BCD Wejście Wyjście (00011011) BIN (00100111) BCD 0 liczby 99 3
Metoda +3 Liczba konwertowana zapisana jest w postaci binarnej Przekształcenie polega na wykonaniu określonej liczby razy tych samych operacji START LOAD (LB) LDA := 0 LDB := 0 LK := 8 Wykorzystuje proste operacje na liczbach binarnych: LDB 5 NIE TAK LDB := LDB + 3 przesunięcie w lewo, zwiększenie o 3, LDA 5 TAK porównanie ze stałą. NIE LDA := LDA + 3 Przy konwersji liczb z zakresu 0 99 można algorytm uprościć LDA := SHL(LDA,LDB 7 ) LDB := SHL(LDB,LB 7 ) LB := SHL(LB) LK := DEC(LK) NIE LK = 0 TAK LD := LDA LDB KONIEC 4
Przykład działania 0 0 0 0 0 0 0 0 27 = 0 0 0 1 1 0 1 1 LDA LDB LB 0 0 0 0 0 0 0 0 LDB 5 NIE TAK LDB := LDB LDB := LDB+3 8 5
LDA LDB LB LDB < 5 LDB < 5 LDB < 5 LDB < 5 LDB < 5 LDB < 5 LDB 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 6 0 1 1 0 0 0 0 0 1 1 0 + 0 0 1 1 1 2 3 4 5 7 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 LDB < 5 0 0 0 1 0 0 1 1 8 1 0 0 1 0 0 1 1 1 LD BCD = 0 0 1 0 0 1 1 1 = 27 2 7 6
Algorytm zapisany w języku C++ Kompilator Dev-C++ Kompilacja w systemie Windows XP Specyfikacja komputera: Procesor AMD Athlon 64X2 Dual Core 4200+ 2.2 GHz Pamięć RAM 1,96 GB DDR2 Realizacja programowa Konieczność symulowania operacji na rejestrach: przesunięcie w lewo, zwiększenie o 3, porównanie ze stałą. 7
Efektywność realizacji Szybkość działania szacowana liczbą konwersji na sekundę Przepustowość = 9,17 * 10 6 = 9,17 mln liczb binarnych na sekundę 8
Urządzenia przetwarzania i przechowywania danych: pamięć operacyjna procesor kanały WE/WY urządzenia pamięci zewnętrznej: taśmy dyski (elastyczne, twarde, optyczne) Architektura komputerów 9
Nowoczesny Procesor 10
Schemat jądra procesora 11
Schemat jednostki ALU 12
Kod w asemblerze 13
Inne myślenie Komputer może być przedstawiany jako zestaw warstw poczynając od warstwy programów a kończąc na poziomie tranzystorów Najwyższa warstwa prezentuje najbardziej abstrakcyjny model systemu Im niższa warstwa tym bardziej szczegółowy model systemu Poziom użytkownika: Programy Języki wysokiego poziomu Kod maszynowy (Asembler) Sprzętowe/programowalne sterowanie Moduły funkcjonalne (ALU, pamięć,..) Bramki logiczne Tranzystory 14
System cyfrowy Sygnały sterujące 0 0 0 1 11 0 0 0 1 0 0 Dane wejściowe Układ sterujący (kontroler) Układ operacyjny (Datapath) Mikrooperacje wywoływane przez sygnały sterujące Stan części operacyjnej Dane wyjściowe 15
Realizacja systemu cyfrowego X Z D Z US UO X P Z Y F Układ operacyjny (UO) budowany jest z bloków funkcjonalnych Układ sterujący (US) tworzony jest jako automat (lub układ mikroprogramowany) 16
Metoda +3 Rejestry LB, LDA, LDB z operacjami: START zeruj wpisz, przesuń. LOAD (LB) LDA := 0 LDB := 0 LK := 8 Licznik LK z operacjami: ustaw, zmniejsz o 1. LDB 5 NIE TAK LDB := LDB + 3 Sumator LDA 5 TAK NIE LDA := LDA + 3 Komparator LDA := SHL(LDA,LDB 7 ) LDB := SHL(LDB,LB 7 ) LB := SHL(LB) LK := DEC(LK) NIE LK = 0 TAK LD := LDA LDB KONIEC 17
Opis strukturalny układu operacyjnego 4 4 8 LB 8 4 R3 R2 R1 A S3 S2 S1 B LK LK = 0 LOAD1 DEC 1 0 3 4 Σ MUX K 5 MUX A B 4 4 S US LK = 0 K 5 10 LB UO Y K 5 R4 LOAD2 8 Y = LD 18
Sieć działań układu sterującego 0 1 S LOAD 1 CLEAR 2,3 LOAD (LK) A 0 A 1 x 2 A 0 /Z 0 x 2 MUX := 0 A 2 A 1 /Z 1 K > 5 1 A 6 0 A 3 MUX := 1 K > 5 1 LOAD 2 A 7 A 2 /Z 2 x 1 x 1 A 6 /Z 4 0 A 4 LOAD 3 A 3 /Z 3 x 1 A 7 /Z 5 SHL 1, SHL 2, SHL 3, DEC (LK) x 1 0 LK = 0 1 A 5 LOAD 4 x 0 A 4 /Z 6 x 0 A 5 /Z 7 19
Bin2BCD opis strukturalny -- Kowersja liczby binarnej na liczbe bcd (lb<99) ------------------------------------------------ library ieee; use ieee.std_logic_1164.all; entity bin2bcd is port( start, zegar: in std_logic; lb : in std_logic_vector(7 downto 0); ld : out std_logic_vector(7 downto 0); koniec : out std_logic); end bin2bcd; signal a : std_logic_vector(1 downto 0); signal b : std_logic_vector(9 downto 0); begin k1 : uo port map (lb => lb, st => b, zegar => zegar, ld => ld, lk_s => a(1), k_s => a(0)); k2 : us port map (start => start, lk => a(1), k => a(0), zegar => zegar, s => b, koniec => koniec); end structure; architecture structure of bin2bcd is component uo port( lb : in std_logic_vector(7 downto 0); st : in std_logic_vector(9 downto 0); zegar : in std_logic; ld : out std_logic_vector(7 downto 0); lk_s, k_s: out std_logic); end component; component us port( start, lk : in std_logic; k,zegar : in std_logic; s : out std_logic_vector(9 downto 0); koniec : out std_logic); end component; S US LK = 0 K 5 10 LB UO Y 20
Wyniki realizacji FLEX10K10 EPF10K10LC84-3 LC s 69 (12 %) f MAX 56,82 MHz (17,6 ns ) Niewielki procent wykorzystania zasobów układu Liczba jest konwertowana w (około) 29 cyklach zegarowych Przepustowość = 56,82 * 10 6 / 29 = 1,959 mln liczb binarnych na sekundę 21
Bin2BCD opis funkcjonalny -- Konwersja liczby binarnej na liczbe bcd (lb<99) ------------------------------------------------ library ieee; use ieee.std_logic_1164.all; -- USE ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity bin2bcd is port( start, clk : in std_logic; lb : in std_logic_vector(7 downto 0); koniec : out std_logic; ld : out std_logic_vector(7 downto 0)); end bin2bcd; architecture behavior of bin2bcd is begin process (clk) variable lk : integer range 0 to 8; variable lda, ldb : std_ligic_vector(3 downto 0); variable lb_r : std_ligic_vector(7 downto 0); begin if (rising_edge(clk)) then if start = '1' then lda := "0000"; ldb := "0000"; ld <= "00000000"; lb_r := lb; lk := 8; koniec <= '0'; else if lk > 0 then if ldb >= 5 then lda := (lda(2 downto 0) & '1'); ldb := ((ldb(2 downto 0) + "011") & lb_r(7)); else lda := (lda(2 downto 0) & '0'); ldb := (ldb(2 downto 0) & lb_r(7)); end if; lb_r := (lb_r(6 downto 0) & '0'); lk := lk - 1; else ld <= (lda & ldb); koniec <= '1'; end if; end if; end if; end process; end behavior; 22
Wyniki realizacji FLEX10K10 EPF10K10LC84-3 LC s 43 (7 %) f MAX 69,93 MHz (14,3 ns ) Jeszcze mniejsze wykorzystanie zasobów układu Liczba jest konwertowana w (około) 10 cyklach zegarowych Przepustowość = 69,93 * 10 6 / 10 = 6,993 mln liczb binarnych na sekundę 23
Inna rodzina układów FPGA EP1S10F484C5 Strukturalny Funkcjonalny LC s 54 ( < 1 % ) 34 ( < 1 % ) f MAX 392,77 MHz (2,546 ns ) 371,20 MHz (2,694 ns ) Dla realizacji opisanej funkcjonalnie: Przepustowość = 392,77 * 10 6 / 10 = 39,277 mln liczb binarnych na sekundę Znacznie więcej niż nowoczesny komputer! 24
Inny algorytm dla realizacji programowej Algorytm zapisany w języku C++ Kompilator Dev-C++ Kompilacja w systemie Windows XP Specyfikacja komputera: Procesor AMD Athlon 64X2 Dual Core 4200+ 2.2 GHz Pamięć RAM 1,96 GB DDR2 Wykorzystanie operacji dzielenia i modulo Ponad 91 mln liczb na sekundę! 25
# Konwerter bin2bcd.type fr.i 7.o 8.p 100 0000000 00000000 0000001 00000001 0000010 00000010 0000011 00000011.................. 1011111 10010101 1100000 10010110 1100001 10010111 1100010 10011000 1100011 10011001.e EP1S10F484C5 Inny algorytm dla realizacji sprzętowej pla2vhdl LC s 24 (< 1 %) f MAX 357,78 MHz (2,795 ns ) EP2S15F484C3 LC s 7 (< 1 %) f MAX 500,00 MHz (2,000 ns ).................................... block1_1: process (block1_1_in) begin case block1_1_in is when "0000000" => block1_1_out <= '0'; when "0000001" => block1_1_out <= '0'; when "0000010" => block1_1_out <= '0'; when "0000011" => block1_1_out <= '0'; when "0000100" => block1_1_out <= '0'; when "0000101" => block1_1_out <= '0'; when "0000110" => block1_1_out <= '0'; when "0000111" => block1_1_out <= '0'; when "0001000" => block1_1_out <= '0'; when "0001001" => block1_1_out <= '0'; when "0001010" => block1_1_out <= '0'; when "0001011" => block1_1_out <= '0'; when "0001100" => block1_1_out <= '0'; when "0001101" => block1_1_out <= '0';.................................... Ponad 357 mln liczb na sekundę! Nowszy układ Stratix II jeszcze szybszy! 26