Bài giảng Thiết kế vi mạch lập trình được

pdf 140 trang ngocly 1320
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Thiết kế vi mạch lập trình được", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_thiet_ke_vi_mach_lap_trinh_duoc.pdf

Nội dung text: Bài giảng Thiết kế vi mạch lập trình được

  1. TRƯỜNG ĐH CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ ĐIỆN TỬ VÀ TRUYỀN THÔNG BÀI GIẢNG MÔN THIẾT KẾ VI MẠCH LẬP TRÌNH ĐƯỢC BIÊN SOẠN : NGUYỄN THẾ DŨNG Thái Nguyên, tháng 8 năm 2012
  2. MỤC LỤC Chương 1: KIẾN THỨC CƠ SỞ 4 1.1. Các khái niệm chung 4 1.1.1. Transistor 4 1.1.2. Vi mạch số tích hợp 4 1.1.3. Cổng logic 5 1.1.4. Phần tử nhớ 8 1.1.5. Mạch logic tổ hợp 10 1.1.6. Mạch logic tuần tự 11 1.2. Các phương pháp thể hiện thiết kế 12 1.2.1. Mô tả bằng sơ đồ 12 1.2.2. Mô tả bằng HDL 14 1.2. Yêu cầu với một thiết kế mạch logic số 16 1.3. Các công nghệ thiết kế mạch logic số 17 1.4. Kiến trúc của các IC khả trình 20 1.4.2. Kiến trúc PAL 23 1.4.3. Kiến trúc PLA 23 1.4.4. Kiến trúc của GAL 24 1.4.5. Kiến trúc của FPGA 26 Chương 2: GIẢI PHÁP PHẦN CỨNG FPGA CỦA XILINX CHO THIẾT KẾ VI MẠCH SỐ 29 2.1. Một số giải pháp cho thiết kế mạch logic số 29 2.1.1. Khái niệm FPGA 29 2.1.2. Ứng dụng của FPGA trong xử lý tín hiệu số 32 2.1.3. Công nghệ tái cấu trúc FPGA 33 2.2. Kiến trúc của FPGA 34 2.2.1. Kiến trúc chung FPGA 34 2.2.2. So sánh giữa cấu trúc nhỏ và cấu trúc lớn: 37 2.2.3. So sánh giữa SDRAM Programming và Anti-fuse programming:38 2.3.1. Khối logic khả trình 40 2.3.3. Hệ thống kết nối khả trình 60 2.3.4. Các phần tử khác của FPGA 62 2.4. Các khối giao tiếp có trên mạch Xilinx Spartan 3E Starter Kitboard FPGA. 72 2.4.1. Các thành phần chính của Xilinx Spartan 3E Starter Kitboard 72 2.4.2. Mạch nạp JTAG/PLATFORM FLASH XCF04 73 1
  3. 2.4.3. Khối nguồn Power Supply 73 2.4.4. Khối giao tiếp Keypad 73 2.4.5. Khối 8x2 Led-Diod 73 2.4.6. Khối Switch 74 2.4.7. Khối giao tiếp 4x7-seg Digits 74 2.4.8. Khối giao tiếp RS232 74 2.4.9. Khối giao tiếp USB – RS232 74 2.4.10. Khối giao tiếp PS/2 75 2.4.11. Khối giao tiếp VGA 75 2.4.12. Khối giao tiếp LCD1602A 75 2.4.13. Khối giao tiếp ADC/DAC 75 2.4.14. Khối giao tiếp Ethernet 76 Chương 3: GIẢI PHÁP PHẦN MỀM CHO THIẾT KẾ VI MẠCH SỐ 77 3.1. Giới thiệu các phần mềm hỗ trợ thiết kế 77 3.1.1. Hãng Xilinx 77 3.1.2. ISE 77 3.1.3. EDK 78 3.1.4. System Generator 9.2 78 3.2. Quy trình thiết kế FPGA tổng quát 78 3.2.1. Mô tả thiết kế 80 3.2.2. Tổng hợp thiết kế 81 3.2.3. Hiện thực hóa thiết kế 87 3.2.4. Cấu hình FPGA 93 3.3. Phần mềm thiết kế ISE của Xilinx 93 3.3.1. Giới thiệu môi trường lập trình 93 Chương 4: MỘT SỐ BÀI TOÁN THIẾT KẾ MẠCH SỐ TRÊN FPGA SPARTAN-3E STARTER KIT BOARD 96 4.1. Điều khiển LED với Switch và Push button 96 4.1.1. Sơ đồ khối chức năng 96 4.1.2. Nguyên lý hoạt động 98 4.1.3. Phân tích xây dựng bài toán 98 4.1.4. Hiện thực hóa thiết kế 105 4.2. Picoblaze_pwm_control 115 4.2.1. Sơ đồ nguyên lý 115 4.2.2. Nguyên lý hoạt động 115 2
  4. 4.2.3. Phân tích thiết kế 115 4.2.4. Hiện thực hóa thiết kế 116 4.3. Chuyển đổi ADC 122 4.3.1. Sơ đồ nguyên lý 122 4.3.2. Nguyên lý hoạt động 123 4.3.3.Phân tích thiết kế bài toán 123 4.4. Điều khiển LCD 129 4.4.1. Sơ đồ khối chức năng 129 4.4.2. Vi điều khiển PicoBlaze 129 4.4.3. Nguyên lý hoạt động 132 4.4.4. Phân tích xây dựng bài toán 132 4.4.5. Hiện thực hóa thiết kế 133 TÀI LIỆU THAM KHẢO 139 3
  5. Chương 1 KIẾN THỨC CƠ SỞ 1.1. Các khái niệm chung 1.1.1. Transistor Transistor là một linh kiện bán dẫn thường được sử dụng như một thiết bị khuếch đại hoặc một khóa điện tử. Transistor là phần tử cơ bản của mọi vi mạch số tích hợp, từ các cổng logic đơn giản AND, OR, NOT đến các loại phức tạp như các mạch điều khiển ngoại vi, vi điều khiển, vi xử lý Transistor là khối đơn vị cơ bản xây dựng nên cấu trúc mạch ở máy tính điện tử và tất cả các thiết bị điện tử hiện đại khác. Do đáp ứng nhanh và chính xác nên các transistor được sử dụng trong nhiều ứng dụng tương tự và số, như khuếch đại, đóng cắt, điều chỉnh điện áp, điều khiển tín hiệu, và tạo dao động. Transistor cũng thường được kết hợp thành mạch tích hợp (IC). Hình 1.1. Transistor Transistor được làm từ vật liệu bán dẫn (semiconductor), là vật liệu vừa có khả năng dẫn điện vừa có khả năng làm việc như những vật liệu cách điện, khả năng này thay đổi tùy theo kích thích từ bên ngoài như nhiệt độ, ánh sáng, trường điện từ, dòng điện. Chất bán dẫn dùng để cấu tạo transistor thường là Germany (Ge) hoặc Silicon (Si) được pha tạp một lượng nhỏ Photpho (P) hoặc Boron (B) với mục đích tăng mật độ electron (kiểu N) tự do hoặc tăng mật độ lỗ trống (kiểu P) tương ứng trong tinh thể bán dẫn. 1.1.2. Vi mạch số tích hợp Còn được gọi là IC - Intergrated Circuits, chip, là cấu trúc mạch điện được thu nhỏ bằng cách tích hợp chủ yếu từ các transitor với mật độ cao, ngoài ra còn có thể có các linh kiện điện thụ động khác trên một khối bán dẫn mỏng. Các vi mạch tích hợp đều có một số lượng tín hiệu đầu vào và đầu ra để thực hiện một chức năng cụ thể nào đó. 4
  6. a) b) Hình 1.2. a) Mô hình Vi mạch số tích hợp b) Vi mạch tích hợp thực tế Vi mạch tích hợp ra đời từ những năm 1960 và được ứng dụng rộng rãi trong thực tế, đã và đang tạo ra cuộc cách mạng trong lĩnh vực điện tử. Ví dụ về vi mạch tích hợp như các IC đa dụng (general purposes IC) họ 7400, 4000, các dòng vi xử lý 80x86 dùng trong máy vi tính, chíp xử lý dùng cho điện thoại di động, máy ảnh kỹ thuật số, các vi điều khiển dùng trong các thiết bị dân dụng, ti vi, máy giặt, lò vi sóng Các vi mạch này có mật độ tích hợp từ hàng vài chục đến hàng trăm triệu, và hiện nay đã đến hàng tỷ transistor trong một miếng bán dẫn có kích thước xấp xỉ kích thước đồng xu. Mật độ tích hợp được định nghĩa là tổng số những phần tử tích cực (transistor hoặc cổng logic) chứa trên một đơn vị diện tích của khối tinh thể bán dẫn. Theo mật độ tích hợp chia ra các loại vi mạch sau: - Vi mạch cỡ nhỏ SSI (Small scale integration), có hàng chục transistor trong một vi mạch. - Vi mạch cỡ vừa MSI (Medium scale integration), có hàng trăm transistor trong một vi mạch. - Vi mạch cỡ lớn LSI (Large scale integration), có hàng ngàn đến hàng chục ngàn transistor trong một vi mạch. - Vi mạch cực lớn VLSI (Very large scale integration), có hàng vạn, hàng triệu, hàng chục triệu transistor và lớn hơn trong một vi mạch, tới thời điểm hiện nay đã xuất hiện nhưng vi mạch có độ tích hợp đến hàng tỷ transitor. - Vi mạch siêu lớn ULSI (Ultra large scale intergration), vi mạch có độ tích hợp với mức độ hàng triệu transistor trở lên. 1.1.3. Cổng logic Cổng logic hay logic gate là cấu trúc mạch điện (sơ đồ khối hình ) được lắp ráp từ các linh kiện điện tử để thực hiện chức năng của các hàm logic cơ bản 5
  7. y = f(xn, xn-1, , x1, x0). Trong đó các tín hiệu vào xn-1, xn-2, , x1, x0 của mạch tương ứng với các biến logic xn-1, xn-2, , x1, x0 của hàm . Tín hiệu ra y của mạch tương ứng với hàm logic y. Với các cổng cơ bản thường giá trị n < 4. Hình 1.3. Mô hình cổng logic cơ bản Giá trị của các tín hiệu vào và ra chỉ có hai mức là mức thấp (Low - L) và mức cao (High - H) tương ứng với với hai giá trị 0 và 1 của các biến logic và hàm logic. 1.1.3.1. Một số cổng logic cơ bản: * Cổng logic AND Cổng AND là cổng logic thực hiện chức năng của phép toán nhân logic với 2 ngõ vào và 1 ngõ ra với ký hiệu như hình vẽ: Hình 1.4. Cổng logic AND Phương trình logic mô tả cổng logic AND: Hình 1.5. Bảng chân lý cổng logic AND Ngõ ra chỉ bằng mức 1 khi cả 2 ngõ vào bằng 1, ngõ ra bằng 0 khi một trong hai ngõ vào bằng 0. Cổng AND có thể có nhiều hơn 2 đầu vào. Trên một chip có thể có nhiều cổng AND. 6
  8. * Cổng logic OR Cổng OR là cổng logic thực hiện chức năng của phép toán cộng logic với 2 ngõ vào và 1 ngõ ra với ký hiệu như hình vẽ: Hình 1.6. Cổng logic OR Phương trình logic mô tả cổng logic OR: Hình 1.7. Bảng chân lý cổng logic OR Ngõ ra chỉ bằng mức 0 khi cả 2 ngõ vào bằng 0, ngõ ra bằng 1 khi một trong hai ngõ vào bằng 1. * Cổng logic NOT Còn gọi là cổng đảo (Inverter), có hình vẽ như sau: Hình 1.8. Cổng logic NOT Bảng chân lý của cổng logic NOT: Hình 1.9. Bảng chân lý của cổng logic NOT * Một số cổng logic thường gặp khác như NAND, NOR, EX-OR, EX-NOR 1.1.3.2. Tham số thời gian của cổng logic: Các mạch logic đều được biểu diễn bằng các hệ hàm logic và do đó có thể phát biểu là: Mọi mạch logic đều có thể xây dựng từ các cổng logic cơ bản. Đối với các cổng logic cơ bản đó thì có hai tham số thời gian cơ bản: 7
  9. Hình 1.10. Tham số thời gian của cổng NOT Thời gian trễ lan truyền Tpd (Propagation delay) là thời gian tối thiểu kể từ thời điểm bắt đầu xảy ra sự thay đổi từ đầu vào X cho tới khi sự thay đổi này tạo ra thay đổi xác định tại đầu ra Y, hay nói một cách khác cho tới khi đầu ra Y ổn định giá trị. Tcd (Contamination delay) là khoảng thời gian kể từ thời điểm xuất hiện sự thay đổi của đầu vào X cho tới khi đầu ra Y bắt đầu xảy ra sự mất ổn định. Sau giai đoạn mất ổn định hay còn gọi là giai đoạn chuyển tiếp tín hiệu tại đầu ra sẽ thiết lập trạng thái xác định vững bền. Như vậy Tpd > Tcd và khi nhắc đến độ trễ của cổng thì là chỉ tới giá trị Tpd. 1.1.4. Phần tử nhớ 1.1.4.1. D-Latch và D-Flip Flop Latch và Flip Flop là các phần tử nhớ quan trọng trong thiết kế VLSI, sơ đồ cấu tạo chi tiết và mô tả đã được trình bày kỹ trong môn học Kỹ thuật số. Ở phần này chỉ nhắc lại những tính chất cơ bản nhất của các Flip Flop và bổ xung thêm các tham số thời gian thực của các phần tử này. Bảng 1.1. D-Flip Flop và D-Latch D-Latch là phần tử nhớ làm việc theo mức xung, cụ thể khi tín hiệu Clock bằng 1 thì giá trị Q đầu ra bằng giá trị đầu vào, khi tín hiệu Clock = 0 thì giá trị đầu ra không đổi. Nói một cách khác D-latch làm việc như một cửa đóng mở giữa tín hiệu Q và D tương ứng với mức điện áp của xung Clock. 8
  10. D- Flip Flop là phần tử nhớ làm việc theo sườn xung, có hai dạng sườn là sườn lên (rising edge) khi xung thay đổi từ 0->1 và sườn xuống (falling edge) khi xung thay đổi từ 1->0. Khi không có yêu cầu gì đặc biệt thì Flip Flop làm việc với sườn xung lên thường được sử dụng. Khác với D-Latch giá trị đầu ra của Flip Flop chỉ thay vào thời điểm sườn xung. Với cách làm việc như vậy giá trị đầu ra sẽ không thay đổi trong suốt thời gian một chu kỳ xung nhịp dù cho tín hiệu đầu vào thay đổi. D- Flip-Flop rất hay được dùng trong mạch có nhớ vì vậy đôi khi nói đến phần tử nhớ thường ngầm hiểu là D- Flip Flop. Hình 1.11. Đồ thị thời gian của D-Flip Flop và D Latch Đối với D-Flip Flop và D-Latch nhớ thì có hai tham số thời gian hết sức quan trọng là Tsetup, và Thold. Đây là tham số thời gian đối với dữ liệu đầu vào cổng Din để đảm bảo việc truyền dữ liệu sang cổng ra Qout là chính xác, cụ thể đối với Flip Flop. Tsetup: Là khoảng thời gian cần thiết cần giữ ổn định đầu vào trước sườn tích cực của xung nhịp Clock Thold: Là khoảng thời gian tối thiểu cần giữ ổn định dữ liệu đầu vào sau sườn tích cực của xung nhịp Clock. Hình 1.12. Tham số thời gian của D-Flip Flop 9
  11. 1.1.5. Mạch logic tổ hợp Mạch logic tổ hợp (Combinational logic circuit) là mạch mà giá trị tổ hợp tín hiệu ra tại một thời điểm chỉ phụ thuộc vào giá trị tổ hợp tín hiệu vào tại thời điểm đó. Hiểu một cách khác mạch tổ hợp không có trạng thái, không chứa các phần tử nhớ mà chỉ chứa các phần tử thực hiện logic chức năng như AND, OR, NOT Đối với mạch tổ hợp tham số thời gian trễ Tdeíay là khoảng thời gian lớn nhất kể từ thời điểm xác định tất cả các giá trị đầu vào cho tới thời điểm tất cả các kết quả ở đầu ra trở nên ổn định. Trên thực tế với vi mạch tích hợp việc thời gian trễ rất nhỏ nên việc tìm tham số độ trễ của mạch được thực hiện bằng cách liệt kê tất cả các đường biến đổi tín hiệu có thể từ tất cả các đầu vào tới tất cả đầu ra sau đó dựa trên thông số về thời gian của các cổng và độ trễ đường truyền có thể tính được độ trễ của các đường truyền này và tìm ra đường truyền có độ trễ lớn nhất, giá trị đó chính là Tdelay. Hình 1.13. Độ trễ của mạch tổ hợp Minh họa cho độ trễ trong mạch tổ hợp như hình 1.1.3. Về lý thuyết để xác định độ trễ của mạch cần liệt kê tất cả các đường tín hiệu từ 4 đầu vào In1, In2, In3, In4 đến 2 đầu ra Outl, Out2. Đối với mỗi cặp đầu ra đầu vào tồn tại nhiều đường truyền khác nhau vì vậy tổng số lượng các đường truyền này thường rất lớn. Chính vì thế đối với những mạch tổ hợp lớn thì việc xác định độ trễ đều phải thực hiện bằng sự hỗ trợ của máy tính. Ví dụ để xác định độ trễ của hai đường truyền 1 và 2 trên hình vẽ: Đường lần lượt đi qua các cổng NOT, AND_4, NOR, AND_3, OR. Đường 2 lần lượt đi 10
  12. qua cổng NOT, AND, OR_4, AND_4, OR_4. Độ trễ của các đường truyền này tính bằng độ trễ của các cổng nó đi qua cộng với độ trễ dây dẫn (TWrite). T1 = TNOT + TAND_4 + TNOR + TAND_3 + TAND_3 + TWire1 T2 = TNOT + TAND + TOR_4 + TAND_4 + TOR_4 + TWire2 Do độ trễ của cổng nhiều đầu vào lớn hơn độ trễ của cổng ít đầu vào nên mặc dù số cổng đi qua trên đường truyền như nhau nhưng đường truyền 2 sẽ có độ trễ lớn hơn đường 1. Các đường truyền có độ trễ lớn nhất được gọi là Critical paths. Các đường truyền này cần đặc biệt quan tâm trong quá trình tối ưu hóa độ trễ của mạch. 1.1.6. Mạch logic tuần tự Mạch logic dãy (Sequential logic circuits) còn được gọi là mạch logic tuần tự là mạch số mà tín hiệu ra tại một thời điểm không những phụ thuộc vào tổ hợp tín hiệu đầu vào tại thời điểm đó mà còn phụ thuộc vào tín hiệu vào tại các thời điểm trước đó. Hiểu một cách khác mạch dãy ngoài các phần tử tổ hợp có chứa các phần tử nhớ và nó lưu trữ lớn hơn một trạng thái của mạch. Tham số thời gian của mạch tuần tự được tính khác với mạch tổ hợp, sự khác biệt đó có quan hệ mật thiết với đặc điểm của tín hiệu đồng bộ Clock. Ví dụ với một mạch tuần tự điển hình dưới đây. Mạch tạo từ hai lớp thanh ghi sử dụng Flip Flop A và B, trước giữa và sau thanh ghi là ba khối logic tổ hợp Combinational logic 1, 2, 3, các tham số thời gian cụ thể như sau: Td1, Td2, Td3. Là thời gian trễ tương ứng của 3 khối mạch tổ hợp 1, 2, 3. Tsa, Tsb là thời gian thiết lập (Tsetup) của hai Flipflop A, B tương ứng Tclk-q. là khoảng thời gian cần thiết để dữ liệu tại đầu ra Q xác định sau thời điểm kích hoạt của sườn Clock Hình 1.14. Tham số thời gian của mạch tuần tự 11
  13. Đối với mạch đồng bộ thì sẽ là lý tưởng nếu như điểm kích hoạt (sườn lên hoặc sườn xuống) của xung nhịp Clock tới các Flip Flop cùng một thời điểm. Tuy vậy trên thực tế bao giờ cũng tồn tại độ trễ giữa hai xung Clock đến hai Flip Flop khác nhau. Tskew là độ trễ lớn nhất của xung nhịp Clock đến hai Flip Flop khác nhau trong mạch. Thời gian chênh lệch lớn nhất giữa tín hiệu xung nhịp, thời gian trễ này sinh ra do độ trễ trên đường truyền của xung Clock từ A đến B. Trên thực tế Tskew giữa hai Flip Flop liên tiếp có giá trị rất bé so với các giá trị độ trễ khác và có thể bỏ qua, nhưng đối với những mạch cỡ lớn khi số lượng Flip Flop nhiều hơn và phân bố xa nhau thì giá trị Tskew có giá trị tương đối lớn. Những tham số trên cho phép tính toán các đặc trưng thời gian của mạch tuần tự đó là: - Thời gian trễ trước xung nhịp Clock tại đầu vào: Tinput_delay = Td1 + Tsa - Thời gian trễ sau xung nhịp Clock tại đầu ra: Toutput_delay = Td3 + Tclk-q - Chu kỳ tối thiểu của xung nhịp Clock, hay là khoảng thời gian tối thiểu đảm bảo cho dữ liệu trong mạch được xử lý và truyền tải giữa hai lớp thanh ghi liên tiếp mà không xảy ra sai sót. Nếu xung nhịp đầu vào có chu kỳ nhỏ hơn Tclk_min thì mạch sẽ không thể hoạt động theo thiết kế. Tclk_min = Tclk-q + Td2 + Tsb + Tskew - Từ đó tính được xung nhịp tối đa của vi mạch là: Fmax = 1/ Tclk_min = 1/( Tclk-q + Td2 + Tsb + Tskew) 1.2. Các phương pháp thể hiện thiết kế Có hai phương pháp cơ bản được sử dụng để mô tả vi mạch số là mô tả bằng sơ đồ logic (schematic) và mô tả bằng ngôn ngữ mô tả phần cứng HDL (Hardware Description Language). 1.2.1. Mô tả bằng sơ đồ Vi mạch được mô tả trực quan bằng cách ghép nối các phần tử logic khác nhau một cách trực tiếp giống như ví dụ ở hình vẽ dưới đây. Thông thường các phần tử không đơn thuần là các đối tượng đồ họa mà còn có các đặc tính vật lý gồm chức năng logic, thông số tải vào ra, thời gian trễ Những thông tin này được lưu trữ trong thư viện logic thiết kế. Mạch vẽ ra có thể được mô phỏng để kiểm tra chức năng và phát hiện và sửa lỗi một cách trực tiếp. 12
  14. Hình 1.15. Mô tả mạch số bằng sơ đồ Ngày nay, các mạch tích hợp ngày càng thực hiện được nhiều chức năng do đó mà vấn đề thiết kế mạch càng trở nên phức tạp. Những phương pháp truyền thống như dùng phương pháp tối thiểu hoá hàm Boolean hay dùng sơ đồ các phần tử không còn đáp ứng được các yêu cầu đặt ra khi thiết kế. Nhược điểm lớn nhất của các phương pháp này là chúng chỉ mô tả được hệ thống dưới dạng mạng nối các phần tử với nhau. Người thiết kế cần phải đi qua hai bước thực hiện hoàn toàn thủ công: đó là chuyển từ các yêu cầu về chức năng của hệ thống sang biểu diễn theo dạng hàm Boolean, sau các bước tối thiểu hoá hàm này ta lại phải chuyển từ hàm Boolean sang sơ đồ mạch của hệ thống. Cũng tương tự khi phân tích một hệ thống người phân tích cần phải phân tích sơ đồ mạch của hệ thống, rồi chuyển nó thành các hàm Boolean, sau đó mới lập lại các chức năng, hoạt động của hệ thống. Tất cả các bước nói trên hoàn toàn phải thực hiện thủ công không có bất kỳ sự trợ giúp nào của máy tính. Người thiết kế chỉ có thể sử dụng máy tính làm công cụ hỗ trợ trong việc vẽ sơ đồ mạch của hệ thống và chuyển từ sơ đồ mạch sang công cụ tổng hợp mạch vật lý dùng công cụ Synthesis. Một nhược điểm khác nữa của phương pháp thiết kế truyền thống là sự giới hạn về độ phức tạp của hệ thống được thiết kế .Phương pháp dùng 13
  15. hàm Boolean chỉ có thể dùng để thiết kế hệ thống lớn nhất biểu diễn bởi vài trăm hàm. Còn phương pháp dựa trên sơ đồ chỉ có thể dùng để thiết kế hệ thống lớn nhất chứa khoảng vài nghìn phần tử. 1.2.2. Mô tả bằng HDL Sự ra đời của ngôn ngữ mô phỏng phần cứng (HDL) đã giải quyết được rất nhiều nhược điểm lớn của các phương pháp thiết kế trước đây: Nếu các phương pháp cũ đòi hỏi phải chuyển đổi từ mô tả hệ thống (các chỉ tiêu về chức năng) sang tập hợp các hàm logic bằng tay thì bước chuyển đó hoàn toàn không cần thiết khi dùng HDL. Hầu hết các công cụ thiết kế dùng ngôn ngữ mô phỏng phần cứng đều cho phép sử dụng biểu đồ trạng thái cho các hệ thống tuần tự cũng như cho phép sử dụng bảng chân lý cho hệ thống tổng hợp. Việc chuyển đổi từ các biểu đồ trạng thái và bảng chân lý sang mã ngôn ngữ mô phỏng phần cứng được thực hiện hoàn toàn tự động. Nhờ tính dễ kiểm tra thử nghiệm hệ thống trong suốt quá trình thiết kế mà người thiết kế có thể dễ dàng phát hiện các lỗi thiết kế ngay từ những giai đoạn đầu, giai đoạn chưa đưa vào sản xuất thử, do đó tiết kiệm được lượng chi phí đáng kể bởi từ ý thiết kế đến tạo ra sản phẩm đúng như mong muốn là một việc rất khó tránh khỏi những khó khăn, thất bại. Khi mọi lĩnh vực của khoa học đều phát triển không ngừng thì sự phức tạp của hệ thống điện tử cũng ngày một tăng theo và gần như không thể tiến hành thiết kế thủ công mà không có sự trợ giúp cuả các loại máy tính hiện đại. Ngày nay, ngôn ngữ mô tả phần cứng HDL được dùng nhiều để thiết kế cho các thiết bị logic lập trình được PLD từ loại đơn giản đến các loại phức tạp như ma trận cổng lập trình được FPGA. Có ba ngôn ngữ mô tả phần cứng phổ biến hiện nay là: 1.2.1.1. Verilog HDL Ra đời năm 1983, do hai kỹ sư Phil Moorby và Prabhu Goel làm việc tại Automated Integrated Design Systems (sau này thuộc sở hữu của Cadence). Verilog được IEEE chính thức tiêu chuẩn hóa vào năm 1995 và sau đó là các phiên bản năm 2001, 2005. Đây là một ngôn ngữ mô tả phần cứng có cấu trúc và cú pháp gần giống với ngôn ngữ lập trình C, ngoài khả năng hỗ trợ thiết kế logic thì Verilog rất mạnh trong việc hỗ trợ cho quá trình kiểm tra thiết kế. Một số đặc điểm của Verilog: - Verilog là một trong những phương thức thiết bị có thể xử lý nhiều mức thiết kế khác nhau. Nó có thể chuẩn hóa dữ liệu chuyển đến giữa các giai đoạn thiết bị và làm đơn giản hóa lập tài liệu. 14
  16. - Nền tảng mạnh: Chuẩn hóa 1995 bởi IEEE, hỗ trợ công nghiệp, phổ biến cho các nhà ASIC vì dễ học cho phép mô phỏng nhanh và tổng hợp hiệu quả. - Tính đa năng: Cho phép quá trình thiết kế thực thể thực hiện trong môi trường thiết kế cả phân tích và kiểm tra. Tuy nhiên Verilog không thích hợp lắm cho các thiết kế mức hệ thống phức tạp, đây là trở ngại chính của Verilog. - Hỗ trợ công nghiệp: Phổ biến cho các nhà thiết kế ASIC vì dễ học , cho phép mô phỏng nhanh và tổng hợp hiệu quả. - Có khả năng mở rộng IEEE Std 1364 chứa định nghĩa của PLI Verilog (Programming Language Interface) cho phép mở rộng khả năng của Verilog. Nó là một tập hợp các bộ định tuyến cho phép các chức năng bên ngoài truy nhập thông tin chức năng thiết kế Verilog. - Một module Verilog có thể thể hiện được cả giao diện và thân chương trình của một hệ thống. 1.2.1.2. VHDL VHDL viết tắt của Very-high-speed intergrated circuits Hardware Description Language, hay ngôn ngữ mô tả cho các mạch tích hợp tốc độ cao. VHDL lần đầu tiên được phát triển bởi Bộ Quốc Phòng Mỹ nhằm hỗ trợ cho việc thiết kế những vi mạch tích hợp chuyên dụng (ASICs). VHDL cũng được IEEE chuẩn hóa vào các năm 1987, 1991, 2002, và 2006 và mới nhâts 2009. VHDL được phát triển dựa trên cấu trúc của ngôn ngữ lập trình Ada. Cấu trúc của mô tả VHDL tuy phức tạp hơn Verilog nhưng mang tính logic chặt chẽ và gần với phần cứng hơn. VHDL được phát triển như một ngôn ngữ độc lập không gắn với bất kỳ một phương pháp thiết kế, một bộ mô tả hay công nghệ phần cứng nào. Người thiết kế có thể tự do lựa chọn công nghệ, phương pháp thiết kế trong khi chỉ sử dụng một ngôn ngữ duy nhất. Và khi đem so sánh với các ngôn ngữ mô phỏng phần cứng khác ta thấy VHDL có một số ưu điểm hơn hẳn các ngôn ngữ khác: - Thứ nhất là tính công cộng: VHDL được phát triển dưới sự bảo trợ của chính phủ Mỹ và hiện nay là một tiêu chuẩn của IEEE. VHDL được sự hỗ trợ của nhiều nhà sản xuất thiết bị cũng như nhiều nhà cung cấp công cụ thiết kế mô phỏng hệ thống. - Thứ hai là khả năng hỗ trợ nhiều công nghệ và phương pháp thiết kế. VHDL cho phép thiết kế bằng nhiều phương pháp ví dụ phương pháp thiết kế từ trên xuống, hay từ dưới lên dựa vào các thư viện sẵn có. VHDL cũng hỗ trợ cho 15
  17. nhiều loại công cụ xây dựng mạch như sử dụng công nghệ đồng bộ hay không đồng bộ, sử dụng ma trận lập trình được hay sử dụng mảng ngẫu nhiên. - Thứ ba là tính độc lập với công nghệ: VHDL hoàn toàn độc lập với công nghệ chế tạo phần cứng. Một mô tả hệ thống dùng VHDL thiết kế ở mức cổng có thể được chuyển thành các bản tổng hợp mạch khác nhau tuỳ thuộc công nghệ chế tạo phần cứng mới ra đời nó có thể được áp dụng ngay cho các hệ thống đã thiết kế. - Thứ tư là khả năng mô tả mở rộng: VHDL cho phép mô tả hoạt động của phần cứng từ mức hệ thống số cho đến mức cổng. VHDL có khả năng mô tả hoạt động của hệ thống trên nhiều mức nhưng chỉ sử dụng một cú pháp chặt chẽ thống nhất cho mọi mức. Như thế ta có thể mô phỏng một bản thiết kế bao gồm cả các hệ con được mô tả chi tiết. - Thứ năm là khả năng trao đổi kết quả: Vì VHDL là một tiêu chuẩn được chấp nhận, nên một mô hình VHDL có thể chạy trên mọi bộ mô tả đáp ứng được tiêu chuẩn VHDL. Các kết quả mô tả hệ thống có thể được trao đổi giữa các nhà thiết kế sử dụng công cụ thiết kế khác nhau nhưng cùng tuân theo tiêu chuẩn VHDL. Cũng như một nhóm thiết kế có thể trao đổi mô tả mức cao của các hệ thống con trong một hệ thống lớn (trong đó các hệ con đó được thiết kế độc lập). - Thứ sáu là khả năng hỗ trợ thiết kế mức lớn và khả năng sử dụng lại các thiết kế: VHDL được phát triển như một ngôn ngữ lập trình bậc cao, vì vậy nó có thể được sử dụng để thiết kế một hệ thống lớn với sự tham gia của một nhóm nhiều người. Bên trong ngôn ngữ VHDL có nhiều tính năng hỗ trợ việc quản lý, thử nghiệm và chia sẻ thiết kế. Và nó cũng cho phép dùng lại các phần đã có sẵn. Ngoài hai ngôn ngữ kể trên còn có ngôn ngữ Altera HDL được phát triển bởi công ty bán dẫn Altera với mục đích dùng thiết kế cho các sản phẩm FPGA và CPLD của Altera. AHDL có cấu trúc hết sức chặt chẽ và là ngôn ngữ rất khó sử dụng nhất so với 2 ngôn ngữ trên. Bù lại AHDL cho phép mô tả thực thể logic chi tiết và chính xác hơn. Ngôn ngữ này ít phổ biến tuy vậy nó cũng được rất nhiều chương trình phần mềm hỗ trợ mô phỏng biên dịch. 1.2. Yêu cầu với một thiết kế mạch logic số Yêu cầu đối với một thiết kế IC bao gồm: - Yêu cầu chức năng: Mạch gồm có các đầu vào đầu ra như thế nào, thực hiện nhiệm vụ gì 16
  18. - Yêu cầu về mặt công nghệ: Mạch thiết kế sử dụng nền công nghệ bán dẫn nào PLD, ASIC, FPGA. . - Yêu cầu về mặt tài nguyên: Giới hạn về số lượng cổng, số lượng transitors, về diện tích quy đổi chuẩn, về kích thước của IC thiết kế. - Yêu cầu về khả năng làm việc (performance): là yêu cầu về các tham số thời gian của mạch bao gồm độ trễ cổng vào, độ trễ cổng ra, độ trễ logic với mạch tổ hợp, các xung nhịp làm việc, số lượng xung nhịp cho một chu trình xử lý dữ liệu, số lượng dữ liệu xử lý trên một đơn vị thời gian. - Yêu cầu về mức tiêu hao năng lượng (power consumtion). - Yêu cầu về chi phí cho quá trình thiết kế và chế tạo (design cost). Các yêu cầu kể trên có quan hệ mật thiết với nhau và thông thường chúng không thể đồng thời đạt được tối ưu. Ví dụ năng lượng tiêu thụ của mạch muốn nhỏ thì số lượng cổng sử dụng hạn chế và sẽ hạn chế tốc độ làm việc, hoặc việc sử dụng các công nghệ rẻ tiền hơn hoặc dùng các cổng công xuất thấp cũng là nhân tố giảm hiệu năng làm việc của mạch. Trong thực tế các IC phục vụ các mục đích khác nhau thì có yêu cầu khác nhau và người lập kế hoạch thiết kế chế tạo IC cần phải cân đối giữa các tiêu chí để có một phương án tối ưu nhất. Ví dụ cùng là vi xử lý nhưng nếu dùng thì không có yêu cầu đặc biệt về mặt tiêu hao năng lượng do nguồn cấp là cố định, khi đó Chip phải được thiết kế để có hiệu suất làm việc tối đa. Trong khi vi xử lý cho máy tính xách tay thì cần phải thiết kế để có mức tiêu thụ năng lượng thấp nhất có thể hoặc để có thể hoạt động ở nhiều mức tiêu thụ năng lượng khác nhau nhằm kéo dài thời gian sử dụng. Chip điều khiển cho các thiết bị di động thì cần phải tối ưu hết mức mức tiêu tốn năng lượng bằng cách thu gọn thiết kế, giảm thiểu những tập lệnh không cần thiết và sử dụng các phần tử tiết kiệm năng lượng nhất. 1.3. Các công nghệ thiết kế mạch logic số Vi mạch số đơn giản có thể được thiết kế thủ công (Manual IC design), nhưng với các vi mạch số cỡ lớn thì quá trình thiết kế buộc phải sử dụng các chương trình hỗ trợ thiết kế trên máy tính (Design Automation) Manual design: Vi mạch số có thể được thiết kế bởi cách ghép nối các linh kiện bán dẫn rời rạc. Sự ra đời các IC đa dụng họ 74XX hay 40XX cho phép người sử dụng có thể tự thiết kế những mạch số cỡ nhỏ và cỡ vừa bằng cách ghép nối trên một bản mạch in. Nhờ có cấu trúc chuẩn hóa, có thể dễ dàng ghép nối, tạo những mạch chức năng khác nhau. Trên thực tế những mạch dạng 17
  19. này đã và vẫn đang được ứng dụng rộng rãi. Điểm hạn chế duy nhất của những thiết kế dạng này là chúng chỉ phù hợp cho những thiết kế SSI đơn giản do giới hạn về mật độ tích hợp và tốc độ làm việc thấp. Hình 1.16. Phân loại thiết kế vi mạch số Design Automation: Máy tính là một sản phẩm đặc trưng nhất của nền công nghiệp sản xuất chế tạo bán dẫn nhưng ngay sau khi ra đời đã trở thành công cụ đắc lực cho việc thiết kế mô phỏng IC nói riêng và các thiết bị khác nói chung. Tự động hóa thiết kế không những giúp đơn giản hóa và rút ngắn đáng kể thời gian thiết kế sản phẩm mà còn đem lại những khả năng mà quá trình thiết kế thủ công bởi con người không làm được đó là: Khả năng làm việc với những thiết kế phức tạp tới cỡ hàng nghìn đến hàng tỷ transitor. Khả năng xử lý những bài toán tối ưu với nhiều tiêu chí và nhiều điều kiện ràng buộc phức tạp. Khả năng tự động tổng hợp thiết kế từ các mức trừu tượng cao xuống các mức trừu tượng thấp hơn một cách chính xác, nhanh chóng. Đơn giản hóa việc lưu trữ và trao đổi dữ liệu thiết kế. Các phần mềm hỗ trợ thiết kế gọi chung là CAD Tools, trong lĩnh vực 18
  20. thiết kế ASIC có 3 hệ thống phần mềm phổ biến của Cadence®, Synopsys®, Magma® Design Automation Inc. Trong thiết kế trên FPGA phổ biến có Xilinx, Altera. Trong tự động hóa thiết kế IC thường phân biệt thành những quy trình như sau: Full-custom ASIC: Là quy trình thiết kế IC có mức độ chi tiết cao nhất nhằm thu được sản phẩm có hiệu quả làm việc cao nhất trong khi vẫn đạt tối ưu về mặt tài nguyên trên nền một công nghệ bán dẫn nhất định. Để đạt được mục đích đó thiết kế không những được tối ưu ở những mức cao mà còn được tối ưu ở mức độ bố trí transitor và kết nối giữa chúng, ví dụng hai khối logic cùng thực hiện hàm OR nhưng phân bố ở hai vị trí khác nhau thì được cấu trúc bằng các mạch transitor khác nhau, phụ thuộc vào các thông số khác như tải đầu vào đầu ra, vị trí, ảnh hưởng các khối liền kề. Chính vì thế Full-custom ASIC đôi khi còn được gọi là random-logic gate networks nghĩa là mạch tạo bởi những cổng không đồng nhất. Semi-custom ASIC design: Phân biệt với Full-custom ASIC design, khái niệm này chỉ quy trình thiết kế mà mức độ chi tiết không đạt đến tối đa, thông thường thiết kế đạt chi tiết đến mức cổng logic hoặc cao hơn. Do Full-custom ASIC có độ phức tạp cao nên không những chi phí cho quá trình thiết kế rất lớn mặt khác thời gian dành cho thiết kế có thể kéo dài hàng vài năm trở lên, trong thời gian đó có thể đã có những công nghệ mới ra đời, mỗi một thay đổi nhỏ kéo theo việc phải làm lại gần như toàn bộ thiết kế và phát sinh thêm chi phí rất nhiều do vậy lợi nhuận sản phẩm bán ra thấp hay thậm chí thua lỗ. Semi- custom ASIC cân bằng giữa chi phí thiết kế và lợi nhuận thu được sản phẩm bằng cách đẩy nhanh và giảm thiểu chi phí cho quá trình thiết kế, dĩ nhiên bù lại sản phẩm làm ra không đạt được mức tối ưu lý thuyết như Full-custom design. Có nhiều dạng Semi-custom design nhưng một trong những kiểu cơ bản mà thường được sử dụng là thiết kế trên cơ sở thư viện cổng chuẩn (Standard Cell Library), thư viện này là tập hợp của các cổng logic như AND, OR, XOR, thanh ghi. và vì chúng có cùng kích thước chiều cao nên được gọi là cổng chuẩn. ASIC based on Programmable Device: Thiết kế ASIC trên cơ sở IC khả trình. Chíp khả trình (Programmable device) được hiểu là IC chứa những phần tử logic có thể được lập trình can thiệp để tái cấu trúc nhằm thực hiện một chức năng nào đó. Quá trình tái cấu trúc thực hiện thông qua ngôn ngữ mô tả phần 19
  21. cứng nên thường được gọi ngắn gọn là lập trình. IC khả trình được chia thành các dạng sau: SPLD (Simple Programmable Logic Device) Nhóm những IC khả trình PROM, PAL, PLA, GAL. Đặc điểm chung của nhóm này là chứa một số lượng cổng tương đương từ vài chục (PROM) đến vài trăm (PAL, GAL) cổng, nhóm này sử dụng cấu trúc của bộ nhớ ROM để lưu cấu hình IC, (vì vậy nhóm này còn gọi là Memory-based PLD), cấu trúc này bao gồm một mảng ma trận AND và một mảng ma trận OR có thể cấu trúc được. Trong các chip dạng này lại chia làm hai, thứ nhất là loại chỉ lập trình một lần, và loại có khả năng tái lập trình dùng các công nghệ như EEPROM hay EPROM. Cấu trúc cụ thể và nguyên lý làm việc của PROM, PAL, PLA, GAL, FPGA, CPLD sẽ được lần lượt được trình bày chi tiết ở phần tiếp theo. CPLD (Complex Programmable Logic Device) CPLD là IC lập trình phức tạp thường được ghép từ nhiều các SPLD trên một chip đơn. Số cổng tương đương của CPLD đạt từ hàng nghìn đến hàng chục nghìn cổng. FPGA (Field-Programmable Gate Array) là IC khả trình cấu trúc từ mảng các khối logic lập trình được. Nếu như đối với các PLD khác việc tái cấu trúc IC được thực hiện trong điều kiện của nhà máy sản xuất bán dẫn, quá trình này cần những mặt nạ cho quang khắc nên sử dụng lớp những PLD này được gọi chung bằng thuật ngữ Mask-Programmable Device. FPGA phân biệt chính với các loại trên ở khả năng tái cấu trúc IC bởi người dùng cuối hay chính là người lập trình IC. 1.4. Kiến trúc của các IC khả trình Trong Kỹ thuật số ta đã chỉ ra mọi hàm logic tổ hợp đều có thể biểu diển dưới dạng chuẩn tắc tuyển tức là dưới dạng tổng của các tích đầy đủ, hoặc chuẩn tắc hội, tức là dạng tích của các tổng đầy đủ. Hai cách biểu diễn này là hoàn toàn tương đương. Nguyên lý này cho phép hiện thực hóa hệ hàm logic tổ hợp bằng cách ghép hai mảng ma trận nhân (AND) và ma trận cộng (OR). Nếu một trong các mảng này có tính khả trình thì IC sẽ có tính khả trình. Ta sẽ lần lượt nghiên cứu cấu trúc của một số loại IC hoạt động trên nguyên lý này. Kiến trúc PROM, PAL, PLA, GAL: 20
  22. 1.4.1. Kiến trúc PROM: PROM được phát minh bởi Wen Tsing Chow năm 1956 khi làm việc tại Arma Division của công ty American Bosch Arma tại Garden, New York. PROM được chế tạo theo đơn đặt hàng từ lực lượng Không quân Hoa Kỳ lúc bấy giờ với mục đích có được một thiết bị lưu trữ các tham số về mục tiêu một các an toàn và linh động. Thiết bị này dùng trong máy tính của Atlas E/F và được giữ bí mật trong vòng vài năm trước khi Atlas E/F trở nên phổ biến. PROM là viết tắt của programmable Read-only memory trong tiếng Anh, hay "chíp bộ nhớ chỉ đọc lập trình được". PROM là vi mạch lập trình đầu tiên và đơn giản nhất trong nhóm các vi mạch bán dẫn lập trình được (programmable logic device, hay PLD). PROM chỉ lập trình được một lần duy nhất bằng phương pháp hàn cứng. PROM có số đầu vào hạn chế, thông thường đến 16 đầu vào, vì vậy chỉ thực hiện được những hàm đơn giản. PROM gọi là bộ nhớ chỉ đọc lập trình được. Đây là họ vi mạch đầu tiên được sử dụng như là những vi mạch số lập trình theo quan điểm của vi mạch số. Cấu trúc của PROM rất đơn giản bao gồm một mảng tế bào nhớ với những đường điạ chỉ ngỏ vào và nhũng đường dữ liệu ngỏ ra. Số đường điạ chỉ và dữ liệu cho biết ma trận nhớ của PROM. Một PROM đơn giản được trình bày ở hình 1.17. D7 D6 A4 D5 A3 D4 A2 D3 A1 D2 Ngõ vào A0 Ngõ ra D1 D0 Hình 1.17. Trình bày một PROM đơn giản PROM có 5 đường điều khiển ngỏ vào cho phép tạo ra 32 tổ hợp logic và 8 đường dữ liệu ra tạo thành một ma trận nhớ 32x8, vì vậy có tổng cộng 256 tế bào nhớ. Cấu trúc của PROM gồm một mảng AND cố định theo sau là mảng OR lập trình. Cấu trúc của PROM tạo bởi ma trận tạo bởi mảng cố định các phần tử AND nối với mảng các phần tử OR lập trình được. 21
  23. Hình 1.18. Cấu trúc của PROM Tại mảng nhân AND, các đầu vào sẽ được tách thành hai pha, ví dụ a thành pha thuận a và nghịch , các chấm (•) trong mảng liên kết thể hiện kết nối cứng, tất cả các kết nối trên mỗi đường ngang sau đó được thực hiện phép logic AND, như vậy đầu ra của mỗi phần tử AND là một nhân tử tương ứng của các đầu vào. Ví dụ như hình trên thu được các nhân tử như sau: , . Các nhân tử được gửi tiếp đến mảng cộng OR, ở mảng này “X” dùng để biểu diễn kết nối lập trình được. Ở trạng thái chưa lập trình thì tất cả các điểm nối đều là X tức là không kết nối, tương tự như trên, phép OR thực hiện đối với toàn bộ các kết nối trên đường đứng và gửi ra các đầu ra X, Y, Z, Tương ứng với mỗi đầu ra như vậy thu được hàm dưới dạng tổng của các nhân tử, ví dụ tương ứng với đầu ra Y: . 22
  24. 1.4.2. Kiến trúc PAL Programmable Array Logic (PAL) là một thuật ngữ chỉ các mảng logic lập trình được. PAL cùng với PROM, PLA, GAL nằm trong nhóm những vi mạch lập trình đơn giản SPLD (Simple Programmable Logic Device). PAL ra đời cuối thập niên 1970. Cấu trúc của PAL kế thừa cấu trúc của PROM, sử dụng hai mảng logic nhưng chỉ một mảng lập trình được, Nếu như ở PROM mảng OR là mảng lập trình được thì ở PAL mảng AND lập trình được còn mảng OR được gắn cứng. Việc cho phép mảng AND lập trình được tăng đáng kể độ linh động của PAL so với PROM, mặt khác tốc độ làm việc của PAL nhanh hơn nhiều so với PLA. Do loại bỏ việc sử dụng cầu chì ở mảng OR, do đó số lượng tinh thể Silicon được sử dụng giảm, dẫn đến giá thành của PAL thấp hơn so với FPLA. Mặt khác thời gian trì hoãn của PAL ngắn hơn so với FPLA do giảm được sự trì hoãn khi truyền qua mảng OR. Hình 1.19. Cấu trúc của PAL Đến năm 1983 hãng Lattice Semiconductor chế tạo GAL dựa trên cấu trúc của PAL nhưng sử dụng công nghệ CMOS cho các nút mạng lập trình, cho phép mảng lập trình có thể xóa và lập trình lại được 1.4.3. Kiến trúc PLA PLA, viết tắt của "Programmable Logic Array" trong tiếng Anh, là một thuật ngữ chỉ các vi mạch lập trình dùng mảng logic dùng trong điện tử học. 23
  25. PLA ra đời năm 1975 và là chíp lập trình thứ hai sau PROM. PLA kế thừa cấu trúc của PROM, nhưng có khả năng lập trình linh động hơn, bù lại tốc độ của PLA thấp hơn nhiều so với PROM và các sản phẩm cùng loại khác. Thực tế PLA được ứng dụng không nhiều và nhanh chóng bị thay thế bởi những công nghệ mới hơn như PAL, GAL, CPLD Cấu trúc của PLA cũng sử dụng hai mảng logic AND và OR nhưng khác với PROM, số nhân tử của PLA không phụ thuộc số lượng đầu vào và có thể lập trình được giống như mảng OR. Hình 1.20. Cấu trúc PLA 1.4.4. Kiến trúc của GAL GAL (Generic Array Logic) được phát triển bởi Lattice Semiconductor company vào năm 1983, cấu trúc của GAL không khác biệt PAL nhưng thay vì lập trình sử dụng công nghệ antifuse thì ở GAL dùng CMOS electrically erasable PROM, chính vì vậy đôi khi tên gọi GAL ít được sử dụng thay vì đó GAL được hiểu như một dạng PAL được cải tiến. 1.4.5. Kiến trúc của CPLD Tất cả các chip khả trình PROM, PAL, GAL, thuộc nhóm SPLD (Simple Programmable Logic Devices) những IC này có ưu điểm là thiết kế đơn giản, chi phí thấp cho sản xuất cũng như thiết kế, có thể chuyển dễ dàng từ công nghệ này sang công nghệ khác tuy vậy nhược điểm là tốc độ làm việc thấp, số cổng logic tương đương nhỏ do đó không đáp ứng được những thiết kế phức tạp đòi hỏi nhiều về tài nguyên và tốc độ. 24
  26. CPLD (Complex Programmable Logic Devices) được Altera tiên phong nghiên cứu chế tạo đầu tiên nhằm tạo ra những IC khả trình dung lượng lớn MAX5000, MAX7000, MAX9000 là họ những CPLD tiêu biểu của hãng này. Sau sự thành công của Altera một loạt các hãng khác cũng bắt tay vào nghiên cứu chế tạo CPLD, Xilinx với các sản phẩm XC95xx series, Lattice với isp Mach 4000 serise, ispMarch XO. Logic block Logic block Logic block Programmable Logic block Interconnect matrix Logic block Logic block Logic block Logic block Hình 1.21. Cấu trúc CPLD Một cách đơn giản nhất có thể hiểu CPLD được cấu trúc bằng cách ghép nhiều các chíp SPLD lại, thông thường là PAL. Tuy vậy về bản chất độ phức tạp của CPLD vượt xa so với các IC nhóm SPLD và cấu trúc của các CPLD cũng rất đa dạng, phụ thuộc vào từng hãng sản xuất cụ thể. Dưới đây sẽ trình bày nguyên lý chung nhất của các chip họ này. CPLD được tạo từ hai thành thành phần cơ bản là nhóm các khối logic (Logic block) và một ma trận kết nối khả trình PIM (Programmable Interconnect Matrix). Logic block là các SPLD được cải tiến thường chứa từ 8 đên 16 macrocells. Tất cả các Logic block giống nhau về mặt cấu trúc. PIM là ma trận chứa các kết nối khả trình, nhiệm vụ của ma trận này là thực hiện kết nối giữa các LB và các cổng vào ra IO của CPLD. Về mặt lý thuyết thì ma trận này có thể thực hiện kết nối giữa hai điểm bất kỳ. 25
  27. CPLD thông thường sử dụng các công nghệ lập trình của EEPROM, điểm khác biệt là đối với CPLD thường không thể dùng những programmer đơn giản cho PAL, PLA. vì số chân giao tiếp của CPLD rất lớn. Để thực hiện cấu hình cho CPLD mỗi một công ty phát triển riêng cho mình một bộ công cụ và giao thức, thông thường các chip này được gắn trên một bo mạch in và dữ liệu thiết kế được tải vào từ máy vi tính. Tuy vậy các quy trình nạp trên đang dần bị thay thế bởi giao thức chuẩn JTAG (Join Test Action Group) chuẩn, đây cũng là giao thức dùng để cấu trúc cho FPGA mà ta sẽ nghiên cứu kỹ hơn ở chương kế tiếp. Nhờ kế thừa cấu trúc của SPLD nên CPLD không cần sử dụng bộ nhớ ROM ngoài để lưu cấu hình của IC, đây là một đặc điểm cơ bản nhất phân biệt CPLD với các IC khả trình cỡ lớn khác như FPGA. 1.4.6. Kiến trúc của FPGA Field-programmable gate array (FPGA) là vi mạch dùng cấu trúc mảng phần tử logic mà người dùng có thể lập trình được. (Chữ field ở đây muốn chỉ đến khả năng tái lập trình “bên ngoài” của người sử dụng, không phụ thuộc vào dây chuyền sản xuất phức tạp của nhà máy bán dẫn). Vi mạch FPGA được cấu thành từ các bộ phận:  Các khối logic cơ bản lập trình được (logic block)  Hệ thống mạch liên kết lập trình được  Khối vào/ra (IO Pads)  Phần tử thiết kế sẵn khác (DSP slice, RAM, ROM, nhân vi xử lý ) FPGA cũng được xem như một loại vi mạch bán dẫn chuyên dụng ASIC, nhưng nếu so sánh FPGA với những ASIC đặc chế hoàn toàn hay ASIC thiết kế trên thư viện logic thì FPGA không đạt đựợc mức độ tối ưu như những loại này, và hạn chế trong khả năng thực hiện những tác vụ đặc biệt phức tạp, tuy vậy FPGA ưu việt hơn ở chỗ có thể tái cấu trúc lại khi đang sử dụng, công đoạn thiết kế đơn giản do vậy chi phí giảm, rút ngắn thời gian đưa sản phẩm vào sử dụng. Còn nếu so sánh với các dạng vi mạch bán dẫn lập trình được dùng cấu trúc mảng phần tử logic như PLA, PAL, CPLD thì FPGA ưu việt hơn các điểm: tác vụ tái lập trình của FPGA thực hiện đơn giản hơn; khả năng lập trình linh động hơn; và khác biệt quan trọng nhất là kiến trúc của FPGA cho phép nó 26
  28. có khả năng chứa khối lượng lớn cổng logic (logic gate), so với các vi mạch bán dẫn lập trình được có trước nó. Kiến trúc tổng thể của một FPGA được minh họa như sau: Hình 1.22. Cấu trúc của FPGA - Khối logic Hình 1.23. Khối logic FPGA Phần tử chính của FPGA là các khối logic (logic block). Khối logic được cấu thành từ LUT và một phần tử nhớ đồng bộ flip-flop, LUT (Look up table) là khối logic có thể thực hiện bất kì hàm logic nào từ 4 đầu vào, kêt quả của hàm này tùy vào mục đích mà gửi ra ngoài khối logic trực tiếp hay thông qua phần tử nhớ flip-flop. 27
  29. Trong tài liệu hướng dẫn của các dòng FPGA của Xilinx còn sử dụng khái niệm SLICE, 1 Slice tạo thành từ gồm 4 khối logic, số lượng các Slices thay đổi từ vài nghìn đến vài chục nghìn tùy theo loại FPGA. Nếu nhìn cấu trúc tổng thể của mảng LUT thì ngoài 4 đầu vào kể trên còn hỗ trợ thêm 2 đầu vào bổ sung từ các khối logic phân bố trước và sau nó nâng tổng số đầu vào của LUT lên 6 chân. Cấu trúc này là nhằm tăng tốc các bộ số học logic. - Hệ thống mạch liên kết Hình 1.24. Khối chuyển mạch của FPGA Mạng liên kết trong FPGA được cấu thành từ các đường kết nối theo hai phương ngang và đứng, tùy theo từng loại FPGA mà các đường kết nối được chia thành các nhóm khác nhau, ví dụ trong XC4000 của Xilinx có 3 loại kết nối: ngắn, dài và rất dài. Các đường kết nối được nối với nhau thông qua các khối chuyển mạch lập trình được (programmable switch), trong một khối chuyển mạch chứa một số lượng nút chuyển lập trình được đảm bảo cho các dạng liên kết phức tạp khác nhau. - Các phần tử tích hợp sẵn Ngoài các khối logic tùy theo các loại FPGA khác nhau mà có các phần tử tích hợp thêm khác nhau, ví dụ để thiết kế những ứng dụng SoC, trong dòng Virtex 4,5 của Xilinx có chứa nhân xử lý PowerPC, hay trong Atmel FPSLIC tích hợp nhân AVR , hay cho những ứng dụng xử lý tín hiệu số DSP trong FPGA được tích hợp các DSP Slide là bộ nhân cộng tốc độ cao, thực hiện hàm A*B+C, ví dụ dòng Virtex của Xilinx chứa từ vài chục đến hàng trăm DSP slices với A, B, C 18-bit. 28
  30. Chương 2 GIẢI PHÁP PHẦN CỨNG FPGA CỦA XILINX CHO THIẾT KẾ VI MẠCH SỐ 2.1. Một số giải pháp cho thiết kế mạch logic số FPGA là công nghệ mang lại sự thay đổi lớn lao trong kỹ thuật điện tử số hiện đại. Nếu như các IC tích hợp số trước kia được sản xuất bằng công nghệ phức tạp, sở hữu bởi số ít các quốc gia có nền tảng khoa học kỹ thuật phát triển, khi thiết kế các hệ thống số người thiết kế không có được sự tùy biến linh động cũng như những giải pháp tối ưu mà phải lệ thuộc vào các phần tử có sẵn. HDL và FPGA ra đời đã cho phép người thiết kế có khả năng tự thiết kế IC chức năng theo mục đích sử dụng một cách nhanh chóng dễ dàng, đây cũng chính là một trong những cơ sở để môn học thiết kế vi mạch tích hợp được đưa vào giảng dạy cho đối tượng đại học. Bên cạnh sự tiếp cận trực tiếp và đơn giản FPGA còn đem lại hiệu quả thiết kế cao và tính ứng dụng thực tiễn cho những bài toán số được xem rất phức tạp đối với các công nghệ cũ hơn. Sinh viên sẽ được giới thiệu căn bản về cấu trúc của FPGA và các cách thức làm việc với FPGA. Song song đó là các bài thực hành giúp sinh viên làm quen và sử dụng thành thạo các công cụ thiết kế trên FPGA, trên cơ sở đó thực hiện các bài tập cơ bản và một số hướng nghiên cứu chuyên sâu sử dụng công nghệ FPGA. 2.1.1. Khái niệm FPGA FPGA là công nghệ vi mạch tích hợp khả trình (PLD - Programmable Logic Device) trình mới nhất và tiên tiến nhất hiện nay. Thuật ngữ Field- Programmable chỉ quá trình tái cấu trúc IC có thể được thực hiện bởi người dùng cuối, trong điều kiện thông thường thường, hay nói một cách khác là người kỹ sư lập trình IC có thể dễ dàng hiện thực hóa thiết kế của mình sử dụng FPGA mà không lệ thuộc vào một quy trình sản xuất hay cấu trúc phần cứng phức tạp nào trong nhà máy bán dẫn. Đây chính là một trong những đặc điểm làm FPGA trở thành một công nghệ IC khả trình được nghiên và cứu phát triển nhiều nhất hiện nay. Để có được khả năng đó, FPGA ra đời hoàn toàn là một công nghệ mới chứ không phải là một dạng mở rộng của các chip khả trình kiểu như PAL, 29
  31. PLA Sự khác biệt đó thứ nhất nằm ở cơ chế tái cấu trúc FPGA, toàn bộ cấu hình của FPGA thường được lưu trong một bộ nhớ truy cập ngẫu nhiên (thông thường SRAM), quá trình tái cấu trúc được thực hiện bằng cách đọc thông tin từ RAM để lập trình lại các kết nối và chức năng logic trong IC. Có thể so sánh cơ chế đó làm việc giống như phần mềm máy tính cũng được lưu trữ trong RAM và khi thực thi sẽ được nạp lần lượt vi xử lý, nói cách khác việc lập trình lại cho FPGA cũng dễ dàng như lập trình lại phần mềm trên máy tính. Như vậy về mặt nguyên tắc thì quá trình khởi động của FPGA không diễn ra tức thì mà cấu hình từ SRAM phải được đọc trước sau đó mới diễn ra quá trình tái cấu trúc theo nội dung thông tin chứa trong SRAM. Dữ liệu chứa trong bộ nhớ RAM phụ thuộc vào nguồn cấp, chính vì vậy để lưu giữ cấu hình cho FPGA thường phải dùng thêm một ROM ngoại vi. Đến những dòng sản phẩm FPGA gần đây thì FPGA được thiết kế để có thể giao tiếp với rất nhiều dạng ROM khác nhau hoặc FPGA thường được thiết kế kèm CPLD để nạp những thành phần cố định, việc tích hợp này làm FPGA nạp cấu hình nhanh hơn nhưng cơ chế nạp và lưu trữ cấu hình vẫn không thay đổi. Ngoài khả năng đó điểm thứ hai làm FPGA khác biệt với các PLD thế hệ trước là FPGA có khả năng tích hợp logic với mật độ cao với số cổng logic tương đương lên tới hàng trăm nghìn, hàng triệu cổng. Khả năng đó có được nhờ sự đột phá trong kiến trúc của FPGA. Nếu hướng mở rộng của CPLD tích hợp nhiều mảng PAL, PLA lên một chip đơn, trong khi bản thân các mảng này có kích thước lớn và cấu trúc không đơn giản nên số lượng mảng tích hợp nhanh chóng bị hạn chế, dung lượng của CPLD nhiều nhất cũng chỉ đạt được con số trăm nghìn cổng tương đương. Đối với FPGA thì phần tử logic cơ bản không còn là mảng PAL, PLA mà thường là các khối logic lập trình được cho 4-6 bit đầu vào và 1 đầu ra (thường được gọi là LUT). Việc chia nhỏ đơn vị logic cho phép tạo một cấu trúc khả trình linh hoạt hơn và tích hợp được nhiều hơn số lượng cổng logic trên một khối bán dẫn. Bên cạnh đó hiệu quả làm việc và tốc độ làm việc của FPGA cũng vượt trội so với các IC khả trình trước đó. Vì có mật độ tích hợp lớn và tốc độ làm việc cao nên FPGA có thể được ứng dụng cho lớp những bài toán xử lý số phức tạp đòi hỏi hiệu suất làm việc lớn mà các công nghệ trước đó không đáp ứng được. Thiết kế trên FPGA thường được thực hiện bởi các ngôn ngữ HDL và hầu hết các dòng FPGA hiện tại hỗ trợ thiết kế theo hai ngôn ngữ chính là Verilog và VHDL, tất cả những thiết kế ở những chương trước đều có thể hiện 30
  32. thực hóa trên FPGA bằng một quy trình đơn giản. Ngoài HDL, thiết kế trên FPGA còn có thể được thực hiện thông qua hệ nhúng nghĩa là bằng ngôn ngữ phần mềm (thường là C/C++). Một phương pháp nữa thường dùng trong các bài toán xử lý số tín hiệu là sử dụng System Generator một chương trình kết hợp của Matlab với phần mềm thiết kế FPGA của Xilinx. Hiện nay công nghệ FPGA đang được phát triển rộng rãi bởi nhiều công ty bán dẫn khác nhau. Dẫn đầu là Xilinx với các dòng sản phẩm như Virtex 3, 4, 5, 6 và Spartan3, 6, Altera với Stratix, Cyclone, Arria, Bên cạnh đó còn có sản phẩm của Lattice Semiconductor Company, Actel, Achronix, Blue Silicon Technology Khái niệm FPGA board, hay FPGA KIT là khái niệm chỉ một bo mạch in trên đó có gắn chíp FPGA và các phần tử khác như cổng giao tiếp, màn hình, led, nút bấm và bao giờ cũng có phần giao tiếp với máy tính để nạp cấu hình cho FPGA. Ngoài ra board còn chứa các thiết bị ngoại vi được liên kết với các cổng vào ra của FPGA nhằm mục đích thử nghiệm. Theo bảng so sánh 1-4 dưới đây trên có thể thấy khả năng tích hợp của FPGA là rất lớn, những FPGA mới nhất hiện nay có khả năng tích hợp lớn tương đương như các chíp chuyên dụng cho máy chủ như Xenon 6-core. Còn bản thân các chip cỡ nhỏ như Pentium hay thậm chí Core duo nếu so sánh về mức độ tích hợp thì chúng có thể được - nạp hoàn toàn vào một FPGA cỡ trung bình. Khả năng này của FPGA mở ra một hướng mới cho ứng dụng FPGA đó là sử dụng FPGA như một phương tiện để kiểm tra thiết kế ASIC (ASIC prototyping with FPGA). Kế thừa của phương pháp này là công nghệ có tên gọi ―Hard-copy là công nghệ cho phép sao chép toàn bộ các thiết kế đã được nạp vào FPGA thành một IC chuyên dụng (ASIC) độc lập. Tính tối ưu của thiết kế này không cao nhưng đơn giản và giảm đáng kể chi phí nếu so sánh với thiết kế ASIC chuẩn. Tài nguyên logic của FPGA được thể hiện ở bảng so sánh sau: Mật độ tích hợp của một số IC thông dụng: IC Transitor count Process Manufacture Year Intel 4004 2 300 10 um Intel 1971 Zilog Z80 8 500 4 um Zilog 1976 31
  33. Intel 80286 164 000 1.5 um Intel 1982 Pentium 2 7 500 000 0.35um Intel 1997 Pentium 4 42 000 000 180 nm Intel 2000 Core 2 Duo 291 000 000 65 nm Intel 2006 Six core Xenon 7400 1 900 000 000 45 nm Intel 2008 10-Core Xeon 2 600 000 000 32 nm Intel 2010 Westmere-EX AMD K8 106 000 000 130 nm AMD 2003 Spartan 3E ~40 000 000 90 nm Xilinx 1998 Virtex 4 1 000 000 000 90 nm Xilinx 2004 Virtex 5 1 100 000 000 65 nm Xilinx 2006 Starix IV 2 500 000 000 40 nm Altera 2008 Starix V 3 800 000 000 28 nm Altera 2011 Virtex 6 ~2 600 000 000 65 nm Xilinx 2010 Virtex 7 ~6 800 000 000 28nm Xilinx 2011 2.1.2. Ứng dụng của FPGA trong xử lý tín hiệu số Do khả năng tái cấu trúc đơn giản và sở hữu một khối tài nguyên logic lớn FPGA có thể được ứng dụng cho nhiều các lớp bài toán xử lý tín hiệu số cỡ lớn mà các công nghệ trước đó không làm được hoặc làm được nhưng với tốc độ và hiệu suất thấp. Các lớp ứng dụng đó là: - Các ứng dụng chung về xử lý số như lọc tín hiệu, tìm kiếm, phân tích, giải mã, điều chế tín hiệu, trộn tín hiệu - Các ứng dụng về mã hóa, giải mã giọng nói, nhận dạng giọng nói, tổng hợp giọng nói. Xử lý tín hiệu âm thanh bao gồm lọc nhiễu , trộn, mã hóa, giải mã, nén, tổng hợp âm thanh - Ứng dụng trong xử lý ảnh số, nén và giải nén, các thao tác biến đổi, chỉnh sửa, nhận dạng ảnh số - Ứng dụng trong các hệ thống bảo mật thông tin, cung cấp các khối giải mã và mã hóa có thể thực thi với tốc độ rất cao và dễ dàng tham số hóa hoặc điều chỉnh. 32
  34. - Ứng dụng trong các hệ thống thông tin như các hệ thống Voice IP, Voice mail. Modem, điện thoại di động, mã hóa và giải mã truyền thông trong mạng LAN, WIFI trong truyền hình KTS, radio KTS - Ứng dụng trong điều khiển các thiết bị điện tử: ổ cứng, máy in, máy công nghiệp , dẫn đường, định vị, robots. Các sản phẩm ứng dụng FPGA hiện tại vẫn nằm ở con số khiêm tốn nếu so sánh với các giải pháp truyền thống tuy vậy với các thế mạnh kể trên FPGA chắc chắn sẽ là một công nghệ quan trọng của tương lai. Một số những kiến trúc thích nghi Vi xử lý – FPGA với nền tảng chíp vi xử lý và FPGA được đặt trong một chip đơn mang lại hiệu quả xử lý mạnh mẽ do kết hợp được tính linh động của phần mềm và hiệu suất, tốc độ của phần cứng đang là những hướng nghiên cứu mới và có thể tạo nên sự thay đổi lớn với các thiết kế số truyền thống. 2.1.3. Công nghệ tái cấu trúc FPGA Trong lĩnh vực công nghệ tái cấu trúc IC hiện nay có tất cả 5 công nghệ fuse, EPROM, EEPROM, SRAM based, Antifuse trong đó SRAM-based là công nghệ phổ biến được sử dụng cho FPGA. SRAM-based Cấu hình của FPGA bản chất là mô tả các điểm kết nối giữa các thành phần có chứa trong IC, có hai dạng kết nối cơ bản là kết nối giữa các đường kết nối dẫn bằng ma trận chuyển mạch (switch matrix), và kết nối nội bộ trong các khối logic. Kết nối trong ma trận chuyển là kết nối giữa hai kênh dẫn được thực hiện thông qua các pass-transitor, hay gọi là transitor dẫn. 1 bit thông tin từ bộ nhớ SRAM được sử dụng để đóng hoặc mở pass-transitor này, tương ứng sẽ ngắt hay kết nối giữa hai kênh dẫn. Kiểu cấu trúc thứ hai phổ biến trong các khối logic là lập trình thông qua khối chọn kênh (Multiplexer). Thông tin điều khiển từ SRAM cho phép khối chọn kênh chọn một trong số các đầu vào để đưa ra. Nếu khối lượng đầu vào là 2n, thì yêu cầu số bit điều khiển từ SRAM là n-bit. Kiểu cấu trúc thứ 3 được gọi là Look-Up Table (LUT), mỗi một LUT có thể được lập trình để thực hiện bất kỳ một hàm logic bất kỳ nào của đầu ra phụ thuộc các đầu vào. Cơ chế làm việc của LUT có thể tóm tắt như sau, giả sử cần thực hiện một hàm m đầu vào và n đầu ra thì cần một bộ nhớ 2mx(n), 33
  35. chứa thông tin về n đầu ra đối với tất cả các khả năng đầu vào. Khi làm việc thì m-bit đầu vào đóng vai trò như địa chỉ để truy cập (Look-up) lên bộ nhớ (Table). Về bản chất cấu trúc này cũng giống như khối chọn kênh cỡ lớn. Trong FPGA phổ biến sử dụng các LUT có 4-6 bit đầu vào và 1 bit đầu ra. Hình 2.1. SRAM-based FPGA Như vậy tính khả trình của FPGA được thực hiện nhờ tính khả trình của các khối logic và tính khả trình của hệ thống kênh kết nối, ngoài ra là tính khả trình của các khối điều khiển cổng vào ra. Sau đây ta sẽ đi vào nghiên cứu cấu trúc cụ thể của họ FPGA Spartan 3E của Xilinx, về cơ bản, cấu trúc của các họ Xilinx FPGA khác đều tương tự như cấu trúc này. 2.2. Kiến trúc của FPGA 2.2.1. Kiến trúc chung FPGA Mỗi nhà sản xuất FPGA có riêng cấu trúc FPGA, nhưng nhìn chung cấu trúc được thể hiện giống như trong hình bên trên. Cấu trúc FPGA bao gồm có configuration logic blocks (CLBs), configurable I/O blocks (IOB), và programmable interconnect. Và tất nhiên, chúng có mạch clock để truyền tín hiệu clock tới các logic block, và thêm vào đó có các logic resources như ALUs, memory và có thể có cả decoders. 34
  36. Hình 2.2. Kiến trúc chung của FPGA Các phần tử lập trình được của FPGA có 2 dạng cơ bản là các RAM tĩnh (Static RAM) và anti-fuses. - Configurable Logic Blocks (CLBs): Hình 2.3. Một Logic Block điển hình Configurable Logic Blocks (CLBs) bao gồm các Look-Up Tables (LUTs) rất linh động có chức năng thực thi các logic và các phần tử nhớ dùng như là các flip-flop hoặc các chốt (latch). CLB thực hiện phần lớn các chức năng logic như là lưu trữ dữ liệu, - Configurable I/O Blocks: Input/Output Blocks (IOBs) điều khiển dòng dữ liệu giữa các chân vào ra I/O và các logic bên trong của FPGA. Nó bao gồm có các bộ đệm vào và ra với 3 trạng thái và điều khiển ngõ ra dạng open collector. Phần lớn là có trở kéo lên ở ngõ ra và thỉnh thoảng lại có trở kéo xuống. IOBs hỗ trợ luồng dữ liệu 2 chiều (bidirectional data flow) và hoạt động logic 3 trạng thái (3 state). 35
  37. Hỗ trợ phần lớn các chuẩn tín hiệu, bao gồm một vài chuẩn tốc độ cao, như Double Data-Rate (DDR). Hình 2.4. Configurable Logic Blocks - Programmable Interconnect: Interconnect ở FPGA khác xa so với ở CPLD, tuy nhiên lại giống với của gate array ASIC. Có một line dài được dùng để nối các CLBs quan trọng mà chúng lại ở cách xa nhau mà không gây ra quá nhiều trễ. Chúng có thể được dùng như là các bus ở trong chip. Có các line ngắn được dùng để liên kết các CLBs riêng rẽ nhưng đặt gần nhau. Và cũng thường có vài ma trận chuyển đổi (switch matrices), giống như trong CPLD, nối giữa các line dài và ngắn lại với nhau theo một số cách đặc biệt. Các chuyển đổi lập trình được (Programmable switches) bên trong chip cho phép kết nối giữa CLBs tới các interconnect line và giữa interconnect line với các line khác và với switch matrix. Các bộ đệm 3 trạng thái được dùng để kết nối phần lớn các CLBs với các line dài (long line), tạo nên các bus. Các long line đặc biệt, gọi là các line clock toàn cục (global clock lines), được thiết kế đặc biệt cho trở kháng thấp và nhờ đó mà thời gian lan truyền nhanh hơn. Chúng được kết nối với các bộ đệm clock và với mỗi phần tử được clock trong mỗi CLB.Đó là cách mà clock có thể phân phối bên trong FPGA. 36
  38. Hình 2.5. Programmable Interconnect - Mạch đồng hồ (Clock Circuitry): Các khối vào ra với bộ đệm clock high drive gọi là các clock driver,nằm rải rác xung quanh chip. Các bộ đệm này được nối với các chân clock vào và lái các tín hiệu clock vào các đường clock toàn cục (global clock line) như mô tả ở bên trên. Các đường clock được thiết kế sao cho thời gian thời gian lệch nhỏ nhất và thời gian lan truyền nhanh. Thiết kế đồng bộ là yêu cầu bắt buộc với FPGA, từ khi độ lệch tuyệt đối và trễ không được bảo đảm. Chỉ khi dùng các tín hiệu clock từ các bộ đệm clock thì thời gian trễ tương đối và thời gian lệch mới được đảm bảo. 2.2.2. So sánh giữa cấu trúc nhỏ và cấu trúc lớn: FPGA có cấu trúc nhỏ giống như các mảng cổng của hệ ASIC với các CLBs chỉ bao gồm các phần tử cơ bản rất nhỏ như các cổng NAND, cổng NOR, Các nhà lý luận cho rằng các phần tử nhỏ có thể nói với nhau tạo lên các chức năng lớn hơn mà không tốn nhiều các phần tử logic. Trong các FPGA có cấu trúc lớn, các CLB có thể bao gồm 2 hoặc nhiều flip-flop, các thiết kế mà không cần nhiều flip-flop sẽ khiến cho nhiều flip-flop không được dùng đến. Tiếc rằng, các cấu trúc nhỏ lại yêu cầu khá nhiều nguồn kết nối (routing resource), dẫn đến tăng không gian và thêm vào một lượng lớn trễ mà không thể bù lại để có hiệu quả hơn. 37
  39. 2.2.3. So sánh giữa SDRAM Programming và Anti-fuse programming: Có 2 cách để lập trình FPGA. Cách đầu tiên là SDRAM Programming, bao gồm một vài bit Static RAM cho mỗi phần tử lập trình. Ghi một bit với giá trị 0 sẽ ngắt switch, trong khi ghi giá trị 1 sẽ đóng switch. Cách còn lại là anti- fuse bao gồm các cấu trúc rất nhỏ, không giống như các cầu chì thông thường, bình thường chúng không tạo ra một kết nối nào cả. Một dòng điện có cường độ nhất định trong khi lập trình thiết bị sẽ dẫn đến việc hai bên của anti-fuse kết nối với nhau. Thuận lợi của cấu trúc FPGA dựa trên SRAM là chúng dùng một quá trình sản xuất chuẩn mà ở đó các kế hoạch sản xuất chip là gần như giống nhau và luôn luôn được tối ưu cho khả năng hoạt động. Từ khi mà SRAM có thể lập trình lại được thì FPGA có thể lập trình lại bất cứ khi nào muốn, thận chí ngay cả khi chúng đang ở trong hệ thống, đơn giản như là ghi vào SRAM thông thường. Chúng có nhược điểm là vùng nhớ volatile nên một vấn đề về nguồn có thể thay đổi nội dung của RAM. Các thiết bị dựa trên SDRAM cũng có thời gian trễ đường truyền lớn. Thuận lợi của cấu trúc FPGA dựa trên anti-fuse là chúng là non-volatile và các trễ khi nối dây sẽ rất nhỏ vì thế nên chúng có khuynh hướng nhanh hơn. Nhược điểm là chúng yêu cầu một bộ lập trình bên ngoài để lập trình và mỗi khi lập trình xong thì không thể thay đổi được. 2.3. Cấu trúc FPGA của Spartan 3 Cấu trúc tổng quan của Spartan 3 gồm có 5 thành phần có chức năng khả trình cơ bản sau: - Configurable Logic Blocks (CLBs) bao gồm các Look-Up Tables (LUTs) rất linh động có chức năng thực thi các logic và các phần tử nhớ dùng như là các flip-flop hoặc các chốt (latch). CLB thực hiện phần lớn các chức năng logic như là lưu trữ dữ liệu, - Input/Output Blocks (IOBs) điều khiển dòng dữ liệu giữa các chân vào ra I/O và các logic bên trong của FPGA. IOBs hỗ trợ luồng dữ liệu 2 chiều (bidirectional data flow) và hoạt động logic 3 trạng thái (3 state). Hỗ trợ phần lớn các chuẩn tín hiệu, bao gồm một vài chuẩn tốc độ cao, như Double Data-Rate (DDR). 38
  40. - Block RAM cho phép lưu trữ dữ liệu dưới dạng các khối (block) dual- port 18-Kbit. - Multiplier Blocks cho phép 2 số nhị phân 18bit làm đầu vào và dễ dàng tính toán tích của chúng. - Digital Clock Manager (DCM) Blocks cung cấp khả năng tự xác định xung clock, là giải pháp số hoàn chỉnh cho các tín hiệu clock phân phối, trễ, nhân, chia và dịch bit. - Interconnect: Các kết nối khả trình và ma trận chuyển dùng để liên kết các phần tử chức năng của FPGA với nhau. Các phần tử này được tổ chức như trong hình sau: Hình 2.6. Cấu trúc các thành phần của Spartan-3E Từ hình vẽ ta thấy, các IOBs bao quanh các mảng CLBs, riêng Spartan- 3E chỉ có một vòng các IOBs. Mỗi cột block RAM bao gồm một vài block RAM 18-Kbit, mỗi block RAM lại gắn liền với một multiplier dành riêng. Các DCM được đặt ở các vị trí: 2 DCM phía trên và 2 cái phía dưới của thiết bị, và đối với các device lớn hơn thì có thêm các DCM ở phía bên cạnh. Đặc điểm chung mạng Spartan-3 là kết nối liên thông giữa 5 phần tử cơ bản này, và truyền tín hiệu giữa chúng. Mỗi thành phần chức năng này có 39
  41. một switch matrix dành riêng để cho phép chọn lựa kết nối cho việc đi dây trong FPGA. 2.3.1. Khối logic khả trình Khối logic khả trình của FPGA Xilinx có tên gọi đầy đủ là Configurable Logic Blocks (CLBs). CLBs là phần tử cơ bản cấu thành FPGA, là nguồn tài nguyên logic chính tạo nên các mạch logic đồng bộ lẫn không đồng bộ. Mỗi CLB được cấu thành từ 4 Slices, mỗi Slice lại được cấu thành từ 2 LUTs (Look Up Tables). Phân bố của các CLB thể hiện ở hình sau: Hình 2.7. Phân bố của cácCLB trong FPGA Các CLB được phân bố theo hàng và theo cột, mỗi một CLB được xác định bằng một tọa độ X và Y trong ma trận, đối với Spartan 3E số lượng hàng thay đổi từ 22 đến 76, số lượng cột từ 16 đến 56 tùy thuộc vào các gói cụ thể. * SLICE Mỗi CLB được cấu tạo thành từ 4 slices và các slices này chia làm hai nhóm trái và phải. Nhóm 2 slices bên trái có khả năng thực hiện các chức năng logic và làm việc như phần tử nhớ nên được gọi là SLICEM (SLICE Memory). 40
  42. Nhóm 2 silces bên phải chỉ thực hiện được các chức năng logic nên được gọi là SLICEL (SLICE Logic). Thiết kế như vậy xuất phát từ thực tế là nhu cầu thực hiện chức năng logic thường lớn hơn so với nhu cầu lưu trữ dữ liệu, do đó việc hỗ trợ chỉ một nửa làm việc như phần tử nhớ làm giảm kích thước và chi phí cho FPGA, mặt khác làm tăng tốc độ làm việc cho toàn khối. Hình 2.8. Bố trí slice bên trong một CLB SLICEL chỉ thực hiện chức năng logic nên chỉ chứa các thành phần gồm LUT, chuỗi bít nhớ (Carry Chain), chuỗi số học (Arithmetic chain), các bộ chọn kênh mở rộng (wide-multiplexer) F5MUX và FiMUX, 2 Flip-flop. Còn đối với SLICEM thì ngoài các thành phần trên LUT còn có thể được cấu hình để làm việc như một thanh ghi dịch 16 bit Shift-Register (SRL16), hoặc RAM phân tán 16x1bit (Distributed RAM), như hình sau: Hình 2.9. Phân bố tài nguyên trong SLICEM và SLICEL 41
  43. Cấu trúc chi tiết của một Slices đươc thể hiện ở hình dưới đây: Hình 2.10. Cấu trúc chi tiết của một SLICE Những đường gạch đứt thể hiện những kết nối tới các tài nguyên mà chỉ SLICEM mới có, những đường gạch liền chỉ những kết nối mà cả hai dạng SLICEs đều có. Mỗi một slice chia làm hai phần với cấu trúc gần như nhau ở phần trên và phần dưới, mỗi phần chứa các khối chức năng giống nhau nhưng được ký hiệu khác nhau, ví dụ G-LUT chỉ LUT ở phần trên, F-LUT chỉ LUT ở phần dưới. Tín hiệu đồng bộ CLK, tín hiệu cho phép của xung nhịp CE (Clock Enable), tín hiệu cho phép ghi dữ liệu vào SLICEM SLICEWE1 và tín hiệu RS (Reset/Set) là các tín hiệu dùng chung cho cả phần trên và phần dưới của SLICE. 42
  44. Các đường dữ liệu cơ bản trong Slices là các đường bắt đầu từ các đầu vào F[4:1] và G[4:1] thẳng tới F-LUT và G-LUT tương ứng, tại đây sẽ thực hiện hàm logic tổ hợp theo yêu cầu và gửi ra ở các đầu ra D. Từ đây đầu ra D được gửi ra các cổng ra của SLICE thông qua các đường sau:  Kết thúc trực tiếp tại các đầu ra X, Y và nối ra ngoài với ma trận kết nối.  Thông qua FMUX (GMUX) rồi DMUX làm đầu vào cho phần tử nhớ  FFX (FFY) sau đó gửi ra thông qua các đầu ra QX (QY) tương ứng của các phần tử nhớ.  Điều khiển CYMUXF (CYMUXG) của chuỗi bit nhớ (chi tiết về Carry chain xem mục 2.1.5).  Gửi tới cổng XORF (XORF) để tính tổng hoặc tích riêng trong chuỗi nhớ.  Làm đầu vào cho F5MUX (FIMUX) trong trường hợp thiết kế các khối logic, các chuỗi nhớ, thanh ghi dịch, RAM mở rộng. Bên cạnh các đường dữ liệu cơ bản trên thì trong Slice tồn tại các đường dữ liệu “tắt” bắt đầu từ các đầu vào BX, BY và kết thúc qua một trong những đường sau:  Bỏ qua cả LUT lẫn phần tử nhớ và kết thúc ở các đầu ra BXOUT, BYOUT rồi ra ma trận kết nối.  Bỏ qua LUT nhưng làm đầu vào cho các phần tử nhớ và kết thúc ở các đầu ra QX, QY.  Điều khiển F5MUX hoặc FiMUX.  Thông qua các bộ chọn kênh, tham gia như một đầu vào của chuỗi bit nhớ.  Làm việc như đầu vào DI của LUT (khi LUT làm việc ở chế độ Distributed RAM hay Shift Register).  BY có thể đóng vai trò của tín hiệu REV cho phần tử nhớ (xem chi tiết về  REV tại mô tả về phần tử nhớ). 43
  45. * Bảng tham chiếu LUT Hình 2.11. Phân bố các LUT trên một SLICE Bảng tham chiếu (Look-Up Table) gọi tắt là các LUT được phân bố ở góc trên trái và góc dưới phải của Slice và được gọi tên tương ứng là F-LUT và G-LUT. Phần tử nhớ đóng vai trò là đầu ra của các LUT được gọi tương ứng là Flip-Flop X (FFX) và Flip-Flop Y FFY. LUT là đơn vị logic và là tài nguyên logic cơ bản của FPGA, LUT có khả năng được cấu trúc để thực hiện một hàm logic bất kỳ với 4 đầu vào. Cấu trúc của LUT được thể hiện ở hình sau: Hình 2.12. Cấu trúc của LUT LUT bản chất là một bộ chọn kênh 16 đầu vào, các đầu vào của LUT A[3:0] đóng vai trò tín hiệu chọn kênh, đầu ra của LUT là đầu ra của bộ chọn kênh. Khi cần thực hiện một hàm logic bất kỳ nào đó, một bảng nhớ SRAM 16 bit được tạo để lưu trữ kết quả bảng chân lý của hàm, tổ hợp 16 giá trị của hàm tương ứng sẽ là các kênh chọn của khối chọn kênh. Khi làm việc tùy vào giá trị của A[3:0] đầu ra D sẽ nhận một trong số 16 giá trị lưu trữ tương ứng trong SRAM. Bằng cách đó một hàm logic bất kỳ với 4 đầu vào 1 đầu ra có thể thực hiện được trên LUT. 44
  46. 2 LUTs có trong SLICEM có thể được cấu trúc để làm việc như 16x1 RAM gọi là Ram phân tán (Distributed RAM) hoặc được cấu trúc để làm việc như một thanh ghi dịch 16-bit SHL16. Các LUT có thể được kết hợp với nhau để thực hiện các hàm logic tùy biến có số lượng đầu vào lớn hơn 4 thông qua các bộ chọn kênh mở rộng. Ở các thế hệ FPGA về sau này, nguyên lý làm việc của LUT vẫn không thay đổi nhưng số lượng đầu vào có thể nhiều hơn, ví dụ trong Virtex-5, số lượng đầu vào là 6. * Phần tử nhớ Phần tử nhớ (Storage elements) có trong CLBs là Flip-Flop FFX, FFY có thể được cấu hình để làm việc như D-flip-flop hoặc Latch, làm việc với các tín hiệu điều khiển đồng bộ hoặc không đồng bộ vì vậy cấu trúc của phần tử nhớ trong FPGA phức tạp hơn so với cấu trúc của D-flip-flop thông thường. Các đầu ra QX, QY của phần tử nhớ cũng là các đầu ra của Slices. Trong phần lớn các ứng dụng thường gặp phần tử nhớ được cấu trúc để làm việc như D-flipflop đồng bộ. Các cổng giao tiếp của một phần tử nhớ bao gồm:  D, Q là các cổng dữ liệu vào và ra tương ứng.  C là cổng vào xung nhịp đồng bộ.  GE (Gate Enable) cổng cho phép xung nhịp C khi làm việc ở chế độ latch  CE (Clock Enable) cổng cho phép xung nhịp C khi làm việc ở chế độ flip-flop  S, R là các cổng Set và Reset đồng bộ cho Flip-flop.  PRE, CLR Cổng Set và Clear không đồng bộ  RS Cổng vào của CLB cho S, R, PRE, hay CLR.  REV Cổng vào pha nghịch so với RS, thờng có đầu vào từ BY, có tác dụng ngược với RS. Khi cả hai cổng này kích hoạt thì giá trị đầu ra của phần tử nhớ bằng 0. 45
  47. * Bộ chọn kênh mở rộng Trong cấu trúc của Slice có chứa hai bộ chọn kênh đặc biệt gọi là Bộ chọn kênh mở rộng - Wide-multipexer F5MUX và FiMUX. Hình 2.13. FiMUX và F5MUX Mỗi một LUT được thiết kế để có thể thực hiện được mọi hàm logic 4 đầu vào. Mục đích của các bộ chọn kênh này là tăng tính linh động của FPGA bằng cách kết hợp các phần tử logic chức năng như LUT, chuỗi bit nhớ, Thanh ghi dịch, RAM phân tán ở các Slices, CLBs khác nhau để tạo ra các hàm tùy biến với nhiều đầu vào hơn. Ví dụ ở bảng sau thể hiện cách sử dụng 2 LUT 4 đầu vào và 1 F5MUX để tạo ra một hàm logic tùy biến 5 đầu vào. Hình 2.14. Nguyên lý làm việc của F5MUX 46
  48. Đầu tiên đối với hàm 5 biến OUT = F(X1, X2, X3, X4, X5) bất kỳ ta thành lập bảng chân lý tương ứng, bảng này được chia làm hai phần, phần trên với tất cả các giá trị của X5 bằng 0, ta gọi hàm này có tên là: OUT0 = F(X1, X2, X3,X4,0) = F0(X1, X2, X3, X4) Phần dưới với tất cả các giá trị của X5 bằng 1, ta gọi hàm này có tên là: OUT1 = F(X1, X2, X3, X4,1). = F1(X1, X2, X3, X4) Hai hàm F1, F2 là các hàm 4 đầu vào đợc thực hiện ở tương ứng bởi LUT1, LUT2. Tín hiệu X5 đợc sử dụng làm tín hiệu chọn kênh cho F5MUX chọn 1 trong hai giá trị đầu ra của LUT1, LUT2, đầu ra của F5MUX chính là kết quả của hàm 5 biến cần thực hiện. OUT = F0(X1, X2, X3, X4) nếu X5 = 0 = F1(X1, X2, X3, X4) nếu X5 = 1 Hình 2.15. Cấu tạo của F5MUX F5MUX được thiết kế dựa trên nguyên lý trên nhưng trên FPGA thực tế ngoài cổng ra thông thường O theo đó kết quả gửi ra phần tử nhớ của CLB, thì kết quả còn được gửi ra tín hiệu trả về LO (Local Output) theo đó kết quả có thể được gửi ngược lại các FiMUX để tiếp tục thực hiện các hàm logic có nhiều cổng vào hơn. Tương tự như vậy có thể thành lập các hàm với số lượng đầu vào lớn hơn bằng 6, 7, 8 tương ứng FiMUX sẽ được gọi là F6MUX, F7MUX, F8MUX Ví dụ 1 hàm 6 biến thì phải thực hiện bằng cách ghép nối 2 CLB liên tiếp thông qua F6MUX. Ngoài thực hiện các hàm đầy đủ với sự kết hợp hai LUT để tạo ra hàm logic tùy biến 5 đầu vào thì có thể kết hợp để tạo ra các hàm logic không đầy đủ với 6, 7, 8, 9 đầu vào. * Chuỗi bit nhớ và chuỗi số học Trong Spartan-3E cũng như trong các FPGA thế hệ sau này đều được tích hợp các chuỗi bit nhớ (carry chain) và các chuỗi số học (arithmetic chain) đặc biệt, các chuỗi này kết hợp với các LUT được sử dụng tự động hầu hết trong các 47
  49. phép toán số học thường gặp như cộng, nhân, góp phần rất lớn vào việc tăng tốc cho các phép toán này, đồng thời tiết kiệm tài nguyên logic (LUTs). Các chuỗi nàyđược tạo thành bằng các khối chọn kênh và các cổng logic riêng biệt, các phần tử đó cũng có thể được sử dụng độc lập để thực hiện các hàm logic đơn giản khác. Chuỗi bit nhớ thường gặp trong phép toán cộng, với mỗi SLICE chuỗi bit nhớ được bắt đầu từ tín hiệu CIN và kết thúc ở COUT. Các chuỗi đơn lẻ trong có thể được nối trực tiếp giữa các CLB với nhau để tạo thành các chuỗi dài hơn theo yêu cầu. Mỗi một chuỗi bit nhớ này có thể được bắt đầu tại bất kỳ một đầu vào BY hoặc BY nào của các Slices. Các chuỗi số học logic bao gồm chuỗi thực hiện hàm XOR với các cổng XORG, XORF phân bố ở phần trên và phần duới của Slice, chuỗi AND với các cổng GAND, FAND. Các chuỗi này kết hợp với các LUT để thực hiện phép nhân hoặc tạo thành các bộ đếm nhị phân. Các thành phần cơ bản của Chuỗi bit nhớ và Chuỗi số học bao gồm:  CYINIT: nằm ở phần dưới của Slice, chọn tín hiệu từ BX đầu vào của (Slice) nếu là điểm đầu của chuỗi hoặc CIN từ Slice kế cận trong trường hợp muốn kéo dài chuỗi nhớ.  CYOF/CYOG: Khối chọn nhớ phát sinh tương ứng ở phần dưới và trên của Slices, có khả năng chọn một trong số các đầu vào F1,F2/ G1,G2 là đầu vào của các LUT, đầu vào từ cổng AND, đầu vào từ BX/BY, đầu vào với các giá trị cố định 0, 1 nếu sử dụng như các hàm logic thông thường  CYMUXG lựa chọn giữa hai dạng nhớ là CYINIT nếu là nhớ lan truyền (carry propagation), CYOG nếu là nhớ phát sinh (carry generation), tương ứng với giá trị từ CYSELG là 0 và 1. Đầu ra COUT hoặc cổng YB của Slice.  CYMUXF lựa chọn giữa hai dạng nhớ là CMUXF nếu là nhớ lan truyền (carry propagation), CYOF nếu là nhớ phát sinh (carry generation), tương ứng với giá trị từ CYSELF là 0 và 1. Đầu ra tới đầu vào của chuỗi nhớ tại phần trên của Slice hoặc cổng XB của Slice  CYSELF/G lựa chọn giữa một trong hai tín hiệu: Đầu ra của F/GLUT nếu là nhớ phát sinh, và giá trị bằng 1 cho trường hợp nhớ lan truyền. 48
  50.  XORF cổng XOR cho chuỗi thực hiện hàm cộng bù 2 thuộc nửa dưới của Slice, hai đầu vào từ đầu ra của FLUT và từ đầu vào chuỗi nhớ CYINIT, đầu ra của cổng được gửi tới cổng D của phần tử nhớ FFX hoặc trực tiếp tới đầu ra X của Slices  XORG cổng XOR cho chuỗi thực hiện hàm cộng bù 2 thuộc nửa trên của Slice, hai đầu vào từ đầu ra của GLUT và từ đầu vào chuỗi nhớ CMUXF, đầu ra của cổng được gửi ra cổng D của phần tử nhớ FFY hoặc trực tiếp tới cổng Y của Slice  FAND cổng AND cho chuỗi thực hiện hàm logic nhân thuộc nửa dưới của  Slice, các đầu vào lấy trực tiếp từ đầu vào F1, F2 của các LUT, đầu ra được gửi tới CYOF để trở thành tín hiệu nhớ phát sinh cho chuỗi bit nhớ.  FAND cổng AND cho chuỗi thực hiện hàm logic nhân thuộc nửa dưới của Slice, các đầu vào lấy trực tiếp từ đầu vào F1, F2 của các LUT, đầu ra được gửi tới CYOF để trở thành tín hiệu nhớ phát sinh cho chuỗi bit nhớ. Hình 2.16. Chuỗi bit nhớ 49
  51. Minh họa về cách sử dụng các chuỗi này để tối ưu hóa tài nguyên và tăng tốc cho FPGA như sau: Về phép cộng, thiết kế điển hình của bộ cộng bắt đầu từ thiết kế quen thuộc của bộ cộng 1 bit đầy đủ gọi là FULL_ADDER. Hình 2.17. Sơ đồ logic truyền thống của FULL_ADDER Với cấu trúc này để thực hiện một FULL_ADDER trên FPGA cần tối thiểu hai LUT, mỗi LUT sử dụng với 3 đầu vào A, B, CIN. Trên thực tế cấu trúc trên có thể được thiết kế khác đi nhằm tăng tốc thực hiện cũng như giảm thiểu tài nguyên bằng sơ đồ cộng thấy nhớ trước. Định nghĩa các tín hiệu sau g = A and B; generation carry - nhớ phát sinh p = A xor B; propagation delay – nhớ lan truyền khi đó Sum = p xor CIN COUT = (CIN and (not p)) or (a and p); Từ hai công thức trên có thể thiết lập một sơ đồ khác của FULL_ADDER như sau: Hình 2.18. Sơ đồ logic của FULL_ADDER trên FPGA 50
  52. Với sơ đồ trên ta có thể thấy thay vì sử dụng hai phần tử AND ta sử dụng một bộ chọn kênh 2 đầu vào. Quay lại với sơ đồ Hình 4.12 và so sánh với sơ đồ trên ta có thể thấy FULL_ADDER có thể thực hiện với 1 LUT hai đầu và kết hợp với chuỗi bit nhớ có sẵn trong FPGA. Khi đó CYMUXF, CYMUXG đóng vài trò như bộ chọn kênh trên Hình 4.14. Bản thân LUT thực hiện hàm XOR. Với cách thiết kế như vậy mỗi Slice có thể tạo được chuỗi nhớ cho 2 bit. Các đầu vào CIN, COUT của các CLB được nối trực tiếp và được tối ưu hóa để trễ lan truyền gần như bằng 0 chuỗi nhớ thực hiện với một tốc độ rất nhanh. - Về phép nhân, để thực hiện phép nhân thì phải thực hiện việc tính các tích riêng (partial products) sau đó cộng các tích này với nhau để tạo thành kết quả đầy đủ (full product). Khi biểu diễn các số dưới dạng nhị phân, tích riêng hoặc bằng số bị nhân nếu như bit nhân là 1 và tích riêng bằng 0 nếu như bit nhân bằng 0. Để cộng các tích riêng thì phải sử dụng chuỗi bít nhớ tương tự như ở ví dụ trên. Còn tích riêng được tạo bởi các phần tử AND. Xét sơ đồ tính tích riêng như ở hình dưới đây: Hình 2.19. Cách tính tổng các tích riêng trong phép nhân 51
  53. Sơ đồ trên biểu diễn phép nhân B0B1với A0A1A2A3. Đối với mạch dùng để tính cho một bit của tích riêng P2 được khoanh vùng trên Hình 4.16 thì cần tối thiểu 1 cổng XOR 3 đầu vào (tương đương 2 cổng XOR 2 đầu vào) và hai cổng AND 2 đầu vào. Nếu thực hiện theo sơ đồ trên và chỉ dùng LUT có thể thấy mỗi đầu vào phần tử XOR xuất phát từ 1 phần tử AND, điều đó có nghĩa là mỗi phần tử AND chiếm 1 LUT. Như vậy nếu nhân hai số 8-bit ta phải cần 8x8 = 64 LUT = 32 Slices. Quan sát lại sơ đồ dưới đây, nếu sử dụng các tài nguyên khác của chuỗi bit nhớ có thể thiết kế như sau: Hình 2.20. Tối ưu hoá khối MULT_AND dùng chuỗi bit nhớ Với sơ đồ như trên tổng Am*Bn+1 + Am+1*Bn được thực hiện trong 1 LUT, ngoài ra tích Am+1*Bn được lặp lại nhờ phần tử AND (FAND hay GAND) để gửi tới bộ chọn kênh (CYMUXF, hoặc CYMUXG). Với cách làm như vây thì số lượng LUT đối với phép nhân 8x8 giảm xuống chỉ còn một nửa tức là 32LUTs = 16 Slices. Bên cạnh đó các phần tử MULT_AND được tối ưu hóa về độ trễ giữa các kết nối nên có thể làm việc rất nhanh. Tuy vậy sơ đồ nhân như trên chỉ được thực hiện với các phép nhân có số bit đầu vào nhỏ. Với các phép nhân có số lượng bit lớn hơn thì FPGA sẽ sử dụng các khối nhân chuyên dụng (dedicated multipliers) 18-bit x 18-bit sẽ được trình bày ở dưới. * RAM phân tán Trong mỗi CLB của Xilinx FPGA có chứa 4 x 16 = 64 bit RAM tương ứng với 4 LUT nằm trong 2 SLICEM của CLB. Phần RAM có thể sử dụng như một khối 64-bit RAM một cổng (Single-port RAM) hoặc khối 32-bit RAM hai cổng (Dual-port RAM), khi đó khối RAM được tạo thành từ hai mảng nhớ 32-bit và lưu trữ dữ liệu y hệt như nhau. Vì các RAM này phân bố rải rác theo CLB bên trong cấu trúc của FPGA nên chúng được gọi là các RAM phân tán (Distributed RAM) để phân biệt với các khối RAM nằm tập trung và có kích thước lớn hơn khác là Block RAM. 52
  54. Hình 2.21. RAM phân tán trong FPGA RAM phân tán trong FPGA có thể sử dụng ở một trong hai dạng như hình vẽ trên. Đối với kiểu single-port RAM thì có một ghi dữ liệu 1 cổng đọc dữ liệu. Đối với dual-port RAM thì có 1 cổng đọc ghi dữ liệu và một cổng chỉ thực hiện đọc dữ liệu từ RAM. Đối với thao tác ghi dữ liệu cho cả hai kiểu RAM được thực hiện đồng bộ trong 1 xung nhịp WCLK, tín hiệu cho phép ghi là WE (Write Enable, theo ngầm định tích cực nếu WE = “1”). Đối với Dual-port RAM thì mỗi động tác ghi sẽ thực hiện ghi dữ liệu từ cổng D vào hai phần nhớ của RAM. Thao tác đọc dữ liệu ở hai dạng RAM đều được thực hiện không đồng bộ và thuần túy sử dụng các khối logic tổ hợp, thời gian trễ của thao tác đọc dữ liệu bằng thời gian trễ tổ hợp và thông thường được tối ưu nhỏ hơn so với thời gian 1 xung nhịp đồng hồ. Giản đồ sau thể hiện thao tác đọc ghi dữ liệu: Hình 2.22. Thao tác đọc ghi dữ liệu của Distributed RAM trong Xilix FPGA 53
  55. Tài nguyên RAM phân tán trong FPGA được sử dụng hết sức linh động, một khối CLB đơn lẻ có thể được cấu hình để tạo thành các khối 64x1, 32x2, 16x4 Distributed RAM, các đầu vào G[4:1] và F[4:1] được dùng như các đầu vào địa chỉ. Các khối RAM lớn hơn có thể cấu tạo bằng cách ghép tài nguyên trong các CLB khác nhau lại sử dụng các bộ chọn kênh mở rộng, khi đó các cổng BX, BY được sử dụng như các bit địa chỉ bổ xung. * Thanh ghi dịch Một dạng sử dụng khác của các LUTG, và LUTF trong SLICEM là dùng như một thanh ghi dịch (Shift Register) 16 bit ký hiệu là SRL16. Hình 2.23. Thao tác đọc ghi dữ liệu của Distributed RAM trong Xilix FPGA Khi sử dụng LUT như một thanh ghi dịch, cấu trúc của LUT về cơ bản giữ nguyên, các kênh chọn được nối với chuỗi các D flip-flop làm việc đồng bộ. Đầu ra D vẫn nhận giá trị tại đầu ra Q của D-flip-flop quy định bởi giá trị địa chỉ A[3:0], chính vì vậy SRL16 còn được gọi là thanh ghi dịch có địa chỉ. Ngoài đầu ra D thanh ghi dịch có đầu ra cuối cùng có tên là Q15 hoặc MC15 quy định trong thư viện các phần tử chuẩn của FPGA. Đầu vào DI có thể được bắt đầu từ cổng BY. BX hoặc đầu vào SHIFTIN từ ngoài CLB. Tín hiệu xung nhịp đồng bộ CLK và CE được lấy từ tín hiệu đồng bộ chung của Slices. Đầu ra của MC15 của SRL16 có thể được nối tiếp với cổng SHIFTOUT của Slice hoặc YB. Đầu ra địa chỉ D có thể được gửi trực tiếp ra ngoài Slice hoặc thông qua FFX hoặc FFY, khi đó chuỗi dịch tính thêm một đơn vị, trên thực tế độ trễ của FFX, FFY thường nhỏ hơn so với độ trễ của các D-flip-flop trong thanh ghi dịch. 54
  56. Hình 2.24. Cấu trúc của thanh ghi dịch trong FPGA Thanh ghi dịch có thể sử dụng ở chế độ địa chỉ hoặc không. Khi muốn mở rộng thanh ghi dịch ở chế độ địa chỉ thì phải sử dụng thêm các Wide-multiplexers, ví dụ như trong một SLICEM, có thể kết hợp LUTG, LUTF ở chế độ thanh ghi dịch để tạo thành 32-bit thanh ghi dịch ở chế độ địa chỉ như ở hình sau: Hình 2.24. Mở rộng thanh ghi dịch ở chế độ địa chỉ 55
  57. Tương tự như vậy có thể sử dụng F6MUX, F7MUX để mở rộng kích thước của thanh ghi dịch ở chế độ địa chỉ. Hình 2.25. Mở rộng thanh ghi dịch ở chế độ không địa chỉ Khi sử dụng thanh ghi ở chế độ không địa chỉ, nghĩa là thực hiện dịch đủ 16 bit từ D-flip-flop thứ nhất cho đến đầu ra MC15 việc mở rộng thanh ghi dịch đơn giản là việc nối tiếp các đầu ra của thanh ghi dịch trước với đầu vào của thanh ghi dịch sau, ví dụ SHIFTOUT của CLB trên với SHIFTOUT của CLB dưới như hình vẽ dưới đây. Cũng như đối với Ram phân tán hay chuỗi bit nhớ, thanh ghi dịch có các cổng kết nối được tối ưu hóa về mặt tốc độ làm việc, việc ghép nối các thanh ghi liền kề không gây ra trễ đường truyền lớn. Việc sử dụng thanh ghi dịch trong Xilinx FPGA thường tự động nhưng người cũng có thể chủ động khai báo sử dụng tùy theo mục đích thiết kế. 2.3.2. Khối điều khiển vào ra Sơ đồ nguyên lý của khối điều khiển vào ra (Input/Output Block) trong Spartan 3E được trình bày như ở hình dưới đây: 56
  58. Hình 2.26. Sơ đồ nguyên lý của khối đệm vào ra IOB Các khối Input/Output Blocks (IOB) trong FPGA cung cấp các cổng vào ra lập trình được một chiều hoặc hai chiều giữa các chân vào ra của FPGA với các khối logic bên trong. Các khối một chiều là các khối Input- only nghĩa là chỉ đóng vai trò cổng vào, số lượng của các cổng này thường chiếm không nhiều khoảng 25% trên tổng số tài nguyên IOB của FPGA. Hình trên mô tả sơ đồ tổng quan của một IOB, đối với các khối Input- only thì không có những phần tử liên quan đến Output. Một IOB điển hình có ba đường dữ liệu chính, đường input, đường output, đường cổng 3 trạng thái (Three state path), mỗi đường này đều chứa các khối làm trễ lập trình bước và cặp phần tử nhớ có khả năng làm việc như Latch hoặc D-flipflop. - Input dẫn dữ liệu từ các chân vào ra của FPGA có thể qua hoặc không qua khối làm trễ khả trình vào gửi tới thẳng chân dữ liệu I. Đường Input thứ hai đi qua cặp phần tử nhớ tới các chân IQ1, IQ2. Các chân I, IQ1, IQ2 dẫn trực tiếp tới phần logic bên trong của FPGA. 57
  59. - Đường Output bắt đầu tại các chân O1, O2 có nhiệm vụ dẫn luồng dữ liệu từ các khối logic bên trong tới các chân vào ra của FPGA. Đường dẫn trực tiếp là đườngdẫn từ O1, O2 qua khối chọn kênh tới khối dẫn 3 trạng thái tới các chân vào ra. Đường vào thứ 2 dẫn thứ hai ngoài các phần tử trên còn đi qua hai phần tử nhớ. Đầu ra còn được nối với hệ thống pull-up, pull-down resisters để đặt các giá trị cổng ra là logic 1 hoặc 0. - Đường 3 trạng thái xác định khi nào đường dẫn ra là trạng thái trở kháng cao.Đường trực tiếp từ các chân T1, T2 tới khối điều khiển 3 trạng thái. Đường gián tiếp gián tiếp đi qua hai phần tử nhớ trước khi tới khối điều khiển 3 trạng thái. 2.3.2.1. Cổng vào với độ trễ khả trình Mỗi đường dữ liệu vào (input path) chứa các khối làm trễ lập trình được gọi là programmable input delay block. Các khối này bao gồm một phần tử làm trễ thô (Coarse delay) có thể được bỏ qua, khối này làm trễ tín hiệu ở mức độ chính xác vừa phải. Tiếp theo là chuỗi 6 phần tử làm trễ được điều khiển bởi các bộ chọn kênh. Đối với đường vào đồng bộ thông qua các phần tử nhớ tới IQ1, IQ2 thì có thể chọn 3 mức làm trễ. Còn đối với đường vào không đồng bộ tới cổng I thì có thể thay đổi ở 6 mức làm trễ. Tất cả khối làm trễ có thể được bỏ qua, khi đó tín hiệu gửi gửi đồng thời tới các chân ra đồng bộ và không đồng bộ. Hình 2.27. Khối làm trễ khả trình Một trong những ứng dụng của khối làm trễ là đảm bảo không vi phạm điều kiện của Thole khi phần tử nhớ hoạt động (Thold là thời gian tối thiểu cần giữ ổn định dữ liệu sau thời điểm kích hoạt của xung nhịp đồng bộ), ví dụ nhớ ở hình vẽ sau: 58
  60. Hình 2.28. Điều chỉnh đầu vào bằng khối làm trễ khả trình 2.3.2.2. Cổng vào ra ở chế độ DDR Khái niệm DDR (Double Data Rate transmission) chỉ dạng đường truyền dữ liệu đồng bộ ở tốc độ gấp 2 lần tốc độ cho phép của xung nhịp đồng hồ bằng cách kích hoạt tại cả thời điểm sườn lên và sườn xuống của xung nhịp. Với cả 3 đường dữ liệu đi dữ liệu có trong IOB, mỗi đường đều có một cặp phần tử nhớ cho phép thực hiện truyền dữ liệu theo phương thức DDR. Hình 2.29. Nguyên lý DDR Hình 2.29 thể hiện các thức hiện thực DDR trong FPGA. Hai phần tử nhớ hoạt động ở chế độ Flip-flop. Đầu ra được nối với Multiplexer DDR_MUX để điểu khiển vào ra dữ liệu. Cùng một thời điểm có hai xung nhịp đồng hồ lệch pha nhau 180o gửi tới đầu vào xung nhịp CLK1, CLK2 với chu kỳ T của Flip-flops. Giả sử tại thời điểm sườn dương của tín hiệu CLK1 Flip-Flop 1 hoạt động, sau đó nửa chu kỳ tại thời điểm sườn âm của xung nhịp CLK1 tương ứng ứng với sườn dương của CLK2 thì Flip-flop 2 làm việc. Như vậy chu kỳ nhận/gửi dữ liệu là T/2 hay tốc độ nhận gửi dữ liệu tăng gấp đôi. 59
  61. Để tạo ra hai xung nhịp lệch pha nhau có thể dùng khối DCM (Digital Clock Manager) từ một tín hiệu xung nhịp chuẩn sinh ra tín hiệu xung nhịp thứ hai bằng cách dịch pha 180o(hình bên trái). Phương pháp này đạt được độ trễ xung nhịp (Clock skew) thấp nhất. Bên cạnh đó phương pháp thứ hai như mô tả ở hình bên phải là dùng cổng đảo có trong IOB để tạo lệch pha 180o 2.3.3. Hệ thống kết nối khả trình Hệ thống kết nối khả trình (Progammable Interconnects) của FPGA dùng để liên kết các phần tử chức năng khác nhau bao gồm IOB, CLB, Block RAM, khối nhân chuyên dụng, DCM với nhau. Hệ thống kết nối của FPGA được thiết kế cân bằng giữa yếu tố linh động và tốc độ làm việc (giảm thiểu trễ do đường truyền gây ra). Đối với các FPGA họ Spartan 3E có 4 loại kết nối sau: kết nối xa (long lines), kết nối kép (double lines), kết nối ba (hex lines), kết nối trực tiếp (direct line). Các dạng kết nối này liên hệ với nhau thông qua cấu trúc ma trận chuyển (switch matrix). 2.3.3.1. Ma trận chuyển Ma trận chuyển (Switch matrix) là các khối thực hiện kết nối giữa các dạng tài nguyên kết nối của FPGA bao gồm kết nối xa, kết nối kép, kết nối ba, kết nối trực tiếp. Ô liên kết (interconnect tiles) được định nghĩa là một khối bao gồm ma trận chuyển và các phần tử chức năng của FPGA như IOB, CLB, Block RAM, Dedicated Multipliers, DCM. Hình 2.30. Các thành phần nối khác nhau trong Xilinx FPGA 60
  62. Với CLB, IOB, DCM chỉ cần 1 ma trận chuyển để tạo thành một ô kết nối nhưng với các phần tử lớn hơn nhơ Sơn Block RAM hay MULT18 thì cần nhiều ma trận kết nối tương ứng có số ô kết nối lớn hơn. 2.3.3.2. Các dạng kết nối Các kiểu kết nối có trong FPGA bao gồm:  Kết nối dài - Long lines Hình 2.31. Đường kết nối xa Đường kết nối xa gồm tổ hợp 24 đường nối 1 trong 4 CLB liên tiếp theo phương ngang hoặc phương dọc. Từ mỗi ô kết nối có 4 đường kết nối thông qua ma trận chuyển để nối với các ô còn lại. Đường kết nối xa có trở kháng thấp do vậy thích hợp cho những tín hiệu toàn cục kiểu như CLK hay Reset.  Kết nối ba Hex lines Hình 2.32. Đường kết nối ba Kết nối 3 là kênh kết nối gồm 8 đường nối tới 1 trong 3 CLB liên tiếp, đối với kết nối dạng này tín hiệu chỉ có thể truyền từ một đầu xác định tới các đầu khác theo hướng mũi tên.  Kết nối kép - Double lines Hình 2.33. Đường kết nối kép 61
  63. Kết nối kép là kênh kết nối gồm 8 đường nối tới 1 trong 2 CLB liên tiếp, đối với kết nối dạng này tín hiệu chỉ có thể truyền từ một đầu xác định tới các điểm khác như hex lines. Số lượng của double lines trong FPGA lớn hơn nhiều so với hai dạng long lines và hex line do khả năng kết nối linh động.  Kết nối trực tiếp - Direct lines Hình 2.34. Đường kết nối trực tiếp Kết nối trực tiếp kết nối các CLB cạnh nhau theo phương ngang, dọc và chéo mà không cần thông qua ma trận kết nối. Việc phân cấp các tài nguyên kết nối trong FPGA tuy làm cho việc thiết kế bản thân FPGA phức tạp hơn cũng như tăng độ phức tạp cho thuât toán kết nối đường truyền nhưng góp phần rất lớn vào việc tiết kiệm diện tích và tối ưu hóa thiết kế trên FPGA. Trên thực tế việc sử dụng tài nguyên kết nối trong FPGA được thực hiện tự động, bản thân người thiết kế ít tham gia vào quá trình này hoặc nếu có chỉ là tạo các tín hiệu toàn cục kiểu như CLK, RS, TST để sử dụng phân bố đã được tối ưu hóa của các tín hiệu này. 2.3.4. Các phần tử khác của FPGA Ngoài các thành phần liệt kê ở hai phần trên, trong FPGA còn được tích hợp thêm các phần tử chức năng đặc biệt khác, đối với Spartan 3E là Khối RAM (Block RAM), và khối nhân chuyên dụng (Dedicated multiplier) 18 bit MULT18. Một số những dòng FPGA khác được tích hợp thêm DSP là khối nhân-cộng 18 bit ứng dụng cho các bài toán xử lý tín hiệu số, ở một số FPGA còn được nhúng cứng vi xử lý như PowerPC 405, ARM để có thể lập trình phần mềm trực tiếp. 62
  64. 2.3.4.1. Khối RAM Bên cạnh nguồn tài nguyên lưu trữ dữ liệu như trình bầy ở trên là RAM phân tán (Distributed RAM) với bản chất là một hình thức sử dụng khác của LUT thì trong Xilinx FPGA còn được tích hợp các RAM (Block RAM) riêng biệt được cấu hình như một khối RAM hai cổng, số lượng này trong Spartan 3E thay đổi từ 4 đến 36 tùy theo từng IC cụ thể. Tất cả Block RAM hoạt động đồng bộ và có khả năng lưu trữ tập trung một khối lượng lớn thông tin. Giao diện của một Khối RAM như sau: Hình 2.35. Giao diện khối RAM Khối RAM có hai cổng A và B vào ra cho phép thực hiện các thao tác đọc ghi độc lập với nhau, mỗi một cổng có các tín hiệu xung nhịp đồng bộ, kênh dữ liệu và các tín hiệu điều khiển riêng. Có 4 đường dữ liệu cơ bản như sau: 1. Đọc ghi cổng A 2. Đọc ghi cổng B 3. Truyền dữ liệu từ A sang B 4. Truyền dữ liệu từ B sang A. Tùy theo từng FPGA cụ thể mà có thể có từ một đến 5 cột bố trí Block RAM, các cột này thường được bố trí bên cạnh cùng các khối nhân 18-bit. 16-bit cổng A phần thuộc khối nhớ bên trên dùng chung với 16 bit cổng A, tương tự như vậy với 16 bit cổng B của Block RAM được chia sẻ với 16 bit cổng B của khối nhân. Vị trí của các Block RAM này trong FPGA thường được bố trí như sau: 63
  65. Hình 2.36. Phân bố của các khối RAM trong Spartan 3E FPGA Về kích cỡ của các khối RAM có thể được cấu hình một trong các dạng sau, nếu ký hiệu M là số hàng, W là số bít dữ liệu, P là số bit kiểm tra chẵn lẻ (Parity) trên một hàng Size = M x (W+P) bit  Cấu hình 16K x 1 không có bit kiểm tra chẵn lẻ  Cấu hình 8K x2 không có bit kiểm tra chẵn lẻ  Cấu hình 4K x 4 không có bít kiểm tra chẵn lẻ  Cấu hình 2K x (8+1), có 1 bit kiểm tra chẵn lẻ  Cấu hình 1K x (16+2) với hai bit kiểm tra chẵn lẻ  Cấu hình 512 x (32+4) với 4 bit kiểm tra chẵn lẻ. Cách kiểm tra chẵn lẻ như sau, mỗi bit kiểm tra tương ứng với 1 byte hay 8 bit dữ liệu, tính chẵn lẻ xác định bằng số lần xuất hiện bit 1 trong chuỗi 8 bit. Ví dụ nêu cấu hình của RAM là 1K x(16+2) có nghĩa là bit Pi là bit kiểm tra chẵn lẻ của Byte như ở hình vẽ dưới đây Hình 2.37. Parity bit calculation 64
  66. Block RAM trêm thực tế đều là các khối RAM hai cổng nhưng các phần tử tương ứng được mô tả trong thư viện chuẩn của Xilinx và có thể được khởi tạo để hoạt động như RAM 2 cổng (Dual-port RAM) hoặc RAM 1 cổng (Single- port RAM). Các cổng vào ra của Block RAM được mô tả ở hình vẽ sau: Hình 2.38. Chi tiết về khối RAM Tên gọi của các RAM được đặt theo cú pháp RAMB16_S(Wa)_S(Wb), trong đó Wa = W+P là tổng độ rộng kênh dữ liệu và số bit kiểm tra. RAM một cổng có tên tương ứng RAM16_SW lược bỏ đi phần tên của một cổng. Ví dụ: RAM16B_S18_S9 nghĩa là RAM hai cổng với tổng độ rộng kênh dữ liệu ở cổng A là 18 bit và cổng B là 9 bit, RAM16B_S34 là khối RAM một cổng với độ rộng kênh dữ liệu là 34 bit. Đối với Block RAM hai cổng các tín hiệu vào ra được mô tả như sau:  CLKA, CLKB là xung nhịp đồng bộ cho các cổng A, B tương ứng  WEA, WEB là tín hiệu cho phép ghi vào cổng A, B tương ứng,  ENA, ENB là tín hiệu cho phép các cổng A, B hoạt động,  SSRA, SSRB là các tín hiệu Set và Reset đồng bộ cho các đầu ra DOA, DOB  ADDRA, ADDRB [r-1] là kênh địa chỉ của các cổng A, B tương ứng trong đó giá trị R tính bằng công thức: r = 14 – log2(W) trong đó W là số bit của kênh dữ liệu.  DIA, DIB[W-1:0] là các kênh dữ liệu vào của cổng A, B. 65
  67.  DIPA, DIPB[p-1:0] là kênh dữ liệu kiểm tra chẵn lẻ vào của cổng A, B.  DOA, DOB[W-1:0] kênh dữ liệu ra của cổng A, B.  DOPA, DOPB[P-1] kênh dữ liệu kiểm tra chẵn lẻ ra của cổng A, B.  Đối với Block RAM một cổng tên các tín hiệu giữ nguyên như trên nhưng bỏ bớt hậu tố A hoặc B vì chỉ có một cổng duy nhất. 2.3.4.2. Khối nhân chuyên dụng 18x18 Các khối nhân chuyên dụng 18bitx18bit (Dedicated Multiplier) được thiết kế riêng, thường được ứng dụng trong các bài toán xử lý tín hiệu số, ký hiệu là MULT18x18SIO trong thư viện chuẩn của Xilinx. Các khối nhân được đặt tại các vị trí sát với các Block RAM nhằm kết hợp hai khối này cho những tính toán lớn với tốc độ cao. Số lượng của các khối này bằng với số lượng của các khối RAM trong FPGA, ngoài ra hai thành phần này còn chia sẻ với nhau các cổng A, B 16 bit dùng chung Khối nhân trong Spartan 3E thực hiện phép nhân hai số18 bit có dấu, kết quả là một số 36 bit có dấu. Phép nhân không dấu được thực hiện bằng cách giới hạn miền của số nhân và số bị nhân (bit dấu luôn bằng 0). Mô tả các cổng vào ra của phần tử nhân MULT18X18SIO thể hiện ở hình sau: Hình 2.39. Cổng vào ra của khối nhân 18 bit Khối nhân có tất cả 13 cổng vào ra với các chức năng như sau:  A, B[17:0] là cổng vào 18 bit số nhân và số bị nhân.  P[35:0] là 36 bit kết quả nhân (Product) 66
  68.  CEA, CEB là tín hiệu cho phép xung nhịp ở các đầu vào A, B  RSTA, RSTB, RSTP là các cổng Set/Reset đồng bộ tương ứng cho các giá trị A, B, P.  CLK là tín hiệu xung nhịp đồng bộ cho các Flip-flop trong khối nhân  BCIN, BCOUT[17:0] là các cổng vào ra tương ứng nhằm chia sẻ giá trị số bị nhân giữa các khối nhân với nhau nhằm mục đích tạo thành các khối nhân nhiều bit hơn. BCOUT = BCIN. Pipelined option: Khối nhân có thể được thực hiện như một khối tổ hợp thuần túy hoặc có thể chia nhỏ bởi các thanh ghi để đạt hiệu suất làm việc cao hơn. Cấu trúc pipelined của khối nhân thể hiện ở hình sau: Hình 2.40. Cấu trúc pipelined của khối nhân Các nhân tử A, B và kết quả P có thể được lưu trong các thanh ghi trung gian gồm AREG, BREG, PREG, mỗi thanh ghi là một chuỗi các Flip-flop. Trong cấu trúc pipelined đó thì REGA, REGB có cùng mức. Bên cạnh khả năng cấu trúc dạng pipelined để tăng tốc cho phép toán, các khối nhân có thể được kết hợp với nhau thông qua cổng BCIN và BCOUT để thực hiện phép nhân với các nhân tử lớn hơn. Ví dụ khi tiến hành phép nhân hai số 22 bit x 16 bit có thể được thực hiện theo sơ đồ sau: 67
  69. Hình 2.41. Hiện thực phép nhân 22x16 bằng khối nhân 18 bit Để thực hiện phép nhân trên số nhân 22 bít được phân tách thành 4 bit thấp và 18 bít cao, các phần này lần lượt được gửi tới một khối nhân thường 16 bit x 4 bit và một khối nhân 18bit x 18bit MULT18X18SIO. Kết quả hai phép nhân ở khối nhân thường là một số 20 bit trong đó 16 bít cao được gửi tới bộ cộng để cộng với 34-bit kết quả từ khối nhân MULT18X18SIO. Kết quả thu được bằng cách ghép 4 bit thấp với 34 bit tổng để tạo thành số 38-bit 2.3.4.3. Khối điều chỉnh xung nhịp đồng bộ Digital Clock Manager (DCM) là một khối đặc biệt trong FPGA có nhiệm vụ điều chỉnh và tạo ra xung nhịp đồng bộ (Clock) theo những yêu cầu cụ thể của bài toán. DCM có cấu tạo không đơn giản và có số lượng hạn chế (2-4 DCM trong Spartan 3E). 3 thao tác chính mà khối DCM có thể thực hiện là: - Loại bỏ độ trễ giữa các xung Clock ở các vị trí khác nhau (Clock Skew Elimination). Xung đồng bộ gửi tới các thành phần khác nhau trong FPGA có thể không đến đồng thời do sự khác biệt về tải đường truyền. DCM có khả năng tăng các giá trị Thold, Tsetup của xung đồng bộ và thời gian từ điểm kích hoạt cho tới khi đầu ra ổn định Tclk_q để”đồng nhất” các xung đồng bộ. Trong các bài toán đòi hỏi làm việc với tần số cao thì đây là một trong những thao tác không thể bỏ qua. - Tổng hợp tần số (Frequency Synthesis): Tổng hợp tần số ở đây bao gồm nhân và chia tần số, với tần số cố định đầu vào DCM có thể thực hiện thao tác nhân tần số với 1 số M, chia cho một số D hoặc đồng thời nhân và chia M/D. Đây là một khả năng đặc biệt quan trọng cho những bài toán yêu cầu tần số làm việc là cố định như điều khiển VGA, DAC, ADC, LCD - Dịch pha (Phase shifting) Dịch pha của xung nhịp đồng bộ đi 0, 90, 180, hoặc 270 độ. 68
  70. Hình 2.42. Sơ đồ khối DCM Khối DCM được cấu tạo từ 4 khối chính, khối dịch pha PhS (Phase shifter), khối lặp khóa pha DLL (Delay Locked Loop), khối tổng hợp tần số DFS (digital Frequency Synthesis) và khối Trạng thái logic của DCM. Khối DLL: Khối DLL được cấu tạo bởi một chuỗi các phần tử làm trễ mà thực chất các khối đếm. DLL có đầu vào xung nhịp CLKIN, đầu vào CLKFB (CLOCK FEEBACK), xung nhịp này sẽ được sử dụng để so sánh pha ở khối Phase detection để thực hiện điều chỉnh pha thông qua một vòng lặp hồi tiếp dương, tùy thuộc vào cấu hình cài đặt mà CLKFB có thể là đầu ra CLK2X hoặc CLK0 (đây cũng là đặc điểm khác biệt giữa DLL và PLL). Hình 2.43. Sơ đồ khối DCM 69
  71. DLL có 7 đầu ra xung nhịp CLK0, CLK90, CLK180, CLK270, CLK2X (nhân đôi tần số), CLKDV (chia tần) và một đầu ra LOCKED báo hiệu khi pha giữa CLKFB và CLKIN đã trùng nhau. Khối DLL có các tham số như sau: Khối tổng hợp tần số DFS có thể được thực hiện độc lập hoặc trên nền tảng của DLL, chi tiết xem thêm trong tài liệu của Xilinx. DFS có đầu vào là CLKIN và hai đầu ra là CLKFX và CLKFX180, trong đó CLKFX = CLKIN * M/D Còn CLKFX180 là CLKFX bị dịch pha 180 độ. M là hệ số nhân, D là hệ số chia được định nghĩa khi cài đặt DCM bởi các tham số tương ứng CLKFX_MULTIPLY (giá trị nguyên từ 2-32) và CLKFX_DIVIDE, (giá trị nguyên từ 1 – 32). Khối dịch pha PS: Bản thân DLL cung cấp các đầu ra với độ lệch pha chuẩn lần lượt là 0, 90, 180, 270, ngoài ra trong DCM còn có khối PS cho phép “tinh chỉnh” độ lệch pha của tín hiệu CLKIN và CLKFB với độ phân giản (-255 + 255) trên miền (-360 + 360) độ như ở hình sau: 70
  72. Hình 2.44. Sơ đồ khối dịch pha Trong chế độ không dịch pha thì CLKIN và CLKFB đồng pha, trong chế độ dịch pha thì CLKFB có thể lệch so với CLKIN một đại lượng pha tương ứng tPS= P/256 * TCLKIN. Khi CLKFB và CLKIN lệch pha thì sẽ dẫn tới sự lệch pha tương ứng của tất cả các đầu ra kể trên. Các tham số và tín hiệu của khối dịch pha liệt kê ở hai bảng sau: 71
  73. 2.4. Các khối giao tiếp có trên mạch Xilinx Spartan 3E Starter Kitboard FPGA 2.4.1. Các thành phần chính của Xilinx Spartan 3E Starter Kitboard 1. Xilinx XC3S500E Spartan-3E FPGA : con chính của KIT 2. Xilinx 4 Mbit Platform Flash configuration PROM 3. Xilinx 64-macrocell XC2C64A CoolRunner CPLD 4. 64 MByte (512 Mbit) of DDR SDRAM, x16 data interface, 100+ MHz 5. 16 MByte (128 Mbit) of parallel NOR Flash (Intel StrataFlash) 6. 16 Mbits of SPI serial Flash (STMicro) 7. 2-line, 16-character LCD screen 8. PS/2 mouse or keyboard port 9. VGA display port 10. 10/100 Ethernet PHY (requires Ethernet MAC in FPGA) 11. Two 9-pin RS-232 ports (DTE- and DCE-style) 12. On-board USB-based FPGA/CPLD download/debug interface 13. 50 MHz clock oscillator 14. SHA-1 1-wire serial EEPROM for bitstream copy protection 15. Hirose FX2 expansion connector 16. Three Digilent 6-pin expansion connectors 17. Four-output, SPI-based Digital-to-Analog Converter (DAC) 18. Two-input, SPI-based Analog-to-Digital Converter (ADC) with programmable-gain pre-amplifier 19. ChipScope™ SoftTouch debugging port 20. Rotary-encoder with push-button shaft 21. Eight discrete LEDs 22. Four slide switches 72
  74. Spartan3E dòng FPGA trung bình được thiết kế cho những ứng dụng cỡ vừa và nhỏ với chi phí không lớn. Có tất cả 5 loại Spartan 3E với mật độ tích hợp từ 960 Slices(XC3S200) cho tới 14752 Slices (XC3S1600), nếu tính theo đơn vị cổng tương đương là 2000 cho tới 30000 cổng (cổng tương đương được tính là một cổng AND hoặc OR hai đầu vào). XC3S500 được thiết kế trên công nghệ 90nm và cho phép làm việc ở xung nhịp tối đa đến 300Mhz, với tốc độ như vậy XC3S500 có thể đáp ứng hầu hết những bài toán xử lý số cỡ vừa và nhỏ. 2.4.2. Mạch nạp JTAG/PLATFORM FLASH XCF04 Mạch nạp cho FPGA sử dụng Xilinx platform Flash ROM XCF04 dung lượng 4Mb, có khả năng nạp trực tiếp cấu hình vào FPGA thông qua giao tiếp JTAG hoặc nạp gián tiếp cấu hình để lưu trữ cố định trong ROM, khi cần nạp lại cấu hình vào FPGA chỉ việc ấn phím PROG. Chương trình lưu trong ROM có thể được đọc/xóa và ghi mới lại 2.4.3. Khối nguồn Power Supply Khối nguồn là một khối quan trọng cung cấp cho chip FPGA yêu cầu cấp các nguồn điện áp một chiều 3,3V, 2.5V và 1.2V. Cho Xilinx Flash Platform XFC04 yêu cầu nguồn 3.3V. Với tất cả các ngoại vi còn lại sử dụng các mức điện áp phổ biến là 5.0V và 3.3V. Tất cả các mức điện áp này được tạo bởi các IC nguồn chuyên dụng tích hợp trên mạch. Để mạch hoạt động chỉ cần cung cấp điện áp đầu vào DC 5V. 2.4.4. Khối giao tiếp Keypad Trong sơ đồ sử dụng 5 Keypad độc lập có thể sử dụng cho nhiều mục đích khác nhau, các phím này được treo ở mức cao. Ngoài ra có hai Keypads được nối cứng với FPGA thông qua các chân P90 và P89 để sử dụng trực tiếp trong các thiết kế. 2.4.5. Khối 8x2 Led-Diod Khối hiển thị LED được thiết kế gồm 2x8 LED đơn treo trở 10K trong đó 8LEDs được gắn cứng với FPGA thông qua các chân P153, P152, P151, P150, P147, P145, P146, P144. 8LEDs còn lại để mở khi sử dụng phải kết nối bằng cáp riêng. Tất cả các LED này được trở 1K và có mức tích cực là 1. 73