Giáo trình Thiết kế mạch logic số - Chương IV: Thiết kế vi mạch số trên FPGA

pdf 81 trang ngocly 2770
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Thiết kế mạch logic số - Chương IV: Thiết kế vi mạch số trên FPGA", để 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:

  • pdfgiao_trinh_thiet_ke_mach_logic_so_chuong_iv_thiet_ke_vi_mach.pdf

Nội dung text: Giáo trình Thiết kế mạch logic số - Chương IV: Thiết kế vi mạch số trên FPGA

  1. Chương IV: Thiết kế vi mạch số trên FPGA 1 Tổng quan về kiến trúc FPGA 1.2 Khái niệm FPGA FPGA là công nghệ IC lập 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 bình 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 đặc điểm làm FPGA trở thành một công nghệ PLD được phát triển và nghiên cứu 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, 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ớ động (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 logic trong IC. Nói một cách khác 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 đọc lần lượt nạp vào vi xử l{. Cũng như vậy 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 sau đó mới diễn ra quá trình tái cấu trúc theo thông tin chứa trong SRAM. SRAM chỉ lưu trữ được trong trạng thái làm việc, nghĩa là có 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ì các ROM ngoại vi này dần được thay thế bằng các ROM tích hợp sẵn, việc tích hợp này làm FPGA nạp cấu hình nhanh hơn nhưng cơ chế thực hiện vẫn phải thông qua một bộ nhớ SRAM như cũ. 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 hơn hẳn, với số cổng logic tương đương lên tới hàng trăm nghìn, hàng triệu Chương III -Thiết kế vi mạch số trên FPGA 1
  2. 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 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 chíp 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 số phức tạp đòi hỏi không những tốc độ cao mà còn nhiều tài nguyên logic. 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à Spartan, Altera với Stratix, Cyclone, Arria, Bên cạnh đó còn có sản phẩm của Lattice Semiconductor Company, Actel, Achronix, BlueSilicon Tecnology 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. Tài nguyên logic của FPGA được thể hiện ở bảng so sánh sau: IC Transitor count Process Manufacture Pentium 2 7 500 000 0.35um Intel Pentium 4 42 000 000 180nm Intel Core 2 Duo 291 000 000 65nm Intel Six core Xenon 1 900 000 000 45nm Intel AMD K8 106 000 000 130nm AMD Virtex 4 1 000 000 000 90nm Xilinx Virtex 5 1 100 000 000 65nm Xilinx Chương III -Thiết kế vi mạch số trên FPGA 2
  3. Starix IV 2 500 000 000 40nm Altera Virtex 6 ~2 600 000 000 65 nm Xilinx Theo bảng so sánh 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 server như Xenon 6 nhân. 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. 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 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 semi-custom ASIC. 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, soạn thảo, nhận dạng ảnh số - Ứ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, radio -Ứ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. Chương III -Thiết kế vi mạch số trên FPGA 3
  4. 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 Hình 3.1 SRAM-based FPGA 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 switch matrix 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 dẫn kênh Multiplexer. Thông tin điều khiển từ SRAM cho phép Multiplexer 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 kz một hàm logic bất kz 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), 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ớ Chương III -Thiết kế vi mạch số trên FPGA 4
  5. (Table). Về bản chất cấu trúc này cũng giống như khối chọn kênh (Multiplexer) cỡ lớn. Trong FPGA điển hình sử dụng các LUT có 4 bit đầu vào và 1 bit đầu ra. 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 tương tự như cấu trúc này. 1.4 Kiến trúc tổng quan Hình 3.2 trình bày cấu trúc tổng quan nhất cho các loại FPGA hiện nay. Cấu trúc chi tiết và tên gọi của các thành phần có thể thay đôi tùy theo các hãng sản xuất khác nhau nhưng về cơ bản FPGA được cấu thành từ các Khối Logic (Logic Block) số lượng của các khối khối này thay đổi từ vài trăm (Xilinx Spartan) đến vài chục nghìn (Xilinx Virtex6) được bố trí dưới dạng ma trận, chúng được nối với nhau thông qua hệ thống các kênh kết nối khả trình. Hệ thống này còn có nhiệm vụ kết nối với các cổng giao tiếp vào ra (IO_PAD) của FPGA. Số lượng các chân vào ra thay đổi từ vài trăm đến cỡ hơn một nghìn. Bên cạnh các thành phần chính đó, những FPGA cỡ lớn còn được tích hợp những khối thiết kế sẵn mà thuật ngữ gọi là IP cores, các IP cores này có thể là các bộ nhớ RAM, ROM, khối thực hiện phép nhân, khối thực hiện phép nhân cộng (DSP) Chương III -Thiết kế vi mạch số trên FPGA 5
  6. IO_PAD IO_PAD IO_PAD I O _ I P O A LOGIC BLOCK LOGIC BLOCK _ D LOGIC BLOCK P A D I O I _ O P LOGIC BLOCK LOGIC BLOCK LOGIC BLOCK _ A P D A D IP_COREs, RAM, Interconnect ROM wires . . I I O O _ _ P P A LOGIC BLOCK LOGIC BLOCK A D LOGIC BLOCK D IO_PAD IO_PAD IO_PAD Hình3.2. Kiến trúc tổng quan của FPGA 2. Kiến trúc chi tiết Xilinx FPGA Spartan-3E. Để hiểu chi tiết về cấu trúc của FPGA phần dưới đây ta sẽ đi nghiên cứu một cấu trúc cụ thể của FPGA Spartan 3E, tài liệu gốc có thể tìm thấy trên trang web của Xilinx, người đọc nên tham khảo thêm để hiểu kỹ hơn vấn đề. Hình vẽ dưới đây thể hiện cấu trúc tổng quan của họ FPGA này. Chương III -Thiết kế vi mạch số trên FPGA 6
  7. Hình 3.3. Kiến trúc tổng quan của Spartan 3E FPGA FPGA Spartan 3E được cấu trúc từ các thành phần sau: CLBs (Configurable Logic Blocks) Là các khối logic lập trình được chứa các LUTs và các phần tử nhớ flip-flop có thể được cấu trúc thực hiện các hàm khác nhau. IOBs (Input/Output Blocks) là các khối điều khiển giao tiếp giữa các chân vào của FPGA với các khối logic bên trong, hỗ trợ được nhiều dạng tín hiệu khác nhau. Các khối IO được phân bố xung quanh mảng các CLB. Block RAM các khối RAM 18Kbit hỗ trợ các cổng đọc ghi độc lập, với các FPGA họ Spartan 3 block RAM thường phân bố ở hai cột, mỗi cột chứa một vài module RAM 18Kbit, mỗi khối RAM được nối trực tiếp với một khối nhân 18 bit. Dedicated Multiplier: Các khối thực hiện phép nhân với đầu vào là các số 18 bit. DCM (Digital Clock Manager) Các khối làm nhiệm vụ điều chỉnh, phân phối tín hiệu đồng bộ tới tất cảc các khối khác. DCM thường được phân bố ở giữa, với hai khối ở trên và hai khối ở dưới. Ở một số đời FPGA Spartan 3E DCM còn được bố trí ở giữa. Chương III -Thiết kế vi mạch số trên FPGA 7
  8. 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. 2.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 3.4: Hình 3.4. Phân bố của các CLB 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ể. 2.1.1. SLICE Mỗi CLB được cấu tạo thành từ 4 slices và 4 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. 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. Thiết kế như vây xuất phát từ thực tế là nhu cầu thực hiện logic thường lớn hơn so với nhu cầu lưu trữ dữ liệu do vậy việc hỗ trợ một nửa làm việc như phần tử nhớ làm Chương III -Thiết kế vi mạch số trên FPGA 8
  9. 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 3.5 Bố trí slice bên trong 1 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à F5MUX, 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ư trình bày trên hình 3.6. Chương III -Thiết kế vi mạch số trên FPGA 9
  10. Hình 3.6 Phân bố tài nguyên trong SLICEM và SLICEL Cấu trúc chi tiết của một Slices được thể hiện ở hình dưới đây: Hình 3.7. Cấu trúc chi tiết của Slice Chương III -Thiết kế vi mạch số trên FPGA 10
  11. 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 là phần trên và phần dưới, mỗi phần chứa các thành phần 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. 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 dưới đây). 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 multiplexers, tham gia như một đầu vào của chuỗi bit nhớ. Chương III -Thiết kế vi mạch số trên FPGA 11
  12. 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ớ) 2.1.2. Bảng tham chiếu Hình 3.8: 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 vvà đượ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à FFX và 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 kz với 4 đầu vào. Cấu trúc của LUT được thể hiện ở hình sau: Hình 3.9 Cấu trúc của LUT LUT bản chất là một bộ chọn kênh 16 đầu vào (Multiplexer), 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 Multiplexer. Khi cần thực hiện một hàm logic bất kz nào đó, một bảng nhớ Chương III -Thiết kế vi mạch số trên FPGA 12
  13. 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 Multiplexer. khi làm việc tùy vào giá trị của A*3:0+ đầu ra sẽ nhận một trong số 16 giá trị lưu trữ tương ứng trong SRAM. 2 LUTs có trong SLICEM có thể được cấu trúc để làm việc như 16x1 RAM gọi là Distributed RAM hoặc được cấu trúc để làm việc như một thanh ghi dịch 16-bit SHL16. Cấu trúc của các phần tử này sẽ được nghiên cứu kỹ hơn ở phần 1.3.2.6 và 1.3.2.7. 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 wide- multiplexers. 2.1.3. Phần tử nhớ Phần tử nhớ (Storage elements) có trong CLB FFX, FFY có thể được cấu hình là các D flip-flop hoặc là 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-flipflop 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. Chương III -Thiết kế vi mạch số trên FPGA 13
  14. 2.1.4. 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 Multiplexer đặc biệt gọi là Bộ chọn kênh mở rộng (Wide-multipexer) F5MUX và FiMUX. Hình 3.9: 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, Carry chain, Shift- register, Distributed RAM ở 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. X5 X4 X3 X2 X1 Y 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 LUT0 OUT0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 OUT 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 LUT1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 1 OUT1 Chương III -Thiết kế vi mạch số trên FPGA 14
  15. 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 Hình 3.10 Nguyên lý làm việc vủa F5MUX Đầu tiên đối với hàm 5 biến OUT = F(X1, X2, X3, X4, X5) bất kz 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 3.11 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 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. Chương III -Thiết kế vi mạch số trên FPGA 15
  16. 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. 2.1.5. 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 logic (arithmetic chain) đặc biệt khác, 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 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 Các chuỗi này được tạo thành bằng các multiplexers 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. Carry chain là 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 kz 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 Carry chain và Arithmetic chain 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), Chương III -Thiết kế vi mạch số trên FPGA 16
  17. 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. 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ớ. Chương III -Thiết kế vi mạch số trên FPGA 17
  18. Hình 3.12 Chuỗi bit nhớ (Carry chain) 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 2 bit đầy đủ gọi là FULL_ADDER. Hình 3.13: 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. Chương III -Thiết kế vi mạch số trên FPGA 18
  19. Đị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 3.14: Sơ đồ logic của FULL_ADDER trên FPGA 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 3.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 3.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 Chương III -Thiết kế vi mạch số trên FPGA 19
  20. 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 3.15: Cách tính tổng các tích riêng trong phép nhân Sơ đồ trên biểu diễn phép nhân B0B1 vớ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 3.15 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ơ đồ 3.12, 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: Chương III -Thiết kế vi mạch số trên FPGA 20
  21. Hình 3.16: Tối ưu hóa 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 phần tử nhân riêng (dedicated multipliers) 18-bit x 18-bit. 2.1.6. 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. Chương III -Thiết kế vi mạch số trên FPGA 21
  22. Hình 3.17: Distributed RAM trong FPGA Distributed RAM trong FPGA có thể sử dụng ở một trong hai dạng như hinhg 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 3.18: Thao tác đọc ghi dữ liệu của Distributed RAM trong Xilinx FPGA Chương III -Thiết kế vi mạch số trên FPGA 22
  23. Tài nguyên Distributed RAM 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 (Wide- Multiplexer), khi đó các cổng BX, BY được sử dụng như các bit địa chỉ bổ xung. 2.1.7. 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 3.20 Sử dụng LUT như 16-bit Shifter 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. Chương III -Thiết kế vi mạch số trên FPGA 23
  24. Hình 3.21 Cấu trúc của thanh ghi dịch trong FPGA Đầ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. 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 3.22 Mở rộng thanh ghi dịch ở chế độ địa chỉ Chương III -Thiết kế vi mạch số trên FPGA 24
  25. 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 3.23. Sử dụ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 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 Distributed RAM hay Arithmetic chain, 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 là tự động,. Có thể sử dụng thanh ghi dịch như một phần tử (component) có sẵn trong thư viện FPGA để thu được hiệu quả cao hơn. Chương III -Thiết kế vi mạch số trên FPGA 25
  26. 2.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: Hình 3.24 Sơ đồ nguyên lý của IO block 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 (package pin) 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 3.24 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 Chương III -Thiết kế vi mạch số trên FPGA 26
  27. (Three state path), mỗi đường này đều chứa các khối làm trễ lập trình được và cặp phần tử nhớ có khả năng làm việc như Latch hoặc D-flipflop. - Đường 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. Khi sử dụng các khối làm trễ khả trình thì thường được cấu hình để đảm bảo cho yêu cầu về giá trị hold time của phần tử nhớ. - Đườ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à đường dẫ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 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 đi qua hai phần tử nhớ trước khi tới khối điều khiển 3 trạng thái. 2.2.1. Cổng vào với độ trễ khả trình Mỗi một đườ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 được gửi đồng thời tới các chân ra đồng bộ và không đồng bộ. Chương III -Thiết kế vi mạch số trên FPGA 27
  28. Hình 3.25. 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 Thold 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: Hình 3.26. Tránh vi phạm điều kiện Thold bằng khối làm trễ khả trình 2.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 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. Chương III -Thiết kế vi mạch số trên FPGA 28
  29. Hình 3.27. Double data rate transmission Hình 3.26 thể hiện các thức hiện thực DDR trong FPGA. Hai phần tử nhớ hoạt động ở chế độ Flipflop. Đầ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 kz 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 kz tại thời điểm sườn âm của xung nhịp CLK1 tương ứng với sườn dương của CLK2 thì Flip-flop 2 làm việc. Như vậy chu kz 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. Để 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 scew) 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 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, Dedicated Multipliers, 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). Chương III -Thiết kế vi mạch số trên FPGA 29
  30. 2.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 3.28 Các ô kết nối khác nhau trong Xilinx FPGA 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ư 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.2 Các dạng kết nối Các kiểu kết nối có trong FPGA bao gồm: Long lines Hình 3.29 Đường kết nối long lines Chương III -Thiết kế vi mạch số trên FPGA 30
  31. Đườ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 RS. Hex lines Hình 3.30. Hex lines interconnect Hex lines 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 như trong hình 3.29. Double lines Hình 3.31 Double lines interconnect Double lines 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. Direct lines Hình 3.32 Direct lines interconnect Chương III -Thiết kế vi mạch số trên FPGA 31
  32. Direct lines hay 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 (Routing) 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.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à Block RAM, và khối nhân 18 bit MULT18. 2.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à Distributed RAM với bản chất là một hình thức sử dụng của LUT thì trong Xilinx FPGA còn được tích hợp các khối 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. Cấu trúc bên trong của một Block RAM như sau: Hình 3.33 Block RAM structure Chương III -Thiết kế vi mạch số trên FPGA 32
  33. 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ộ, bus 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. Vị trí của các Block RAM này trong FPGA thể hiện như ở hình sau: Hình 3.34 Block RAM location 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ề 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 hinhg 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ẻ Chương III -Thiết kế vi mạch số trên FPGA 33
  34. 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 Bytei như ở hình vẽ dưới đây Hình 3.35 Parity bit calculation Block RAM trêm thực tế đều là các khối RAM hai cổng(Dual port) 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ư Dual-port RAM hoặc Single-port RAM. Các cổng vào ra của phần tử Block RAM được mô tả ở hình vẽ sau: Hình 3.36 Block RAM port detail 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, Chương III -Thiết kế vi mạch số trên FPGA 34
  35. 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àocủa cổng A, B. 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.4.2. Khối nhân 18x18 Các khối nhân 18bit x 18bit (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: Chương III -Thiết kế vi mạch số trên FPGA 35
  36. Hình 3.37 Interface of Dedicated Multiplier primitive 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) 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 xuấ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 3.38 Cấu trúc pipelined của khối nhân Chương III -Thiết kế vi mạch số trên FPGA 36
  37. 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 3.39. Hiện thực phép nhân 22 x 16 bằng MULT18X18SIO Để 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 3. Quy trình thiết kế FPGA Một trong những yếu tố góp phần vào sự thành công của FPGA phải kể đến là có một quy trình thiết kế đơn giản, hoàn thiện được thực hiện bằng các bộ phần mềm chuyên dụng. Các phần mềm này được tích hợp nhiều các thuật toán xử lý tối ưu khác nhau nhằm tăng tính tự động hóa cho quy trình thiết kế. Nội dung của những phần dưới đây được viết dựa trên cơ sở các bước thiết kế FPGA bằng tổ hợp phần mềm Xilinx ISE (Integrated Software Enviroments). Để tìm hiểu kỹ hơn người đọc có thể tham khảo thêm các tài liệu gốc có trên trang chủ của Xilinx. Chương III -Thiết kế vi mạch số trên FPGA 37
  38. Có một số điểm khác nhau cho từng loại FPGA hay cho FPGA của từng hãng nhưng quy trình thiết kế IC số sử dụng FPGA chung đều có thể chia thành các các bước thể hiện ở sơ đồ dưới đây: Hình 3.40. Quy trình thiết kế trên FPGA 3.1 Mô tả thiết kế Sau khi đã có sơ đồ thuật toán chi tiết thì việc tiến hành mô tả vi mạch bằng HDL. Trong chương trình ISE người dùng mô tả thiết kể không chỉ bằng HDL mà còn bằng sơ đồ (schematic). Khi chọn mô tả bằng schematic thì ISE cung cấp một thư viện các phần tử dưới dạng đồ họa (graphic symbols) như các khối cộng, trừ, buffer, thanh ghi, khối nhân, RAM, cổng vào ra Người thiết kế sẽ sử dụng các phần tử này và thực hiện kết nối trên sơ đồ để tạo thành mạch hoàn chỉnh. Mạch này sau khi kiểm tra có thể sử dụng làm đầu vào cho bước tiếp theo là tổng hợp thiết kế. Chương III -Thiết kế vi mạch số trên FPGA 38
  39. Hình 3.41. Minh họa mô tả bằng sơ đồ trong môi trường Xilinx ISE Tuy vậy việc mô tả bằng sơ đồ có rất nhiều điểm hạn chế như không thể hiện được thiết kế lớn, khó kiểm soát và trong phần lớn các trường hợp không độc lập với công nghệ. Sử dụng HDL người thiết kế có thể dễ dàng hơn trong việc mô tả các thiết kế cỡ lớn bằng cách ghép từ các mô tả của các module nhỏ, thêm vào đó do khả năng độc lập với công nghệ nên bản mô tả bằng HDL có thể được tổng hợp trên các nền công nghệ khác nhau và cho phép chia sẻ, tái sử dụng dễ dàng. Mã nguồn VHDL viết cho một đối tượng FPGA cụ thể có thể được viết ở nhiều cấp độ chi tiết khác nhau. Người thiết kế có thể viết ở dạng mô tả chức năng trên các thư viện hỗ trợ sẵn hoặc mô tả cụ thể ở mức cổng. Khi mô tả cụ thể ở các cổng thì tùy theo yêu cầu có thể sử dụng trực tiếp các phần tử chức năng được mô tả sẵn trong thư viện UNISIM của FPGA như LUT, block RAM, multiplier gọi chung là FPGA library primitives. Việc sử dụng trực tiếp như vậy có thể mang lại tính tối ưu cao cho thiết kế nhưng sẽ khiến chon mô tả mã nguồn VHDL phụ thuộc vào đối tượng công nghệ. Nếu người sử dụng mô tả ở Chương III -Thiết kế vi mạch số trên FPGA 39
  40. mức chức năng thì việc sử dụng tài nguyên như thế nào sẽ phụ thuộc vào bước tổng hợp thiết kế. Trên thực tế thì những trình tổng hợp FPGA thực hiện nhiệm vụ của mình khá tốt và mô tả sau khi tổng hợp thường có tính tối ưu cao. Chính vì người thiết kế nên sử dụng nhiều các mô tả ở mức độ chức năng, còn mô tả cấp độ cổng chỉ dùng khi thật sự cần thiết. 3.2 Tổng hợp thiết kế Quá trình tổng hợp FPGA (FPGA Synthesis) bằng chương trình ISE bao gồm các bước như sau. LOGIC SYNTHESIS CREATE CREATE RTL CHECK SYNTAX GENERATE TECHNOLOGY SCHEMATIC & SYNTHESIS NETLIST SCHEMATIC Hình 3.42. Tổng hợp thiết kế FPGA trên Xilinx ISE Check Syntax & Synthesis: Trước khi thiết kế được tổng hợp thì mã nguồn VHDL được biên dịch và kiểm tra trước. Nếu xuất hiện lỗi cú pháp ở mã nguồn thì qua trình tổng hợp sẽ dừng lại. Nếu mô tả VHDL không có lỗi thì chuyển sang bước thứ hai là tổng hợp (synthesis). Tổng hợp thiết kế là chuyển mô tả tử mức trừu tượng cao (con người có thể đọc hiểu) xuống mức trừu tượng thấp hơn (máy tính mới có khả năng đọc hiểu). Đối với FPGA quá trình tổng hợp logic là quá trình biên dịch từ mô tả chức năng sang mô tả cổng (netlist). Mô tả cổng bản chất vẫn là các mô tả VHDL nhưng sử dụng các cổng cơ bản của FPGA, hiểu một cách khác nếu mô tả chức năng là sơ đồ nguyên lý thì mô tả netlist là sự chi tiết hóa sơ đồ nguyên lý. Các mã nguồn VHDL được chia thành hai dạng là tổng hợp được (Synthesizable) và không tổng hợp được (Simulation only), việc phân biệt hai dạng mã nguồn này được ISE làm tự động. Điểm đáng lưu { tại thời điểm này là quá trình tổng hợp bao gồm cả quá trình tối ưu logic cho thiết kế, ví dụ nếu chúng ta sử dụng bộ trừ để làm phép so sánh nhưng về thực chất để so sánh hai số chỉ cần thiết lập bít nhớ cuối Chương III -Thiết kế vi mạch số trên FPGA 40
  41. cùng của phép trừ mà không cần quan tâm đến bản thân giá trị thu được của phép tính. Chính vì vậy sau khi tổng hợp ta nhận được cảnh báo (Warning) từ chương trình. Xst:646 - Signal > is assigned but never used. This unconnected signal will be trimmed during the optimization process. Tất cả những tín hiệu thừa sẽ bị bỏ đi sau khi tổng hợp nhằm tiết kiệm tài nguyên FPGA, nếu muốn bỏ cảnh báo này chúng ta có thể thay đổi thiết kế của bộ so sánh bằng cách mô tả chi tiết chuỗi nhớ thay vì dùng cả bộ cộng/trừ 4 bit. Những cảnh báo dạng này thuộc dạng vô hại vì nó không ảnh hưởng tới chức năng của mạch. Tuy vậy kinh nghiệm thực tế cho thấy trong mọi trường hợp việc kiểm tra các cảnh báo là cực kz cần thiết vì một thiết kế được biên dịch và mô phỏng đúng rất có thể chức năng của mạch bị thay đổi do việc tối ưu (cắt bỏ các tín hiệu bị coi là thừa), hoặc nhờ những cảnh báo này có thể tìm ra những sai sót trong sơ đồ nguyên lý, nhất là với những thiết kế phức tạp. Synthesis report: Kết quả tổng hợp được ghi dưới dạng một tệp văn bản, trong đó thống kê về các phần tử logic, các phần tử nhớ, số LUT, số cổng vào ra (IO_BUF) và tham số về mặt thời gian, ví dụ kết quả tổng hợp như sau: === * Final Report * === Final Results RTL Top Level Output File Name : sp3_led.ngr Top Level Output File Name : sp3_led Output Format : NGC Optimization Goal : Speed Keep Hierarchy : NO Device utilization summary: Selected Device : 3s500epq208-4 Number of Slices: 4 out of 4656 0% Number of 4 input LUTs: 8 out of 9312 0% Number of IOs: 16 Number of bonded IOBs: 16 out of 158 10% Partition Resource Summary: No Partitions were found in this design. === TIMING REPORT Timing Summary: Chương III -Thiết kế vi mạch số trên FPGA 41
  42. Speed Grade: -4 Minimum period: No path found Minimum input arrival time before clock: No path found Maximum output required time after clock: No path found Maximum combinational path delay: 6.320ns Timing Detail: All values displayed in nanoseconds (ns) Khi phân tích kết quả tổng hợp cần lưu { hai thông tin cơ bản. Thứ nhất là thông tin về tài nguyên, trong báo cáo sẽ liệt kê các dạng tài nguyên và số lượng của từng loại được sử dụng cho toàn khối thiết kế (Device utilization summary). Thông tin này trong một số trường hợp còn giúp người thiết kế kiểm định lại sơ đồ thuật toán ban đầu bằng cách so sánh giữa tài nguyên thực tế sau tổng hợp với tài nguyên ước tính sơ bộ ở ban đầu. Thông tin thứ hai là thông tin về mặt thời gian, theo ngầm định thiết kế sẽ được tối ưu với tiêu chí đầu tiên là giảm tối đa thời gian trễ (Optimization Goal : Speed). Các thông tin thời gian được liệt kê bao gồm thời gian trễ tổ hợp (combinational delay) và chu kz của xung nhịp (Clock informations) nếu có. Trong báo cáo cũng sẽ liệt các đường gây trễ cực đại (Critial paths), các thông tin này có thể giúp người thiết kế tối ưu hóa lại mô tả VHDL hoặc thuật toán để đạt được độ trễ thấp hơn một cách hiệu quả. Kết xuất mô tả netlist: mô tả netlist là mô tả VHDL của thiết kế nhưng được ánh xạ lên thư viện phần tử logic của FPGA. Mô tả netlist là dạng mô tả ở mức cổng vì vậy không mô tả trực quan được chức năng của vi mạch mà chỉ thể hiện được cấu trúc của mạch, trong đó các khối con (components) là các phần tử cơ bản được mô tả trong thư viện UNISIM của FPGA. Ví dụ một mô tả netlist có dạng như sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; library UNISIM; use UNISIM.VCOMPONENTS.ALL; use UNISIM.VPKG.ALL; entity sp3_led is port ( LED1 : out STD_LOGIC; LED2 : out STD_LOGIC; Chương III -Thiết kế vi mạch số trên FPGA 42
  43. SW7 : in STD_LOGIC := 'X'; SW8 : in STD_LOGIC := 'X'); end sp3_led; architecture Structure of sp3_led is signal LED1_OBUF_1 : STD_LOGIC; signal LED2_OBUF_3 : STD_LOGIC; signal SW7_IBUF_29 : STD_LOGIC; signal SW8_IBUF_31 : STD_LOGIC; begin LED81 : LUT2 generic map( INIT => X"1" ) port map ( I0 => SW8_IBUF_31, I1 => SW7_IBUF_29, O => LED8_OBUF_15); LED8_OBUF : OBUF port map ( I => LED8_OBUF_15, O => LED8); LED51_INV_0 : INV port map ( I => SW5_IBUF_25, O => LED5_OBUF_9); end Structure; Netlist có thể không phản ánh đúng bản chất thực tế của mạch mà mô tả này này chỉ sử dụng để kiểm tra lại chức năng của vi mạch sau khi ánh xạ lên thư viện phần tử FPGA. Việc kiểm tra này được thực hiện giống như kiểm tra mô tả VHDL ban đầu, tức là có thể dùng bất kz chương trình mô phỏng logic mà hỗ trợ thư viện UNISIM. Create Technology schematic (Sơ đồ công nghệ chi tiết) Sau khi tổng hợp chương trình cũng cho phép kết xuất sơ đồ công nghệ chi tiết của thiết kế mà bản chất là mô tả trực quan bằng hình ảnh của netlist, ví dụ một sơ đồ công nghệ chi tiết ở hình sau: Chương III -Thiết kế vi mạch số trên FPGA 43
  44. Hình 3.43. Technology schematic Việc so sánh sơ đồ này với sơ đồ nguyên lý ở bước 1 cho phép kiểm tra trực quan sơ bộ việc thực hiện đúng sơ đồ nguyên lý của mô tả VHDL. Create RTL schematic (Sơ đồ logic chi tiết) Sơ đồ logic chi tiết là sơ đồ thể hiện chức năng của thiết kế sử dụng các cổng logic chuẩn như AND, OR, NOT, FFD thay vì sử dụng các phần tử chuẩn của FPGA, sơ đồ này vì thế không phụ thuộc vào đối tượng công nghệ cụ thể. Chương III -Thiết kế vi mạch số trên FPGA 44
  45. Hình 3.44. RTL schematic 3.3. Hiện thực hóa thiết kế Hiện thực hóa thiết (Implementation) kế FPGA là quá trình chuẩn bị dữ liệu cho việc cấu hình FPGA từ thông tin đầu vào là mô tả netlist. Quá trình này bắt đầu bằng quá trình biên dịch và ánh xạ thiết kế lên đối tượng FPGA cho tới khi thiết kế vật l{ được phân bố cụ thể và kết nối với nhau Quá trình đó gồm 3 bước như sau: Chương III -Thiết kế vi mạch số trên FPGA 45
  46. TRANSLATE Post-translate simulation model N O I T Post-translate simulation model A T N MAPING E M E Post-translate simulation model L P M I Post-translate simulation model PLACE & ROUTE Post-translate simulation model Hình 3.45 FPGA Implementation 3.3.1 Translate Netlist của chương trình được dịch thành định dạng EDIF (Electronic Device Interchangeable Format) hoặc NGC format (một định dạng netlist riêng của Xilinx) sau đó kết hợp với hai file quy định điều kiện ràng buộc của thiết kế. - NCF (Native Constraint File) chứa những thông tin vật lý về thời gian, tốc độ, các tham số tải, tham số vật l{ k{ sinh của chip vật lý FPGA là đối tượng sẽ tiến hành cấu hình. - UCF (User Constraint File) chứa những ràng buộc yêu cầu từ phía người thiết kế với vi mạch của mình. UCF được xem là một phần quan trọng trong thiết kế, nếu như mô tả chức năng chỉ quy định vi mạch định làm gì thì trong file UCF sẽ chứa những yêu cầu đòi hỏi về tốc làm việc (timing constraint) cũng như mức độ sử dụng tài nguyên. Các yêu cầu này là cơ sở cho các trình biên dịch trong ISE tối ưu hóa thiết kế. Để có thể viết được những yêu cầu này thì người thiết kế trước hết phải hiểu rất rõ thiết kế của mình, chẳng hạn trong thiết kế có dùng những tín hiệu xung nhịp như thế nào, khu vực tổ hợp nào có khả năng gây ra thời gian trễ lớn nhất và ước tính được giá trị của độ trễ. Phân tích nội dung một file UCF có nội dung như dưới đây. # IO location defination NET "HIGH_voltage" LOC = P102; NET "LOW_voltage" LOC = P100; NET "voltage[0]" LOC = P160; NET "voltage[1]" LOC = P161; NET "voltage[2]" LOC = P162; NET "voltage[3]" LOC = P163; Chương III -Thiết kế vi mạch số trên FPGA 46
  47. # Timing constraint INST "LOW_voltage" TNM = "OUT_REG"; INST "HIGH_voltage" TNM = "OUT_REG"; NET "voltage[0]" OFFSET = IN 2 ns VALID 0.5 ns BEFORE "CLK" TIMEGRP "OUT_REG" RISING; NET "voltage[1]" OFFSET = IN 2 ns VALID 0.5 ns BEFORE "CLK" TIMEGRP "OUT_REG" RISING; NET "voltage[2]" OFFSET = IN 2 ns VALID 0.5 ns BEFORE "CLK" TIMEGRP "OUT_REG" RISING; NET "voltage[3]" OFFSET = IN 2 ns VALID 0.5 ns BEFORE "CLK" TIMEGRP "OUT_REG" RISING; Nhóm mô tả thứ nhất quy định cách gán chân vào ra của FPGA, cách gán chân này phụ thuộc thứ nhất vào từng loại FPGA, thứ hai vào bản mạch ứng dụng FPGA cụ thể, chẳng hạn như ở trên các chân voltage được gán cho các cổng từ P160 đến P163, còn hai tín hiệu LOW_voltage và HIGH_voltage được gắn cho chân P102 và P100. Nhóm thứ hai mô tả điều kiện ràng buộc về mặt thời gian: hai lệnh đầu ghép hai Flip-flop đầu ra của mạch thành một nhóm có tên là OUT_REG, 4 lệnh sau quy định thời gian trễ của 4 tín hiệu đầu vào có thời gian: OFFSET = IN 2 ns VALID 0.5 ns BEFORE "CLK" TIMEGRP "OUT_REG" RISING nghĩa là thời gian trễ của các tín hiệu này trước khi đến các Flip-Flop của nhóm OUT_REG không quá 2 ns và thời gian giữ tín hiệu ổn định cho Flip-Flop (Setup time) không qus 0,5 ns. Xilinx ISE hỗ trợ trình soạn thảo GUI cho UCF tuy vậy có thể sử dụng trình soạn thảo Text bất kz để soạn file UCF, yêu cầu duy nhất là đặt tên file UCF trùng với tên thiết kế, ví dụ như trên là simple_control.ucf. Việc soạn thảo bằng tay cho phép người dùng nắm vững được kỹ năng trong việc tối ưu hóa thiết kế và chủ động hơn trong khi làm việc. (*) Chi tiết hướng dẫn về UCF có thể xem trong tài liệu hướng dẫn của Xilinx Chương III -Thiết kế vi mạch số trên FPGA 47
  48. LOGIC Native User SYNTHESIS Constraint File Constraint File (NCD or EDIF files) (NCF) (UCF) TRANSLATE Native Generic Database (NGD) Hình 3.46. Translate process Quá trình translate sẽ đọc các thông tin từ 3 file trên và chuyển về định dạng NGD (Native Generic Database) của Xilinx để phục vụ cho hai bước kế tiếp là Mapping và Routing. NGD bản chất là một mô tả cấu trúc của mạch trên cơ sở các phần tử chức năng được mô tả trong thư viện có tên SIMPRIM (simulation primitves) của Xilinx. Các phần tử này không phụ thuộc vào FPGA cụ thể, nó có thể được sử dụng cho tất cả các dạng FPGA và CPLD của Xilinx. Người thiết kế có thể tạo ra file netlist để phục vụ mô phỏng kiểm tra sau Translate (Post-translate simulation model). Ví dụ file netlist như sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; library SIMPRIM; use SIMPRIM.VCOMPONENTS.ALL; use SIMPRIM.VPACKAGE.ALL; entity sp3_led is port ( LED1 : out STD_LOGIC; LED2 : out STD_LOGIC; SW7 : in STD_LOGIC := 'X'; SW8 : in STD_LOGIC := 'X' ); end sp3_led; architecture Structure of sp3_led is signal LED1_OBUF_1 : STD_LOGIC; signal SW8_IBUF_31 : STD_LOGIC; begin Chương III -Thiết kế vi mạch số trên FPGA 48
  49. LED81 : X_LUT2 generic map( INIT => X"1" ) port map ( ADR0 => SW8_IBUF_31, ADR1 => SW7_IBUF_29, O => LED8_OBUF_15); SW8_IBUF : X_BUF port map ( I => SW8, O => SW8_IBUF_31); LED51_INV_0 : X_INV port map ( I => SW5_IBUF_25, O => LED5_OBUF_9); LED8_OBUF : X_OBUF port map ( I => LED8_OBUF_15, O => LED8); NlwBlockROC : X_ROC generic map (ROC_WIDTH => 100 ns) port map (O => GSR); NlwBlockTOC : X_TOC port map (O => GTS); end Structure; 3.3.2. Maping Mapping là động tác gán các khối sơ đồ logic vào các khối cơ sở của một FPGA cụ thể, đầu vào của quá trình là dữ liệu được lưu trong file NGD bao gồm mô tả logic sử dụng các phần tử chức năng độc lập với công nghệ có trong thư viên SIMPRIM và các thông tin về các khối, đường kết nối cố định. Đầu ra của quá trình này là một file dạng NCD (Native Circuit Database), file này chứa mô tả chức năng mạch thiết kế trên đối tượng FPGA cụ thể. Quá trình maping trải qua các bước cơ sở như sau. - Đọc thông tin của đối tượng FPGA. - Đọc thông tin thiết kế từ file NGD. - Thực hiện DRC (Design Rule Check) Kiểm tra thiết kế bao gồm: kiểm tra khối (Block check) là kiểm tra sơ đồ kết nối của các khối, kiểm tra sự tồn tại của các mô tả khối con. Kiểm tra các đường nối logic (Net check) bao gồm kiểm tra các khối đầu vào đầu ra và việc tuân thủ các Chương III -Thiết kế vi mạch số trên FPGA 49
  50. quy tắc nối các đầu vào đầu ra đó. Ngoài ra còn có các kiểm tra khác như kiểm tra các vị trí vào ra (PAD check), kiểm tra các khối đệm cho tín hiệu đồng bộ (Clock buffer check), kiểm tra sự trùng lặp tên gọi(Name check). - Nếu như bước DRC không phát sinh ra lỗi thì quá trình maping được thực hiện tiếp tục, ở bước này sẽ tiến hành lược bỏ các phần tử thừa trong thiết kế và ánh xạ các khối thiết kế lên các khối chức năng của đối tượng FPGA cụ thể - Tạo ra một file chứa các điều kiện ràng buộc của mô tả vật lý của mạch sinh ra bởi bước trên PCF (Physical Constrait Files). File này tập hợp tất cả các điều kiện ràng buộc của thiết kế ở cấp độ cổng (NCF, UCF) và đối tượng FPGA cụ thể. - Thực hiện DRC với thiết kế đã ánh xạ (mapped), nếu DRC ở bước này không gây ra lỗi thì sẽ thực hiện bước cuối cùng là tạo ra file NCD. 3.3.3. Place and Routing Placing & Routing là quá trình ánh xạ những khối logic đã được phân chia ở phần Maping sang những khối logic (LUT, IOBUF ) có vị trí cụ cụ thể trên FPGA và kết nối chúng lại với nhau thông qua khối tài nguyên kết nối (Interconnect resourse). người thiết kế có thể can thiệp vào quá trình này bằng FPGA editor, một công cụ giao diện đồ họa tích hợp trong ISE, nhưng trên thực tế thì quá trình này thường thực hiện hoàn toàn tự động bằng công cụ PAR (Place and Route). Hình dưới đây minh họa cho quá hai quá trình trên. Chương III -Thiết kế vi mạch số trên FPGA 50
  51. Hình 3.47. Place & Routing Placing: Ở bước này PAR lựa chọn các khối logic chức năng cụ thể phân bố trên FPGA để gán cho các khối chức năng trên mô tả thiết kế, việc lựa chọn dựa trên các tiêu chí như nguồn tài nguyên, độ dài kết nối, điều kiện ràng buộc trong PCF file Quá trình này thực hiện thông qua một số pha, kết thúc mỗi pha thì thiết kế được tối ưu thêm một mức, kết thúc Placing một file NCD mới được tạo ra. Routing: là quá trình tiến hành sử dụng các tài nguyên kết nối (interconnects), các kết nối được thực hiện nhằm đạt thời gian trễ thấp nhất có thể, khi kết nối PAR sẽ phải quan tâm tới thông tin trong PCF file. Quá trình này cũng được thực hiện thành nhiều pha, ở mỗi pha một file NCD mới sẽ được lưu lại nếu như có được sự tối ưu về thời gian so với phương án trước đó. Floorplaning: Là quá trình cho phép người thiết kế sử dụng FPGA editor để can thiệp vào quá trình Placing và Routing, bước này có thể làm trước hoặc sau các bước của PAR. 3.4. Cấu hình FPGA Sau khi thiết kế đã được hiện thực hóa ở bước 3.3 thì có thể thực hiện cấu trúc FPGA (FPGA Configuration), quá trình cấu trúc như đã trình bày ở phần 2 là việc ghi dữ liệu vào SRAM, dữ liệu này sẽ quy định cách thức làm Chương III -Thiết kế vi mạch số trên FPGA 51
  52. việc, kết nối của các phần tử trong FPGA. Thiết kế được dịch sang 1 file cấu hình (BIT file) và nạp vào trong FPGA thông qua giao thức JTAG. File BIT này cũng có thể được biến đổi thành các định dạng PROM khác nhau để nạp vào trong ROM, khi cần sẽ được đọc để tái cấu trúc FPGA mà không cần phải nạp lại từ máy tính. 3.5. Kiểm tra thiêt kế trên FPGA Thiết kế trên FPGA có thể được kiểm tra ở nhiều mức khác nhau về cả chức năng lẫn về các yêu cầu khác về mặt tài nguyên hay hiệu suất làm việc. VERIFICATION ON-CIRCUIT FUNCTION TIMING TESTING Hình 3.48. Verification FPGA design 3.5.1 Kiểm tra bằng mô phỏng. Các công cụ mô phỏng có thể dùng để mô phỏng chức năng (Functional Simulation) của mạch thiết kế và mô phỏng về mặt thời gian (Timing simulation). Kiểm tra có thể được thực hiện từ bước đầu tiên của quá trình thiết kế (mô tả VHDL) cho tới bước cuối cùng (routing). - Sau khi có mô tả bằng VHDL thiết kế cần được kiểm tra kỹ về mặt chức năng tại thời điểm này trước khi thực hiện các bước ở bên dưới. - Kiểm tra sau tổng hợp: một mô tả netlist sau tổng hợp (post- synthesis simulation model), thư viện UNISIM được tạo ra phục vụ cho quá trình kiểm tra sau tổng hợp. Để kiểm tra thư module này trình mô phỏng cần có mô tả tương ứng của thư viện UNISIM, nếu có phát sinh lỗi về mặt chức năng thì phải quay lại bước mô tả VHDL để sửa lỗi. - Kiểm tra sau Translate: mô tả netlist sau translate (post-synthesis simulation model) là mô tả trên thư viện SIMPRIM. Chương trình mô phỏng cũng phải cần được tích hợp hoặc hỗ trợ thư viện SIMPRIM. Chương III -Thiết kế vi mạch số trên FPGA 52
  53. - Kiểm tra sau Map: mô tả netlist sau translate (post-map simulation model, và post-map static timing) là mô tả trên thư viện SIMPRIM, thư viện này có tham số mô tả về mặt thời gian thực và kể từ bước này ngoài mô phỏng để kiểm tra về mặt chức năng thì thiết kế có thể được kiểm tra các tham số chính xác về mặt thời gian. - Kiểm tra sau Place and Route: Tương tự như kiểm tra sau Mapping, điểm khác là mô phỏng để kiểm tra các tham số thời gian tĩnh ở đây có độ chính xác gần với mạch thật trên FPGA nhất. 3.5.2. Phân tích tham số thời gian tĩnh. Phân tích thời gian tĩnh (Static timing analysis) cho phép nhanh chóng xác định các tham số về mạch thời gian sau quá trình Place & Routing, kết quả của bước kiểm tra này cho phép xác định có hay không các đường truyền vi phạm các điều kiện ràng buộc về mặt thời gian, chỉ ra các đường gây trễ vi phạm để người thiết kế tiến hành những thay đổi để tối ưu mạch nếu cẩn thiết. 3.5.3. Kiểm tra trực tiếp trên mạch Kiểm tra trực tiếp trên mạch (On-circuit Testing) là quá trình thực hiện sau khi cấu hình FPGA đã được nạp vào IC, đối với những thiết kế đơn giản thì mạch được nạp có thể được kiểm tra một cách trực quan bằng các đối tượng như màn hình, LED, switch, cổng COM. Với những thiết kế phức tạp Xilinx cung cấp các công cụ phần mềm kiểm tra riêng. 4. Một số ví dụ thiết kế trên FPGA 4.1. Thiết kế khối nhận thông tin qua cổng COM Cổng COM là một cổng thực hiện giao thức truyền tin dị bộ nối tiếp (UART), đặc điểm của cổng này là giao tiếp đơn giản, phổ biến, nhược điểm là tốc độ trao đổi thông tin hạn chế. Trong ví dụ dưới đây ta sẽ minh họa một thiết kế sử dụng FPGA để cấu hình một khối nhận thông tin qua cổng COM. Để hiểu về thiết kế này trước hết ta tìm hiểu qua về giao thức truyền nhận thông tin nối tiếp. Thông tin nối tiếp được truyền theo một dây dẫn duy nhất và các bit thông tin được mã hóa theo mức điện áp trên dây dẫn. Chương III -Thiết kế vi mạch số trên FPGA 53
  54. IDLE START DATA PARITY STOP IDLE RX Bit counter x 0 0 1 2 3 4 5 6 7 8 0 SAMPLE ONE BIT RECEIVING RX Sample counter 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 Hình 3.49: truyền nhận thông tin UART Hình trên mô tả tín hiệu đầu vào cho một khối nhận tín hiệu từ đường truyền nối tiếp, ở trạng thái nghỉ (IDLE), không có dữ liệu thì tín hiệu được giữ ở mức cao, để bắt đầu truyền thông tin tín hiệu Rx sẽ chuyển về mức thấp trong một khoảng thời gian đủ lớn, thời gian này bằng thời gian nhận 1 bit thông tin tương ứng với tốc độ truyền của cổng gọi là Tbraud. = 1/Fbraud. Sau bit START này thì các bit dữ liệu được truyền nối tiếp trên Rx, tương ứng trạng thái DATA trên hình vẽ, cổng COM có thể được cấu hình để truyền nhận 6, 7 hay 8 bit thông tin. Sau khi kết thúc truyền các tin này có thể có thêm một bit kiểm tra chẵn lẻ của khối tin PARITY, một bit STOP (mức logic 0) được giữ với thời gian bằng 1, 1.5 hay 2 Tbraud. Khi kết thúc quá trình truyền tin thì Rx trở về trạng thái nghỉ ở mức điện áp cao. Đường truyền nối tiếp đơn giản và tốc độ không cao, thông thường Fbraud thay đổi từ 1200 đến 115200 Bit/s. Đường truyền này sử dụng các thiết bị độc lập với nhau và bị ảnh hưởng của nhiễu không nhỏ, mặt khác bộ nhận và bộ chia hoạt động không đồng bộ (không cùng xung nhịp hệ thống) do đó cần phải có cơ chế thu nhận nhằm tránh lỗi phát sinh. Cơ chế đó cũng được minh họa ở trên hình 3.47. Một bit thông tin được chia thành 16 điểm lấy mẫu (Samples), các điểm này được xác định bằng một bộ đếm mẫu (sample counter). Vì xác suất lỗi ở các vị trí mẫu đầu và cuối là cao nhất còn xác suất lỗi ở vị trí giữa là thấp nhất do đó ta chọn điểm lấy mẫu ở giữa, nghĩa là bit thông tin đang nhận bằng Rx ở trạng thái counter = 8. Chương III -Thiết kế vi mạch số trên FPGA 54
  55. Với tốc độ cao nhất có thể là 115200 Bit/s thì tần số của bộ đếm sample counter bằng 115200 x16 = 1 843 200 Hz < 2Mhz vẫn là một tốc độ không cao đối với các thiết kế số trên FPGA. Trên thực tế cũng không phải lúc nào cũng phải chia bit thông tin thành 16 mẫu mà có thể chia lớn hơn hoặc nhỏ hơn. Trên cơ sở giao thức như trên có thể thiết kế một khối nhận thông tin từ cổng COM với cấu hình: - Tốc độ truyền Braud rate = 9600 - 7 bit dữ liệu (truyền ký tự ASCII) Data bit = 7, - Hỗ trợ Bit Parity, - 1 bit STOP. Sơ đồ khối của khối nhận như ở hình dưới đây: SAMPLE COUNTER BIT COUNTER CLK CLOCK DIVIDER CLK16 CNT CNT RESET RESET ENABLE ENABLE nRESET FSM (FINITE STATE MACHINE) RX_REG RX_REG Rx RECEIVE_REG SHIFT_ENABLE DATA REG LOAD LEDs Hình 3.50: Sơ đồ khối nhận thông tin nối tiếp Tín hiệu Rx là đầu vào của cổng COM. Dao động cơ sở của mạch lấy từ bộ dao động thạch anh có tần số CLK = 27Mhz, tần số này được chia nhỏ một bộ chia tần với hệ số chia là (9600 x 16)trước khi sử dụng làm xung nhịp hệ thống CLK16 cho toàn khối, trong đó 9600 là tốc độ Braud. Tín hiệu nRESET cũng lấy từ 1 chân điều khiển của FPGA. Hai tín hiệu CLK16 và nRESET dùng Chương III -Thiết kế vi mạch số trên FPGA 55
  56. chung cho tất cả các khối khác trong bộ nhận. Để kiểm tra dữ liệu vào thì các bit thông tin sẽ được gán cho các LEDs tương ứng trên mạch. Bộ nhận được xây dựng dưới dạng máy trạng thái hữu hạn (Finite State Machine), ở ví dụ minh họa này ta chỉ sử dụng 3 trạng thái là trạng thái nhận biết bit START từ Rx - STATE FRAME DETECTOR, trạng thái nhận dữ liệu (kể cả PARITY bit và STOP bit) - DATA_RECEIVING. Trạng thái nghỉ IDLE. Sơ đồ chuyển trạng thái như sau: IDLE CNT16 = 8 and RX = 1 CNT_BIT = 8 RX = 0, Rx_Reg = 1 START FRAME RECEIVE DETECTOR DATA CNT16 = 8 and RX = 0 Hình 3.51: Sơ đồ khối nhận thông tin nối tiếp Từ trạng thái IDLE sẽ chuyển sang trạng thái STATE FRAME DETECT nếu như đường truyền chuyển từ mức 1 xuống mức 0, để bắt được bước chuyển này ta sử dụng một thanh ghi giữ chậm tín hiệu Rx có tên là Rx_Reg, máy trạng thái ghi nhận Rx chuyển xuống mức 0 nếu Rx = 0 và Rx_Reg = 1. Khi đã chuyển sang trạng thái STATE FRAME DETECT máy trạng thái sẽ khởi động bộ đếm mẫu, tại vị trí lấy mẫu nếu Rx vẫn bằng 0 thì kết luận đây chính là tín hiệu START và sẽ chuyển sang trạng thái nhận dữ liệu RECEIVE DATA. Theo lý thuyết ở trạng thái này chúng ta sẽ đếm đên 8 và lấy mẫu ở điểm chính giữa nhưng vì khi xác nhận tín hiệu START ta xác nhận ở điểm giữa CNT = 8 và RESET ngay bộ đếm mẫu tại điểm này nên điểm lấy mẫu của ta không phải ở vị trí CNT = 8 nữa mà đối với các bit dữ liệu ta sẽ lấy tại các điểm CNT = 15. Trong trạng thái nhận dữ liệu thì bộ đếm bit cũng làm việc, khi có 1 bit thông tin được nhận bộ đếm này cộng thêm 1, đồng thời máy trạng thái cũng Chương III -Thiết kế vi mạch số trên FPGA 56
  57. sẽ điều khiển thanh ghi dịch nhận dữ liệu RECEIVE_REG thông qua tín hiệu SHIFT_ENABLE để thanh ghi này dịch qua trái mỗi lần 1 bit, các bit thông tin được đẩy dần vào thanh ghi này cho tới đầy. Khi đã nhận đủ thông tin giá trị CNT_BIT = 9 thì toàn bộ thông tin từ RECEIVE_REG được ghi song song sang thanh ghi dữ liệu DATA_REG, máy trạng thái chuyển về trạng thái nghỉ và chờ để nhận dữ liệu tiếp theo. Mã thiết kế VHDL của khối này được ghép từ 6 khối nhỏ bao gồm khối chia tần, 2 khối đếm, thanh ghi dịch, thanh ghi song song, máy trạng thái fsm.vhd, và khối tổng receiver.vhd. Nội dung của các khối được liệt kê dưới đây: Khối chia tần clk_div.vhd: LIBRARY ieee; USE ieee.Std_logic_1164.ALL; USE ieee.Std_logic_unsigned.ALL; ENTITY clk_div IS GENERIC(baudDivide : std_logic_vector(7 downto 0) := "10101110"); PORT( clk : in std_logic; clk16 : inout Std_logic ); END clk_div; ARCHITECTURE rtl OF clk_div IS SIGNAL cnt_div : Std_logic_vector(7 DOWNTO 0); BEGIN Clock Dividing Functions process (CLK, cnt_div) begin if (Clk = '1' and Clk'event) then if (cnt_div = baudDivide) then cnt_div <= "00000000"; else cnt_div <= cnt_div + 1; end if; end if; end process; process (cnt_div, clk16, CLK) begin if CLK = '1' and CLK'Event then Chương III -Thiết kế vi mạch số trên FPGA 57
  58. if cnt_div = baudDivide then clk16 '0'); elsif rising_edge(clk) then if clock_enable = '1' then cnt <= cnt + 1; end if; end if; END PROCESS; count_out <= cnt; END rtl; Thanh ghi dịch shifter.vhd: library ieee; use IEEE.STD_LOGIC_1164.ALL; Chương III -Thiết kế vi mạch số trên FPGA 58
  59. entity shifter is generic (n : positive := 8); port ( clk : in std_logic; reset : in std_logic; Rx : in std_logic; shift_enable : in std_logic; shift_value : inout std_logic_vector(n-1 downto 0) ); end entity; architecture rtl of shifter is begin shifting: process (clk, reset) begin if reset = '1' then shift_value '0'); elsif clk = '1' and clk'event then if shift_enable = '1' then shift_value <= Rx & shift_value(n-1 downto 1); end if; end if; end process shifting; end architecture; Thanh ghi song song reg.vhd: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity reg is generic (n: positive := 8); port( WE : in std_logic; write enable D : in std_logic_vector(n-1 downto 0); Q : out std_logic_vector(n-1 downto 0); CLK : in std_logic; RESET : in std_logic ); end reg; architecture behavioral of reg is signal Q_sig : std_logic_vector(n-1 downto 0); begin reg_p: process (CLK, RESET) begin if RESET = '1' then Chương III -Thiết kế vi mạch số trên FPGA 59
  60. Q_sig '0'); elsif CLK = '1' and CLK'event then if WE = '1' then Q_sig <= D; end if; end if; end process reg_p; Q <= Q_sig; end behavioral; Máy trạng thái hữu hạn fsm.vhd: LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY fsm IS PORT( RESET : in std_logic; Rx : in std_logic; cnt16 : in std_logic_vector (3 downto 0); cnt_bit : in std_logic_vector (3 downto 0); clk16 : in std_logic; cnt_bit_reset : out std_logic; cnt_bit_enable : out std_logic; cnt16_reset : out std_logic; cnt16_enable : out std_logic; shift_enable : out std_logic; data_reg_WE : out std_logic ); END fsm; architecture rtl of fsm is signal Rx_reg : std_logic; signal state : std_logic_vector (1 downto 0); constant Idle_state : std_logic_vector (1 downto 0) := "00"; constant start_frame_state : std_logic_vector (1 downto 0) := "01"; constant receive_state : std_logic_vector (1 downto 0) := "10"; Begin reg_RX: process (clk16) begin if clk16 = '1' and clk16'event then Rx_reg <= Rx; end if; end process reg_RX; Chương III -Thiết kế vi mạch số trên FPGA 60
  61. receiving: process (clk16, Rx, RESET, Rx_reg) begin if RESET = '1' then state cnt16_reset cnt16_reset cnt_bit_reset cnt16_enable <= '0'; cnt_bit_enable <= '0'; shift_enable <= '0'; Chương III -Thiết kế vi mạch số trên FPGA 61
  62. state <= Idle_state; end case; Khối tổng (receiver) receiver.vhd: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Receiver is generic (n: positive := 8); port( Rx : in std_logic; data_out : out std_logic_vector(7 downto 0); CLK : in std_logic; nRESET : in std_logic ); end Receiver; architecture behavioral of Receiver is signal RESET : std_logic; signal clk16 : std_logic; signal shift_enable : std_logic; signal shift_value : std_logic_vector(9 downto 0); signal cnt_bit_reset : std_logic; signal cnt_bit_enable : std_logic; signal cnt_bit : std_logic_vector (3 downto 0); signal cnt16_reset : std_logic; signal cnt16_enable : std_logic; signal cnt16 : std_logic_vector (3 downto 0); signal data_reg_WE : std_logic; component clk_div is GENERIC( baudDivide : std_logic_vector(7 downto 0) := "10101110"); PORT( clk : in std_logic; clk16 : inout Std_logic ); end component; component reg is generic (n: positive := 8); port( WE : in std_logic; D : in std_logic_vector(n-1 downto 0); Q : out std_logic_vector(n-1 downto 0); CLK : in std_logic; Chương III -Thiết kế vi mạch số trên FPGA 62
  63. RESET : in std_logic ); end component; component counter IS GENERIC(n : Positive := 3); PORT(clk, reset, clock_enable : IN Std_logic; count_out : out Std_logic_vector((n-1) DOWNTO 0) ); END component; component shifter is generic (n : positive := 8); port (clk : in std_logic; RESET : in std_logic; Rx : in std_logic; shift_enable : in std_logic; shift_value : inout std_logic_vector(n-1 downto 0) ); end component; component fsm is PORT( RESET : in std_logic; Rx : in std_logic; cnt16 : in std_logic_vector (3 downto 0); cnt_bit : in std_logic_vector (3 downto 0); clk16 : in std_logic; cnt_bit_reset : out std_logic; cnt_bit_enable : out std_logic; cnt16_reset : out std_logic; cnt16_enable : out std_logic; shift_enable : out std_logic; data_reg_WE : out std_logic ); end component; begin RESET <= not nRESET; finish_state_machine: component fsm port map ( RESET, Rx, cnt16, cnt_bit, clk16, cnt_bit_reset, cnt_bit_enable, cnt16_reset, cnt16_enable, shift_enable, data_reg_WE ); clock_divide16: component clk_div generic map ("01011001") = 27Mhz/9600/16/2 port map (clk, clk16); receive_reg: Chương III -Thiết kế vi mạch số trên FPGA 63
  64. component shifter generic map (10) port map (clk16, RESET, Rx, shift_enable, shift_value); counter16: component counter generic map (4) port map (clk16, cnt16_reset, cnt16_enable, cnt16); counter_bit: component counter generic map (4) port map (clk16, cnt_bit_reset, cnt_bit_enable, cnt_bit); data_reg: component reg generic map (8) port map (data_reg_WE, shift_value(9 downto 2), data_out, clk16, RESET); end behavioral; Kết quả mô phỏng trên Modelsim Hình 3.52: Kết quả mô phỏng khối nhận UART trên ModelSim Sau khi khởi động hoặc sau khi tín hiệu nRESET tích cực khối nhận đều chuyển về sạng thái IDLE (state = 00). Ở trạng thái này khi Rx = 0 và Rx_reg = 1 bộ đếm mẫu cnt16 bắt đầu đếm và trạng thái chuyển sang START_FRAME_DETECT (state = 01), khi cnt16 đếm đến giá trị bằng 5 tức là 6 mẫu, nếu kể cả 1 mẫu trễ do Rx_reg thì vị trí mẫu 7/16, nếu đến vị trí này mà Rx bằng 0 thì khối nhận xem tín hiệu trên Rx là tín hiệu START và bắt đầu chuyển sang trạng thái nhận dữ liệu RECEIVE DATA(state = 10), ở trạng thái này bộ đếm mẫu cnt16 đếm liên tục từ 0 đến 15, vị trí lấy mẫu là vị trí khi cnt16 = 15. Ở ví dụ mô phỏng trên tín hiệu Rx cứ 16 xung nhịp của clk16 thì thay đổi từ 0 lên 1 hoặc 1 xuống 0 do đó ta sẽ thu được tuần tự các bit 0101 tương ứng đẩy dần vào thanh ghi dịch shift_value. Quá trình thu kết thúc khi bộ đếm bit counter_bit = 8, tương ứng đã nhân đủ đủ 7 bit dữ liệu, 1 bit PARITY và 1 bit STOP. Chương III -Thiết kế vi mạch số trên FPGA 64
  65. Trước khi tổng hợp và hiện thực thiết kế trên FPGA cần thực hiệu gán các chân tín hiệu, thiết lập ràng buộc cho mạch trên Kit FPGA. Để gán các chân tín hiệu trên FPGA ta sử dụng giao diện đồ họa trong chương trình PlandAhead hoặc tạo một tệp có đuôi mở rộng receiver.ucf với nội dung như sau: INST "CLK_BUFGP" LOC = BUFGMUX_X2Y10; NET "CLK" LOC = P184; NET "nRESET" LOC = P29; NET "Rx" LOC = P109; NET "data_out[0]" LOC = P102; NET "data_out[1]" LOC = P100; NET "data_out[2]" LOC = P99; NET "data_out[3]" LOC = P98; NET "data_out[4]" LOC = P97; NET "data_out[5]" LOC = P96; NET "data_out[6]" LOC = P94; NET "data_out[7]" LOC = P93; NET "clock_divide16/clk161" TNM_NET = "clock_divide16/clk161"; TIMESPEC TS_clock_divide16_clk161 = PERIOD "clock_divide16/clk161" 20 ns HIGH 50 %; NET "CLK" TNM_NET = "CLK"; TIMESPEC TS_CLK = PERIOD "CLK" 10 ns HIGH 50 %; Các dòng bắt đầu bằng từ khóa NET thiết lập cài đặt cho các cổng vào ra của thiết kế tương ứng với các vị trí trên mạch thật, mỗi vị trí có một ký hiệu và số thứ tự riêng. Cổng CLK được lấy từ chân tạo dao động thạch anh P184 trên mạch, tương ứng trên sơ đồ FPGA dưới đây chân CLK nằm gần hai khối DCM ở trên. Chân nRESET được lấy từ vị trí P29 là một nút ấn để tạo xung RESET, nút ấn trên mạch có mức tích cực âm, vị trí của nRESET nằm ở giữa cạnh trái. Các chân dữ liệu ra được gán cho vị trí của 8 đèn LED trên mạch, vị trí của các cổng này tại góc dưới phải của mạch. Và cuối cùng là tín hiệu Rx lấy từ chân Rx mạch tương ứng P109 của FPGA, vị trí cổng này nằm gần vị trí chân các đèn LED trên cạnh phải. Ngoài thiết lập về vị trí, trong tệp này còn thiết lập điều kiện ràng buộc cho các tín hiệu CLK và CLK16, các tín hiệu này được định nghĩa là tín hiệu đồng bộ với yêu cầu về chu kz tương ứng không lớn hơn 10 ns và 20 ns. Trên thực tế những yêu cầu về thời gian không quan trọng vì khối nhận của chúng ta làm việc ở xung nhịp nhỏ hơn 2Mhz hay với Tmin = 1/2Mhz = 500 ns. Các lệnh này chỉ có { nghĩa báo cho trình biên dịch biết khi kết nối cần phải “xem” các tín hiệu này là tín hiệu đồng bộ. Chương III -Thiết kế vi mạch số trên FPGA 65
  66. Hình 3.53: Sơ đồ bố trí cổng vào ra trên FPGA Kết quả tổng hợp trên FPGA Device utilization summary: Selected Device : 3s500epq208-4 Number of Slices: 30 out of 4656 0% Number of Slice Flip Flops: 41 out of 9312 0% Number of 4 input LUTs: 44 out of 9312 0% Number of IOs: 11 Number of bonded IOBs: 11 out of 158 6% Number of GCLKs: 2 out of 24 8% === TIMING REPORT Speed Grade: -4 Minimum period: 4.851ns (Maximum Frequency: 206.143MHz) Minimum input arrival time before clock: 5.216ns Maximum output required time after clock: 4.283ns Maximum combinational path delay: No path found Timing Detail: All values displayed in nanoseconds (ns) Chương III -Thiết kế vi mạch số trên FPGA 66
  67. Kết quả sau tổng hợp bao gồm kết quả về sử dụng tài nguyên và kết quả về thời gian. Về sử dụng tài nguyên, khối nhận cổng COM sử dụng một lượng tài nguyên rất nhỏ 30/4656 SLICEs. Về mặt thời gian, thời gian trễ lớn nhất trước xung nhịp là 5,2 ns, tần số cực đại của mạch là ~ 200Mhz, trên thực tế mạch của chúng ta hoạt động ở xung nhịp nhỏ hơn 2Mhz nên những kết quả trên hoàn toàn đáp ứng yêu cầu thiết kế. Kết quả về thời gian tĩnh sau khi thực hiện kết nối và phân bố (Post place & route static timming) là kết quả chính xác thu được trên mạch nạp, như quan sát sau kết quả này thay đổi không đáng kể so với kết quả sau tổng hợp. All constraints were met. Data Sheet report: All values displayed in nanoseconds (ns) Clock to Setup on destination clock CLK + + + + + | Src:Rise| Src:Fall| Src:Rise| Src:Fall| Source Clock |Dest:Rise|Dest:Rise|Dest:Fall|Dest:Fall| + + + + + CLK | 5.004| | | | + + + + + 4.2. Thiết kế khối tổng hợp dao động số NCO NCO viết tắt của Numerically Controler Osillator.là khối tổng hợp dao động bằng vi mạch số. Khối này có khả năng tổng tạo ra dao động với tần số mong muốn một các trực tiếp bằng một vi mạch số tích hợp. Cơ sở toán học của NCO thể hiện như ở hình sau: Chương III -Thiết kế vi mạch số trên FPGA 67
  68. 2^N t 0 360 t 0 +Uo t -Uo Dt Tout Hình 3.54: Cơ sở toán học của NCO Sóng mà ta muốn tổng hợp có hàm số phụ thuộc thời gian và tần số như sau Y(t)= Uo sin ( ) = Uo sin ( . Nếu đặt = thì là một hàm phụ thuộc tuyến tính theo thời gian, nếu biểu diễn giá trị pha theo thang 0-360o thì đồ thị theo thời gian tương ứng là đồ thị thứ hai từ trên xuống dưới ở hình trên. Nếu chia nhỏ trục thời gian thành các điểm cách đều nhau liên tiếp một khoảng , gọi các điểm chia trên trục thời gian lần lượt là 0, , 2 , Ta có Giá trị biên độ tương ứng là Chương III -Thiết kế vi mạch số trên FPGA 68
  69. Áp dụng định lý Kachenhikov về rời rạc hóa và khôi phục tín hiệu có phổ giới hạn ta có thể tính toán giá trị để thu được tổ hợp các giá trị uk đủ để khổi phục hoàn toàn sóng ban đầu giá trị đó phải thỏa mãn Trong đó f là tần số cần tổng hợp. Chuyển sang bài toán trên mạch số, các giá trị tích lũy pha và giá trị biên độ thứ nhất phải được số hóa, tức là biểu diễn dưới dạng số. Giá trị tích lũy pha không nhất thiết thay đổi từ 0-360o mà trên thực tế ta chọn một miền giá trị 0-2N, trong đó 2N >360, để thu được độ chính xác và độ phân giải cao hơn. Gọi p0, pk là giá trị rời rạc pha đã được số hóa các giá trị này được tính bằng một khối tích lũy pha N bit, bản chất là một khối cộng tích lũy. Đầu vào của khối cộng này là giá trị tích lũy N bit m. Sau một khoảng thời gian = 1/f0 trong đó f0 là tần số cơ sở của mạch (tần số làm việc của bộ cộng tích lũy) giá trị lớn nhất mà khối cộng tích lũy biểu diễn được khi đó có thể tính được giá trị biên độ uk được số hóa tương ứng trong bảng SIN là: Bảng SIN tương ứng 1 chu kz của sóng sin, để thực hiện hết một chu kz này thì cần một khoảng thời gian bằng Suy ra tần số của sóng thu được tính gần đúng theo công thức: Như vậy tần số đầu ra phụ thuộc trực tiếp vào 3 tham số Chương III -Thiết kế vi mạch số trên FPGA 69
  70. . N là số bit của dùng cho thanh ghi của bộ tích lũy pha. . m là từ điều khiển tần số đầu vào. . là tần số xung nhịp cơ sở của mạch. Cũng từ công thức trên có thể giới hạn được miền thay đổi của tần số ra của NCO Hình dưới đây là mô tả sơ đồ khối của NCO: G G E E Data R R _ _ Σ A C T C A A m D DAC 27 MHz NCO Hình 3.54: Sơ đồ khối của NCO - Khối tích lũy pha là bộ cộng tích lũy có nhiệm vụ tạo ra tổ hợp các giá trị pk theo thời gian, khối cộng tích lũy có đầu vào xung nhịp là xung nhịp cơ sở của mạch, giá trị tích lũy m hay còn gọi là từ điều khiển tần số. - Khối tham chiếu bảng SIN : từ giá trị pha tích lũy pk để tham chiếu giá trị biên độ sóng SIN uk tương ứng, khối này bản chất là một khối ROM hoặc RAM lưu trữ các giá trị của chu kz sóng được lượng tử và số hóa. Đầu ra của NCO là các giá trị số rời rạc theo thời gian, để thu được sóng SIN cần thêm một khối biến đổi tín hiệu số-tương tự DAC. Khi thiết kế khối SIN ROM cần lưu { một đặc điểm của sóng SIN là hàm lẻ nên trong một chu kz giá trị biên độ ở hai nửa chu kz là đối nhau, còn trong Chương III -Thiết kế vi mạch số trên FPGA 70
  71. một nửa chu kz thì sóng SIN là một hàm chẵn, đối xứng qua trục kπ/2. Do đó để lưu trữ các giá trị trong một chu kz sóng chỉ cần lưu trữ giá trị của ¼ chu kz. Để hiểu cụ thể hơn quan sát hình sau: 0011 0100 0010 0101 0001 0110 0000 0000 1000 1001 1111 1010 1101 1011 1100 Hình 3.55: Mã hóa bảng SIN ROM cho N = 4 Với trường hợp N=4 ta có mã hóa cho bảng SIN ROM như hình trên, các giá trị 4-bit x3x2x1x0 trên hình tương ứng là địa chỉ đầu vào của khối ROM. Với nhận xét như ở trên ta thấy thay vì sử dụng bảng ROM 16 giá trị có thể sử dụng bảng ROM 4 giá trị (miền đánh dấu đậm), bảng ROM này có địa chỉ biểu diễn bằng 2 bit x1x0. Ta giả sử giá trị biên độ SIN cũng biểu diễn dưới dạng 4-bit d3d2d1d0. Khi đó: Nếu x3x2 = 00 thì giá trị tương ứng giữ nguyên. Nếu x3x2 = 01 thì giá trị tương của biên độ Nếu x3x2 = 10 thì giá trị tương của biên độ Nếu x3x2 = 11 thì giá trị tương của biên độ Toàn bộ thao tác trên có thể được thực hiện bằng một khối logic không phức tạp, bù lại ta sẽ tiết kiệm được ¾ số lượng ô nhớ cần cho bảng ROM. Việc mã hóa chỉ ¼ bảng ROM cũng giúp tiết kiệm 1 bit dấu dùng để biểu diễn giá trị vì miền giá trị của bảng ROM luôn là giá trị dương. Chương III -Thiết kế vi mạch số trên FPGA 71
  72. Dưới đây là mã nguồn của một khối NCO dùng 6 bit cho giá trị tích lũy pha, tương ứng bảng ROM sẽ có 26/4 = 16 địa chỉ mã hóa bằng 4 bit, giá trị trong bảng ROM mã hóa bằng 4 bit với giá trị thay đổi từ 0 đến 15 Mã nguồn khối SIN ROM sin_rom.vhd library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_signed.ALL; use IEEE.STD_LOGIC_arith.ALL; entity sin_rom16 is port ( clk : in std_logic; cs : in std_logic; rst : in std_logic; address : in std_logic_vector(5 downto 0); dataout : out std_logic_vector (4 downto 0) ); end sin_rom16; architecture behavioral of sin_rom16 is signal addr :std_logic_vector (3 downto 0); signal data :std_logic_vector (3 downto 0); signal data1, data2 :std_logic_vector (4 downto 0); Du lieu trong ROM duoc nap cac gia tri co dinh begin sinrom: process (rst, cs, addr) begin if rst='0' and cs='1'then case addr is when x"0" => data data data data data data data data data data data data data data data data null; end case; Chương III -Thiết kế vi mạch số trên FPGA 72
  73. end if; end process sinrom; data1 addr addr null; end case; end process mod_address; get_data: process (clk, data) begin if clk = '1' and clk'event then case address (5) is when '0' => dataout dataout null; end case; end if; end process get_data; end behavioral; Bộ cộng đơn giản chỉ có cổng a, b và sum adder.vhd: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity adder is generic (N : natural := 32); port( A : in std_logic_vector(N-1 downto 0); B : in std_logic_vector(N-1 downto 0); SUM : out std_logic_vector(N-1 downto 0) ); end adder; architecture behavioral of adder is begin plus: process (A, B) begin sum <= a + b; end process plus; Chương III -Thiết kế vi mạch số trên FPGA 73
  74. end behavioral; Thanh ghi reg.vhd: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity reg is generic (N : natural := 32); port( D : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0); CLK : in std_logic; RESET : in std_logic ); end reg; architecture behavioral of reg is begin reg_p: process (CLK, RESET) begin if RESET = '1' then Q '0'); elsif CLK = '1' and CLK'event then Q <= D; end if; end process reg_p; end behavioral; Khối cộng tích lũy accumulator.vhd: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity accumulator is generic (N : natural := 32); port( A : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0); CLK : in std_logic; RESET : in std_logic ); end accumulator; architecture structure of accumulator is Chương III -Thiết kế vi mạch số trên FPGA 74
  75. signal sum : std_logic_vector(N-1 downto 0); signal Q_sig : std_logic_vector(N-1 downto 0); COMPONENT ADDER component adder is generic (N : natural := 32); port( A : in std_logic_vector(N-1 downto 0); B : in std_logic_vector(N-1 downto 0); SUM : out std_logic_vector(N-1 downto 0) ); end component; COMPONENT REG component reg is generic (N : natural := 32); port( D : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0); CLK : in std_logic; RESET : in std_logic ); end component; begin add: component adder generic map (6) port map (A, Q_sig, sum); regg: component reg generic map (6) port map (sum, Q_sig, CLK, RESET); Q <= Q_sig; end structure; Khối dds dds.vhd: library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity dds is port ( m : in std_logic_vector(5 downto 0); clk : in std_logic; nRESET : in std_logic; cs : in std_logic; dataout : out std_logic_vector(4 downto 0) ); end entity; architecture behavioral of dds is Chương III -Thiết kế vi mạch số trên FPGA 75
  76. signal RESET : std_logic; signal m_reg : std_logic_vector(5 downto 0); signal address : std_logic_vector(5 downto 0); component accumulator is generic (N : natural := 32); port( A : in std_logic_vector(N-1 downto 0); Q : out std_logic_vector(N-1 downto 0); CLK : in std_logic; RESET : in std_logic ); end component; component sin_rom16 is port ( clk : in std_logic; cs : in std_logic; rst : in std_logic; address : in std_logic_vector(5 downto 0); dataout : out std_logic_vector(4 downto 0) ); end component; begin RESET '0'); elsif clk = '1' and clk'event then m_reg <= m; end if; end process; u1: accumulator generic map (6) port map (m_reg, address , clk , RESET); u2: sin_rom16 port map (clk, cs, RESET, address, dataout); end architecture behavioral; Kết quả mô phỏng trên Modelsim Chương III -Thiết kế vi mạch số trên FPGA 76
  77. Hình 3.56: Kết quả mô phỏng khối nhận UART trên ModelSim Như quan sát trên giản đồ sóng giá trị tín hiệu ở đầu ra có dạng sóng Sin đúng như mong muốn, để tăng độ phân giải và thu được dạng sóng đầu ra tốt hơn thì tăng số bit dành cho thanh ghi tích lũy và số bit sử dụng cho biểu diễn giá trị biên độ sóng. Nội dung dds.ucf: NET "dataout[0]" LOC = "P102"; NET "dataout[1]" LOC = "p100"; NET "dataout[2]" LOC = "P99"; NET "dataout[3]" LOC = "p98"; NET "dataout[4]" LOC = "P97"; NET "m[0]" LOC = "P161"; NET "m[1]" LOC = "p162" ; NET "m[2]" LOC = "P163"; NET "m[3]" LOC = "p164"; NET "m[4]" LOC = "P165"; NET "m[5]" LOC = "P167"; NET "CLK" LOC = P184; NET "nRESET" LOC = P29; NET "CLK" TNM_NET = "CLK"; TIMESPEC TS_CLK = PERIOD "CLK" 5.2 ns HIGH 50 %; Từ điều khiển tần số được đặt giá trị tương ứng bằng 6 switch trên mạch, tín hiệu ra được gửi đến 5 LEDs. Về xung nhịp làm việc ta hạn chế xung CLK là 3.2 ns, con số này có được sau tổng hợp sơ bộ. Kết quả tổng hợp trên FPGA Device utilization summary: Selected Device : 3s500epq208-4 Number of Slices: 11 out of 4656 0% Number of Slice Flip Flops: 20 out of 9312 0% Number of 4 input LUTs: 20 out of 9312 0% Number of IOs: 14 Chương III -Thiết kế vi mạch số trên FPGA 77
  78. Number of bonded IOBs: 14 out of 158 8% IOB Flip Flops: 1 Number of GCLKs: 1 out of 24 4% === Timing Summary: Speed Grade: -4 Minimum period: 3.702ns (Maximum Frequency: 270.124MHz) Minimum input arrival time before clock: 2.360ns Maximum output required time after clock: 4.283ns Maximum combinational path delay: No path found All values displayed in nanoseconds (ns) Kết quả sau tổng hợp bao gồm kết quả về sử dụng tài nguyên và kết quả về thời gian. Về sử dụng tài nguyên, DDS sử dụng 11/4656 SLICEs. Về mặt thời gian, xung nhịp cực đại là 270Mhz, con số này cũng là giới hạn cho tần số sẽ tổng hợp được ở đầu ra vì đây là giới hạn của tần số cơ sở Kết quả về thời gian tĩnh sau khi thực hiện kết nối và phân bố thu được xung nhịp cực đại chính xác là 302Mhz. 1 constraint not met. Data Sheet report: All values displayed in nanoseconds (ns) Clock to Setup on destination clock clk + + + + + | Src:Rise| Src:Fall| Src:Rise| Src:Fall| Source Clock |Dest:Rise|Dest:Rise|Dest:Fall|Dest:Fall| + + + + + clk | 3.303| | | | + + + + + Timing summary: Timing errors: 1 Score: 103 (Setup/Max: 103, Hold: 0) Constraints cover 61 paths, 0 nets, and 28 connections Design statistics: Minimum period: 3.303ns{1} (Maximum frequency: 302.755MHz) Chương III -Thiết kế vi mạch số trên FPGA 78
  79. Bài tập chương IV 1. Bài tập cơ sở 1. Thiết kế, tổng hợp các cổng logic cơ bản trên FPGA. 2. Thiết kế, tổng hợp các flip-flop D, JK, T, RS trên FPGA. 3. Thiết kế và tổng hợp các bộ cộng có dấu 4 bit trên FPGA, nạp và kiểm tra trên FPGA. 4. Thiết kế bộ nhân 8 bit theo hai phương pháp sau: - Trực tiếp. - Thông qua 1 bộ nhân 4 bit và bộ cộng. So sánh kết quả tổng hợp nhận được. 5. Thiết kế tổng hợp module đơn giản dùng để kiểm tra 8 đèn LED và switch trên FPGA, 6. Thiết kế bộ đếm nhị phân 8 bit, nạp và kiểm tra trên FPGA. 7. Thiết kế bộ chia tần, sử dụng tần số cơ sở của bộ tạo dao động thạch anh có trên board FPGA. 8. Thiết kế bộ điều khiển đèn tín hiệu giao thông đơn giản trên FPGA. 9. Thiết kế module điều khiển lò viba trên FPGA. 10. Thiết kế module điều khiển máy photocopy trên FPGA. 11. Thiết kế, tổng hợp module điều khiển thang máy tòa nhà 8 tầng, hoạt động theo chế độ taxi. 12. Sử dụng các mẫu code có sẵn trong Xilinx ISE xây dựng các module dùng Multiplier 18x18 và Block RAM. 2. Bài tập nâng cao Bài 1: Hiện thực hóa bộ thu phát tín hiệu đường truyền cổng COM, hiện thực hóa trên FPGA thực hiện truyền và nhận ký tự chuẩn thông qua Hyper Terminal. Chương III -Thiết kế vi mạch số trên FPGA 79
  80. Bài 2: Điều khiển VGA, Text LCD Nghiên cứu chi tiết về chế độ làm việc, minh họa bằng các module điều khiển đơn giản. Bài 3: Bộ tổng hợp tần số DDS, xuất ra dạng sóng hình sin với tần số có thể thay đổi được. Bài 4: Bộ tổng hợp tần số DDS, xuất ra dạng sóng hình răng cưa với tần số có thể thay đổi được. Bài 5: Nghiên cứu và hiện thực hóa sơ đồ mã hóa thuật toán DES. Bài 6: Nghiên cứu và hiện thực hóa sơ đồ mã hóa thuật toán AES. Bài 7: Nghiên cứu và hiện thực hóa sơ đồ mã hóa thuật toán Triple DES. Bài 8: Nghiên cứu và hiện thực hóa sơ đồ mã hóa thuật toán mã hóa MD5. Bài 9: Bộ điều chế, thu và biến đổi tín hiệu FM nghiên cứu lý thuyết và mô hình, hiện thực hóa bộ thu và điều chế trên FPGA. Bài 10: Nghiên cứu về Fast Fourier Transform và sơ đồ hiện thực hóa trên FPGA. Bài 11: Nghiên cứu giao thức truyền dữ liệu qua USB, hiện thực hóa trên FPGA. Bài 12: Nghiên cứu 100Mb Ethernet, thiết kế một module liên quan. 3. Câu hỏi ôn tập lý thuyết 1. Định nghĩa FPGA, ưu điểm của FPGA với các chip khả trình khác. 2. Nguyên lý làm việc của FPGA, khả năng tái cấu trúc, tài nguyên FPGA. 3. Trình bày kiến trúc tổng quan của FPGA, các dạng tài nguyên của FPGA. 4. Trình bày kiến trúc tổng quan của Spartan 3E FPGA, các tài nguyên của FPGA này. 5. Trình bày cấu trúc chi tiết của CLB, SLICE, LUT. 6. Trình bày cấu trúc và nguyên lý làm việc của Arithmetic chain, Carry Chain, vai trò của các chuỗi này trong FPGA 7. Trình bày cấu trúc của Programable Interconnects trong FPGA Chương III -Thiết kế vi mạch số trên FPGA 80