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.
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.
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..
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.
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:
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.
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:
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…
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).
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:
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.