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).
- 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ó
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).
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:
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
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ề
* 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.
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.
* 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.
Đầ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
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
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