HỌC VIỆN CÔNG NGHỆ BƢU CHÍNH VIỄN THÔNG
--------------------
Đỗ Mạnh Hà
Đặng Hoài Bắc
BÀI GIẢNG THIẾT KẾ LOGIC SỐ
Hà nội 9.2010
1
2
LỜI NÓI ĐẦU
“Thiết kế logic số” là môn học chuyên ngành quan trọng cho sinh viên ngành Kỹ thuật Điện – Điện tử tại Học viện Công nghệ Bƣu chính Viễn thông. Trong môn học này, sinh viên đƣợc trang các kiến thức về phƣơng pháp mô tả, thiết kế theo cấu trúc, RTL và hành vi các hệ thống số dùng ngôn ngữ mô tả phần cứng: thiết kế mạch số tổ hợp, thiết kế mạch số tuần tự, máy trạng thái, hazard, phát hiện lỗi,... thử nghiệm thiết kế các hệ thống số sử dụng những cấu kiện logic khả trình nhƣ CPLD, FPGA. Từ đó sinh viên có thể thực hiện thiết kế logic cho hệ thống điện tử số sử dụng ngôn ngữ mô tả phần cứng VHDL phục vụ mô phỏng, kiểm tra, thử nghiệm, thực thi một một hệ thống điện tử số hoàn chỉnh trong thực tế. Bên cạnh đó môn học còn giúp sinh viên tích lũy các kỹ năng chuyên môn nhƣ kỹ năng phân tích, thiết kế kỹ thuật hệ thống thống số dùng VHDL
Bài giảng gồm các nội dung chính nhƣ sau:
CHƢƠNG 1 – GIỚI THIỆU CHUNG VỀ THIẾT KẾ HỆ THỐNG SỐ
CHƢƠNG 2 – CẤU KIỆN LOGIC KHẢ TRÌNH (PLD).
CHƢƠNG 3 – CĂN BẢN VỀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL
CHƢƠNG 4 – PHƢƠNG PHÁP THIẾT KẾ LOGIC DÙNG VHDL
CHƢƠNG 5 – THIẾT KẾ CÁC HỆ THỐNG SỐ ỨNG DỤNG DÙNG VHDL
PHỤ LỤC I – QUY ƢỚC VỀ ĐẶT TÊN TRONG VHDL
PHỤ LỤC II – CẤU TRÚC LỆNH CƠ BẢN CỦA VHDL
PHỤ LỤC III – GIỚI THIỆU CPLD/FPGA CỦA XILINX
PHỤ LỤC IV – HƢỚNG DẪN PHẦN MỀM ISE CỦA XILINX
Trong đó Chƣơng 1, Phụ lục III, và Phụ lục IV do giảng viên Đặng Hoài Bắc biên soạn, các nội dung còn lại do giảng viên Đỗ Mạnh Hà biên soạn. Bài giảng đƣợc thực hiện trong một thời gian ngắn, nên khó tránh khỏi những thiếu sót. Các tác giả rất mong nhận đƣợc những ý kiến đóng góp các đồng nghiệp để bài giảng đƣợc hoàn thiện hơn. Mọi góp ý xin vui lòng gửi về Bộ môn kỹ thuật điện tử - Khoa Kỹ thuật Điện tử 1- Học viện Công nghệ Bƣu chính Viễn thông hoặc email: hadm@ptit.edu.vn. Chúng tôi xin chân thành cảm ơn các đồng nghiệp đã đóng góp các ý kiến quý báu; xin chân thành cảm ơn lãnh đạo Học viện, Phòng Đào tạo và NCKH, Khoa Kỹ thuật Điện tử 1, 2 đã tạo điều kiện để chúng tôi hoàn thành bài giảng này.
Hà nội, tháng 9 năm 2010
Nhóm tác giả
3
4
Mục lục
MỤC LỤC
LỜI NÓI ĐẦU ................................................................................................................. 3
MỤC LỤC ........................................................................................................................ 5
CHƢƠNG 1 – GIỚI THIỆU CHUNG VỀ THIẾT KẾ HỆ THỐNG SỐ .................. 8 1.1 GIỚI THIỆU CHUNG ................................................................................................ 8 1.2 QUY TRÌNH PHÁT TRIỂN HỆ THỐNG ĐIỆN TỬ ................................................ 9 1.2.1 Quy trình phát triển sản phẩm tuần tự ................................................................. 9 1.2.2 Quy trình phát triển sản phẩm song song .......................................................... 10 1.2 MÔ HÌNH KIẾN TRÚC VÀ CÁC MỨC THIẾT KẾ HỆ THỐNG SỐ .................. 12 1.2.1 Kiến trúc của hệ thống số................................................................................... 12 1.2.2 Các Mức thiết kế hệ thống số ............................................................................. 13 1.3. TỔNG QUAN VỀ CÁC CÔNG NGHỆ THỰC HIỆN HỆ THỐNG SỐ ................ 14 1.3.1 Phân loại các công nghệ logic số ...................................................................... 14 1.3.2 So sánh các loại cấu kiện chuẩn ........................................................................ 17 1.4 QUY TRÌNH THIẾT KẾ VI ĐIỆN TỬ .................................................................... 22 1.5. VAI TRÒ CỦA THIẾT KẾ VI ĐIỆN TỬ SỬ DỤNG HDL ................................... 23 1.6 LƢU ĐỒ THIẾT KẾ VI ĐIỆN TỬ DÙNG HDL ..................................................... 25 1.6.1. Thiết kế logic ..................................................................................................... 26 1.6.2. Tổng hợp thiết kế (Synthesis) ............................................................................ 26 1.6.3. Thiết kế mức vật lý (Physical Design) ............................................................... 26 1.6.4. Kiểm tra thiết kế (Verification) ......................................................................... 27 1.6.5 Sản xuất và đóng gói .......................................................................................... 28 1.7 CÁC PHẦN MỀM EDA HỖ TRỢ THIẾT KẾ LOGIC SỐ DÙNG HDL ............... 28
CHƢƠNG 2 – CẤU KIỆN LOGIC KHẢ TRÌNH (PLD). ........................................ 30 2.1. GIỚI THIỆU CHUNG VỀ CÔNG NGHỆ LOGIC KHẢ TRÌNH (PLD) ............... 30 2.1.1. SPLD ................................................................................................................. 30 2.1.2. CPLD (Complex PLD) ...................................................................................... 33 2.1.3. FPGA................................................................................................................. 34 2.2. GIỚI THIỆU PHƢƠNG PHÁP THIẾT LẬP CẤU HÌNH CHO CPLD/FPGA ...... 36 2.2.1 Phƣơng pháp dùng sơ đồ mô tả ......................................................................... 36 2.2.2. Phƣơng pháp dùng ngôn ngữ mô tả phần cứng (HDL) .................................... 37 2.3. YÊU CẦU CHUNG KHI THIẾT KẾ VỚI CPLD/FPGA ....................................... 37 2.3.1 Chọn vi mạch CPLD hoặc FPGA phù hợp ........................................................ 37 2.3.2 Chọn giải pháp cấu hình cho CPDL/FPGA ....................................................... 38 2.3.3 Chọn công cụ phần mềm phù hợp ...................................................................... 40 2.4. LƢU ĐỒ THIẾT KẾ CHO CPLD/FPGA ................................................................ 41 2.4.1 Lƣu đồ thiết kế cho CPLD .................................................................................. 41 2.4.2 Lƣu đồ thiết kế cho FPGA .................................................................................. 44 2.5.3. Ví dụ thiết kế đơn giản dùng phần mềm ISE ..................................................... 46
5
Mục lục
CHƢƠNG 3 – CĂN BẢN VỀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL ........... 65 3.1. LỊCH SỬ PHÁT TRIỂN CỦA VHDL .................................................................... 65 3.2 NHỮNG ƢU ĐIỂM CỦA VHDL ............................................................................ 66 3.3 CẤU TRÚC NGÔN NGỮ CỦA VHDL ................................................................... 67 3.3.1 Đối tƣợng trong VHDL ...................................................................................... 68 3.3.2 Kiểu dữ liệu trong VHDL ................................................................................... 70 3.3.3 Các phép toán trong VHDL ............................................................................... 81 3.3.4 Các đơn vị thiết kế trong VHDL......................................................................... 87 3.3.5 Cấu trúc chung của một chƣơng trình mô tả VHDL .......................................... 95 3.3.6 Môi trƣờng kiểm tra “testbench” ....................................................................... 97 3.3.7 Các cấu trúc lệnh song song ............................................................................ 100 3.3.8 Cấu trúc lệnh tuần tự ....................................................................................... 111 3.3.9 Hàm và thủ tục ................................................................................................. 120 BÀI TẬP ....................................................................................................................... 126
CHƢƠNG 4 – PHƢƠNG PHÁP THIẾT KẾ LOGIC DÙNG VHDL .................... 128 4.0 GIỚI THIỆU CHUNG VỀ THIẾT KẾ LOGIC DÙNG HDL ................................ 128 4.1 MÔ HÌNH BIỂU DIỄN HỆ THỐNG SỐ ............................................................... 129 4.1.1. Mô hình hoạt động (Behavioral views) ........................................................... 129 4.1.2. Mô hình cấu trúc (Structural views) ............................................................... 130 4.1.3. Mô hình vật lý (Physical views) ...................................................................... 130 4.2 CÁC MỨC ĐỘ TRỪU TƢỢNG TRONG MÔ TẢ HỆ THỐNG SỐ .................... 130 4.2.1. Mô tả mức mạch điện (Circuit Level or Transistor Level) ............................. 132 4.2.2. Mô tả mức logic (Logic Lever or Gate Level) ................................................. 132 4.2.3 Mô tả mức RTL (Register Transfer Level – Mức truyền đạt thanh ghi) .......... 132 4.2.4. Mô tả mức hệ thống (System Level or Processor Level) ................................. 132 4.2.5. Ví dụ các mô hình hệ thống số ........................................................................ 133 4.3 MÔ TẢ THEO MÔ HÌNH HOẠT ĐỘNG (BEHAVIORAL) ............................... 135 4.3.1 Mô tả theo mức hệ thống .................................................................................. 135 4.3.2 Mô tả theo mức RTL ......................................................................................... 136 4.3.3. Viết mô tả Testbench ....................................................................................... 139 4.3.4 Mã mô tả VHDL không tổng hợp đƣợc ............................................................ 153 4.4. CÁC MÔ HÌNH TÍN HIỆU SỐ ............................................................................. 154 4.5. MÔ TẢ THEO MÔ HÌNH CẤU TRÚC ................................................................ 155 4.6. MÔ TẢ MẠCH LOGIC TỔ HỢP ......................................................................... 160 4.6.1. Các cấu trúc lệnh VHDL dùng cho mô tả mạch tổ hợp .................................. 160 4.6.2. Mô tả các mạch tổ hợp cơ bản ........................................................................ 163 4.6.3. Phƣơng pháp thiết kế dùng chung phép toán .................................................. 182 4.6.4. Phƣơng pháp thiết kế dùng chung chức năng ................................................. 188 4.7. MÔ TẢ MẠCH LOGIC TUẦN TỰ CƠ BẢN ...................................................... 190 4.7.1. Cấu trúc lệnh VHDL dùng cho mô tả mạch tuần tự ....................................... 190 4.7.2. Mô tả các phần tử nhớ .................................................................................... 191 4.7.3. Bộ đếm (Counter) ............................................................................................ 197 4.7 MÁY TRẠNG THÁI HỮU HẠN – FSM .............................................................. 206
6
Mục lục
4.7.1. Giới thiệu chung về máy trạng thái hữu hạn - FSM ....................................... 206 4.7.2. Đồ hình máy trạng thái - FSMD ..................................................................... 208 4.7.3. Lƣu đồ giải thuật máy trạng thái – ASM ......................................................... 210 4.7.4. Mô tả VHDL cho FSM .................................................................................... 212 4.8. PHƢƠNG PHÁP THIẾT KẾ TOP-DOWN .......................................................... 220 BÀI TẬP ....................................................................................................................... 221
CHƢƠNG 5 – THIẾT KẾ CÁC HỆ THỐNG SỐ ỨNG DỤNG DÙNG VHDL ... 222 5.1. THIẾT KẾ MẠCH ĐIỀU KHIỂN HIỂN THỊ LED .............................................. 222 5.1.1 Thiết kế mạch điều khiển màn chỉ thị số LED. ................................................ 222 5.1.2 Thiết kế mạch điều khiển ma trận LED ............................................................ 227 5.1.3. Thiết kế ứng dụng điều hiển thị 8 led đơn sáng theo quy luật ........................ 233 5.2 THIẾT KẾ BỘ ĐẾM THUẬT NGHỊCH THEO ĐIỀU KHIỂN ............................ 237 5.3. THIẾT KẾ BỘ ĐẾM TẦN TỰ ĐỘNG THAY ĐỔI THANG ĐO ....................... 240 5.4. THIẾT KẾ MẠCH GIAO TIẾP ĐIỀU KHIỂN VGA ........................................... 248 5.5. THIẾT KẾ MẠCH ĐIỀU KHIỂN HIỂN THỊ LCD .............................................. 255 5.6 THIẾT KẾ MẠCH ĐIÈU KHIỂN MA TRẬN PHÍM............................................ 270 5.7. THIẾT KẾ GIAO TIẾP PS2 VỚI BÀN PHÍM ..................................................... 274 5.8. THIẾT KẾ BỘ ĐIỀU KIỂN TRUYỀN THÔNG NỐI TIẾP UART .................... 279
PHỤ LỤC I – QUY ƢỚC VỀ ĐẶT TÊN TRONG VHDL ...................................... 289 I.1. Quy ƣớc chung về đặt tên trong VHDL .................................................................. 289 I.2. Quy ƣớc đặt tên các đối tƣợng trong VHDL .......................................................... 290 I.3. Quy ƣớc đặt tên các đơn vị thiết kế ........................................................................ 291
PHỤ LỤC II – CẤU TRÖC LỆNH CƠ BẢN CỦA VHDL ..................................... 293
PHỤ LỤC III – GIỚI THIỆU CPLD/FPGA CỦA XILINX ................................... 297 III.1. GIỚI THIỆU CHUNG VỀ CPLD/FPGA CỦA XILINX .................................... 297 III.1.1. CPLD của Xilinx ........................................................................................... 297 III.1.2. FPGA của Xilinx ........................................................................................... 300 III.2. CẤU TRÚC CPLD CỦA XILINX ..................................................................... 301 III.2.1 XC9500XL ...................................................................................................... 301 III.2.2. CoolRunner XPLA3 ....................................................................................... 307 III.2.3 CoolRunner II ................................................................................................. 309 III.3. GIỚI THIỆU CÁC DÒNG FPGA CĂN BẢN .................................................... 313 III.3.1. Spartan-3 ....................................................................................................... 313 III.3.2. Virtex ............................................................................................................. 317
PHỤ LỤC IV – HƢỚNG DẪN PHẦN MỀM ISE CỦA XILINX .......................... 323 IV.1. GIỚI THIỆU CHUNG ......................................................................................... 323 IV.2. HƢỚNG D N CÀI Đ T .................................................................................... 323 IV.3. THỰC HIỆN LƢU ĐỒ THIẾT KẾ TRÊN ISE .................................................. 323
TÀI LIỆU THAM KHẢO .......................................................................................... 343
7
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
CHƢƠNG 1 – GIỚI THIỆU CHUNG VỀ THIẾT KẾ HỆ THỐNG SỐ
Giới thiệu chung
Quy trình phát triển hệ thống điện tử
Mô hình kiến trúc và các mức thiết kế hệ thống số
Tổng quan về các công nghệ thực hiện hệ thống số
Quy trình thiết kế vi điện tử
Vai trò của thiết kết vi điện tử sử dụng HDL
Lƣu đồ thiết kế vi điện tử dùng HDL
Các phần mềm EDA hỗ trợ thiết kế logic dùng HDL
1.1 GIỚI THIỆU CHUNG
Hiện nay, Hệ thống số đang là trung tâm của các hệ thống điện tử. Mọi phát triển hiện nay đều dựa vào công nghệ số. Trang bị kiến thức và kỹ năng thiết kế hệ thống số là rất quan trọng đối với kỹ sƣ điện tử. Các phƣơng thức nền tảng cho phát triển hệ thống số nhƣ sau:
+ Phát triển hệ thống số trên cở sở dùng rút gọn hàm logic, bảng trạng thái, máy trạng thái dùng các cấu kiện logic chuẩn chức năng cố định nhƣ: Các cổng logic đơn giản, các mô- đun mạch tổ hợp và tuần tự cơ bản.
+ Phát triển hệ thống số trên cơ sở dùng các hệ vi xử lý, vi điều khiển, bộ xử lý tín hiệu số, và thực hiện ghép nối máy tính: Chức năng hệ thống chủ yếu đƣợc phát triển nhờ lập trình phần mềm.
+ Phát triển hệ thống số trên cơ sở thiết kế logic số: Sử dụng ngôn ngữ mô tả phần cứng HDL mô tả đƣợc hệ thống số cần thiết kế, thực hiện tổng hợp và thực hiện chúng trên các cấu kiện logic khả trình PLD hay chuyển sang các mức thiết kế vật lý, layout và thực hiện trên các vi mạch số VLSI... Đây là những tiền đề tốt cho thiết kế IC số và thiết kế hệ thống VLSI.
Cả ba hƣớng trên đều có thể đƣợc sử dụng để phát triển các hệ thống số nhƣng mức độ đơn giản hay phức tạp là khác nhau và đều đƣợc đào tạo cho sinh viên ngành Điện – Điện tử và Kỹ thuật Máy tính ở các môn học với các mức độ khác nhau. Trong môn học Thiết kế logic số chủ yếu tập trung vào hƣớng thứ 3. Hƣớng phát triển này vừa phù hợp với môi trƣờng giáo dục đại học và yêu cầu phát triển khả thi đƣợc các ứng dụng đa dạng trong thực tế với mức độ phức tạp cao. Trong đó phƣơng pháp thiết kế trọng tâm mà sinh viên sử dụng để phát triển các hệ thống số là Thiết kế logic dùng HDL, đây cũng là phƣơng pháp thiết kế đòi hỏi sinh viên phải có kiến thức nền tảng tổng hợp tốt của cả hai hƣớng phát triển trên. Sử dụng thiết kế logic cũng đòi hỏi sinh viên phải có hiểu biết sâu sắc về hoạt động của đối tƣợng mình định thiết kế, và đặc biệt là phát huy đƣợc tính sáng tạo của sinh viên. Hơn thế nữa thiết kế logic số dùng HDL hiện vẫn đang đƣợc giảng dạy phổ biến trong các Trƣờng đại học tiên tiến trên thế giới và vẫn là phƣơng pháp thiết kế phổ biến của các phần mềm Thiết kế điện tử hiện đại đang đƣợc sử dụng phổ biến cho các nhà Thiết kế của nhiều doanh nghiệp điện tử trên thế giới.
8
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Trƣớc khi tập trung vào trình bày về phƣơng pháp thiết kế logic số dùng HDL ở các chƣơng tiếp theo, trong chƣơng này sẽ nêu bật đƣợc vai trò và vị trí của Thiết kế điện tử nói chung và Thiết kế logic nói riêng trong toàn bộ quá trình phát triển hệ thống điện tử số hiện đại.
1.2 QUY TRÌNH PHÁT TRIỂN HỆ THỐNG ĐIỆN TỬ
Phát triển hệ thống điện tử nói chung, hệ thống số nói riêng sẽ đƣợc thƣc hiện trên cơ sở phát triển các hệ thống con và ghép chúng với nhau tạo thành toàn bộ hệ thống. Tuy nhiên, trƣớc khi xem xét đến quá trình phát triển cũng nhƣ thiết kế hệ thống điện tử chúng ta chú ý ba điểm nhƣ sau trong quá trình thiết kế:
1. Luôn luôn sử dụng chung:
2. Không bao giờ tự bỏ bất cứ điều gì để thay đổi:
3. Hầu hết có nhiều hơn một cách để giải quyết một vấn đề: Ngƣời thiết kế có nhiệm vụ tìm ra cách giải quyết vấn đề hợp lý nhất. Giải pháp đƣợc phát triển đầu tiên không nhất thiết phải là tốt nhất.
Quy trình phát triển một hệ thống số (một sản phẩm hệ thống số) là quá trình một thiết kế đƣợc phát triển từ những ý tƣởng ban đầu đến sự hiện thực hóa đƣợc một sản phẩm (thƣơng mại hoặc phi lợi nhuận). Quá trình phát triển một sản phẩm hệ thống số có thể tiếp cận theo một trong hai hƣớng sau:
+ Quy trình phát triển tuần tự
+ Quy trình phát triển song song
1.2.1 Quy trình phát triển sản phẩm tuần tự
Trong quá trình phát triển sản phẩm tuần tự, mỗi một bƣớc trong quá trình phát triển (từ ý tƣởng thiết kế đến quá trính sản xuất và kiểm tra sản phẩm) đƣợc hoàn thành trƣớc khi thực hiện bƣớc tiếp theo. Quy trình phát triển truyền thống này đƣợc minh họa nhƣ hình vẽ và gồm các bƣớc chính nhƣ sau:
1. Xác định yêu cầu sản phẩm: Xác định các yều cầu, tham số kỹ thuật cần phát triển
cho sản phẩm.
2. Thiết kế: Tạo ra thiết kế ban đầu
3. Kiểm tra thiết kế: Kiểm tra chức năng của thiết kế ban đầu có đúng yêu cầu không?
4. Chế mẫu: Tạo ra sản phẩm mẫu vật lý của thiết kế và kiểm tra hoạt động của mẫu
theo yêu cầu thiết kế.
5. Kiểm tra mẫu: Xác định xem liệu chức năng của thiết kế có nhƣ kỳ vọng hay không và kiểm tra xem có xuất hiện những vấn đề của thiết kế mà cần đƣợc giải quyết hay không?
6. Thiết kế lại: Dựa vào những vấn đề đã phát hiện ở bƣớc trên, thực hiện thiết kế lại
sản phẩm để giải quyết những vấn đề đó
7. Kiểm tra lại thiết kế: Kiểm tra chức năng của thiết kế mới có đúng yêu cầu không?
8. Sản xuất sản phẩm: Khi thiết kế đã đƣợc kiểm tra thành công, thì có thể sản xuất
hoạt loạt sản phẩm
9
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
9. Kiểm tra sản phẩm: Các sản phẩm đã đƣợc sản xuất dƣợc kiểm tra để phát hiện lỗi
xuất hiện trong quá trình sản xuất.
Mặc dù cách tiếp cận của quy trình trên có vể đơn giản, dễ thực hiện, dễ quản lý, nhƣng cách tiếp cận tuần tự đó thƣờng không có hiệu quả cao. Nó không cho phép một bƣóc nào đó tác động đến các bƣớc khác trừ các bƣớc ngay trƣớc và sau nó. Ví dụ bƣớc Chế mẫu không tác động đến bƣớc sản xuất. Những ràng buộc vốn có trong bƣớc chế mẫu có thể không tạo ra lỗi đƣợc mà chỉ đƣợc phát hiện trong bƣớc sản xuất. Những thông tin quan trọng có thể đƣợc phát sinh trong bƣớc sản xuất đã bị bỏ qua trong bƣớc Chế mẫu và thậm trí là trong cả bƣớc Thiết kế.
Xác định yêu cầu sản phẩm
Thiết kể sản phẩm
Kiểm tra Thiết kế
Chế mẫu
Kiểm tra mẫu
Thiết kế lại
Kiểm tra lại Thiết kế
Sản xuất sản phẩm
Kiểm tra sản phẩm
Hình 1.1 – Quy trình phát triển sản phẩm tuần tự
1.2.2 Quy trình phát triển sản phẩm song song
Trong quy trình phát triển song song, mỗi bƣớc từ ý tƣởng thiết kế đến bƣớc sản xuất và kiểm tra đƣợc liên kết với nhau, cho phép thông tin đƣợc chuyển qua lại giữa các bƣớc. Quy trình phát triển sản phẩm theo cách tiếp cận này đƣợc minh họa nhƣ Hình 1.2. Trong đó các bƣớc khác nhau trong quy trình đƣợc thực hiện tại cùng thời điểm. Toàn bộ quá trình có cấu trúc dàn flatter, ngƣợc lại so với cách tiếp cận theo tuần tự, quy trình phát triển song song cho phép nhiều vấn đề đƣợc giải quyết cùng nhau. Điều đó cho phép tất cả các thành viên tham
10
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
gia vào phát triển sản phẩm có những thông tin liên quan và đánh giá các khía cạnh của vấn đề thiết kế và thay đổi các thành phần của họ trong quá trình phát triển sản phẩm.
Xác định yêu cầu sản phẩm
DFx[1]
Ý tƣởng thiết kế
Yêu cầu Thị trƣờng
Cơ cấu chất lƣợng
Hệ thống hỗ trợ và dịch vụ
Các quy trình sản xuất
Định dạng thiết kế
Sản xuất
Sản phẩm
[1] DFx:
DFA: Design for Assembly
DFD: Design for Debug
DFM: Design for Manufacturability
DFR: Design for Reliability
DFT: Design for Testability
DFY: Design for Yield
Hình 1.2 – Quy trình phát triển sản phẩm song song
Tính song song trong quy trình phát triển này đặc biệt đƣợc thực hiện rất rõ trong bƣớc thiết kế sản phẩm. Trong bƣớc thiết kế sản phẩm đã có tính đến các yếu tố khác nhau, và hƣớng nhiều đến các mục đích khác ngoài Yêu cầu kỹ thuật của sản phẩm. Đó là các quá trình thiết kế hƣớng mục đích nhƣ:
- DFA: Design for Assembly – Thiết kế tính đến quá trình lắp rắp sản phẩm.
- DFD: Design for Debug – Thiết kế tính đến việc gỡ rối.
- DFM: Design for Manufacturability – Thiết kế tính đến quá trình sản xuất.
11
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
- DFR: Design for Reliability – Thiết kế tính đến mức độ tin cậy.
- DFT: Design for Testability – Thiết kế hỗ trợ việc đo kiểm.
- DFY: Design for Yield - Thiết kế tính đến yêu cầu sản lƣợng.
Nhƣ vậy Thiết kế là một bƣớc rất quan trọng trong quá trình phát triển sản phẩm điện tử, nó quyết định rất lớn đến sự thành công của sản phẩm. Nắm bắt các công nghệ và thực hành kỹ năng thiết kế điện tử là rất cần thiết đối với sinh viên ngành Điện – Điện tử và Kỹ thuật máy tính.
1.2 MÔ HÌNH KIẾN TRÖC VÀ CÁC MỨC THIẾT KẾ HỆ THỐNG SỐ
Hệ thống số: là hệ thống điện tử xử lý tín hiệu số trên cơ sở các mạch điện tử số. Hệ thống số hiện nay chủ yếu xử lý tín hiệu nhị phân và đƣợc xây dựng trên cơ sở các hệ thống tính toán số. Ví dụ các hệ thống số điển hình nhƣ máy tính, điện thoại số, .... Một hệ thống điện tử có thể bao gồm cả các mạch xử lý tín hiệu tƣơng tự, tuy nhiên hiện nay phần mạch số là khối trung tâm và quan trọng nhất của hệ thống.
1.2.1 Kiến trúc của hệ thống số
Kiến trúc của một hệ thống số cơ bản đƣợc mô tả nhƣ trong Hình 1.3, nó gồm các thành
phần:
Hình 1.3 – Kiến trúc hệ thống số và các mức thiết kế
- Phần mềm ứng dụng: là các phần mềm đƣợc thiết kế để thực thi một tác vụ thực tế dựa trên tài nguyên do nền phần cứng cung cấp. Ví dụ nhƣ các phần mềm chơi nhạc trên các máy MP3, ứng dụng game trên các máy PS2, bộ công cụ Microsoft Office trên các PC,...
- Phần mềm hệ thống: Ví dụ nhƣ các hệ điều hành Windows, Linux, Unix, và các chƣơng trình hỗ trợ nhƣ trình biên dịch, loader, linker, debugger, .. giúp quản lý các tài
12
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
nguyên phần cứng ở mức thấp. Về cơ bản nó cho phép các phần của hệ thống làm việc với nhau, cấp phát các tài nguyên cho các phần mềm ứng dụng.
- Phần cứng : chỉ các thành phần vật lý của hệ thống, đƣợc cấu tạo về cơ bản từ các linh kiện vậy lý.Ví dụ nhƣ với một PC, phần cứng gồm các thành phần bo mạch chủ, Ram, ở cứng, nguồn nuôi, ... Các bo mạch chủ thì đƣợc cấu tạo từ các linh kiện bán dẫn, các linh kiện thụ động nhƣ điện trở, tụ điện, cuộn cảm,...
Từ kiến trúc trên của hệ thống số, có thể phân chia việc thiết kế một hệ thống thành các
mảng công việc khác nhau nhƣ sau:
- Quản lý, tích hợp và thiết kế hệ thống.
- Thiết kế, phát triển phần mềm ứng dụng.
- Thiết kế firmware (device driver, OS, middleware).
- Thiết kế mạch, PCB.
- Thiết kế vi điện tử : linh kiện, IC, IP, Phụ kiện
Đối với từng mảng công việc, đòi hỏi ngƣời thực hiện cần có các kĩ năng tƣơng ứng.
1.2.2 Các Mức thiết kế hệ thống số
a. Quản lý, tích hợp, thiết kế hệ thống:
Đây là một trong những mặt có vai trò quan trọng đối với sự thành công của một dự án
thiết kế một hệ thống số. Nó bao gồm các công việc:
- Hoạch định các yêu cầu của hệ thống, từ đó xây dựng kết cấu chung của hệ thống.
- Phân tách, tích hợp hệ thống, kiểm tra hệ thống,... đảm bảo hệ thống hoạt động ổn
định, đáp ứng đƣợc các yêu cầu về hiệu năng, giá thành, tuổi thọ,...
.- Xác định các tài nguyên có sẵn bao gồm nhân lực và vật lực.
- Lên kế hoạch các bƣớc thực hiện.
- Giám sát quá trình thực hiện.
…
b. Thiết kế, phát triển phần mềm ứng dụng
Đối với các hệ thống số, điều quan trọng là ứng dụng thực tiễn của nó trong đời sống, quan trọng hơn, chức năng đƣợc quyết định bởi phần mềm ứng dụng đƣợc cài đặt trên hệ thống. Vì vậy, các thiết kế, phát triển phần mềm ứng dụng là không thể thiếu đối với thiết kế hệ thống số hiện nay. Quá trình phát triển phần mềm ứng dụng thƣờng đƣợc dựa trên các kỹ thuật về xây dựng cấu trúc dữ liệu và giải thuật; cơ sở dữ liệu; các phƣơng thức lập trình hƣớng cấu trúc , hƣớng đối tƣợng; đồ họa; đa phƣơng tiện; xử lý tín hiệu... Và sử dụng các ngôn ngữ lập trình ứng dụng nhƣ C/C++, VC++, VB, Delphi, ASP, PHP, JAVA để thực hiện trên các nền tẳng hệ điều hành khác nhau.
c. Thiết kế firmware
Điều quan trọng của các ứng dụng hệ thống số đó là tận dụng đƣợc các tài nguyên của hệ thống : CPU, memory, các ngoại vi, các giao diện,... Hầu hết quá trình xử lý bên trong của hệ thống là sự giao tiếp giữa các thành phần phần cứng bên trong. Vì vậy đòi hỏi xây dựng firmware để quản lý các tài nguyên này một cách hữu hiệu, cung cấp các giao diện truy cập các tài nguyên này cho lớp cao hơn( lớp ứng dụng).
13
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Nó gồm các lĩnh vực về thiết kế trình điều khiển thiết bị - Device Driver, thiết kế OS –
hệ điều hành, thiết kế phần mềm Middleware.
d. Thiết kế mạch, PCB:
Phần cứng có thể coi nhƣ phần xác của hệ thống, cũng là một phần không thể thiếu của hệ thống số. Thiết kế phần cứng là quá trình kết hợp các thành phần rời rạc nhƣ các phần tử mạch điện tử cơ bản, phần cứng vi xử lý, vi điều khiển, IC chức năng, FPGA, CPLD..., và các phụ kiện khác để tạo lên 1 hệ thống hoàn chỉnh. Quá trình thiết kế thƣờng đƣợc hỗ trợ bằng các công cụ phần mềm thiết kế mạch, mô phỏng mạch nhƣ Altium, ISE, proteus,..
e. Thiết kế vi điện tử : linh kiện, IP, IC, phụ kiện
Vi điện tử là các vấn đề liên quan đến nghiên cứu, chế tạo các linh kiện điện tử. Những linh kiện này làm từ các chất bán dẫn. Chúng là những thành phần cơ bản trong các thiết kế điện tử nhƣ transistor, tụ điện, điện trở, diode, IC, ...Có thể nói các linh kiện, IP core, IC, phụ kiện,... là những “viên gạch” xây lên “ngôi nhà” phần cứng hệ thống. Thiết kế vi điện tử là quá trình thiết kế các thành phần linh kiện này. Hiện nay các thiết kế vi điện tử chủ yếu đƣợc thực hiện ở mức thiết kế layout, ASIC, VLSI .. sử dụng các phần mềm EDA nhƣ MentorGraphic, Cadence, ADS, ...
Nhƣ vậy trong quá trình phát triển Hệ thống số, tùy theo công nghệ logic số đƣợc sử dụng mà các mức thiết kế ở trên đƣợc thực hiện ở với các mức độ khác nhau. Có những công nghệ chỉ cần sử dụng 1 mức thiết kế, và có những công nghệ phải sử dụng một vài mức hay tất cả các mức thiết kế kể trên để hoàn thiện sản phẩm.
1.3. TỔNG QUAN VỀ CÁC CÔNG NGHỆ THỰC HIỆN HỆ THỐNG SỐ
1.3.1 Phân loại các công nghệ logic số
Ngày nay công nghệ Logic số đã phát triển rất mạnh mẽ và là công nghệ chủ đạo trong việc phát triển các hệ thống số trong các lĩnh vực công nghiệp và dân dụng, điều khiển – tự động, viễn thông và công nghệ thông tin. Hiện nay có có rất nhiều loại công nghệ logic số khác nhau đƣợc sử dụng để phát triển các hệ thống số. Biểu đồ phân loại các công nghệ logic số đƣợc sử dụng để phát triển các hệ thống số nhƣ Hình 1.4. Trong đó gồm có:
1. Sử dụng cấu kiện chuẩn (Standard Components): gồm có 2 hƣớng chính:
- Sử dụng cấu kiện logic chuẩn có ứng dụng/chức năng cố định: Đây là công nghệ logic truyền thống gồm có các IC số chức năng cố định, công nghệ này có 2 họ cấu kiện logic điển hình là TTL 74xx và CMOS 4xxx. Chức năng của mỗi cấu kiện là cố định do nhà sản xuất tạo ra, ngƣời sử dụng chỉ thực hiện kết nối chúng với nhau để xây dựng mạch ứng dụng. Các IC số theo công nghệ logic chuẩn này rất đa dạng từ IC chức năng thực hiện các phép toán logic căn bản đến IC thực hiện các chức năng phức tạp khác nhƣ: bộ hợp kênh, phân kênh, bộ cộng, so sánh, bộ mã hoá, giải mã, bộ đếm… Chúng là các IC số có chức năng cố định, tức là mỗi IC thực hiện một chứ năng chuyên biệt. Những cấu kiện này đƣợc sản xuất một số lƣợng lớn để đáp ứng nhu cầu ứng dụng phong phú. Để thiết kế một mạch số, nhà thiết kế có thể chọn từ các IC có sẵn phù hợp nhất cho mạch điện. Phần thiết kế này có thể đƣợc chỉnh sửa để đáp ứng các yêu cầu chuyên biệt của những linh kiện này.
14
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
- Sử dụng lập trình để phát triển ứng dụng (Application by programming): Sử dụng các IC số chức năng đa dụng đã đƣợc chế tạo sẵn để phát triển ứng dụng theo hai cách khác nhau nhƣ sau:
+ Lập trình phần mềm (Software Programming): Phát triển hệ thống số dựa trên các hệ vi xử lý hoặc vi điều khiển đa dụng, hoặc Bộ xử lý tín hiệu số (DSPs). Các ứng dụng của hệ thống đƣợc phát triển bằng cách lập trình phần mềm cho các hệ vi xử lý, vi điều khiển hoặc DSPs đó.
+ Lập trình/Cấu hình phần cứng (Hardware Programming/Configuring): Phát triển hệ thống số dựa trên lập trình phần cứng để cấu hình cho các cấu kiện logic khả trình (PLD). Đây là một chip LSI có chứa nhiều cấu trúc logic đồng nhất và các kết nối khả trình cho phép nhà thiết kế tạo tuỳ biến cho nó để dùng cho bất kỳ ứng dụng đặc biệt nào, tức là nó có thể đƣợc ngƣời dùng lập trình lại cấu hình phần cứng để thực hiện một chức năng cần thiết cho ứng dụng của họ.Các PLD có các ƣu điểm sau:
Thời gian thiết kế ứng dụng ngắn.
Chi phí phát triển thấp.
Giảm thiểu đƣợc yêu cầu khoảng trống trên bảng mạch.
Giảm thiểu đƣợc yêu cầu về điện.
Bảo đảm tính bảo mật của thiết kế.
Tốc độ chuyển mạch nhanh hơn.
Mật độ tích hợp cao.
Chi phí sản xuất số lƣợng lớn thấp.
PLD cũng cho phép nhà thiết kế có nhiều phƣơng tiện linh động hơn để thí nghiệm với các bản thiết kế bởi vì chúng có thể đƣợc lập trình lại trong vài giây.
Với nhiều ƣu điểm nhƣ vậy nên hiện nay có một số lƣợng lớn các PLD đƣợc các nhà sản xuất IC tạo ra với nhiều tính năng đa dạng và nhiều tuỳ chọn có sẵn để nhà thiết kế mạch có thể sử dụng một cách phổ biến. Một số cấu trúc của PLD nhƣ: Mảng logic khả trình (PLA). Logic mảng khả trình (PAL), Cấu kiện logic khả trình đơn giản (SPLD), và Mảng cổng có thể lập trình theo trƣờng (FPGA) sẽ đƣợc đề cập kỹ hơn trong các phần sau.
2. Công nghệ ASIC (Application specific Integrated Circuit):
Để khắc phục những nhƣợc điểm của việc thiết kế bằng cách sử dụng các IC chức năng cố định, các mạch tích hợp chuyên biệt ứng dụng (ASIC-Aplication Specific IC) đã đƣợc phát triển. Các ASIC đã đƣợc thiết kế để đáp ứng các yêu cầu chuyên biệt của một mạch và đƣợc giới thiệu bởi một nhà sản xuất IC. Các thiết kế này quá phức tạp không thể thực hiện bằng cách sử dụng các IC chức năng cố định đƣợc Ngƣời sử dụng có thể thiết kế cấu hình chúng theo chức năng mong muốn, nhƣng cần thực hiện công đoạn sản xuất cuối cùng tại nhà máy để tạo ra một lại IC chuyên dụng cho mục đích riêng của ngƣời sử dụng. Hiện nay công nghệ ASIC gồm 2 loại là: Gate Arrays và Standard Cell.
Cấu kiện Gate Arrays đƣợc cấu tạo từ mảng các logic cell cố định đã đƣợc sản xuất trƣớc. Mỗi logic cell gồm có vài cổng logic hoặc một Flip-Flop. Cần có một bƣớc sản xuất
15
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
cuối cùng để thực hiện tạo ra lớp kết nối các logic cell này theo mẫu kết nối đã đƣợc tạo ra bởi ngƣời sử dụng khi thực hiện một thiết kế xác định.
Cấu kiện Standard Cell không có cấu trúc cố định, nhà sản xuất tạo ra mặt nạ riêng để xây dựng IC dựa vào những lựa chọn linh kiện của ngƣời sử dụng nhƣ các bộ điều khiển, ALU, RAM, ROM, vi xử lý... từ thƣ viện standard cell mà nhà sản xuất đã đƣa ra. Các lớp mặt nạ này sẽ đƣợc thực hiện trong quá trình sản xuất tại nhà máy.
Hình 1.4 – Các công nghệ Logic số
3. Công nghệ thiết kế vi mạch số mật độ tích hợp lớn (Full Custom VLSI Design):
Công nghệ thực hiện việc thiết kế vi mạch số ở mức Transistor trên bề mặt của tinh thể bán dẫn, cho phép tạo ra vi mạch có chức năng mong muốn, thƣờng sử dụng để thiết kế các vi mạch đa dụng có tính năng mạnh, và có phạm vi ứng dụng lớn, điển hình nhƣ các họ vi xử lý (MicroProcessor), Bộ nhớ RAM...., các vi mạch số có độ phức tạo cao, tính năng mạnh... Khi sử dụng các họ vi xử lý để phát triển ứng dụng, thiết kế của ngƣời sử dụng đƣợc chƣơng trình hoá và đƣợc cài đặt vào các thiết bị nhớ. Nhiệm vụ chính của việc thiết kế là lập trình cho các vi xử lý này theo bài toán đã đặt ra.
4. Công nghệ SoC (System on Chip)
Hệ thống trên một vi mạch, là một khái niệm dùng để chỉ các hệ thống đƣợc xây dựng trên ý tƣởng tích hợp tất cả các thành phần của một hệ thống máy tính lên trên một vi mạch đơn (hay còn gọi là một chip đơn). Hệ thống trên một vi mạch có thể bao gồm các khối chức năng số, tƣơng tự, tín hiệu kết hợp (mixed-signal) và cả các khối tần số radio (RF). Ứng dụng điển hình của các hệ thống trên một vi mạch là các hệ thống nhúng. Các SoC này thƣờng đƣợc phát triển nhờ phƣơng pháp thiết kế vi mạch điển hình là thiết kế hệ thống VLSI.
16
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
So sánh chung giữa các công nghệ logic số
Sự phức tạp khi sử dụng, thời gian thiết kế, cũng nhƣ độ phức tạp của ứng dụng là khác
nhau đối với mỗi loại công nghệ logic số.
Việc phát triển vi mạch VLSI đa dụng cũng nhƣ SoC cho một thiết kế ở mức transistor có thể mất tới vài năm cho việc thiết kế và kiểm tra. Do đó công nghệ này phù hợp cho việc phát triển những loại cấu kiện có số lƣợng cao nhất, hiệu năng cao nhất, đa dụng nhất ví dụ nhƣ vi xử lý, bộ nhớ, vi điều khiển... sử dụng trong trong các hệ máy tính cũng nhƣ trong các hệ thống số khác.
Giá thành và thời gian phát triển sản phẩm dùng ASIC giảm hơn công nghệ thiết kế VLSI, tuy vậy vẫn cần thời gian và chi phí phát triển cho công đoạn sản xuất cuối cùng ở nhà máy. Việc kiểm tra đƣợc thực hiện bởi ngƣời sử dụng sau công đoạn sản xuất cuối cùng đó, nên nếu có bất kỳ lỗi thiết kế nào cũng sẽ dẫn đến việc tăng thời gian và giá thành phát triển. Công nghệ này thích hợp với phát triển các sản phẩm có số lƣợng và thời gian sống lớn.
Sử dụng Công nghệ Cấu kiện chuẩn, mà điển hình là sử dụng Vi xử lý, Vi điều khiển, và Công nghệ logic khả trình (điển hình nhất là CPLD và FPGA) rất thích hợp cho yêu cầu phát triển sản phẩm nhanh, số lƣợng không lớn và có mật độ tích hợp cũng độ phức tạp không quá lớn, và đặc biệt tiện lợi trong giai đoạn nghiên cứu phát triển, chế thử sản phẩm. Tuy nhiên sự cân bằng về hiệu năng và tính kinh tế giữa ASIC, CPLD, FPGA, Vi xử lý sẽ liên tục thay đổi với mỗi thế hệ cấu kiện và công cụ thiết kế mới.
Tóm lại trong số các công nghệ logic số hiện nay, công nghệ Cấu kiện chuẩn là lựa chọn khá thích hợp cho việc phát triển các hệ thống số không quá phức tạp, với số lƣợng không lớn, thời gian phát triển nhanh, nhất là ở những nƣớc có nền công nghiệp điện tử cũng nhƣ sản xuất vi mạch mới phát triển nhƣ Việt Nam và đặc biệt là trong môi trƣờng giáo dục.
1.3.2 So sánh các loại cấu kiện chuẩn
Các cấu kiện chuẩn phổ biến nhất hiện nay dùng cho phát triển các hệ thống số gồm các công nghệ sau: Cấu kiện logic chuẩn, ASSP, MCU, RISC/GPP, DSP, Vi xử lý có thể cấu hình, FPGA.
Các công nghệ đều nhằm đáp ứng lợi ích ngƣời dùng là thiết bị phải nhỏ hơn, nhanh hơn, thông minh hơn, tiêu thụ ít năng lƣợng hơn, tƣơng tác đƣợc với nhau... nhƣng cũng làm các nhà thiết kế bối rối nhiều hơn khi lựa chọn công nghệ thích hợp cho sản phẩm của mình. Tiêu chí để đánh giá so sánh chúng bao gồm:
- Thời gian đƣa sản phẩm ra thị trƣờng ***
- Năng lực thực hiện
***
- Giá thành
***
- Dễ phát triển ***
- Năng lƣợng tiêu thụ **
- Tính mềm dẻo *
(Các dấu (*) xác định tầm quan trọng của các tiêu chí)
17
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Thời gian đƣa sản phẩm ra thị trƣờng: đây là tiêu chí quan trọng nhất trong một chu trình phát triển, từ vài năm đến vài tháng. Theo bài báo “Mind of the Engineer” của Cahners thì thậm chí Thời gian ra thị trƣờng còn điều khiển cả nền công nghiệp.
Năng lực thực hiện: là tiêu chí quyết định năng lực của sản phẩm. Tăng năng lực thực hiện sẽ thêm chức năng và tốc độ cao hơn, cũng nhƣ giảm kích thƣớc và đạt chất lƣợng cao hơn. Năng lực thực hiện có thể đo bằng nhiều cách, nói chung là số triệu thao tác trên một giây (MIPS), số triệu phép nhân trên một giây (MMACS); hoặc, đôi khi, đơn giản hơn đo bằng số chu kỳ clock trên một giây (MHz).
Giá thành: thƣờng là tiêu chí hiển nhiên nhất, nhƣng trong đa số trƣờng hợp vẫn xếp sau Thời gian ra thị trƣờng và Năng lực thực hiện. Nói chung số lƣợng sản phẩm và khách hàng càng nhiều thì tiêu chí này càng đƣợc đẩy lên cao và giá càng thấp.
Dễ phát triển: tiêu chí này đi cùng với hỗ trợ phát triển, công cụ phát triển, giá phát triển và có thể phân chi tiết thành Hỗ trợ kỹ thuật, Đào tạo kỹ thuật, Trang web có giá trị của thành phần thứ ba, Công cụ phần mềm, Tài liệu, Thời gian thiết kế.Rõ ràng là càng nhiều hỗ trợ kỹ thuật thì ngƣời kỹ sƣ thiết kế càng có điều kiện tập trung vào công việc sáng chế của mình, thay vì phải tự nghiên cứu thì anh ta có thể thuê ý kiến của các chuyên gia. Công cụ phát triển cũng là chìa khóa để thiết kế. Các công cụ mạnh nhƣ DSP Starter Kits, Môi trƣờng phát triển tích hợp, Compiler và Công cụ cho phần cứng đích... giúp thiết kế trực quan và dễ dàng hơn. Tất cả những điều đó đều cho phép rút ngắn đáng kể thời gian phát triển và thời gian ra thị trƣờng, cũng đồng nghĩa với giảm tổng chi phí phát triển và hạ giá thành sản phẩm.
Năng lƣợng tiêu thụ: Tiêu chí này quan trọng trong các sản phẩm xách tay nhƣ điện thoại di động... Năng lƣợng tiêu thụ thấp tức là thời gian sống của ắcquy kéo dài – mối quan tâm lớn của ngƣời dùng cuối. Năng lƣợng tiêu thụ thấp cũng làm giảm phát xạ nhiệt, điều này có ý nghĩa lớn trong các thiết bị kín vì nhiệt độ trong vỏ kín tăng cao sẽ là nhân tố giảm mật độ kênh hoặc một số chức năng của thiết bị.
Tính mềm dẻo: là khả năng sửa đổi hay tăng thêm chức năng cho thiết bị khi có yêu cầu. Chẳng hạn các thiết bị làm việc theo chuẩn (nhƣ chuẩn truyền thông hay chuẩn nén) đƣợc tung ra thị trƣờng trong khi chuẩn còn đang tạm thời. Nhƣ thế các nhà thiết kế cần tính toán sao cho sản phẩm có khả năng upgrade một cách dễ dàng và nhanh chóng khi chuẩn đã đƣợc phê chuẩn.
Sau đây chúng ta sẽ phân tích các công nghệ với từng tiêu chí kể trên.
1. Công nghệ logic chuẩn
Ƣu điểm của việc sử dụng công nghệ logic chuẩn này là:
- Thực hiện thiết kế đơn giản.
- Chi phí phát triển ứng dụng thấp.
- Thay đổi nhanh xung quanh bản thiết kế.
- Tƣơng đối dễ thử nghiệm các mạch
Nhƣợc điểm:
- Các yêu cầu về kích thƣớc trong bảng mạch lớn.
- Khó tạo đƣợc những mạch ứng dụng phức tạp.
18
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
- Yêu cầu về điện lớn.
- Thiếu tính bảo mật (Các bảng mạch có thể bị sao chép).
- Các yêu cầu về chi phí bổ sung, khoảng trống, điện…cần thiết để chỉnh sửa bản thiết kế
hoặc bổ sung các tính năng khác.
2. Công nghệ ASSP
ASSP (Application-Specific Standard Product): Sản phẩm chuẩn cho ứng dụng xác
định.
Thời gian ra thị trƣờng của ASSP: nếu thị trƣờng đã có và sản phẩm cũng đã sẵn sàng thì tiêu chí này từ tốt cho đến rất tốt. Nếu thị trƣờng mới và còn phải phát triển các đặc điểm mới cho sản phẩm thì tiêu chí này là kém. Thỏa hiệp của cả hai khả năng ấy thì tiêu chí Thời gian ra thị trƣờng của ASSP đƣợc coi là khá.
Giá thành của ASSP đƣợc coi là tốt cho loạt sản phẩm nhỏ, tuy nhiên kém hơn chút ít so
với DSP.
Năng lƣợng tiêu thụ của ASSP đƣợc coi là rất tốt khi nó đƣợc thiết kế tối ƣu cho ứng dụng xác định. Tuy nhiên nếu thay vì Năng lƣợng tiêu thụ mà thiết kế hƣớng đến Giá thành thì tiêu chí này thua DSP.
Dễ phát triển của ASSP đƣợc coi là khá, vì giả thiết một số khó khăn khi thiết kế các đặc điểm riêng biệt làm chậm quá trình phát triển. Tài liệu phát triển chung không tốt vì ASSP định hƣớng cho thiết kế chuyên dụng.
Tính mềm dẻo của ASSP bị coi là kém vì ngay từ đầu ASSP đã định hƣớng cho các sản
phẩm đích xác định.
3. Công nghệ MCU
MCU (Microcontroller): vi điều khiển.
Thời gian ra thị trƣờng của MCU đƣợc coi là rất tốt, cũng nhƣ DSP, RISC. Về xử lý thời gian thực thì mặc dù MCU không thật tốt nhƣng do nó đƣợc phổ biến rất rộng rãi, cũng nhƣ có rất nhiều công cụ và các trang web có giá trị nên MCU đƣợc xếp đứng hàng thứ hai.
Về Năng lực thực hiện MCU đƣợc coi là khá. So với RISC/GPP thì tài nguyên để thực
hiện các phép toán của MCU nhỏ hơn và tần số làm việc cũng chậm hơn.
Giá thành của MCU là rất tốt do nói chung MCU là các chip nhỏ tƣơng đối rẻ và đứng
hàng thứ hai sau ASIC.
Về Năng lƣợng tiêu thụ thì MCU đƣợc đánh giá là khá. MCU tiêu thụ ít năng lƣợng hơn RISC và FPGA do nó sử dụng ít tài nguyên silicon hơn. Tuy nhiên kém DSP, ASSP và bộ xử lý có thể cấu hình.
Tính Dễ phát triển của MCU đƣợc đánh giá là tốt. Khả năng lập trình đƣợc của các chip MCU đang có cho phép phát triển các chức năng theo nhu cầu nhanh hơn đối với ASIC hoặc các chip chuyên dụng cho ứng dụng xác định. Sử dụng đúng ngôn ngữ lập trình bậc cao và/hoặc sử dụng các mô-đun code chuẩn có thể giảm đáng kể, dẫn đến hạ giá thành phát triển.
Về việc hỗ trợ phát triển, hầu hết các nhà cung cấp MCU đều có mạng lƣới giúp đỡ tốt, tuy vậy không đƣợc đánh giá là rất tốt vì nhiều mạng này đơn thuần là các ứng dụng nhúng mà không phải ứng dụng thời gian thực.
19
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Tính mềm dẻo MCU đƣợc đánh giá là rất tốt, tƣơng tự nhƣ các chip có thể lập trình.
4. Công nghệ RISC/GPP
RISC/GPP (Reduced Instruction Set Computer/ General Purpose Processor) - Chip tính
toán có tập lệnh rút gọn/Bộ xử lý mục đích chung.
Thời gian ra thị trƣờng của RISC/GPP đƣợc coi là tốt, cũng nhƣ DSP, các bộ xử lý cấu hình đƣợc và MCU. Đối với xử lý tín hiệu thời gian thực, RISC/GPP đứng hàng thứ ba sau MCU. Tuy nhiên nó không đủ mạnh cho các ứng dụng thời gian thực và không định hƣớng cho các ứng dụng nhúng mà mục tiêu tập trung vào máy tính để bàn.
Năng lực thực hiện của RISC đƣợc coi là tốt. Tần số làm việc cao tăng hiệu suất xử lý tín hiệu. Tuy vậy do không có các lệnh thực hiện phép toán trong một chu kỳ và không có các khối nhân làm việc thực hiện thời gian thực của nó bị giới hạn.
Giá thành của RISC bị coi là khá. Các bộ xử lý RISC tốt với các ứng dụng để bàn,
nhƣng về mặt giá thì chỉ đƣợc coi là khá với xử lý tín hiệu thời gian thực.
Năng lƣợng tiêu thụ của RISC đƣợc đánh giá là khá, xếp dƣới so với DSP, ASSP hay
các bộ xử lý cấu hình lại.
Dễ phát triển của RISC đƣợc đánh giá là tốt. Khả năng lập trình đƣợc của RISC đang có cho phép phát triển các chức năng theo nhu cầu nhanh hơn đối với ASIC hoặc các chip chuyên dụng cho ứng dụng xác định. Sử dụng đúng ngôn ngữ lập trình bậc cao và/hoặc sử dụng các mô-đun code chuẩn có thể giảm đáng kể, dẫn đến hạ giá thành phát triển.
Về giúp đỡ phát triển, có những hỗ trợ chung cho các nhà thiết kế RISC, nhƣng không có những hỗ trợ cho một ứng dụng xác định nào cũng nhƣ không có hỗ trợ về thời gian thực do kiến thức của những nhà cung cấp RISC về các nội dung này không mạnh.
Tính mềm dẻo của RISCđƣợc đánh giá là rất tốt so với thực hiện bằng phần cứng, giống
nhƣ các loại có khả năng lập trình khác.
5. Công nghệ DSP
DSP (Digital Signal Processor): Bộ xử lý tín hiệu số.
Thời gian ra thị trƣờng của DSP đƣợc coi là rất tốt. Các bộ xử lý có thể lập trình nhƣ DSP, RISC và MCU đều có khả năng lập trình bằng phần mềm để có đƣợc các chức năng và đặc điểm khác nhau, tiết kiệm thời gian so với các thực hiện tƣơng tự bằng phần cứng. Trong ba loại kể trên thì thì DSP đƣợc coi là tốt nhất và cũng vì thế mà công cụ và thông tin dành cho DSP cũng nhiều nhất.
Năng lực thực hiện của DSP đƣợc coi là rất tốt. Các DSP có cấu trúc multi-MAC VLIW
nhƣ TMS320C6000 có tốc độ MIPS rất cao.
Về Giá thành DSP đƣợc coi là tốt, không rẻ nhƣ ASIC nhƣng không quá cao so với
MCU.
Năng lƣợng tiêu thụ của DSP đƣợc coi là rất tốt, nhất là với loại DSP đƣợc thiết kế đặc
biệt cho tiêu chí này cho các ứng dụng xách tay nhƣ TMS320C5000.
Tính Dễ phát triển đƣợc đánh giá là rất tốt. Các nhà cung cấp DSP có một mạng lƣới thành phần thứ ba cho mọi lĩnh vực để giúp phát triển DSP, từ các chuyên gia cố vấn cho phần cứng, phần mềm, đến hệ thống.
20
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Cũng vậy, có các công cụ phát triển DSP rất mạnh, dễ sử dụng. Có mạng lƣới hỗ trợ kỹ thuật và các kỹ sƣ am hiểu luôn sẵn sàng giúp đỡ khách hàng đạt đƣợc các thiết kế thời gian thực của mình.
Về giá thành phát triển, khả năng lập trình của DSP cho phép chu kỳ phát triển nhanh hơn so với các chip định hƣớng cho ứng dụng xác định hoặc ASIC. Sử dụng đúng ngôn ngữ lập trình bậc cao kết hợp các mô-đun code chuẩn sẽ rút ngắn đáng kể thời gian phát triển, và nhƣ vậy tiết kiệm giá thành.
Tính mềm dẻo của DSP là rất tốt, nhất là so với các thực hiện tƣơng tự bằng phần cứng. Đối với xử lý tín hiệu thời gian thực, có nhiều công cụ tốt và thích đáng nhất cũng nhƣ có nhiều trang web có giá trị dành cho DSP hơn so với RISC và MCU.
6. Công nghệ Configurable Processor
Configurable Processor: Bộ xử lý có khả năng cấu hình.
Thời gian ra thị trƣờng bị coi là kém, nhƣng Năng lực thực hiện lại đƣợc đánh giá là rất
tốt do có thể cấu hình đặc biệt cho ứng dụng xác định.
Về Giá thành và Năng lƣợng tiêu thụ đƣợc coi là tốt. Về tính Dễ phát triển thì kém.
Tính mềm dẻo đƣợc đánh giá là khá: có thể thay đổi cấu hình để có đƣợc đặc điểm mới, tuy nhiên do định hƣớng cho ứng dụng xác định nên sau khi đã đƣa ra vào sử dụng thì tính mềm dẻo trở nên kém.
7. Công nghệ FPGA
FPGA (Field Programmable Gate Array): mảng cổng có thể lập trình theo yêu cầu.
Thời gian ra thị trƣờng của FPGA đƣợc đánh giá là tốt. Có thể modify các trƣờng của FPGA để đƣợc các chức năng khác nhau, nhƣng không mềm dẻo nhƣ lập trình bằng phần mềm của DSP, MCU và RISC trong góc độ đƣa ra thị trƣờng. Tuy nhiên FPGA đƣợc hỗ trợ tốt hơn và chu kỳ thời gian nhanh hơn ASSP, các bộ xử lý có thể cấu hình và ASIC và nhƣ thế có thể coi tiêu chí Thời gian ra thị trƣờng của FPGA tốt hơn.
Năng lực thực hiện của FPGA đƣợc đánh giá là rất tốt vì các nhà phát triển có thể vi
chỉnh đến các cổng hardware của FPGA cho sát với ứng dụng.
Về Giá thành thì FPGA bị coi là kém, đắt hơn nhiều so với 6 loại còn lại.
Về Năng lƣợng tiêu thụ cũng bị đánh giá là kém nhất so với các loại khác do đặc điểm của công nghệ FPGA và do các cổng không dùng đến tiêu thụ năng lƣợng quá mức. Công nghệ mới ngày nay đã giảm năng lƣợng tiêu thụ của FPGA nhƣng dƣờng nhƣ vẫn chƣa đủ để xếp FPGA vào hàng ngũ các loại hiệu quả về Năng lƣợng tiêu thụ.
Về Dễ phát triển, FPGA đƣợc coi là rất tốt. Giá phát triển sẽ là tốt nhất với giả thiết 2 điều kiện: 1) công cụ lập trình FPGA không quá đắt; và 2) các nhà phát triển căn bản phải thông thạo phần cứng. Nếu các nhà phát triển là các kỹ sƣ thiên về phần mềm thì phải nỗ lực nhiều và tăng giá thành.
Về hỗ trợ cho phát triển thì các công cụ và cấu trúc cho thiết kế FPGA khá tốt và có khả
năng chấp nhận OEM.
Tính mềm dẻo của FPGA đƣợc coi là tốt. Nó có thể đƣợc cấu hình lại để tăng thêm hoặc thay đổi đặc điểm. Tuy nhiên lập trình lại phần cứng khó hơn và các chức năng thêm cũng hạn chế hơn so với các giải pháp lập trình phần mềm nhƣ DSP.
21
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
1.4 QUY TRÌNH THIẾT KẾ VI ĐIỆN TỬ
Nhƣ đã trình bày ở trên, Thiết kế vi điện tử bao gồm là quá trình thiết kế những thành phần tạo lên mạch điện tử nhƣ: Linh kiện cơ bản Transistor, tụ điện, điện trở, diode, Mạch tích hợp (IC), IP core... Hiện nay các thiết kế vi điện tử chủ yếu đƣợc thực hiện ở mức thiết kế layout, ASIC, hệ thống VLSI, Cấu hình phần cứng cho PLD... Quá trình thiết kế có thể đƣợc thực hiện tự động bởi phần mềm EDA (Electronic Design Automation - Tự động thiết kế điện tử). Một số phần mềm EDA nổi tiếng nhƣ MentorGraphic, Cadence, ADS, ISE...
Quy trình thiết kế vi điện tử nói chung đƣợc bắt đầu từ việc xác định chỉ tiêu kỹ thuật của chíp và trải qua một loạt các bƣớc để đi đến cuối cùng là tạo ra bản thiết kế vật lý cho phép sản xuất và đóng gói chíp (Thực hiện chíp). Quy trình thiết kế vi điện tử cho một Chíp số gồm có các bƣớc cơ bản sau:
1. Design Idea (Ý tưởng thiết kế)
Xây dựng ý tƣởng và mô hình hệ thống, các yêu cầu của hệ thống trong ứng dụng. Xây
dựng ý tƣởng thiết kế, mô hình thiết kế.
2. Behavioral Design (Thiết kế chức năng)
Thiết kế hệ thống ở mức chức năng hoạt động của hệ thống, kết quả của quá trình này có thể là các Flow Graph, Flow chart, hay các Pseudocode,... Trong giai đoạn này chúng ta chỉ xác định các chức năng chung của hệ thống, các lối vào và lối ra. Chƣa xây dựng kiến trúc cụ thể hay các khối chức năng cụ thể của hệ thống.
3. Data Path Design (Thiết kế cấu trúc đường dữ liệu)
Xây dựng kiến trúc của hệ thống theo mô hình RTL (Register-Transfer Level) gồm cấu trúc Bus, Cấu trúc thanh ghi, Các khối lôgic cần thiết, các thủ tục điều khiển Bus để thực hiện truyền thông giữa các khối trong hệ thống, cũng nhƣ kiến trúc tập lệnh. Các thành phần đƣợc xây dựng trong bƣớc này nhƣ sau:
o Bộ thanh ghi và hàm chuyển đổi (Mô hình đƣờng dữ liệu Data Path)
22
o Máy trạng thái (Xây dựng bộ điều khiển theo Mô hình FSM)
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
o Tập các kết nối giữa các khối chức năng (Mô hình kết nối cấu trúc)
o Kiến trúc tập lệnh điều khiển hoạt động của của hệ thống.
4. Logic Design (Thiết kế mạch logic)
Tạo ra Gate Wirelist, Netlist,...
Trong giai đoạn này chúng ta sử dụng các cấu trúc logic cơ bản, các flip-flop để xây dựng các thanh ghi dữ liệu, bus, các khối logic và các mạch điều khiển các khối đó. Kết quả cuối cùng là chúng ta thu đƣợc một netlist gồm các gate và flip-flop cơ bản. Phần này chƣa đề cập đến công nghệ chế tạo gate và các vấn đề khác liên quan đến gate.
5. Physical Design (Thiết kế mạch mức vật lý)
Tạo ra Transistor List, Layout,...
Trong khâu này, chúng ta thay thế các gate và các flip-flop bằng các transistor tƣơng đƣơng hoặc các cell trong thƣ viện cấu trúc linh kiện trong phần mềm thiết kế. Bên cạnh đó chúng ta phải xét đến các vấn đề về loading và timing trong quá trình chọn lựa Transistor. Bản thiết kế layout cho phép chuyển sang khâu sản xuất để chế tạo hệ thống số (chíp số). Đó có thể là bản thiết kế cấu hình để cấu hình các Chíp FPGA (công nghệ FPGA) hay tạo ra một IC mask để đặt lên một wafer (công nghệ ASIC hay hệ thống VLSI).
1.5. VAI TRÕ CỦA THIẾT KẾ VI ĐIỆN TỬ SỬ DỤNG HDL
Ngày nay, các mạch tích hợp có mật độ ngày càng lớn và ngày càng thực hiện đƣợc nhiều chức năng, hệ thống điện tử nói chung, hệ thống số nói riêng ngày trở lên phức tạp. Do đó, vấn đề thiết kế mạch càng trở nên phức tạp. Để thực hiện đƣợc các bƣớc thiết kế từ 1 đến 4 nhƣ trong quy trình thiết kế Chip số ở trên, những phƣơng pháp truyền thống nhƣ dùng phƣơng pháp tối thiểu hoá hàm Boolean hay dùng sơ đồ các phần tử không còn đáp ứng đƣợc các yêu cầu đặt ra khi thiết kế. Nhƣợc điểm lớn nhất của các phƣơng pháp này là chúng chỉ mô tả đƣợc hệ thống dƣới dạng mạng nối các phần tử với nhau. Ngƣời thiết kế cần phải đi qua hai bƣớc thực hiện hoàn toàn thủ công: đó là chuyển từ các yêu cầu về chức năng của hệ thống sang biểu diễn theo dạng hàm Boolean, sau các bƣớc tối thiểu hoá hàm này ta lại phải chuyển từ hàm Boolean sang sơ đồ mạch của hệ thống.
Cũng tƣơng tự khi phân tích một hệ thống ngƣời phân tích cần phải phân tích sơ đồ mạch của hệ thống, rồi chuyển nó thành các hàm Boolean, sau đó mới lập lại các chức năng, hoạt động của hệ thống. Tất cả các bƣớc nói trên hoàn toàn phải thực hiện thủ công không có bất kỳ sự trợ giúp nào của máy tính. Ngƣời thiết kế chỉ có thể sử dụng máy tính làm công cụ hỗ trợ trong việc vẽ sơ đồ mạch của hệ thống và chuyển từ sơ đồ mạch sang công cụ tổng hợp mạch logic cũng nhƣ mạch vật lý dùng các công cụ tổng hợp “Synthesis”.
Một nhƣợc điểm khác nữa của phƣơng pháp thiết kế truyền thống là sự giới hạn về độ phức tạp của hệ thống đƣợc thiết kế. Phƣơng pháp dùng hàm Boolean chỉ có thể dùng để thiết kế hệ thống lớn nhất biểu diễn bởi vài trăm hàm. Còn phƣơng pháp dựa trên sơ đồ chỉ có thể dùng để thiết kế hệ thống lớn nhất chứa khoảng vài nghìn phần tử.
23
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Mô tả yêu cầu chức năng mạch số
Mô tả bằng hàm Boolean
Mô tả bằng HDL
Sơ đồ mạch nguyên lý (Schematic)
Tổng hợp thành mạch số
Hình 1.5 – Quy trình thiết kế truyền thống và thiết kế dùng HDL
Nhờ sự trợ giúp đắc lực của máy tính, phƣơng pháp thiết kế, thử nghiệm, phân tích các hệ thống số sử dụng các ngôn ngữ mô tả phần cứng nổi bật lên với các ƣu điểm hơn hẳn và sẽ dần thay thế các phƣơng pháp truyền thống. Sự ra đời của ngôn ngữ mô phỏng phần cứng HDL (Hardware Description Language) đã giải quyết đƣợc rất nhiều nhƣợc điểm lớn của các phƣơng pháp thiết kế trƣớc đây: Nếu các phƣơng pháp cũ đòi hỏi phải chuyển đổi từ mô tả hệ thống (các chỉ tiêu về chức năng) sang tập hợp các hàm logic bằng tay thì bƣớc chuyển đó hoàn toàn không cần thiết khi dùng HDL. Hầu hết các công cụ thiết kế dùng ngôn ngữ mô phỏng phần cứng đều cho phép sử dụng đồ hình trạng thái cho các hệ thống tuần tự cũng nhƣ cho phép sử dụng bảng chân lý cho hệ thống mạch tổ hợp. Việc chuyển đổi từ các biểu đồ trạng thái, hay bảng chân lý sang mã ngôn ngữ mô phỏng phần cứng đƣợc thực hiện hoàn toàn tự động nhờ phần mềm thiết kế trên máy tính. So sánh hai quy trình thiết kế truyền thống và thiết kế dùng HDL nhƣ Hình 1.5.
Nhờ tính dễ kiểm tra thử nghiệm hệ thống trong suốt quá trình thiết kế dùng HDL mà ngƣời thiết kế có thể dễ dàng phát hiện các lỗi thiết kế ngay từ những giai đoạn đầu, giai đoạn chƣa đƣa vào sản xuất thử, do đó tiết kiệm đƣợc lƣợng chi phí đáng kể bởi từ ý tƣởng thiết kế đến tạo ra sản phẩm đúng nhƣ mong muốn là một việc rất khó tránh khỏi những khó khăn, thất bại.
Khi mọi lĩnh vực của khoa học đều phát triển không ngừng thì sự phức tạp của hệ thống điện tử cũng ngày một tăng theo và gần nhƣ không thể tiến hành thiết kế thủ công mà không có sự trợ giúp của các loại máy tính hiện đại. Ngày nay, ngôn ngữ mô tả phần cứng HDL đƣợc dùng nhiều để thiết kế vi điện tử từ các thiết bị logic khả trình PLD loại đơn giản đến các loại phức tạp nhƣ FPGA, cũng nhƣ thiết kế hệ thống VLSI.
24
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Mạch nguyên lý mạch FullAdder
-- Mã VHDL mô tả cấu trúc, hoạt động của mạch FullAdder
ENTITY FullAdder IS
PORT (Ai, Bi, Ci1: IN BIT;
Si, Ci: OUT BIT);
END FullAdder;
ARCHITECTURE dataflow OF FullAdder IS
BEGIN
Si<= Ai XOR Bi XOR Ci1;
Mạch số FullAdder
Ci<=(Ai AND Bi) OR (Ai AND
Ci1) OR (Bi AND Ci1);
END dataflow;
Hình 1.6 –Mô tả mạch nguyên lý và mô tả VHDL cho mạch Cộng toàn tổng (FullAdder)
Trong quá trình thiết kế có sự trợ giúp của máy tính, bƣớc nhập thiết kế là bƣớc quan trọng và tốn nhiều công sức nhất, nó quyết định phần lớn đến kết quả của công việc thiết kế. Các công cụ thiết kế hỗ trợ nhiều phƣơng pháp nhập thiết kế khác nhau, tuy nhiên phƣơng pháp nhập thiết kế dùng ngôn ngữ mô tả phần cứng HDL là ƣu việt hơn cả và đƣợc sử dụng chủ yếu trong quá trình thiết kế số nói chung và thiết kế cho CPLD/FPGA nói riêng. Hiện nay có nhiều ngôn ngữ HDL đƣợc sử dụng (nhƣ VHDL, VERILOG, ABEL…), tuy nhiên trong tài liệu này chỉ giới thiệu phƣơng pháp thiết kế dùng ngôn ngữ VHDL và giới thiệu những đặc điểm của VHDL khiến nó đƣợc trở thành một ngôn ngữ HDL không những đƣợc giảng dạy và sử dụng ở nhiều trƣờng đại học trên thế giới mà còn đƣợc sử dụng bởi hãng điện tử lớn.
Tóm lại ngƣời sử dụng có thể dùng VHDL để mô tả cấu trúc và hoạt động của một mạch số, sau đó mã VHDL này có thể dùng để mô phỏng hoạt động của mạch số trên máy tính, hay đƣợc tổng hợp thành file netlist rồi đƣợc ánh xạ đến một phần cứng thực dùng công nghệ logic số nào đó để thực hiện mạch số nhƣ đã mô tả. Ví dụ mô tả VHDL cho mạch cộng toàn tổng nhƣ Hình 1.6.
1.6 LƢU ĐỒ THIẾT KẾ VI ĐIỆN TỬ DÙNG HDL
Thiết kế vi điện tử là quá trình phức tạp, gồm nhiều bƣớc cho phép biến những ý tƣởng thiết kế thành bản thiết kế layout cho cấu trúc của Chíp cho phép thực hiện sản xuất và đóng gói Chíp theo bản thiết kế đó. Hiện nay các thiết kế vi điện từ chủ yếu đƣợc thực hiện trên các phần mềm EDA sử dụng ngôn ngữ mô tả phần cứng HDL. Lƣu đồ thiết kế của chúng cũng thay đổi so với lƣu đồ thiết kế truyền thống. Nhiều công đoạn thiết kế đƣợc thực hiện tự động trên phần mềm. Lƣu đồ thiết kế vi điện tử dùng VHDL điển hình nhƣ Hình 1.7, trong đó gồm các công đoạn chính nhƣ sau:
25
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
- Thiết kế logic
- Tổng hợp thiết kế (Synthesis)
- Thiết kế mức vật lý (Physical Design)
- Kiểm tra thiết kế (Verification)
1.6.1. Thiết kế logic
Từ ý tƣởng thiết kế (các chỉ tiêu kỹ thuật, tính năng, tham số, … của hệ thống), ngƣời thiết kế thực hiện phân tích thiết kế và thực hiện các bƣớc thiết kế ở các mức khác nhau kiến trúc hệ thống, chức năng hoạt động, cấu trúc đƣờng dữ liệu, cũng nhƣ nhƣ cấu trúc logic của hệ thống,… và từ đó sử dụng ngôn ngữ HDL để mô tả lại thiết kế ở các mức độ trừu tƣợng cao. Kết quả của bƣớc thiết kế logic là file mô tả HDL có thể tổng hợp cho hệ thống. Trong bài giảng này sẽ tập chung chủ yếu bƣớc thiết kế logic dùng HDL này.
1.6.2. Tổng hợp thiết kế (Synthesis)
Đây là bƣớc mô tả hệ thống cấu trúc hệ thống ở mức độ trừu tƣợng thấp. Kết quả bƣớc này là các file netlist mô tả cấu trúc của hệ thống ở mức cổng dƣới dạng các cấu trúc logic cơ bản (cổng logic cơ bản, Flop-Flops,…), bƣớc tổng hợp thƣờng đƣợc thực hiện tự động bằng các công cụ tổng hợp của các phần mềm EDA từ các mô tả HDL của hệ thống ở mức trừu tƣợng cao nhƣ mô hình hoạt động, mô hình RTL,… Để dễ dàng cho quá trình thực hiện và quản lý, bƣớc tổng hợp thiết kế còn đƣợc chia thành các bƣớc nhỏ nhƣ:
+ Tổng hợp mức cao: biến đổi các mô tả ở mức giả thuật, hệ thống, hành vi thành mô tả mức truyền đạt thanh ghi RTL. Do sự biến đổi phức tạp nên bƣớc này nên chỉ giới hạn ở những giải thuật đơn giản và có phạm vi ứng dụng nhất định.
+ Tổng hợp mức truyền đạt thanh ghi RTL: Phân tích các mô tả chức năng hoạt động ở mức RTL, tìm và thay thế những cấu trúc mức RTL để thực hiện chức năng hoạt động đó. Bƣớc này cũng nên thực hiện với mức độ tối ƣu hạn chế để giảm số lƣợng các cấu trúc đƣợc sử dụng.
+ Tổng hợp mức cổng: Tƣơng tự tổng hợp mức RTL, nhƣng các cấu trúc cổng đƣợc lựa chọn để thực hiện các mô tả chức năng hoạt động ở mức RTL. Sau khi mạch đã đƣợc tổng hợp, có thể cần thiết thƣc hiện bƣớc tối ƣu ở nhiều cấp độ khác nhau dê tối thiểu hóa kích thƣớc của mạch cũng nhƣ để phù hợp với những ràng buộc về định thời. Các cấu trúc cơ bản đƣợc sử dụng cho tổng hợp mức cổng nên kết quả của nó độc lập với công nghệ thực hiện mạch. Thông thƣờng đây là bƣớc cuối cùng của quá trình tổng hợp.
+ Ánh xạ theo công nghệ logic số: Để tối ƣu cho bƣớc tổng hợp thiết kế, bƣớc này có thể đƣợc thực hiện thêm vào để chuyển những mô tả hệ thống ở mức cổng cơ bản sang sử dụng những phần tử, cấu trúc cơ bản đã đƣợc thiết kế trƣớc ứng với công nghệ logic thực hiện mạch số, nhƣ vậy kết quả của bƣớc tổng hợp phụ thuộc vào công nghệ thực hiện mạch.
1.6.3. Thiết kế mức vật lý (Physical Design)
Thiết kế mức vật lý gồm 2 phần chính: Phần thứ nhất là quá trình sàn lọc giữa mô hình cấu trúc và mô hình vật lý đẻ tạo ra layout cho netlist. Bƣớc thứ 2 là phân tích và điều chỉnh các đặc tính điện cảu mạch. Nhƣ vậy thiết kế mức logic gồm có các nhiệm vụ :Phân vùng (Floor planning), Đặt (Placement), Định tuyến (Routing), Rút gọn mạch (Circuit Extraction).
26
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
Logic Design
Synthesis
Physical Design
Verification
Ý tƣởng thiết kế
Thiết kế logic
Testbench
Mô tả HDL
Tổng hợp thiết kế
Mô phỏng chức năng
nestlist
Thiết kế vật lý
Mô phỏng sau tổng hợp
Layout file
Sản xuất và đóng gói
Mô phỏng và phân tích định thời
Testing
Hình 1.7 – Lƣu đồ thiết kế Vi điện tử dùng HDL
+ Phân vùng (Floor planning): tạo ra layout mức RTL và hệ thống. Hệ thống đƣợc phân chia thành các khối chức năng và đặt chúng vào các vị trị phù hợp để thuận lợi cho việc định tuyến sau này và đạt mục tiêu định thời nhất định.
+ Đặt và Định tuyến ((Placement and Routing) : tạo ra layout ở mức cổng, bao gồm các
vị trí của cổng cũng nhƣ định tuyến cho các đƣờng kết nối giữa chúng.
+ Rút gọn mạch (Circuit Extraction): Thực hiện rút gọn chiều dài, vị trí của mỗi kết nối
xác định, và tính toán các tham số điện dung, điện cảm ký sinh…
1.6.4. Kiểm tra thiết kế (Verification)
Bƣớc này đƣợc thực hiện để xác định xem các thiết kế ở các mức có thỏa mãn các mục tiêu thiết kế hay không. Bƣớc này đƣợc thực hiện bằng mô phỏng ở các giai đoạn khác nhau
27
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
gồm: Mô phỏng chức năng (thực hiện trƣớc khi tổng hợp), mô phỏng sau tổng hợp, mô phỏng và phân tích định thời (thực hiện sau bƣớc thiết kế mức vật lý).
1.6.5 Sản xuất và đóng gói
Đây là quá trình đƣa các thiết kế vật lý vào chíp. Đó là quá trình nạp cấu hình cho chip trong công nghệ PLD, hay tạo các mặt lạ (IC mask) để xác định các khoảng không gian trên tấm wafer mà vùng đó đƣợc lắng đọng, khuếch tán, hay loại bỏ để tạo ra các lớp bán dẫn, điện cực đƣợc sắp xếp phù hợp theo bản thiết kết vật lý để tạo ra cấu trúc bán dẫn của hệ thống. Sau đó các wafer đƣợc cặt thành các chip riêng rẽ. Mỗi chip đƣợc đóng gọi và kiểm tra (Testing) để đảm bảo ràng chúng thỏa mãn các chỉ tiêu kỹ thuật thiết kế cũng nhƣ hoạt động đúng với chức năng thiết kế.
1.7 CÁC PHẦN MỀM EDA HỖ TRỢ THIẾT KẾ LOGIC SỐ DÙNG HDL
Phần mềm EDA Hãng sản
Ngôn ngữ HDL hỗ trợ
Công nghệ logic số hỗ trợ CPLD,FPGA FPGA,ASIC
VHDL,Verilog, EDIF VHDL,Verilog,SystemC,system verilog,EDIF
VHDL,VerilogHDL,systemverilog CPLD,FPGA , ASIC
Libero IDE Active-HDL Quartus HDL Planner Altium Designer
xuất Actel Aldec Altera Almel Altium Cadence
VHDL,Verilog VHDL,Verilog VHDL,Verilog,system verilog
FPSLIC,FPGA CPLD,FPGA CPLD,FPGA
Allegro FPGA System Planner XL Leonardo Spectrum ISPLEVER Quickworks Synplify pro
Mentor Graphic Lattice Quicklogic Synplicity
ISE Design Suite Labview
Xilinx NI
system verilog,VHDL, verilog VHDL,Verilog VHDL,Verilog VHDL,Verilog, system verilog,systemC VHDL, Verilog Albel VHDL, Verilog
CPLD,FPGA CPLD,FPGA CPLD,FPGA CPLD, FPGA CPLD,FPGA,PLDs CPLD, FPGA CPLD, FPGA
28
Chương 1 – Giới thiệu chung về thiết kế hệ thống số
29
Chương 2 – Cấu kiện logic khả trình (PLD)
CHƢƠNG 2 – CẤU KIỆN LOGIC KHẢ TRÌNH (PLD).
Giới thiệu chung về công nghệ logic khả trình (PLD).
Giới thiệu phƣơng pháp thiết lập cấu hình cho CPLD/FPGA.
Yêu cầu chung khi thiết kế với CPLD/FPGA.
Lƣu đồ thiết kế cho CPLD/FPGA.
2.1. GIỚI THIỆU CHUNG VỀ CÔNG NGHỆ LOGIC KHẢ TRÌNH (PLD)
Vào cuối thập kỷ 70, các thiết bị logic chuẩn xuất hiện ồ ạt, đi kèm với đó là sự xuất hiện mạch in. Ngƣời ta đặt ra câu hỏi: “Chuyện gì xảy ra nếu ngƣời thiết kế có thể thực hiện các kết nối khác nhau trong một thiết bị lớn hơn?” Điều này cho phép ngƣời thiết kế tích hợp nhiều thiết bị logic chuẩn trong một linh kiện. Để có thiết kế linh hoạt nhất, nhà sản xuất Ron Cline từ Signetics (sau này đƣợc Philips và thậm chí cả Xilinx) đƣa ra ý tƣởng dùng hai ma trận kết nối khả trình. Hai ma trận kết nối khả trình này có thể tổ hợp tuỳ ý giữa các cổng AND và cổng OR, đồng thời cho phép nhiều cổng OR cùng sử dụng chung một cổng AND. Kiến trúc này rất linh hoạt, nhƣng tại thời điểm đó, trễ lan truyền từ đầu vào tới đầu ra (Tpd) khá cao (do cấu trúc 10µm) nên thiết bị hoạt động tƣơng đối chậm. Và dạng công nghệ logic khả trình đầu tiên xuất hiện chính là SPLD. Sau này công nghệ CPLD và FPGA ra đời có mật độ tích hợp cao hơn, cấu trúc linh hoạt hơn cho phép tạo ra nhiều mạch logic phức tạp hơn
Vi mạch lập trình, viết tắt là PLD (Programmable Logic Device), là loại cấu kiện điện tử có nhiều ƣu điểm và hiện nay đang đƣợc phát triển rất mạnh. Về nguyên lý, chúng có cấu tạo rất giống với PROM. Việc lập trình cho PLD có thể đƣợc thực hiện bằng các công nghệ khác nhau, dựa trên cơ sở bẻ cầu chì hoặc chuyển mạch. Tuy nhiên, ứng dụng của PLD lại rất khác với PROM. Một PLD, đƣợc tạo thành bằng một số cổng AND, OR, XOR hoặc cả các Flip-Flop, có thể thực hiện nhiều hàm Boole khác nhau.
2.1.1. SPLD
SPLD - cấu kiện logic khả trình đơn giản. Đây là loại cấu kiện số có nhiều ƣu điểm và cũng đã đƣợc phát triển rất mạnh. Về nguyên lý, chúng có cấu tạo rất giống với PROM. Việc lập trình cho SPLD có thể đƣợc thực hiện bằng các công nghệ khác nhau, dựa trên cơ sở thực hiện các kết nối bằng cách sử dụng cầu chì hoặc chuyển mạch. Một SPLD, đƣợc tạo thành bằng một số mảng cổng AND, OR, XOR hoặc cả các trigơ, có thể thực hiện nhiều hàm Boole khác nhau.
Các SPLD đều có cấu tạo dựa trên một trong hai dạng cấu trúc chính: mảng logic khả trình PLA (Programmable Logic Array) và logic mảng khả trình PAL (Programmable Array Logic).
30
Chương 2 – Cấu kiện logic khả trình (PLD)
Đầu vào
Đầu ra
Điểm kết nối khả trình
Hình 2.1 - Kiến trúc PAL
Thành phần cơ bản của PLA là một mảng AND và một mảng OR lập trình đƣợc. Mỗi mảng AND, OR gồm các hàng và các cột liên kết với nhau. Tại mỗi điểm giao giữa hàng và cột, có một cầu chì. Khi cầu chì đóng, tại điểm đó có kết nối giữa hàng và cột, khi cầu chì ngắt, tại đó không có kết nối. Việc đóng ngắt cầu chì đƣợc thực hiện bằng phần mềm (do lập trình viên hoặc sử dụng công cụ lập trình trên hệ thống (ISP: In- System Programming).
Cấu trúc PLA tạo ra sự tổ hợp tùy ý giữa các cổng AND và OR, cho mật độ logic cao nhƣng tốc độ chậm, số lƣợng cầu chì lớn. Vì vậy, sau này ngƣời ta đã đƣa ra một kiểu kiến trúc khác là logic mảng khả trình PAL (Programmable Array Logic).
xuất
Công
nghệ PLD
công
hiện
sớm
các
với
rất
ty
nhƣ từ Xilinx – sản xuất vi mạch CMOS công suất cực thấp dựa trên công nghệ Flash. PLD dựa trên công nghệ Flash cho phép lập trình và xoá vi mạch nhiều lần bằng điện, nhờ đó tiết kiệm đƣợc thời gian so với xoá vi mạch bằng tia cực tím.
Ví dụ việc lập trình ma trận kết nối cho PLA tạo ra mạch logic thực hiện các hàm F0,
F1, F2, F3 nhƣ Hình 2.3:
31
Chương 2 – Cấu kiện logic khả trình (PLD)
Đầu vào
Điểm kết nối khả trình
Điểm kết nối khả trình
Đầu ra
Hình 2.2 - Kiến trúc PLA
Hình 2.3 - Thực hiện mạch logic dùng PLA
32
Chương 2 – Cấu kiện logic khả trình (PLD)
2.1.2. CPLD (Complex PLD)
CPLD thuộc về dòng chip khả lập trình PLD nhƣng thiết bị logic khả trình phức hợp (CPLD) có mật độ logic cao hơn so với các PLD đơn giản nhƣ đã xét ở trên (PLA và PAL). CPLD bao gồm nhiều mạch logic, mỗi mạch có thể coi là một SPLD. Trong một mạch đơn chỉ thực hiện các chức năng logic đơn giản. Các chức năng logic phức tạp hơn cần số lƣợng khối nhiều hơn, sử dụng ma trận liên kết chung giữa các khối để tạo kết nối. CPLD thƣờng dùng để điều khiển ghép cổng phức hợp ở tốc độ rất cao (5ns, tƣơng đƣơng với 200MHz). Kiến trúc cơ bản của CPLD đƣợc minh hoạ trong Hình 2.4.
Hình 2.4 - Kiến trúc chung của CPLD
CPLD có cấu trúc đồng nhất gồm nhiều khối chức năng "Function Block" đƣợc kết nối với nhau thông qua một ma trận kết nối trung tâm "Interconnect Array". Mỗi khối chức năng gồm có một khối logic (logic block) - gồm các hạng tích AND và hạng tổng OR sắp xếp giống nhƣ PLA hoặc PAL, cho phép thực hiện các hàm logic tổ hợp và nhiều khối MC (Macrocell) có chứa tài nguyên là các Trigơ cho phép xây dựng mạch số tuần tự nhƣ các thanh ghi và mạch tuần tự... Phần lõi bên trong của CPLD đƣợc nối ra bên ngoài thông qua các khối vào/ra I/O cho phép thiết lập chức năng cho các chân của IC có chức năng vào hoặc ra hoặc vừa là chân vào vừa là chân ra, ngoài ra còn có thể thiết lập các chân I/O này làm việc ở các mức logic khác nhau, có điện trở pull-up hoặc pull-down...
Với cấu trúc đồng nhất, giá thành rẻ, tính năng khá mạnh, dễ sử dụng CPLD đã và đang đƣợc sử dụng rất rộng rãi trong thực tế, giúp cho nhà sản xuất phát triển nhanh sản phẩm của mình với giá thành rẻ. Đặc biệt hiện nay các hãng đã phát triển các họ CPLD với tính năng rất mạnh, công suất tiêu thụ thấp, chúng đang đƣợc sử dụng rất nhiều để phát triển các sản phẩm điện tử, viễn thông, công nghệ thông tin, nhất là trong các thiết bị cầm tay, di động…
Trong thực tế rất có nhiều loại CPLD khác nhau, của các hãng khác nhau và đã đƣợc phát triển với nhiều chủng loại, thế hệ CPLD khác nhau. Cấu tạo, dung lƣợng, tính năng, đặc điểm, ứng dụng… của mỗi loại CPLD cũng rất khác nhau. Trong giáo trình này không đi sâu trình bày cấu tạo cụ thể của các họ CPLD, mà chỉ trình bày kiến trúc chung đơn giản nhất của CPLD. Khi sử dụng cụ thể loại CPLD nào, ngƣời học nên tham khảo các tài liệu khác, nhất là tham khảo các tài liệu kỹ thuật đƣợc cung cấp kèm theo cấu kiện do các hãng đƣa ra. Các hãng điện tử nổi tiếng trên thế giới đang sở hữu, phát triển, cung cấp các loại cấu kiện CPLD là Xilinx, Altera…
33
Chương 2 – Cấu kiện logic khả trình (PLD)
2.1.3. FPGA
Hình 2.5 - Kiến trúc chung của FPGA
FPGA (Field Programmable Gate Array - Ma trận cổng lập trình đƣợc theo trƣờng): có cấu trúc và hoạt động phức tạp hơn CPLD. Nó có thể thực hiện những chức năng phức tạp ƣu việt hơn CPLD. Năm 1985, công ty Xilinx đƣa ra ý tƣởng hoàn toàn mới, đó là kết hợp thời gian hoàn thành sản phẩm và khả năng điều khiển đƣợc của PLD với mật độ và ƣu thế về chi phí của GateArray. Từ đó, FPGA ra đời. Hiện nay, Xilinx vẫn là nhà sản xuất chip FPGA số một trên thế giới.
Cấu trúc FPGA đơn giản gồm các tế bào logic (Logic Cell hay logic Block), các khối cách đều nhau, liên kết nhờ các đƣờng kết nối có thể thay đổi đƣợc theo yêu cầu của ngƣời thiết kế. Nghĩa là ngƣời thiết kế có quyền thiết kế, lập trình và thay đổi mạch điện. Hiện nay, FPGA có mật độ khá cao, lên tới hàng trăm tỷ cổng và cấu trúc cũng đa dạng, phức tạp hơn. Nhiều chức năng phức tạp đã đƣợc tích hợp sẵn để tăng hiệu quả sử dụng FPGA. Ví dụ nhƣ ngoài những tế bào logic, nhiều họ FPGA đã đƣợc tích hợp thêm các khối chức năng khác nhƣ các bộ nhân cứng, khối nhớ, PLL, thậm chí cả một bộ vi xử lý mạnh…
Có hai loại FPGA cơ bản: Loại lập trình lại đƣợc, dựa trên công nghệ SRAM và loại lập
trình một lần.
Loại lập trình lại được (dựa trên SRAM):
- SRAM xác định các kết nối
-
SRAM
định
nghĩa
các
hàm
logic
trong
bảng
ánh
xạ
(LUT - Look Up Table).
Loại lập trình một lần:
- Kết nối dạng bẻ cầu chì
- Sử dụng các cổng logic truyền thống
34
Chương 2 – Cấu kiện logic khả trình (PLD)
Hình 2.6 Cấu trúc của tế bàologic đơn giản
Hai dạng này khác nhau về quy trình thực hiện tế bào logic và cơ chế đƣợc sử dụng để
tạo kết nối trong thiết bị.
Chip FPGA lập trình một lần sử dụng phƣơng pháp bẻ cầu chì (kết nối đƣợc tạo ra bằng cách đóng cầu chì) để tạo kết nối tạm thời trong chip, do đó không cần SPROM hoặc các phƣơng tiện khác để nạp chƣơng trình vào FPGA. Tuy nhiên, mỗi lần thay đổi thiết kế, phải bỏ hoàn toàn chip cũ đi. Tế bào logic OTP tƣơng tự nhƣ PLD với các cổng và các trigơ định trƣớc.
Dạng FPGA quan trọng hơn và đƣợc dùng phổ biến hơn cả là dạng lập trình lại đƣợc, dựa trên SRAM. Trên thực tế, FPGA SRAM đƣợc lập trình lại mỗi khi bật nguồn, vì FPGA là dạng chip nhớ tạm thời. Do đó, mỗi chip FPGA đều cần có một bộ nhớ PROM nối tiếp hoặc một bộ nhớ hệ thống.
Trong tế bào logic SRAM, thay vì các cổng thông thƣờng, ngƣời ta sử dụng bảng ánh xạ (LUT). Bảng này xác định các giá trị đầu ra dựa trên các giá trị đầu vào, sử dụng để xây dựng các hàm logic tổ hợp. Trong sơ đồ “Tế bào logic SRAM” minh hoạ ở Hình 2.6, 16 tổ hợp khác nhau của 4 đầu vào sẽ xác định giá trị của đầu ra). Các ô nhớ SRAM cũng đƣợc sử dụng để điều khiển kết nối.
Bảng 2.1 - So sánh giữa CPLD và FPGA
CPLD
FPGA
- Cấu trúc theo mảng các hạng tích
- Cấu trúc dựa vào LUT
- Mảng kết nối trung tâm
- Ma trận kết nối 2 chiều X-Y
- Mật độ tích hợp trung bình
- Mật độ tích hợp cao
- Tỷ lệ số chân I/O trên microcell nhỏ
- Tỷ lệ số chân I/O trên microcell lớn
35
Chương 2 – Cấu kiện logic khả trình (PLD)
- Cấu hình đƣợc lƣu lại khi mất điện và không thay đổi trong quá trình hoạt động
- Cấu hình nạp vào SRAM, khi mất điện sẽ không còn, cần có bộ nhớ cấu hình PROM, cấu hình có thể đƣợc nạp tự động trong quá trình hoạt động.
- Cấu trúc đồng nhất
– Cấu trúc không đồng nhất
– Nhiều tài nguyên: DLL (Delay Locked Loop: Vòng khoá pha trễ ), bộ nhớ, các bộ nhân
- Ứng dụng: PCI (Peripheral Component Interface: Giao diện thành phần ngoại vi), giao tiếp nối tiếp tốc độ cao và các bộ vi xử lý nhúng..., ƣu thế nổi bật khi thiết kế phức tạp, cần nhiều tài nguyên.
– Ứng dụng: Mã hoá và giải mã logic, các máy trạng thái hay các giao diện bus chuẩn (SPI, I2C, SMBus...), ƣu điểm nổi bật khi thiết kế các mạch logic nhiều đầu vào.
2.2. GIỚI THIỆU PHƢƠNG PHÁP THIẾT LẬP CẤU HÌNH CHO CPLD/FPGA
Để thiết kế và thiết lập cấu hình của các chip CPLD và FPGA, có hai phƣơng pháp phổ biến: phƣơng pháp dùng sơ đồ mô tả và phƣơng pháp dùng ngôn ngữ mô tả phần cứng (HDL: Hardware Descripition Language). Hai phƣơng pháp trên đƣợc tóm tắt dƣới đây.
2.2.1 Phƣơng pháp dùng sơ đồ mô tả
Sơ đồ mô tả là phƣơng pháp truyền thống ngƣời thiết kế sử dụng để xác định ma trận cổng và các cấu kiện logic khả trình, nó cho phép xác định chính xác các cổng cũng nhƣ cách kết nối các cổng đó để đƣợc thiết kế mong muốn. Phƣơng pháp sử dụng sơ đồ mô tả gồm 4 bƣớc chính nhƣ sau:
Bước 1: Chọn thƣ viện cấu kiện và công cụ mô tả thiết kế. Sau đó, chọn các cổng cần cho thiết kế từ thƣ viện, có thể kết hợp tuỳ ý các cổng với nhau. Ở bƣớc này, phải lựa chọn họ cấu kiện sẽ sử dụng, nhƣng chƣa phải quyết định sử dụng cấu kiện cụ thể nào trong họ để đáp ứng các yêu cầu về tốc độ và kích thƣớc.
Bước 2: Thực hiện kết nối các cổng với nhau, sử dụng lƣới hoặc dây nối. Ngƣời thiết kế
có thể điều chỉnh kết nối giữa các cổng tuỳ ý theo mục đích thiết kế.
Bước 3: Gắn thêm và phân bố các bộ đệm đầu vào và đầu ra. Các bộ đệm này sẽ xác
định các chân I/O cho thiết bị.
Bước 4: Bƣớc cuối là tạo ra Netlist. Netlist là file mô tả mạch số dƣới dạng text, đƣợc tạo bởi công cụ thiết kế. Bản mô tả thiết kế giúp các chƣơng trình khác nắm đƣợc các cổng logic có trong mạch, cách kết nối các cổng đó và số các chân I/O. Chuẩn để viết file Netlist phổ biến nhất là dạng EDIF (Electronic Digital Interchange Format: Định dạng trao đổi điện tử số).
Phƣơng pháp thiết kế dùng sơ đồ mô tả có hai nhƣợc điểm chính:
- Khi thiết kế trở nên phức tạp và dùng nhiều cổng hơn, việc sử dụng phƣơng pháp này
trở nên khó khăn, việc sửa lỗi cũng khó khăn hơn, thậm chí không khả thi.
36
Chương 2 – Cấu kiện logic khả trình (PLD)
- Một nhƣợc điểm khác của phƣơng pháp thiết kế theo sơ đồ là khó thay đổi công nghệ hay nhà cung cấp. Giả sử ban đầu, sử dụng chip FPGA của nhà sản xuất X để thiết kế mạch 10 000 cổng, sau đó chuyển sang sử dụng ma trận cổng, sẽ phải thay đổi toàn bộ các trang sơ đồ có sử dụng ma trận cổng trong thƣ viện của nhà sản xuất X.
2.2.2. Phƣơng pháp dùng ngôn ngữ mô tả phần cứng (HDL)
Để khắc phục các nhƣợc điểm trên, ngƣời ta có thể dùng phƣơng pháp dùng ngôn ngữ mô tả phần cứng (HDL). Có hai ngôn ngữ mô tả phần cứng phổ biến nhất: VHDL và Verilog.
Trong phƣơng pháp này, thay vì dùng các sơ đồ mô tả và các kết nối, ngƣời lập trình dùng ngôn ngữ mô tả phần cứng để mô tả các tính năng và hoạt động của từng phần trong hệ thống. Các bƣớc chính để thiết lập cấu hình cho PLD nhƣ sau:
Bước 1: Dùng ngôn ngữ mô tả phần cứng (HDL) để mô tả các tính năng và hoạt động của từng phần trong hệ thống. Đồng thời có thể dùng ngôn ngữ mô tả phần cứng HDL mô tả kết nối giữa các phần trong một hệ thống. Đầu ra của quá trình này là một file ở dạng text.
Bước 2: Dùng công cụ synthesis (tổng hợp) để tạo ra file Netlist từ file ở trên. Công cụ synthesis xác định các cổng đƣợc sử dụng dựa trên mô hình hoạt động (trong phƣơng pháp thiết kế truyền thống, ngƣời thiết kế phải thực hiện thao tác này). Vì Netlist đặc trƣng cho họ thiết bị và nhà sản xuất, nên phải sử dụng thƣ viện của nhà sản xuất tƣơng ứng. Hầu hết các công cụ thiết kế đều cung cấp tên các nhà sản xuất mảng cổng, FPGA và CPLD.
Ngoài ra, khi lựa chọn hay sắp xếp ở mức cổng, ngƣời sử dụng có thể tối ƣu hoá thiết kế để số lƣợng cổng sử dụng ít nhất; tối ƣu hoá từng phần thiết kế để tăng tốc độ; sử dụng cấu hình cổng phù hợp để giảm công suất; sử dụng cấu hình thanh ghi cho máy trạng thái.
Ngƣời thiết kế có thể thử nghiệm với nhiều nhà cung cấp khác nhau, nhiều họ thiết bị khác nhau, nhiều phƣơng pháp tối ƣu khác nhau, từ đó có đƣợc nhiều giải pháp thiết kế thay vì chỉ có một giải pháp nhƣ với phƣơng pháp sơ đồ.
Một ƣu điểm nữa của phƣơng pháp dùng ngôn ngữ mô tả phần cứng là rất dễ nâng cấp hệ thống. Sử dụng ngôn ngữ HDL rút ngắn thời gian thiết kế và khi thay đổi thiết kế cũng rất đơn giản. Ngƣời thiết kế chọn thƣ viện và các thông số tối ƣu (về tốc độ, diện tích,…), công cụ synthesis sẽ xác định kết quả. Ngƣời thiết kế có thể lựa chọn phƣơng án thiết kế tối ƣu sau khi thử các phƣơng án khác nhau.
Sau khi đã tạo đƣợc file Netlist, để lập trình chip PLD dựa trên cấu hình đã đƣợc thiết lập, ngƣời lập trình cần dùng các công cụ khác. Ngoài ra, ngƣời lập trình có thể chạy mô phỏng và kiểm tra thiết kế của mình. Các vấn đề này sẽ đƣợc đề cập rõ hơn trong các chƣơng sau.
2.3. YÊU CẦU CHUNG KHI THIẾT KẾ VỚI CPLD/FPGA
2.3.1 Chọn vi mạch CPLD hoặc FPGA phù hợp
Khi phát triển các hệ thống số sử dụng CPLD/FPGA bƣớc đầu tiên cần đƣợc thực hiện là phân tích bài toán, lựa chọn vi mạch CPLD hoặc FPGA phù hợp. Việc chọn đƣợc vi mạch, công nghệ phù hợp nhất cho các tiêu chuẩn thiết kế, đƣợc tiến hành theo các yêu cầu sau:
Mật độ: Là mật độ logic dự tính của linh kiện, đặc trƣng bởi khái niệm "số lƣợng cổng".
37
Chương 2 – Cấu kiện logic khả trình (PLD)
Số lượng thanh ghi: Phải tính đƣợc số thanh ghi cần cho bộ đếm, máy trạng thái, thanh
ghi và bộ chốt. Số lƣợng macrocell trong vi mạch tối thiểu phải bằng số thanh ghi cần có.
Số lượng chân vào/ra: Phải xác định vi mạch thiết kế cần bao nhiêu đầu vào, bao nhiêu
đầu ra.
Yêu cầu về tốc độ: Tuyến tổ hợp nhanh nhất sẽ xác định tpd (trễ truyền trong vi mạch,
tính theo ns). Mạch tuần tự nhanh nhất sẽ xác định tần số tối đa của vi mạch (fmax).
Đóng vỏ: Phải xác định vi mạch cần gọn nhất hay chỉ sử dụng dạng QFP (Quad Flat Package: Kết hợp sơ đồ bên trong) thông thƣờng. Hoặc vi mạch thiết kế thuộc dạng có lắp chân cắm, trong trƣờng hợp này là vi mạch PLCC (Programmable Logic Contronller Circuit).
Công suất thấp: Phải xác định sản phẩm sẽ sử dụng nguồn pin hay năng lƣợng mặt trời, thiết kế có yêu cầu công suất tiêu thụ thấp hay không, vấn đề tổn hao nhiệt có quan trọng hay không?
Chức năng cấp hệ thống: Phải xác định bo mạch có bao gồm nhiều vi mạch đa mức điện áp hay không, giữa các vi mạch có phải chuyển mức hay không, có yêu cầu sửa dạng xung đồng bộ hay không, có yêu cầu giao tiếp giữa bộ nhớ và bộ vi xử lý hay không?
2.3.2 Chọn giải pháp cấu hình cho CPDL/FPGA
a. Lập trình ngay trên hệ thống
Các CPLD và FPGA của các hãng nói chung, của Xilinx nói riêng có thể đƣợc lập trình ngay trên hệ thống (vi mạch đã đƣợc hàn vào mạch ứng dụng) thông qua giao thức JTAG (Joint Test Advisory Group) đã đƣợc tích hợp sẵn trong IC. Ngƣời thiết kế sử dụng cáp nạp để nạp cấu hình cho CPLD hoặc FPGA. Ví dụ hãng Xilinx đƣa ra một số chuẩn cáp nạp nhƣ sau:
+ MultiLINX: Cáp nạp dựa trên giao chuẩn giao tiếp nối tiếp USB hoặc RS232, cáp nạp này có tốc độ truyền trong dải rộng và giao diện có điện áp điều chỉnh đƣợc để phù hợp với việc giao tiếp với các hệ thống và các chân I/O hoạt động ở các mức điện áp khác nhau 5V; 3,3V; 2,5V. Và đƣợc thiết kế để hỗ trợ để cho các phần mềm gỡ rối phần cứng trƣớc kia, nay chúng đã trở lên lỗi thời khi có sự ra đời của công cụ gỡ rối phần cứng ChipScope ILA.
+ Parallel Cable IV: Cáp nạp sử dụng cổng giao tiếp song song của máy tính, đƣợc phát triển để thay thế cho chuẩn cáp nạp Parallel Cable III và cho phép tăng tốc độ lên hơn 10 lần và hỗ trợ cho tất các các vi mạch sử dụng mức điện áp I/O từ 5V xuống 1,5V. Hiện nay chuẩn cáp nạp này đƣợc dùng phổ biến hơn cả.
b. Lập trình bên ngoài
Các CPLD và FPGA của Xilinx cũng có thể đƣợc lập trình bên ngoài bởi bộ lập trình chip HW130 của Xilinx cũng nhƣ các bộ lập trình của các nhà phát triển khác. Điều này cũng thuận tiện cho việc sử dụng các chip đƣợc lập trình trƣớc trong thời gian sản xuất.
Cấu hình của CPLD đƣợc nạp vào FLASH nên khi mất điện cấu hình không bị mất đi, trong khi đó cấu hình khi hoạt động của FPGA đƣợc ghi vào SRAM nên sẽ mất đi khi mất điện, vì vậy cần sử dụng FPGA và kết hợp với EEPROM lƣu cấu hình phù hợp, mỗi khi bật nguồn, cấu hình sẽ nạp tự động từ PROM vào FPGA. Có thể sử dụng EEPROM nối tiếp hoặc song song, tuy nhiên thì loại EEPROM nối tiếp hay đƣợc sử dụng hơn cả. Khi thiết kế cần chọn loại EEPROM có dung lƣợng phù hợp với mật độ của các loại FPGA khác nhau.
38
Chương 2 – Cấu kiện logic khả trình (PLD)
Ngoài ra Xilinx còn cung cấp các giải pháp đƣợc thiết kế trƣớc, dễ sử dụng để cấu hình cho tất cả CPLD và FPGA của Xilinx, nhất là khi thiết kế các hệ thống phức tạp. Tất cả các nội dung liên quan đến cấu hình, EEPROM cho FPGA hay ISP cho CPLD, đều đƣợc đƣa ra. Các giải pháp sử dụng công cụ “3rd part boundary scan”, các giải pháp phần mềm kèm theo, cáp ISP, thiết bị kiểm tra tự động ATE và hỗ trợ lập trình cũng nhƣ các thiết bị lƣu trữ cấu hình.
c. Nhóm cấu hình hệ thống ACE
Giải pháp cấu hình hiện đại nhất là nhóm cấu hình Hệ thống ACE. Với giải pháp Hệ thống ACE, ngƣời thiết kế có thể dễ dàng sử dụng giao diện vi xử lí trong Hệ thống ACE để trực tiếp phối hợp cấu hình FPGA theo các yêu cầu của hệ thống. Giải pháp đầu tiên trong nhóm này là Hệ thống ACE CF, cung cấp công nghệ điều khiển ổ đĩa “Microdrive” kích thƣớc một inch và “CompactFlash” cũng nhƣ bộ lƣu trữ cấu hình có dung lƣợng 8Gbit. Ngoài ra, Hệ thống ACE CF cũng đƣợc thiết kế trƣớc, cung cấp các đặc tính hiện đại để tận dụng khả năng cấu hình lại linh hoạt của FPGA, bao gồm:
- Cấu hình multi-board từ một nguồn duy nhất
- Quản lý luồng bit đa cấu hình
- Nâng cấp cấu hình qua mạng (IRL)
- Hot-swapping
- Khởi tạo trung tâm xử lí và lƣu trữ phần mềm
- Mã hóa
Với hệ thống ACE CF, ngƣời thiết kế có thể thực hiện đƣợc gần nhƣ toàn bộ các yêu cầu cấu hình cho FPGA. Các khả năng bổ trợ hệ thống này cho phép ngƣời thiết kế sử dụng FPGA thỏa mãn các yêu cầu định trƣớc về mặt thiết kế và thời gian xử lí lỗi. Ngoài ra, các cổng vi xử lí và cổng kiểm tra JTAG còn cho phép tích hợp Hệ thống ACE trong mọi hệ thống.
Một số đặc điểm của giải pháp cấu hình hệ thống ACE:
- Độ linh hoạt: Với hệ thống ACE CF, có thể sử dụng một thiết kế cho nhiều ứng dụng khác nhau, nhờ đó giảm đáng kể thời gian hoàn thành sản phẩm. Thay vì thiết kế vài bo mạch tƣơng tự nhau phù hợp với các chuẩn khác nhau, giờ đây ngƣời thiết kế chỉ phải thiết kế một bo mạch duy nhất với nhiều cấu hình đƣợc lƣu trữ trong bộ nhớ hệ thống ACE CF. Mỗi bo mạch có thể chọn các cấu hình phù hợp với các chuẩn khác nhau bằng cách khởi tạo giá trị mặc định tƣơng ứng đƣợc lƣu trong bộ nhớ ACE. Hệ thống còn cho phép lƣu nhiều cấu hình cho một thiết kế trong một hệ thống ACE CF đơn. Ví dụ nhƣ trong quá trình thiết kế mẫu, ngƣời thiết kế có thể lƣu các cấu hình hoạt động, cấu hình kiểm tra và cấu hình gỡ rối trong bộ nhớ ACE, đồng thời có thể chọn các cấu hình khác để chạy thử bản thiết kế của mình.
Để hỗ trợ quản lý nhiều luồng bit và tích hợp điều khiển cấu hình FPGA với hoạt động của hệ thống, hệ thống ACE có một cổng vi xử lí trong hệ thống. Cổng này cho phép bộ xử lí của hệ thống thay đổi cấu hình mặc định, cấu hình lại trigơ, cấu hình lại từng FPGA hoặc một nhóm FPGA, truy nhập vào các file không cấu hình đƣợc lƣu trong khối CompactFlash hoặc dùng khối CompactFlash làm bộ nhớ chung cho hệ thống.
39
Chương 2 – Cấu kiện logic khả trình (PLD)
Với các FPGA có trung tâm xử lí kèm theo, hệ thống ACE CF cung cấp giải pháp 3 trong 1 để quản lý phần cứng và phần mềm. Hệ thống ACE CF có thể cấu hình khung FPGA, khởi tạo trung tâm vi xử lí và cung cấp các ứng dụng phần mềm cho trung tâm này nếu cần mà không phải thêm bất cứ thiết bị phần cứng nào.
+ Mật độ: Với mật độ logic cao chƣa từng thấy (trên 8Gbit), một Hệ thống ACE CF có thể cấu hình cho hàng trăm FPGA và có thể thay thế cho các mảng EEPROM cấu hình. Ngƣời thiết kế có thể lƣu một số lƣợng lớn các thiết kế khác nhau cho một mảng FPGA trong cùng một khối nhớ. Hệ thống ACE CF sử dụng hệ thống file FAT (File Allocation Table: bảng sắp xếp file tiêu chuẩn), do đó ngƣời thiết kế có thể lƣu cả những file không ở dạng luồng bit hoặc sử dụng bộ nhớ thừa làm bộ nhớ chuẩn cho hệ thống.
+ Khả năng quản lý tập trung: Hệ thống ACE CF đƣợc thiết kế để quản lý cấu hình theo yêu cầu. Một hệ thống ACE CF có thể cấu hình cho một hoặc nhiều bo mạch FPGA. Khả năng tập trung cho phép đơn giản hóa quá trình quản lý và nâng cấp cấu hình. Để thay đổi hay nâng cấp cấu hình của một hệ thống, ngƣời thiết kế có thể vào khối nhớ, thực hiện các thay đổi cần thiết trên màn hình máy tính, chỉnh lại nội dung trong hệ thống qua cổng vi xử lí; hoặc tải cấu hình mới về qua mạng, sử dụng IRL.
2.3.3 Chọn công cụ phần mềm phù hợp
Xilinx đã cung cấp các công cụ thiết kế điện tử hoàn chỉnh, cho phép thực hiện thiết kế trên các thiết bị logic khả trình của Xilinx. Các công cụ này kết hợp công nghệ tiên tiến với giao diện đồ họa linh hoạt, dễ sử dụng để ngƣời thiết kế có đƣợc thiết kế tối ƣu. Bộ công cụ phần mềm hiện đang đƣợc sử dụng rộng rãi là ISE với phiên bản mới nhất là 11.1 (27/4/2009).
Xilinx cũng cung cấp ISE dƣới dạng các gói phần mềm có cấu hình khác nhau với giá
thành khác nhau:
+ ISE WebPACK: Bản miễn phí có thể dùng để thiết kế cho tất cả các họ CPLD của
Xilinx và một số loại FPGA dung lƣợng thấp và trung bình.
+ Gói phần mềm cơ bản BASEX: Có thể thiết kế cho các loại chip sau:
Virtex-4, FPGA LX15, LX25, SX25, FX12, Spartan-3 FPGA lên đến 1.500 ngàn cổng
và tất cả các họ CPLD.
+ Gói phần mềm Foundation: Có thể thiết kế cho tất cả các loại FPGA và CPLD của
Xilinx
Ngoài ra Xilinx còn phát triển các bộ công cụ phần mềm tiện ích khác nhƣ System Generator hỗ trợ cho các thiết kế DSP (Digital Signal Processor: Bộ xử lý tín hiệu số) hay EDK (Embbleded Dvelopment Kit: Bộ phần mềm phát triển hệ thống) hỗ trợ cho các thiết kế nhúng.
ISE hay đƣợc dùng kết hợp với phần mềm mô phỏng ModelSim của Mentor Graphics
phiên bản XE đƣợc phát triển riêng hỗ trợ cho các họ CPLD/FPGA của Xilinx.
40
Chương 2 – Cấu kiện logic khả trình (PLD)
2.4. LƢU ĐỒ THIẾT KẾ CHO CPLD/FPGA
2.4.1 Lƣu đồ thiết kế cho CPLD
Quá trình thiết kế cho CPLD chủ yếu là thực hiện trên các công cụ phần mềm, lƣu đồ
thiết kế chung cho CPLD nhƣ Hình 2.7, bao gồm các bƣớc nhƣ sau:
HDL Verilog/VHDL
Design Entry
Schematic ECS
State Machines StateCad
Design Verification Functional Simulation (ISE Simulator, ModelSim)
Design Synthesis Xilinx Synthesis Tool (XST)
Design Implementation Translate
Fit
ModelSim XE
Timing Simulation Static Timing Analysis (ECS) Configuration Download (iMPACTE)
Hình 2.7 - Lƣu đồ thiết kế CPLD
41
Chương 2 – Cấu kiện logic khả trình (PLD)
Bước 1: Nhập thiết kế (Design Entry)
Đây là bƣớc đầu tiên và quan trọng nhất của quá trình thiết kế cho CPLD. Các công cụ
thiết kế cho phép nhập thiết kế theo các cách sau:
- Nhập thiết kế theo sơ đồ nguyên lý Schematic, ngƣời thiết kế sử dụng các môđun đã có sẵn trong thƣ viện Schematic để ghép nối chúng với nhau tạo thành bản thiết kế theo yêu cầu, cách này có thể thực hiện thiết kế nhanh nhƣng sẽ rất khó khăn và không tối ƣu tài nguyên của CPLD khi thiết kế phức tạp và thiết kế không sử dụng sang công cụ thiết kế CPLD của các hãng khác. Từ sơ đồ nguyên lý đã thiết kế đƣợc công cụ phần mềm sẽ chuyển đổi sang file ngôn ngữ mô tả phần cứng HDL, mà phổ biến là VHDL hoặc Verilog.
- Nhập thiết kế sử dụng ngôn ngữ mô tả phần cứng HDL (VHDL, Verilog, ABEL, AHDL...). Ngƣời thiết kế có thể sử dụng chƣơng trình soạn thảo để thực hiện việc mô tả toàn bộ bản thiết kế của mình dƣới dạng ngôn ngữ HDL nào đó mà công cụ thiết kế có thể tổng hợp đƣợc. Có rất nhiều phƣơng pháp mô tả, mức độ trừu tƣợng khác nhau khi thiết kế, mỗi cách mô tả khác nhau có thể tạo ra một cấu trúc mạch khác nhau trong CPLD mặc dù chúng có cùng chức năng.
Do đó ngƣời thiết kế cần thực hiện phân tích bài toán, tìm hiểu tài nguyên, cấu trúc của CPLD, yêu cầu về thời gian thiết kế để sử dụng kiểu mô tả, mức độ trừu tƣợng phù hợp vừa đảm bảo yêu cầu về thời gian thiết kế vừa tối ƣu đƣợc việc sử dụng tài nguyên của CPLD.
- Nhập thiết kế dƣới dạng sơ dồ: Công cụ thiết kế còn cho phép nhập thiết kế vào dƣới dạng sơ đồ mà điển hình là đồ hình trạng thái FSM, sau đó chúng cũng đƣợc chuyển đổi sang HDL.
Việc nhập thiết kế rất linh hoạt, có thể sử dụng cả 3 cách trên để thực hiện các phần
khác nhau của thiết kế.
Bước 2: Kiểm tra, mô phỏng thiết kế (Design Verification)
Thực hiện kiểm tra, mô phỏng chức năng hoạt động của thiết kế HDL đã tạo ra ở trên. Các công cụ thiết kế đều hỗ trợ việc mô phỏng chức năng hoạt động của bản thiết kế HDL theo mô hình hoạt động (Behavioral Model), mức độ mô phỏng này độc lập với loại CPLD đã đƣợc lựa chọn. Bƣớc này có thể không cần phải thực hiện trong khi thiết kế.
Bước 3: Tổng hợp thiết kế (Design Synthesis)
Sau khi hoàn thành mô phỏng thiết kế, bƣớc tổng hợp tiếp theo có nhiệm vụ chuyển thiết kế dƣới dạng file vản bản HDL thành dạng file Netlist, thực hiện mô tả mạch thực ở mức thấp dƣới dạng cổng logic và kết nối giữa chúng với nhau. Có thể sử dụng các công cụ tổng hợp của các hãng khác nhau nhƣ:
1. FGPAC Compiler. 2. LeonardoSpectrum. 3. Synplify 4. Xilinx XST
Mỗi công cụ có thể tạo ra file Netlist theo định dạng riêng (ví dụ của công cụ tổng hợp XST của Xilinx tạo ra: XNF-Xilinx Netlist Format) nhƣng ngƣời thiết kế có thể đặt lựa chọn để tạo ra file Netlist dƣới dạng định dạng chuẩn EDIF (Electronic Digital Interchange Format) mà tất cả các công cụ có thể hiểu đƣợc.
42
Chương 2 – Cấu kiện logic khả trình (PLD)
Chän c¸c cæng
GhÐp c¸c bé ®Öm vµo/ra
Hình 2.8 - Ví dụ tổng hợp ra file Netlist
Bước 4: Thực hiện thiết kế (Design Implementation)
Thùc hiÖn kÕt nèi Component AND G1 Component OR G Component NOT G3 Net N1: A. G1:a. G3:a T¹o Netlist Net N2: B. G1:b. G2:a Net N3: G1:c. P Net N4: G3:b. G2:b Net N5: G2:c. Q ;
Sau khi có file Netlist, bƣớc tiếp theo là thực hiện thiết kế, nghĩa là xây dựng cấu hình cho CPLD. Bƣớc này sử dụng file Netlist và file ràng buộc "constraints file" (mô tả các nguyên tắc thiết kế, các ràng buộc về vật lý nhƣ gán vị trí cho các đầu vào/ra trên chip, các ràng buộc về tốc độ, thời gian, tần số…) để tạo thiết kế sử dụng tài nguyên có sẵn của CPLD. Bƣớc này bao gồm các bƣớc: Translate (biên dịch), Fit (.
* Translate (biên dịch)
Bƣớc này nhằm thực hiện kiểm tra thiết kế và đảm bảo file Netlist phù hợp với kiến trúc của CPLD đã chọn, kiểm tra file ràng buộc "constraints file" của ngƣời sử dụng để phát hiện các lỗi mâu thuẫn với tham số của CPLD đã chọn. Biên dịch thƣờng bao gồm các quá trình: tối ƣu hoá, biên dịch thành các thành phần vật lý của cấu kiện; kiểm tra ràng buộc thiết kế. Khi kết thúc bƣớc biên dịch, sẽ có một bản báo cáo về các chƣơng trình đƣợc sử dụng, danh sách các cổng I/O và các cấu kiện đƣợc sử dụng trong thiết kế, nhờ đó ngƣời thiết kế sẽ lựa chọn đƣợc phƣơng án thiết kế tối ƣu.
* Fit (Điều chỉnh)
Bƣớc này thực hiện đặt cấu trúc logic trong thiết kế vào các vị trí của Macrocell trong CPLD. Tạo bản phân bố thiết kế tới các tài nguyên cụ thể trong CPLD và tạo kết nối giữa chúng. Nếu thiết kế quá lớn so với thiết bị đƣợc chọn, quy trình này không thể hoàn thành nhiệm vụ của mình. Sau bƣớc này tạo ra đƣợc file cấu hình *.jed có thể đƣợc nạp vào cho CPLD.
Bước 5: Timing Simulation (Mô phỏng định thời)
Sau bƣớc Place and Route ngƣời thiết kế có thể thực hiện mô phỏng thiết kế ở mức cổng logic đã đƣợc định vị trí và định tuyến trên CPLD, phần mềm sử dụng file cấu hình đã đƣợc tạo ra và kết hợp với thƣ viện về mô hình thời gian của các họ CPLD (ví dụ ISE của Xilinx thì dùng thƣ viện VITAL), để thực hiên mô phỏng hoạt động của thiết kế mà có tính đến các tham số thời gian trễ, thời gian thiết lập… của các cổng logic trong CPLD. Bƣớc này rất quan trọng với những thiết kế phức tạp, tốc độ lớn.
Bước 6: Configuration (Cấu hình) hay bƣớc nạp cấu hình (Download)
43
Chương 2 – Cấu kiện logic khả trình (PLD)
Gọi chƣơng trình điều khiển việc nạp cấu hình, thực kết nối thiết bị nạp (cáp nạp) đến CPLD và nạp file cấu hình cho CPLD. Với CPLD của hãng Xilinx, quá trình lập trình có thể thực hiện ngay trong hệ thống nhờ công cụ JTAG hoặc sử dụng bộ lập trình thiết bị chuyên dùng, ví dụ nhƣ công cụ JTAG Data I/O, theo chuẩn IEEE/ANSI 1149.1_1190. Công cụ JTAG là một bộ các nguyên tắc thiết kế, hỗ trợ quá trình kiểm tra, lập trình cho thiết bị và gỡ rối trên chip, trên bo mạch và trên hệ thống. Khả năng lập trình trên hệ thống là ƣu điểm của CPLD, cho phép lập trình lại CPLD đã đƣợc hàn trực tiếp lên PCB. Nếu có thay đổi trong thiết kế, sẽ không phải tháo thiết bị ra khỏi bo mạch, mà đơn giản chỉ phải lập trình lại trên hệ thống.
2.4.2 Lƣu đồ thiết kế cho FPGA
Lƣu đồ thiết kế cho FPGA cũng tƣơng tự nhƣ lƣu đồ thiết kế cho CPLD, chỉ khác ở
bƣớc 4 - Thực hiện thiết kế và bƣớc 6 - Cấu hình cho FPGA.
Design Implementation Translate Map
Place and Route
ModelSim XE
Timing Simulation Static Timing Analysis (ECS) Configuration Create Bit file
Download (iMPACTE)
Hình 2.9 - Lƣu đồ thiết kế FPGA
Bước 4: Thực hiện thiết kế (Design Implementation)
Sau khi có file Netlist, bƣớc tiếp theo là thực hiện thiết kế, nghĩa là xây dựng cấu hình cho FPGA. Bƣớc này sử dụng file Netlist và file ràng buộc "constraints file" (mô tả các nguyên tắc thiết kế, các ràng buộc về vật lý nhƣ gán vị trí cho các đầu vào/ra trên chip, các ràng buộc về tốc độ, thời gian, tần số…) để tạo thiết kế sử dụng tài nguyên có sẵn của FPGA.
44
Chương 2 – Cấu kiện logic khả trình (PLD)
Bƣớc này bao gồm các bƣớc: Translate (biên dịch), Map (Phân bố bản thiết kế vào chip), Place and Route (Định vị và định tuyến kết nối).
* Translate (biên dịch)
Bƣớc này nhằm thực hiện kiểm tra thiết kế và đảm bảo file Netlist phù hợp với kiến trúc của FPGA đã chọn, kiểm tra file ràng buộc "constraints file" của ngƣời sử dụng để phát hiện các lỗi mâu thuẫn với tham số của FPGA đã chọn. Biên dịch thƣờng bao gồm các quá trình: tối ƣu hoá, biên dịch thành các thành phần vật lý của cấu kiện; kiểm tra ràng buộc thiết kế. Khi kết thúc bƣớc biên dịch, sẽ có một bản báo cáo về các chƣơng trình đƣợc sử dụng, danh sách các cổng I/O và các cấu kiện đƣợc sử dụng trong thiết kế, nhờ đó ngƣời thiết kế sẽ lựa chọn đƣợc phƣơng án thiết kế tối ƣu.
* Map
Tạo bản phân bố thiết kế tới các tài nguyên cụ thể trong FPGA. Nếu thiết kế quá lớn so với thiết bị đƣợc chọn, quy trình này không thể hoàn thành nhiệm vụ của mình. Quá trình Map có các tham số ràng buộc của thiết kế, ví dụ nhƣ tham số tốc độ, thời gian của thiết kế và đôi khi quyết định gắn thêm các thành phần logic để đáp ứng các yêu cầu về thời gian. Map có khả năng thay đổi thiết kế xung quanh các bảng ánh xạ để tạo khả năng thực hiện tốt nhất cho thiết kế. Quy trình này đƣợc thực hiện hoàn toàn tự động và cần rất ít tác động đầu vào từ ngƣời sử dụng. Bƣớc này nhằm đƣa mạch thiết kế vào một thiết bị cụ thể. Bƣớc này cũng tạo ra báo cáo xác nhận các tài nguyên đƣợc sử dụng trong chip, mô tả chính xác các phần trong thiết kế đƣợc đặt ở vị trí nào trong chip thực tế.
* Place and Route (PAR - Định vị và định tuyến kết nối)
Place là quá trình lựa chọn vị trí phù hợp của mỗi khối chức năng trong thiết kế và đƣa các cổng logic của phần đó vào các khối logic hay các môđun cụ thể trong FPGA trên cơ sở tối ƣu việc kết nối và đảm bảo về các ràng buộc về thời gian. Những phần logic hoạt động tốc độ cao sẽ đƣợc xếp cạnh nhau để giảm độ dài đƣờng kết nối. Route là quá trình tạo liên kết vật lý giữa các khối logic. Hầu hết các nhà sản xuất cung cấp công cụ Place and Route tự động cho ngƣời sử dụng. Ngoài công cụ tự động, ngƣời thiết kế có thể tự Place and Route trong khi thiết kế. Nhà sản xuất cũng cung cấp các công cụ, nhƣ “Floorplanner”, để nâng cao hiệu suất quá trình Place and Route do ngƣời thiết kế thực hiện so với quá trình tự động.
Place and Route là quá trình phức tạp, do đó nó chiếm thời gian nhiều nhất. Tuy nhiên, bƣớc này chỉ có thể hoạt động tốt nếu Chip đã chọn đáp ứng đủ các tuyến liên kết cho thiết kế. Nếu không, ngƣời thiết kế sẽ phải chọn chip có dung lƣợng lớn hơn. Sau bƣớc này tạo ra đƣợc file mô tả cấu hình dạng *.jed.
Bước 6: Configuration (Cấu hình)
Ở bƣớc này, đối với FPGA có thêm bƣớc "Create Bit file" để tạo ra file "luồng bit" để nạp vào bộ nhớ cấu hình trong FPGA thƣờng là bộ nhớ tạm thời nhƣ SRAM. Dòng bit đƣợc nạp mang tất cả thông tin để định nghĩa các hàm logic và các liên kết trong thiết kế. Mỗi thiết kế khác nhau có một dòng bit khác nhau. Các thiết bị SRAM mất toàn bộ thông tin mỗi khi ngắt nguồn, do đó khi cần thiết phải nạp dòng bit cấu hình này vào trong EEPROM (thƣờng sử dụng EEPROM nối tiếp). Mỗi khi thiết bị đƣợc bật nguồn file cấu hình từ EEPROM sẽ đƣợc nạp tự động vào bộ nhớ SRAM của FPGA và FPGA hoạt động theo cấu hình đã đƣợc nạp đó.
45
Chương 2 – Cấu kiện logic khả trình (PLD)
2.5.3. Ví dụ thiết kế đơn giản dùng phần mềm ISE
Sử dụng phần mềm ISE 11.3 của Xilinx thiết kế một mạch logic (cổng AND hai đầu
vào).
1. Nhập thiết kế
- Mở chƣơng trình.
Chọn Start >> All Program >> Xilinx ISE… >> ISE >> Project Navigator.
- Tạo một project mới.
Vào File >> New Project
+ Nhập tên Project trong mục Name:
+ Xác định thƣ mục đặt Project trong mục Project Location:
+ Lựa chọn kiểu mã nguồn trong mục Top-level source type:.
Ví dụ tạo project and2_gate đặt tại thƣ mục ISE trong ổ D, ta khai báo nhƣ sau:
Sau đó kích vào Next, hộp thoại sau xuất hiện
46
Chương 2 – Cấu kiện logic khả trình (PLD)
Thực hiện thiết lập các thuộc tính ban đầu (lƣu ý rằng các thuộc tính này có thể thay đổi
đƣợc khi đã và đang thực hiện project)
Trong Project catelogy: All là để lựa chọn tất cả, General Purpose là cho mục đích
chung, Automotive cho lĩnh vực tự động hóa, Military.. cho lĩnh vực quân sự,…
47
Chương 2 – Cấu kiện logic khả trình (PLD)
Vào mục Family: để lựa chọn họ linh kiện, mục Device để lựa chọn linh kiện, mục
Package lựa chọn kiểu gói, Speed lựa chọn tốc độ.
Và các lựa chọn khác nhƣ Tool tổng hợp, Bộ mô phỏng, ngôn ngữ viết.
Ví dụ ta lựa chọn nhƣ sau:
Kích vào Next, sẽ hiện ra hộp thoại
Kích vào New Source, hộp thoại sau hiện ra.
48
Chương 2 – Cấu kiện logic khả trình (PLD)
Nếu không muốn tạo ra code mới thì kích Next luôn (lƣu ý, có thể làm điều này vì ta thực hiện
khai báo file code mới sau cũng đƣợc).
Tạo file VHDL Module
Kích chọn VHDL Module
Gõ tên file vào trƣờng File name.
49
Chương 2 – Cấu kiện logic khả trình (PLD)
Sau đó kích Next. Hiện ra hộp thoại sau:
Thực hiện các khai báo:
50
Chương 2 – Cấu kiện logic khả trình (PLD)
Với Cổng And 2 lối vào là InA, InB, và một lối ra là OutC.
Sau đó kích Next và kích Finish.
Kích Yes. Hiện ra hộp thoại:
51
Chương 2 – Cấu kiện logic khả trình (PLD)
Kích Next để tiếp tục.
Nếu chúng ta không thêm file đã tồn tại sẵn thì tiếp tục kích vào Next, rồi kích Finish để
kết thúc.
Cửa sổ sau sẽ hiện ra
52
Chương 2 – Cấu kiện logic khả trình (PLD)
Từ đây chúng ta thực hiện quá trình viết mã VHDL cho project.
Ta thực hiện quá trình mô tả chức năng của cổng AND 2 lối vào bằng đoạn code nhƣ
sau:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
53
use IEEE.STD_LOGIC_ARITH.ALL;
Chương 2 – Cấu kiện logic khả trình (PLD)
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity and2_gate is
Port ( InA : in STD_LOGIC;
InB : in STD_LOGIC;
OutC : out STD_LOGIC);
end and2_gate;
architecture Behavioral of and2_gate is
begin
OutC <= InA and InB;
Sau đó save chƣơng trình vừa viết và tiến hành bƣớc kiểm tra cú pháp.
Cách làm nhƣ sau:
- Trong bảng Sources, trƣờng Sources for ta chọn Implementation. Kích chuột vào file
and2_gate.
54
end Behavioral;
Chương 2 – Cấu kiện logic khả trình (PLD)
- Tiếp đến kích chuột vào dấu cộng trong Implement Design để mở rộng.
Kích chuột phải chạy Run, hoặc Rerun hoặc Re Run All. Hoặc kích đúp chuột, tƣơng
ứng với Run.
Chƣơng trình không còn lỗi, sẽ có một dấu tích màu xanh ở mục check syntax nhƣ sau:
55
Chương 2 – Cấu kiện logic khả trình (PLD)
Kiểm tra schematic kết quả:
Kích chuột phải chạy Run, hoặc Rerun hoặc Re Run All. Hoặc kích đúp chuột, tƣơng
ứng với Run.
Các kết quả hiện ra nhƣ sau
56
Chương 2 – Cấu kiện logic khả trình (PLD)
Kích Add -> thu đƣợc
Kích vào Create Schematic
57
Chương 2 – Cấu kiện logic khả trình (PLD)
Hoàn toàn phù hợp với yêu cầu là cổng AND cần thiết kế.
Bƣớc tiếp theo là mô phỏng, kiểm tra thiết kế.
Kích chuột phải vào project, chọn New source.
Hiện ra hộp thoại, kích chuột chọn VHDL Test Bench và viết tên File vào trƣờng File
name.
58
Chương 2 – Cấu kiện logic khả trình (PLD)
Kích Next, rồi Next và Finish.
Hiện ra cửa sổ.
Ta tiến hành viết code cho phần kiểm tra mô phỏng với dòng code kiểm tra nhƣ sau:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
59
USE ieee.std_logic_unsigned.all;
Chương 2 – Cấu kiện logic khả trình (PLD)
USE ieee.numeric_std.ALL;
ENTITY tb_and2_gate IS
END tb_and2_gate;
ARCHITECTURE behavior OF tb_and2_gate IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT and2_gate
PORT(
InA : IN std_logic;
InB : IN std_logic;
OutC : OUT std_logic
);
END COMPONENT;
--Inputs
signal InA : std_logic := '0';
signal InB : std_logic := '0';
--Outputs
signal OutC : std_logic;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: and2_gate PORT MAP (
InA => InA,
InB => InB,
OutC => OutC
);
InA <= not InA after 10ns;
InB <= not InB after 15ns;
Chạy mô phỏng
Cách làm nhƣ sau:
- Trong bảng Sources, trƣờng Sources for ta chọn Behavioral Simulation. Kích chuột
vào file tb_and2_gate...
60
END;
Chương 2 – Cấu kiện logic khả trình (PLD)
- Tiếp đến kích chuột vào dấu cộng trong Xilinx ISE Simulator để mở rộng. - Kiểm tra cú pháp
Kích chuột phải chạy Run, hoặc Rerun hoặc Re Run All. Hoặc kích đúp chuột, tƣơng
ứng với Run.
61
Chương 2 – Cấu kiện logic khả trình (PLD)
Chƣơng trình không còn lỗi, sẽ có một dấu tích màu xanh ở mục check syntax nhƣ sau:
Mô phỏng: Kích chuột phải vào Simulate Behavioral Model chạy Run, hoặc Rerun
hoặc Re Run All. Hoặc kích đúp chuột, tƣơng ứng với Run.
62
Chương 2 – Cấu kiện logic khả trình (PLD)
Kết quả:
Dùng điều chỉnh Zoom để xem đƣợc toàn bộ hình vẽ.
Kết quả thể hiện chính xác hoạt động của cổng AND 2 lối vào.
63
Chương 2 – Cấu kiện logic khả trình (PLD)
64
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
CHƢƠNG 3 – CĂN BẢN VỀ NGÔN NGỮ MÔ TẢ PHẦN CỨNG VHDL
Lịch sử phát triển của VHDL
Những ƣu điểm của VHDL
Cấu trúc ngôn ngữ của VHDL
3.1. LỊCH SỬ PHÁT TRIỂN CỦA VHDL
VHDL là ngôn ngữ mô tả phần cứng cho các mạch tích hợp tốc độ rất cao, là một loại ngôn ngữ mô tả phần cứng đƣợc phát triển dùng cho trƣơng trình VHSIC (Very High Speed Intergrated Circuit) của bộ quốc phòng Mỹ. Mục tiêu của việc phát triển VHDL là có đƣợc một ngôn ngữ mô phỏng phần cứng tiêu chuẩn và thống nhất cho phép thử nghiệm các hệ thống số nhanh hơn cũng nhƣ cho phép dễ dàng đƣa các hệ thống đó vào ứng dụng trong thực tế. Ngôn ngữ VHDL đƣợc ba công ty Intermetics, IBM và Texas Instruments bắt đầu nghiên cứu phát triển vào tháng 7 năm 1983. Phiên bản đầu tiên đƣợc công bố vào tháng 8-1985. Sau đó VHDL đƣợc đề xuất để tổ chức IEEE xem xét thành một tiêu chuẩn chung. Năm 1987 IEEE đã đƣa ra tiêu chuẩn về VHDL đầu tiên (tiêu chuẩn IEEE-1076-1987). Từ đó các phiển bản tiếp theo của tiêu chuẩn đã ra đời. Đa số các phần mềm thiết kế hiện nay đều hỗ trợ VHDL.
Tiêu chuẩn IEEE-1076-1987 quy định:
- Các kiểu dữ liệu cơ bản: số học (integer, real), kiểu logic (bit, boolean), kiểu ký tự (character), kiểu thời gian (time), mảng bit (bit_vector), mảng ký tự (string), cùng các phép toán với các kiểu dữ liệu đó.
- Các cấu trúc lệnh tuần tự và song song.
- Các đơn vị thiết kế …
Để mô tả đƣợc các tín hiệu logic nhiều trạng thái, IEEE đã bổ sung tiêu chuẩn IEEE 1164 quy định kiểu dữ liệu logic có tới 9 trạng thái (std_ulogic, và kiểu mảng std_ulogic_vector) cùng các phép toán với kiểu dữ liệu đó.
Năm 1993, IEEE đƣa ra phiên bản IEEE-1016-1993 bổ sung thêm nhiều cấu trúc, cú pháp cho phép việc đặt tên linh hoạt hơn, bổ sung thêm lệnh XNOR, kiểu ký tự xuất ra máy in theo tiêu chuẩn ISO-8859-1 …
Phiên bản tiêu chuẩn năm 2000 và 2002 bổ sung một số ý tƣởng về về VHDL hƣớng
đối tƣợng (giống nhƣ C++), và bỏ một số hạn chế trong luật đặt tên cổng “port”.
Ngoài tiêu chuẩn IEEE 1164, IEEE còn đƣa ra một số tiểu chuẩn bổ sung cho VHDL nhƣ:
+ IEEE 1076.1 (VHDL-AMS) tiêu chuẩn VHDL mở rộng cho mô tả mạch tƣơng tự và
mạch tín hiệu hỗ hợp số - tƣơng tự.
+ IEEE 1076.2 bổ sung một số kiểu dữ liệu phức (complex), thực (real).
+ IEEE 1076.3 bổ sung một số kiểu dữ liệu có dấu (signed) và không dấu (unsigned).
65
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ IEEE 1076.4 - VITAL ASIC (Application Specific Integrated Circuit) Modeling
Specification) bổ sung thƣ viện VITAL quy định đặc tính của mô hình mạch ASIC.
+ IEEE 1076.6 bổ sung thƣ viện cho phép tổng hợp hệ thống số theo mô hình luồng dữ
liệu RTL
Năm 2006, ủy ban kỹ thuật VHDL của Accellera đƣợc sự ủy nhiệm của IEEE để thực hiện các cập nhật tiếp theo cho tiêu chuẩn đã đƣa phiên bản VHDL 3.0 (tiêu chuẩn VHDL- 2006) ngoài việc giữ lại đầy đủ phiên bản tiêu chuẩn cũ còn thực hiện nhiều mở rộng cho phép việc viết và quản lý mã VHDL dễ dàng hơn. Những thay đổi quan trọng nhất là kết hợp (IEEE 1164, IEEE 1076.2, IEEE 1076.3) thành tiêu chuẩn chung IEEE 1076 -2006, mở rông cú pháp linh hoạt hơn cho cấu trúc lệnh “case” và lệnh “generate”, kết hợp VHPI (VHPI - interface to C/C++) và tập con của PSL (Property Specification Language). Những thay đổi này nâng cao chất lƣợng của các mã VHLD cho phép tổng hợp, thực hiện viết testbench linh hoạt hơn, cho phép sử dụng rộng rãi hơn việc sử dụng VHDL cho việc mô tả mức hệ thống.
Năm 2008, Accellera đã đƣa ra phiên bản VHDL 4.0 (tiêu chuẩn VHDL 2008), đã giải quyết hơn 90 vấn đề còn tồn tại của phiên bản VHDL 2006 và thêm vào các kiểu generic nâng cấp và phiên bản này dự kiến đƣợc đƣa ra dƣới tiêu chuẩn IEEE 1076-2008.
Nhƣ vậy VHDL luôn luôn đƣợc chuẩn hóa, bổ sung, thay đổi, hoàn thiện… để nó có thể đáp ứng đƣợc sự phức tạp, yêu cầu ngày càng cao của hệ thống điện tử nói chung, hệ thống số nói riêng.
Trong chƣơng này các mã VHDL đƣợc sử dụng chủ yếu là theo tiêu chuẩn IEEE-1076-
2002.
3.2 NHỮNG ƢU ĐIỂM CỦA VHDL
VHDL đƣợc phát triển để giải quyết các khó khăn trong việc mô phỏng, thiết kế, phát triển, thay đổi và lập tài liệu cho các hệ thống số. Nhƣ ta đã biết, một hệ thống số có rất nhiều tài liệu mô tả. Để có thể vận hành bảo trì sửa chữa một hệ thống ta cần tìm hiểu kỹ lƣỡng tài liệu đó. Với một ngôn ngữ mô phỏng phần cứng tốt việc xem xét các tài liệu mô tả trở nên dễ dàng hơn vì bộ tài liệu đó có thể đƣợc thực thi để mô phỏng hoạt động của hệ thống. Nhƣ thế ta có thể xem xét toàn bộ các phần tử của hệ thống hoạt động trong một mô hình thống nhất.
VHDL đƣợc phát triển nhƣ một ngôn ngữ độc lập không gắn với bất kỳ một phƣơng pháp thiết kế, một bộ mô tả hay công nghệ phần cứng nào. Ngƣời thiết kế có thể tự do lựa chọn công nghệ, phƣơng pháp thiết kế trong khi chỉ sử dụng một ngôn ngữ duy nhất. Và khi đem so sánh với các ngôn ngữ mô phỏng phần cứng khác ta thấy VHDL có một số ƣu điểm hơn hẳn các ngôn ngữ khác:
+ Thứ nhất là tính công cộng: VHDL đƣợc phát triển dƣới sự bảo trợ của chính phủ Mỹ và hiện nay là một tiêu chuẩn của IEEE. VHDL đƣợc sự hỗ trợ của nhiều nhà sản xuất thiết bị cũng nhƣ nhiều nhà cung cấp công cụ thiết kế mô phỏng hệ thống.
+ Thứ hai là khả năng hỗ trợ nhiều công nghệ và phƣơng pháp thiết kế. VHDL cho phép thiết kế bằng nhiều phƣơng pháp ví dụ phƣơng pháp thiết kế từ trên xuống, hay từ dƣới lên dựa vào các thƣ viện sẵn có, thiết kế theo cấu trúc hay hành vi... VHDL cũng hỗ trợ cho nhiều loại công cụ thiết kế mạch nhƣ sử dụng công nghệ đồng bộ hay không đồng bộ, sử dụng ma trận lập trình đƣợc hay sử dụng mảng ngẫu nhiên…
66
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ Thứ ba là tính độc lập với công nghệ: VHDL hoàn toàn độc lập với công nghệ chế tạo phần cứng. Một mô tả hệ thống dùng VHDL thiết kế ở mức cổng logic có thể đƣợc chuyển thành các bản tổng hợp mạch khác nhau tuỳ thuộc công nghệ chế tạo phần cứng mới ra đời nó có thể đƣợc áp dụng ngay cho các hệ thống đã thiết kế .
+ Thứ tƣ là khả năng mô tả mở rộng: VHDL cho phép mô tả hoạt động của phần cứng từ mức hệ thống cho đến mức cổng logic. VHDL có khả năng mô tả hoạt động của hệ thống trên nhiều mức nhƣng chỉ sử dụng một cú pháp chặt chẽ thống nhất cho mọi mức. Nhƣ thế ta có thể mô phỏng một bản thiết kế bao gồm cả các hệ con đƣợc mô tả chi tiết.
+ Thứ năm là khả năng trao đổi kết quả: Vì VHDL là một tiêu chuẩn đƣợc chấp nhận, nên một mô hình VHDL có thể chạy trên mọi bộ mô tả đáp ứng đƣợc tiêu chuẩn VHDL. Các kết quả mô tả hệ thống có thể đƣợc trao đổi giữa các nhà thiết kế sử dụng công cụ thiết kế khác nhau nhƣng cùng tuân theo tiêu chuẩn VHDL. Cũng nhƣ một nhóm thiết kế có thể trao đổi mô tả mức cao của các hệ thống con trong một hệ thống lớn (trong đó các hệ con đó đƣợc thiết kế độc lập).
+ Thứ sáu là khả năng hỗ trợ thiết kế mức lớn và khả năng sử dụng lại các thiết kế: VHDL đƣợc phát triển nhƣ một ngôn ngữ lập trình bậc cao, vì vậy nó có thể đƣợc sử dụng để thiết kế một hệ thống lớn với sự tham gia của một nhóm nhiều ngƣời. Bên trong ngôn ngữ VHDL có nhiều tính năng hỗ trợ việc quản lý, thử nghiệm và chia sẻ thiết kế. Và nó cũng cho phép dùng lại các phần đã có sẵn.
3.3 CẤU TRÖC NGÔN NGỮ CỦA VHDL
VHDL là ngôn ngữ cho phép mô tả các thiết bị phần cứng số trừu tƣợng, nó không dựa vào công nghệ thiết bị phần cứng số, hay phƣơng pháp đƣợc sử dụng để thiết kế thiết bị số cụ thể nào đó. Những khái niệm, mô hình trừu tƣợng của thiết bị phần cứng số đƣợc đƣa ra nhƣ là nền tảng của ngôn ngữ. Do đó dùng VHDL cho phép mô tả đƣợc hầu hết các hệ thống phần cứng số.
Để thực hiện mô tả cho một hệ thống số nào đó cần thực hiện theo các bƣớc nhƣ sau:
+ Phân tích yêu cầu của hệ thống số cần phải thiết kế hoặc cần phải mô tả.
+ Phân tách hệ thống thành những khối con.
+ Xác định mô hình mô tả phù hợp cho mỗi khối con hoặc cho cả hệ thống.
+ Sử dụng ngôn ngữ VHDL để mô tả hệ thống số theo các mô hình đã xác định.
Nhƣ vậy việc nắm chắc cấu trúc, cú pháp, các mô hình mô tả của ngôn ngữ là rất quan
trọng, quyết định chủ yếu đến thành công trong việc mô tả hệ thống số cần thiết kế.
VHDL cũng có nhiều điểm giống nhƣ một ngôn ngữ lập trình bậc cao, có cấu trúc, có cú pháp riêng, có cách tổ chức chƣơng trình, có từ khóa, có phƣơng pháp biểu diễn số liệu riêng...
Cấu trúc ngôn ngữ cơ bản của VHDL gồm:
Đối tƣợng: Quy định các dạng tín hiệu cố định, tín hiệu, cổng vào-ra, hay tín hiệu đệm.
Các kiểu dữ liệu: Quy định các kiểu dữ liệu có thể đƣợc dùng để gán cho mỗi đối tƣợng.
Các phép toán: Quy định các phép toán sử dụng cho mỗi loại dữ liệu.
67
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Các đơn vị thiết kế: Các thành phần cơ bản cấu trúc lên một chƣơng trình mã mô tả
dùng VHDL.
Các cấu trúc lệnh tuần tự: Cấu trúc câu lệnh thực hiện theo tiến trình tuần tự, thƣờng
dùng mô tả các cấu trúc mạch tuần tự của mạch số.
Các cấu trúc lệnh song song: Cấu trúc câu lệnh thực hiện song song, thƣờng dùng mô
tả các cấu trúc mạch tổ hợp.
Chú ý:
- Trong các đoạn mã mô tả VHDL trong chƣơng các từ khóa đều đƣợc in đậm.
- Trong VHDL không phân biệt chữ hoa, chữ thƣờng.
- Ghi chú trong VHDL dùng dấu “--“ (-- Ghi chú)
3.3.1 Đối tƣợng trong VHDL
Trong ngôn ngữ VHDL gồm có 5 đối tƣợng là: cổng – Port, tín hiệu - signal, biến - variable, hằng - constant, tham số chung – generic. Mỗi đối tƣợng đƣợc khai báo dựa vào từ khóa tƣơng ứng và chúng có mục đích sử dụng khá nhau.
a b c
Address 8
CPU
AddDecode
8
InBus
x y
Data
ALU
Interface
8
8
8
ExtBus
Result
Hình 3.1 – Ví dụ cấu trúc một mạch số
+ Cổng – Port: là đối tƣợng biểu diễn các đầu tín hiệu vào ra bên ngoài của một mạch số cần mô tả. Cổng đƣợc khai báo trong thực thể - Entity (đơn vị thiết kế để mô tả giao diện vào/ra và các tham số của một mạch hay hệ thống số.
Cú pháp khai báo Cổng nhƣ sau:
port(-- Khai báo danh sách đối tượng các port vào ra
Tên_cổng {, Tên_cổng} : [mode] [Kiểu_dữ_liệu] [:=giá_trị_khởi_tạo];
...);
Ví dụ: -- Mô tả giao diện vào/ra cho mạch CPU như Hình 3.1
port (a,b,c: in std_logic; -- Cổng vào
Data, Address: in std_logic_vector(7 downto 0); -- Bus vào
Result, ExtBus: out std_logic_vector(7 downto 0) –- Bus ra
68
);
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ Tín hiệu – Signal: là đối tƣợng để biểu diễn đƣờng kết nối bên trong các giữa các cổng vào/ra của thực thể (mạch số), giữa các cổng vào/ra của các khối thành phần phần cứng bên trong mạch số… Chúng là phƣơng tiện truyền dữ liệu động giữa các thành phần của mạch số.
Tín hiệu có tính toàn cục rất cao, chúng có thể đƣợc khai báo trong package (tín hiệu toàn cục, đƣợc sử dụng bởi một số thực thể), khai báo trong thực thể - Entity (tín hiệu nội bộ dùng trong thực thể, có thể đƣợc tham chiếu bởi bất kỳ kiến trúc nào của thực thể đó), khai báo trong kiến trúc – Architecture (tín hiệu nội bộ dùng trong kiến trúc, có thể đƣợc sử dụng trong bất cứ cấu trúc lệnh nào trong kiến trúc). Các tín hiệu có thể đƣợc sử dụng nhƣng không đƣợc khai báo trong tiến trình – process, trong thủ tục - proceduce, trong hàm – function, vì tiến trình và thủ tục, hàm là thành phần cơ sở của mô hình và chúng đƣợc coi nhƣ các hộp đen.
Thông thƣờng trong hệ thống có 2 dạng tín hiệu: Tín hiệu đơn và Bus hay còn gọi là Vector (Tín hiệu gồm tín hiệu đơn, chúng truyền thông tin nhƣ là tổ hợp của nhiều giá trị nhị phân)
Cú pháp khai báo tín hiệu nhƣ sau:
Signal tên_tín_hiệu {,tên_tín_hiệu}:kiểu_dữ_liệu [:=giá_trị_khởi_tạo];
Ví dụ: Khai báo tín hiệu nội bộ cho mạch CPU như Hình 3.1
signal x,y: std_logic; -- Tín hiệu đơn
signal InBus: std_logic_vector(7 downto 0):="00000000"; -- Tín hiệu Bus 8
-- bit có giá trị khởi tạo là ―00000000‖.
+ Biến – Variable: là đối tƣợng cục bộ đƣợc sử dụng để chứa các kết quả trung gian.
Biến chỉ đƣợc khai báo và sử dụng trong process và trong procedure và function.
Cú pháp khai báo của biến cũng tƣơng tự nhƣ khai báo tín hiệu:
variable tên_biến {,tên_biến}: kiểu_dữ_liệu [:=giá_trị_khởi_tạo];
Ví dụ: variable x : Bit:=‘1‘;
Nếu không đƣợc khởi tạo giá trị ban đầu biến sẽ nhận giá trị ban đầu là giá trị thấp nhất
trong các giá trị thuộc miền xác định của kiểu dữ liệu.
Đối tƣợng tín hiệu - Signal cũng có thể chứa dữ liệu trung gian nhƣng chúng lại không
đƣợc sử dụng vì những lý do sau:
variable Q: std_logic_vector(3 downto 0);
- Việc sử dụng biến hiệu quả hơn vì giá trị của biến đƣợc gán ngay lập tức trong process, trong khi đó tín hiệu chỉ đƣợc lập kế hoạch để thực hiện và chỉ đƣợc cập nhật toàn bộ sau khi kết thúc process.
- Trong quá trình chạy mô phỏng hay tổng hợp, biến chiếm ít bộ nhớ hơn trong khi tín hiệu cần nhiều thông tin để có thể lập kế hoạch thực hiện cũng nhƣ để chứa các thuộc tính của tín hiệu.
- Sử dụng tín hiệu phải yêu cầu có lệnh wait để thực hiện đồng bộ phép gán tín hiệu với
phép lặp thực hiện theo cách sử dụng quen thuộc.
+ Hằng –constant: đối tƣợng hằng đƣợc gán cho các giá trị cụ thể của một kiểu dữ liệu khi đƣợc tạo ra và không đổi trong toàn bộ quá trình thực hiện. Hằng có thể dùng để mô tả
69
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
cho tín hiệu không đổi (ví dụ tín hiệu GND, VCC,…). Hằng cũng có tính toàn cục giống nhƣ tín hiệu và có thể đƣợc khai báo trong package, entity, architecture, proceduce, function, process…
Cú pháp khai báo hằng:
constant tên_hằng {,tên_hằng}: kiểu_dữ_liệu :=giá_trị_khởi_tạo;
Ví dụ: constant GND : std_logic:=‘0‘;
constant PI: real:=3.1414;
constant datamemory : memory := (('0','0','0','0'),
('0','0','0','1'),
+ Tham số chung – Generic: Dùng để khai báo tham số cho mô hình mạch số, và chỉ
đƣợc khái báo trong phần Entity (Đề cập chi tiết trong phần 3.3.3).
Cú pháp khai báo tham số chung:
('0','0','1','1'));
Generic(Tên_tham_số {, Tên_tham_số}: kiểu_dữ_liệu :=giá_trị_khởi_tạo);
Ví dụ:
entity CPU is
generic(delay: Time:=1us;
BusWidth: integer:=8
);
port (a,b,c: in std_logic; -- Cổng vào
Data, Address: in std_logic_vector(BusWidth downto 0); -- Bus vào
Result, ExtBus: out std_logic_vector(BusWidth downto 0)-- Bus ra
);
end CPU;
Tóm lại: Các đối tƣợng trong VHDL có mục đích sử dụng, phạm vi sử dụng khác nhau,
nhƣng chúng có cú pháp khai báo chung nhƣ sau:
Các đối tƣợng khi khai báo phải đƣợc xác định kiểu dữ liệu tƣơng ứng. VDHL định nghĩa nhiều kiểu dữ liệu khác nhau để phù hợp với việc mô tả, thiết kế, mô phỏng các hệ thống số khác nhau trong thực tế.
Đối_tượng Tên_đối_tượng : kiểu_dữ_liệu {:=giá_trị_khởi_tạo}
3.3.2 Kiểu dữ liệu trong VHDL
Trong VHDL có 4 dạng dữ liệu:
Vô hƣớng : gồm các dữ liệu có giá trị đơn nhƣ bit, boolean, integer, real, physical,
character, std_logic và std_ulogic, enumerated (kiểu liệt kê)...
Kiểu ghép: các dữ liệu dƣới dạng một nhóm các thành phần nhƣ mảng, bảng ghi (record). Bit_logic_vector, std_logic_vector và String đều là những dạng dữ liệu ghép đã đƣợc định nghĩa sẵn.
Mảng hai chiều (2-D Arrays): các dữ liệu có dạng mảng 2 chiều, đƣợc tạo nên từ 1
mảng của một mảng 1 chiều ( hay một bản ghi).
Kiểu dữ liệu con (Subtypes): tập dữ liệu con của một dữ liệu đã có sẵn, đƣợc ngƣời
dùng tự định nghĩa dựa trên những dạng có sẵn.
70
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Các kiểu dữ liệu cũng nhƣ các phép toán của chúng đã đƣợc định nghĩa trong gói dữ liệu chuẩn trong thƣ viện chuẩn Standard Library của VHDL là: bit, boolean, integer, real, physical, character, std_logic and std_ulogic, Bit_logic_vector, std_logic_vector, và String và một số kiểu dữ liệu con. Do các kiểu dữ liệu trên đã đƣợc định nghĩa trong các thƣ viện chuẩn của VHDL nên khi sử dụng các kiểu dữ liệu này chỉ cần khai báo thƣ viện tƣơng ứng để có thể sử dụng chúng cũng nhƣ các phép toán tƣơng ứng với chúng.
Cú pháp chung định nghĩa kiểu dữ liệu trong VHDL nhƣ sau:
Các kiểu dữ liệu chuẩn đƣợc trình bày chi tiết sau đâu:
Type Tên_kiểu is giới_hạn_giá_trị_của_kiểu
a. Kiểu vô hướng
- Bit : Kiểu liệt kê với 2 giá trị „0‟ và „1‟, đặc trƣng cho 2 mức logic thấp và cao. Kiểu
Bit đã đƣợc định nghĩa nhƣ sau: Type Bit is („0‟, „1‟);
- Boolean: Kiểu liệt kê với 2 giá trị false và true. Kiểu Boolean đã đƣợc định nghĩa nhƣ
sau: Type Boolean is (false, true);
- Integer: Kiểu số nguyên với những giá trị dƣơng hoặc âm, độ lớn mặc định là 32 bit với giới hạn giá trị: từ -2147483647 đến +2147483647. Khi sử dụng có thể giới hạn miền xác định theo giới hạn giảm dần dùng từ khóa downto hoặc tăng dần dùng từ khóa to:
signal A : integer range 0 to 7; -- A số nguyên 3 bit giá trị từ 0 đến 7.
variable B:integer range 15 downto 0;--B số nguyên 4 bit giá trị từ 15 xuống 0
Các cách biểu diễn số nguyên dạng thập phân:
+ digit[underline]digit. Ví dụ : 0, 1, 123_456_789 , -123_5678… + digit(E)digit, trong đó E là cơ số. Ví dụ: 987E6 (=987.106)…
Các cách biểu diễn dƣới dạng cơ số xác định:
+ base#based_integer[.based_integer ]#[exponent]. Ví dụ: (196=) 2#1100_0100#,
16#C4#, 4#301#E1=(3.42+1).41=196.
signal C : integer range 15 downto -15;-- C số nguyên 5 bit
- Real: Kiểu số thực có giới hạn từ -1.0E+38 đến 1.0E+38, khác với kiểu integer kiểu Real khi sử dụng thƣờng đƣợc định nghĩa thành kiểu dữ liệu con riêng và có giới hạn miền xác định.
Ví dụ:
signal a: Real:=-123E-4;
type CAPACITY is range -25.0 to 25.0 ;
signal Sig_1 : CAPACITY := 3.0 ;
type PROBABILITY is range 1.0 downto 0.0;
Các cách biểu diễn số thực:
+ Biểu diễn dƣới dạng thập phân: integer[.integer][exponent], ví dụ: 0.0, 0.5,
1.1234_5678, 12.4E-9…
+ Biểu diễn dƣới dạng cơ số xác định:
71
constant P : PROBABILITY := 0.5 ;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
base#based_integer[.based_integer ]#[exponent] Ví dụ: 2#1.111_1111_111#E+11 (=1,1023.103), 16#F.FF#E2 (=4095.0)
- Character: Kiểu ký tự - kiểu dữ liệu liệt kê với miền xác định là tập hợp các ký tự
ASCII. Biểu diễn của giá trị Character: „A‟, „a‟, „*‟, „ „, NUL, ESC…
- Kiểu Vật lý – Physical: đƣợc sử dụng để biểu diễn các đại lƣợng vật lý nhƣ khoảng cách, điện trở, dòng điện, thời gian… Kiểu vật lý cung cấp đơn vi cơ bản và các đơn vị kế tiếp đƣợc định nghĩa theo đơn vị cơ bản, đơn vị nhỏ nhất có thể biểu diễn đƣợc là đơn vị cơ bản. Trong thƣ viện chuẩn của VHDL kiểu Time (kiểu dữ liệu thời gian) là kiểu vật lý duy nhất đã đƣợc định nghĩa nhƣ sau:
type Time is range
units
fs; -- Đơn vị cơ bản
-- Đơn vị kế tiếp
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
Ví dụ:
End Units;
constant Tpd : Time := 3ns ;
…
Z <= A after Tpd ;
- Std_logic và Std_ulogic: kiểu dữ liệu logic nhiều mức đã đƣợc định nghĩa trong gói std_logic_1164, so với kiểu Bit thì chúng có thể mô tả chính xác và chi tiết hơn cho các trạng thái khác nhau của tín hiệu số, chúng cho phép xác định đƣợc cƣờng độ khác nhau của các tín hiệu số. Đây là các kiểu dữ liệu rất quan trọng thƣờng đƣợc sử dụng để mô tả cho các tín hiệu trong các hệ thống số cho mục đích thiết kế, tổng hợp, hiện thực hệ thống đó bằng mạch cứng.
type std_ulogic is type std_logic is
(‘U‘, -- Uninitialize (‘U‘, -- Uninitialize
‗X‘, -- Forcing Unknown ‗X‘, -- Forcing Unknown
‗0‘, -- Forcing Zero ‗0‘, -- Forcing Zero
‗1‘, -- Forcing One ‗1‘, -- Forcing One
‗Z‘, -- High Impedance ‗Z‘, -- High Impedance
‗W‘, -- Weak Unknown ‗W‘, -- Weak Unknown
‗L‘, -- Weak Zero ‗L‘, -- Weak Zero
‗H‘, -- Weak One ‗H‘, -- Weak One
‗-‗ -- Don‘t Care ‗-‗ -- Don‘t Care
Ý nghĩa của các mức logic nhƣ sau:
72
) ; ) ;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
„U‟, -- Uninitialize : Mức khởi tạo
„X‟, -- Forcing Unknown: Mức không xác định chiếm ƣu thế
„0‟, -- Forcing Zero : Mức logic thấp chiếm ƣu thế
„1‟, -- Forcing One : Mức logic cao chiếm ƣu thế
„Z‟, -- High Impedance : Mức trở kháng cao
„W‟, -- Weak Unknown : Mức không xác định yếu
„L‟, -- Weak Zero : Mức logic thấp yếu
„H‟, -- Weak One : Mức logic cao yếu
„-„ -- Don‟t Care : Không quan tâm đến mức logic
Các mức logic chiếm ƣu thế bao giờ cũng có cƣờng độ lớn hơn các mức logic yếu, ví dụ nếu đầu ra của một cổng logic có trạng thái cao đƣợc nối với tín hiệu GND, trong trƣờng hợp này thì đầu ra chính là mức logic cao yếu „H‟ còn tín hiệu GND có mức logic thấp chiếm ƣu thế „0‟, nhƣ vậy mức trạng thái của đầu ra đó sẽ bị kéo xuống mức logic chiếm ƣu thế „0‟, điều này có thể làm hỏng cổng logic. Minh họa các trạng thái logic khác nhau trong mạch đƣợc minh họa nhƣ Error! Reference source not found..
Hình 3.2 – Minh họa các trạng thái std_logic trong mạch số
Hai kiểu dữ liệu std_logic và std_ulogic tƣơng tự nhau, chúng chỉ khác nhau ở chỗ là kiểu std_ulogic không có hàm phân giải (unresolved), còn kiểu std_logic có hàm phân giải – hàm quyết định giá trị tín hiệu, do đó sẽ có bắt lỗi khi các tín hiệu kiểu std_ulogic đƣợc nối chung vào 1 điểm. Thƣ viện cũng cung cấp hàm phát hiện lỗi này của các tín hiệu kiểu std_ulogic.
Nếu không có ràng buộc gì đặc biệt khi thiết kế hệ thống số thi nên dùng kiểu std_logic. Vì thực thế hệ thống số hay đƣợc thiết kế theo kiểu sử dụng bus tín hiệu chung, nên sẽ có nhiều tín hiệu khác nhau của các khối con khác nhau cùng nối chung vào bus.
Ví dụ nhƣ cách mô tả sau cho ta thấy sự khác nhau về việc sử dụng kiểu dữ liệu std_logic và std_ulogic trong quá trình chạy mô phỏng hay tổng hợp từ mã VHDL. Theo mã mô tả thì tín hiệu A, B, C cùng nối chung vào tín hiệu Out_1, Reg_Out. Vì Reg_Out có kiểu std_logic, nên chƣơng trình sẽ không báo lỗi vì kiểu dữ liệu này có hàm phân giải để quyết định mức logic của Reg_Out theo các mức logic chiếm ƣu thế trong 3 tín hiệu A, B, C.
73
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
signal A,B,C,Res_Out : std_logic ;
signal Out_1 : std_ulogic ;
Out_1 <= A ; Res_Out <= A;
Out_1 <= B ; Res_Out <= B; A Out_1 <= C ; Res_Out <= C; A
B Out_1 B Res_Out
X
(Ký hiệu “<=” dùng ở trên là lệnh gán tín hiệu (sẽ đƣợc trình bày chi tiết hơn ở phần sau) lệnh gán tín hiệu thực hiện đƣợc với 2 dữ liệu cùng kiểu, cùng độ lớn, giá trị của tín hiệu bên phải sẽ đƣợc gán cho tín hiệu bên trái).
So sánh 2 bảng chân lý sau để hiểu hơn về hàm phân giải:
C C Có lỗi!!! Thực hiện được
Hàm AND ứng kiểu Std_ulogic Hàm phân giải ứng với kiểu Std_logic
U X 0 1 Z W L H - U X 0 1 Z W L H -
U U U 0 U U U 0 U U U U U U U U U U U
X U X 0 X X X 0 X U X X X X X X X X X
0 0 0 0 0 0 O 0 0 U X 0 X 0 0 0 0 X 0
1 U X 0 1 X X 0 1 U X X 1 1 1 1 1 X 1
Z U X 0 X X X 0 X U X 0 1 Z W L H X Z
W U X 0 X X X 0 X U X 0 1 W W W W X W
L 0 0 0 0 0 0 0 0 U X 0 1 L W L W X L
H U X 0 1 X X 0 1 U X 0 1 H W W H X H
- U X 0 X X X 0 X U X X X X X X X X -
- Kiểu dữ liệu liệt kê tự định nghĩa: Kiểu dữ liệu liệt kê, do ngƣời sử dụng tự định nghĩa, cho phép mô tả rất sáng sủa, và linh hoạt cho các mô hình phần cứng số với mức độ trừu tƣợng cao. Kiểu dữ liệu này dùng nhiều mô tả đồ hình trạng thái (Máy trạng thái), các hệ thống phức tạp…
Ví dụ:
-- Định nghĩa kiểu trạng thái My_State
type My_State is ( RST, LOAD, FETCH, STOR, SHIFT) ;
. . .
-- Khai báo tín hiệu kiểu My_State
Kiểu dữ liệu My_State gồm 5 giá trị RST, LOAD, FETCH, STOR, SHIFT. Các chƣơng trình phần mềm thiết kế thƣờng mặc định mẵ hóa các giá trị đó bằng số nhị phân 3 bit. Tuy nhiên các chƣơng trình phần mềm Tổng hợp có thể phép gán giá trị bit nhị phân tùy ý cho các giá trị của kiểu dữ liệu liệt kê tự định nghĩa này.
74
signal STATE, NEXT_STATE : My_State ;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
b. Kiểu dữ liệu ghép
Tƣơng tự các ngôn ngữ lập trình, VHDL cũng có các kiểu dữ liệu ghép là nhóm các
phần tử dữ liệu theo dạng mảng (array) hoặc bảng ghi (record).
+ Mảng – Array:
Mảng là nhóm nhiều phần tử có cùng kiểu dữ liệu với nhau thành đối tƣợng duy nhất.
Mỗi phần tử của mảng có thể đƣợc truy cập bằng một hoặc nhiều chỉ số của mảng.
Cú pháp định nghĩa kiểu dữ liệu mảng nhƣ sau:
-- Mảng 1D
Trong đó: (khoảng_của_chỉ_số) là khoảng xác định chỉ sổ của các phần tử trong mảng, nó đƣợc xác định bằng khoảng giá trị nguyên liên tục giảm dần, ví dụ (7 downto 0) hoặc tăng dần, ví dụ (0 to 7).
Ví dụ một số cách khai báo và sử dụng dữ liệu mảng:
Type tên_mảng is array (khoảng_của_chỉ_số) of Kiểu_của_phần_tử;
type WORD is array (3 downto 0) of std_logic ;
type Matrix is array (0 to 3) of WORD;
signal A_Bus : WORD:="0101";
-- A_Bus(3)=‘0‘, A_Bus(2)=‘1‘, A_Bus(1)=‘0‘, A_Bus(0)=‘1‘
signal B_Bus : WORD:=('0','1','0','1');
signal C_Matrix: Matrix:=("0001", ('0','1','0','1'), "0110", "1111");
Các kiểu dữ liệu mảng đã đƣợc định nghĩa trong thƣ viện chuẩn của VHDL (các kiểu dữ
liệu vector) là:
-- C_Matrix(0)="0001‖; C_Matrix(0)(0)=‘1‘;
Bit_logic_vector (mảng dữ liệu kiểu Bit).
Std_logic_vector (mảng dữ liệu kiểu std_logic)
Std_ulogic_vector (mảng dữ liệu kiểu std_ulogic).
Signed (Kiểu mảng std_logic có dấu biểu dƣới dƣới dạng mã bù 2).
Unsigned (Kiểu mảng std_logic không dấu)
String (mảng dữ liệu kiểu Chacracter).
Trong đó, kiểu Signed và Unsigned đƣợc định nghĩa trong thƣ viện std_logic_arith. Chúng tƣơng tự nhƣ kiểu std_logic_vector. Với Signed thì bit đầu tiên là bit dấu, và số âm đƣợc biểu diễn dƣới dạng mã bù 2. Ví dụ “1101“ nếu là kiểu Unsigned thì có giá trị thập phân là 13, còn nếu là kiểu Signed thì có giá trị thập phân là -3.
Một số ví dụ sử dụng các kiểu dữ liệu vector nhƣ sau:
signal My_BusA, My_BusB: bit_vector (3 downto 0);
signal My_BusC : bit_vector (0 to 3);
signal Data_Word : std_logic_vector (11 downto 0);
signal Data1 : Signed (0 to 7) ;
signal Data2 : Unsigned (8 downto 1);
variable Warning2: string(1 to 30):= "Unstable, Aborting Now" ;
75
constant Warning3: string(1 to 20):= "Entering FSM State2";
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Một số phép toán thao tác với phần tử mảng:
- Tách phần từ của mảng: Có thể thực hiện việc tách một hay một vài phần tử trong
mảng.
Ví dụ:- Tách 1 phần tử trong mảng: My_BusA(3), My_BusA(2),...
- Phép gán cho mảng: 2 mảng phải cùng kiểu, cùng độ lớn, phép gán sẽ thực hiện gán
theo từng phần tử theo thứ tự từ trái sang phải:
- Tách một số phần tử trong mảng: My_BusA(2 downto 1); My_BusA(3|0); My_BusA(3|2|0); My_BusA(3 downto 2, 0);My_BusA(3, 1 downto 0); .
My_BusB <= My_BusA ; My_BusC <= My_BusA ;
3 1 0 3 1 0
2 2 My_BusA My_BusA
My_BusB My_BusB
;
3 2 1 0 0 2
Ví dụ gán giá trị hằng số cho mảng:
Data_Word <= ‖101001101111‖ ;
Data_Word <= B‖1010_0110_1111‖;
Data_Word <= X‖A6F‖;
Cách biểu diễn số liệu bit_vector và std_logic_vector: B|O|X ”giá_trị” (dùng dấu nháy
kép). Trong đó B : Binary –Kiểu nhị phân, O: Octal – kiểu bát phân, X: hexadecimal.
Data_Word <= O‖5157‖;
- Phép gộp ( …): cho phép nhóm cả dữ liệu vô hƣớng và dữ liệu mảng để thuận tiện
cho các phép gán cho mảng:
X‖1AF‖=B‖0001_1010_1111‖= B‖000_110_101_111‖=O‖0657‖
signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7);
signal Q_Out : std_logic_vector (31 downto 0);
signal A, B, C, D : std_logic;
signal WORD : std_logic_vector (3 downto 0);
…
-- Phép gộp (…) nằm ở vế trái:
(A,B,C,D)<=WORD; -- A<=WORD[3], B<=WORD[2], C<=WORD[1], D<=WORD[0].
Chú ý: Phép gộp nằm ở vế bên trái thì chỉ dùng với kiểu dữ liệu vô hƣớng.
-- Phép gộp (…) nằm ở vế phải:
WORD <= ( 2 => '1', 3 => D, others => '0' ); -- WORD=‖D100‖
Q_Out <= (others => '0') ; -- Tất cả các bit của Q_0ut được gán bằng '0'
WORD <= ( A, B, C, D ) ;
H_Byte <= (7|6|0=>'1', 1 to 5 => '0' );-- Bit 7, 6, 0 của H_Byte được gán bằng '1', từ bit 1 đến bit 5 được gán bằng '0'.
L_Byte <= (3=>'1', 0 to 2 => '0', 4 to 7 => '1');
Chú ý: “others” có thể đƣợc sử dụng khi gán mặc định, nó có ý nghĩa là các tất cả các
phần tử còn lại đƣợc gán bằng một giá trị nào đó) .
76
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
- Phép gán bí danh (Alias): Gán bí danh (tên mới) cho tất cả hay một phần của một đối tƣợng mảng, và coi nó nhƣ một trƣờng của mảng. Bí danh đƣợc sử dụng tƣơng đƣơng nhƣ là một thành phần tƣơng ứng của đối tƣợng mảng. Ví dụ Cấu trúc lệnh (Instruction) 32 bit của một CPU gồm các trƣờng (OpCode: Mã lệnh + SrcReg: Địa chỉ Thanh ghi nguồn + DstReg: Địa chỉ thanh ghi đích v.v.), nhƣ vậy có thể tạo bí danh cho các trƣờng của cấu trúc lệnh nhƣ sau:
SIGNAL Instruction : BIT_VECTOR(31 DOWNTO 0);
-- Gián bí danh cho tín hiệu Instruction
ALIAS OpCode : BIT_VECTOR(7 DOWNTO 0) IS instruction(31 DOWNTO 24);
ALIAS SrcReg : BIT_VECTOR(7 DOWNTO 0) IS instruction(23 DOWNTO 16);
ALIAS DstReg : BIT_VECTOR(7 DOWNTO 0) IS instruction(15 DOWNTO 8);
+ Bảng ghi – Record:
Bảng ghi là nhóm nhiều phần tử có kiểu dữ liệu khác nhau thành đối tƣợng duy nhất.
Mỗi phần tử của bản ghi đƣợc truy nhập tới theo tên trƣờng.
Các phần tử của bản ghi có thể nhận mọi kiểu của ngôn ngữ VHDL kể cả mảng và bảng
ghi.
Cú pháp định nghĩa kiểu dữ liệu bảng ghi nhƣ sau:
Type Tên_Kiểu_Bảng is record
-- Khai báo các trường của bảng ghi
...
End record;
Ví dụ:
type OPCODE is record
-- Khai báo các trường của bảng ghi
PARITY : bit;
ADDRESS : std_logic_vector ( 0 to 3 );
DATA_BYTE : std_logic_vector ( 7 downto 0 );
NUM_VALUE : integer range 0 to 6;
STOP_BITS : bit_vector (1 downto 0);
end record ;
Các trƣờng của dữ liệu bảng ghi OPCODE đƣợc sắp xếp nhƣ sau:
. . .
...
Cách truy nhập và gán dữ liệu cho các trƣờng của bảng ghi: Các phần tử của bảng ghi đƣợc truy nhập theo tên bảng ghi và tên trƣờng, 2 thành phần này đƣợc ngăn cách bởi dấu „.‟. Xét một số ví dụ sau để hiểu cách truy nhập và gán dữ liệu cho bảng ghi:
ADDRESS NUM_VALUE STOP_BITS PARITY DATA_BYTE ;
77
signal TX_PACKET, RX_PACKET : OPCODE;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
TX_PACKET <= ( ‗1‘,‖0011‖,‖11101010‖,5,‖10‖ ) ;
TX_PACKET.ADDRESS <= (―0011‖);
TX_PACKET <= RX_PACKET;
TX_PACKET.ADDRESS <= RX_PACKET.ADDRESS;
c. Kiểu dữ liệu mảng 2 chiều (2-D Array)
Mảng 2 chiều là kiểu dữ liệu mảng của các phần tử mảng một chiều hay bảng ghi. Cú
pháp chung để định nghĩa kiểu dữ liệu mảng 2 chiều nhƣ sau:
-- Kiểu Mảng 1Dx1D
Type Tên_mảng_2D is array (khoảng_chỉ_số) of Kiểu_Mảng/Kiểu_Bảng;
-- Kiểu Mảng 2D
Type Tên_mảng_2D is array (khoảng_chỉ_sô_1, khoảng_chỉ_số_2) of Kiểu_phần_tử;
Một số ví dụ định nghĩa và khai báo kiểu dữ liệu mảng 2 chiều nhƣ sau:
type Mem_Array is array (0 to 3) of std_logic_vector (7 downto 0);
type Memory is array(0 to 3, 7 downto 0) of std_logic;
type Data_Array is array ( 0 to 2 ) of OPCODE ;
…
signal My_Mem:Mem_Array:=(others=>x‖00‖);
signal RAM1:Memory:=((others=>‘0‘),―00001111‖, x‖FF‖, (others=>‘1‘));
-- Ví dụ ứng dụng dùng mảng 2 chiều khởi tạo một vùng nhớ ROM
signal My_Data:Data_Array ;
constant My_ROM:Mem_Array := (0 =>(others=>‗1‘),-- gán cho phần tử thứ nhất
1 => ―10100010‖, -- gán cho phần tử thứ 2
2 => ―00001111‖, -- gán cho phần tử thứ 3
-- Ví dụ các phép tách các phần tử của mảng 2 chiều: My_Mem(0); My_Mem(0)(5
downto 0); My_Mem(0|3); RAM1(0)= My_Mem(0), RAM1(1,7)= My_Mem(1)(7).
3 => ―11110000‖);-- gán cho phần tử thứ 4
Minh họa các kiểu dữ liệu
Kiểu dữ liệu
Ví dụ
Minh họa
Dữ liệu đơn
std_logic
Mảng 1D
std_logic_vector(4 downto 0)
Mảng 1Dx1D
Type Registers is array (2 downto 0) of std_logic_vector (4 downto 0)
Mảng 2D
Type Memory is array(2 downto 0, 4 downto 0) of std_logic
78
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
d. Kiểu dữ liệu con:
Là một tập hợp con của các kiểu dữ liệu đã đƣợc định nghĩa khác. Phép khai báo kiểu
dữ liệu con có thể nằm ở mọi vị trí cho phép khai báo kiểu dữ liệu. Cú pháp khai báo chung:
Subtype Tên_kiểu_dữ_liệu_con is xác_định_kiểu_dữ_liệu_con;
Ví dụ: subtype My_Int is integer range 0 to 255 ;
subtype My_Small_Int is My_Int range 5 to 30 ;
subtype word is bit_vector(31 downto 0);
e. Tổng kết
Trong VHDL có những lệnh chỉ dùng cho mục đích mô phỏng, mà không thể tổng hợp
đƣợc mạch cứng.
Bảng tổng kết sau đƣa ra kiểu dữ liệu có thể đƣợc dùng để viết mã VHDL để tổng hợp
đƣợc mạch cứng:
Kiểu dữ liệu Giá trị có thể tổng hợp được
Use IEEE.std_logic_1164.all;
BIT, BIT_VECTOR ‗0‘, ‗1‘
STD_LOGIC, STD_LOGIC_VECTOR ‗X‘, ‗0‘, ‗1‘, ‗Z‘ (resolved)
STD_ULOGIC, STD_ULOGIC_VECTOR ‗X‘, ‗0‘, ‗1‘, ‗Z‘ (unresolved)
BOOLEAN True, False
NATURAL Từ 0 tới +2.147.483.647
INTEGER Từ -2.147.483.647 đến +2.147.483.647
Kiểu số nguyên tự định nghĩa Tập con của INTEGER
Use IEEE.std_logic_arith.all;
SIGNED Từ -2.147.483.647 đến +2.147.483.647
UNSIGNED Từ 0 to +2.147.483.647
Kiểu dữ liệu liệt kê Các giá trị được liệt kê bởi người dùng
SUBTYPE Tập dữ liệu con được định nghĩa
ARRAY Mảng của bất kỳ kiểu dữ liệu nào ở trên
RECORD Bảng ghi chứa bất kỳ kiểu dữ liệu nào ở trên
Chú ý: Các đối tƣợng này đều có thể đƣợc gán bằng đối tƣợng hay giá trị cùng kiểu bằng các phép gán (Sẽ đƣợc trình bày chi tiết ở những phần sau), trƣớc hết chúng ta cần chú ý các phép gián giá trị đƣợc dùng cho mỗi đối tƣợng nhƣ sau:
Đối tƣợng
Phép gán
Phép gán cho cổng – Port
<=
Phép gán cho tín hiệu - Signal
<=
Phép gán cho biến – Variable
:=
Phép gán giá trị của từng thành phần (trong Mảng, Bảng ghi…)
=>
Phép gán giá trị khởi tạo cho các đối tƣợng
:=
79
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
f. Câu hỏi ôn tập
-- Cho khai báo kiểu và tín hiệu nhƣ sau
TYPE array1 IS ARRAY (7 DOWNTO 0) OF STD_LOGIC;
TYPE array2 IS ARRAY (3 DOWNTO 0, 7 DOWNTO 0) OF STD_LOGIC;
TYPE array3 IS ARRAY (3 DOWNTO 0) OF array1;
SIGNAL a : BIT;
SIGNAL b : STD_LOGIC;:
SIGNAL x : array1;
SIGNAL y : array2;
SIGNAL w : array3;
1. Xác định kiểu dữ liệu (Vô hƣớng, Mảng (1D, 2D, 1Dx1D)) của các tín hiệu đã khai
báo, viết ví dụ về giá trị của mỗi tín hiệu.
2. Xác định xem các phép gán nào đúng, phép gán nào sai trong bảng sau:
SIGNAL z : STD_LOGIC_VECTOR (7 DOWNTO 0);
Đúng STT Phép gán Kích thước dữ liệu mỗi vế /Sai
a <= x(2)
b <= x(2)
b <= y(3,5)
b <= w(5)(3)
y(1)(0) <= z(7)
x(0) <= y(0,0)
x <= "1110000"
a <= "0000000"
1 2 3 4 5 6 7 8 9 y(1) <= x 10 w(0) <= y 11 w(1) <= (7=>'1', OTHERS=>'0') 12 y(1) <= (0=>'0', OTHERS=>'1') 13 w(2)(7 DOWNTO 0) <= x 14 w(0)(7 DOWNTO 6) <= z(5 DOWNTO 4) 15 x(3) <= x(5 DOWNTO 5)
16 b <= x(5 DOWNTO 5)
17 y <= ((OTHERS=>'0'), (OTHERS=>'0'),(OTHERS=>'0'), "10000001")
18 z(6) <= x(5)
19 z(6 DOWNTO 4) <= x(5 DOWNTO 3)
20 z(6 DOWNTO 4) <= y(5 DOWNTO 3)
21 y(6 DOWNTO 4) <= z(3 TO 5)
22 y(0, 7 DOWNTO 0) <= z
80
23 w(2,2) <= '1'
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
3.3.3 Các phép toán trong VHDL
a. Toán tử logic
Toán tử logic gồm có: and, or, nand, nor, xor, not, xnor đƣợc sử dụng cho các dạng
dữ liệu là bit, boolean, bit_vector, std_logic_vector.
Y <= G or ( F and H ) ;
Chú ý:
Toán tử logic dùng cho kiểu dữ liệu mảng có nguyên tắc thực hiện nhƣ sau:
+ Chỉ thực hiện với các mảng cùng kiểu, cùng độ lớn.
+ Phép toán logic thực hiện với từng phần tử của mảng và theo thứ tự từ trái sang phải.
+ Toán tử not có độ ƣu tiên cao nhất: Ví dụ Z <= not A and B -- = (not A) and B.
Ví dụ: Z <= A and B;
signal A_vec, B_vec, C_vec :
bit_vector(7 downto 0) ;
...
C_vec <= A_vec and B_vec ;
b. Toán tử quan hệ
Toán tử quan hệ đƣợc sử dụng cho hầu hết các dạng dữ liệu, tất cả các toán tử quan hệ
đều cho giá trị trả về dƣới dạng boolean.
Toán tử quan hệ gồm có: =, /=, <, <=, >, >=.
Ví dụ: signal FLAG_BIT : boolean ;
signal A, B : integer ;
- Nguyên tắc thực hiện phép quan hệ với dữ liệu mảng:
+ Các mảng phải cùng kiểu, độ dài có thể khác nhau.
+ Mảng có độ dài khác nhau thì phép quan hệ thực hiện ƣu tiên phần tử từ trái sang phải
và so sánh theo giá trị ASCII.
FLAG_BIT <=(A > B);
signal A_vec : bit_vector ( 7 downto 0 ) := ―11000110‖ ;
signal B_vec : bit_vector ( 5 downto 0 ) := ―111001‖ ;
81
...
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
if ( A_vec > B_vec ) then
State <= Normal;
else
State <= Code_Red;
end if;
c. Toán tử số học
Toán tử số học đƣợc sử dụng cho kiểu dữ liệu Integer, Real, Signed, Unsigned, các dạng dữ liệu vật lý, Std_logic, Std_logic_vector, Bit, Bit_vector. Cần chú ý rằng không phải tất cả toán tử số học đều có thể sử dụng cho kiểu dữ liệu mảng.
Các toán tử số học là: +, -, *, /, ABS (trị tuyệt đối), ** (hàm mũ), MOD (Hàm lấy
module), REM (Xác định phần dƣ) .
Toán tử
Kiểu toán hạng trái L
Kiểu toán hạng phải R
Kiểu kết quả
Bất kỳ kiểu dữ liệu số nào Bất kỳ kiểu dữ liệu số nào
Cùng kiểu L
Cùng kiểu L Cùng kiểu L Cùng kiểu L
L + R L - R L * R
Cùng kiểu L
Cùng kiểu L
L / R
Kiểu số nguyên hoặc dấu phải động Kiểu số nguyên, Số Thực, Vật lý Kiểu số nguyên hoặc dấu phải động Kiểu vật lý
Cùng kiểu L
Kiểu vật lý
Kiểu số nguyên, Số Thực, Vật lý Kiểu số nguyên hoặc dấu phải động Kiểu số nguyên hoặc số thực Cùng kiểu L
L mod R L rem R
Kiểu số nguyên Cùng kiểu L Cùng kiểu L
Kiểu số nguyên Kiểu số nguyên
d. Toán tử dịch:
Toán tử dịch là toán tử tác động lên toán hạng kiểu Bit_vector để tạo ra các phép dịch
hoặc quay dữ liệu. Cú pháp của toán tử dịch:
Trong đó:
Các toán tử dịch trong VHDL là: sll (dịch trái logic), srl (dịch phải logic), sla (dịch trái
số học), sra (dịch phải số học), rol (quay trái), ror (quay phải).
Toán_hạng_trái Toán_Tử_dịch Toán hạng phải;
Ví dụ: signal A_vec : bit_vector (7 downto 0) := ―11000110‖;
signal D_vec : bit_vector (7 downto 0);
Phép dịch Kết quả Ý nghĩa
D_vec <= A_vec sll 2; D_vec =‖00011000‖ Dịch trái 2 bit và ví trí bên phải được điền giá trị 0.
D_vec <= A_vec sra 2; D_vec =―11110001‖
82
Dịch phải số học 2 bit và vị trí bên trái được giữ như giá trị ban đầu.
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
D_vec <= A_vec ror 3; D_vec =―11011000‖ Quay phải 3 bit.
D_vec <= A_vec srl 2; D_vec =―00110001‖ Dịch phải 2 bit và ví trí bên trái được điền giá trị 0
D_vec <= A_vec sra -2; D_vec =―00011000‖ Dịch phải số học -2 bit (dịch trái số học 2 bit
e. Toán tử ghép nối
Toán tử ghép nối “&” cho phép ghép nối một cách linh hoạt các dữ liệu đơn và dữ liệu
dạng mảng thành các mảng lớn hơn. Toán tử ghép nối thƣờng chỉ dùng ở vế phải biểu thức.
Ví dụ: signal A_vector, B_vector: std_logic_vector (7 downto 0);
signal Z_vector: std_logic_vector (15 downto 0);
Z_vector <= A_vector & B_vector;
f. Toán tử tách
Toán tử tách cho phép ta lấy ra một số thành phần của mảng, chiều chỉ số của phép
tách phải cùng chiều đánh chỉ số đã định nghĩa cho mảng.
Ví dụ: signal Z_vec: std_logic_vector (15 downto 0);
signal A_vec,B_vec: std_logic_vector (7 downto 0);
A_vec <= Z_vec (12 downto 5);
B_vec <= Z_vec(15 downto 13)& Z_vec(11 downto 8)& Z_vec(1);
g. Toán tử thuộc tính
Toán tử thuộc tính cho phép xác định thuộc tính dữ liệu của đối tƣợng biến và tín hiệu.
Cú pháp chung:
Đối_tượng‘thuộc_tính
- Các thuộc tính cho kiểu dữ liệu mảng trong VHDL là:
+ d’left, d’right: trả lại chỉ số của phần tử bên trái nhất hoặc bên phải nhất của dữ liệu
mảng d.
+ d’high, d’low : trả lại chỉ số của phần tử cao nhất hoặc thấp nhất của kiểu dữ liệu
mảng d.
+ d’range, d’reverse_range : xác định khoảng của chỉ số của mảng d.
+ d’length : trả về số lƣợng các phần tử của mảng d.
- Các thuộc tính cho kiểu dữ liệu liệt kê
+ d’val(pos): Trả về giá trị tại vị trí đƣợc xác định pos.
+ d’pos(value): Trả về vị trí của giá trị xác định value.
+ d’leftof(value): Trả về giá trị bên trái của giá trị xác định value.
+ d’val(row, column): Trả về giá trị tại ví trí có hàng, cột xác định.
- Các thuộc tính cho tín hiệu
+ s’event, s’stable: trả về giá trị boolean, chỉ ra rằng trên đƣờng tín hiệu s có xuất hiện sự kiện thay đổi hay giá trị trên đƣờng tín hiệu ổn định tại thời điểm hiện tại. Các thuộc tính này dùng nhiều với lệnh wait và if.
+ s’active: Trả về giá trị “true” nếu s=„1‟.
83
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ s’quiet (time): Trả về giá trị “true” nếu không có sự kiện nào xảy ra đối với tín hiệu s
trong khoảng thời gian xác định time.
+ s’last_event: Trả về thời gian kể từ khi có sự kiện mới nhất xảy ra đối với s.
+ s’last_active: Trả về thời gian kể từ khi s=„1‟
+ s’last_value: Trả về giá trị của s trƣớc khi xảy ra sự kiện mới nhất.
Ví dụ sử dụng toán tử thuộc tính nhƣ sau:
signal clk : std_logic:=‘0‘;
...
PROCESS(clk)
TYPE bit4 IS ARRAY(0 TO 3) of BIT;
TYPE bit_strange IS ARRAY(10 TO 20) OF BIT;
VARIABLE len1, len2 : INTEGER;
BEGIN
If (clk’event and clk=‘1‘)then –- sự kiện có sườn dương của clk.
len1 := bit4‘LENGTH; -- returns 4
len2 := bit_strange‘LENGTH; -- returns 11
End if;
END PROCESS;
- Thuộc tính tự định nghĩa
Ngƣời sử dụng có thể tự định nghĩa hàm thuộc tính với cú pháp nhƣ sau (Viết trong gói
dữ liệu - Package của thƣ viện do ngƣời sử dụng tạo ra:
ATTRIBUTE Tên_thuộc_tính: Kiểu_thuộc_tính; -- Khai báo chung
ATTRIBUTE Tên_thuộc_tính OF Tên_đối_tượng: Loại_đối_tượng
Trong đó:
+ Kiểu_thuộc_tính: kiểu dữ liệu trả về của thuộc tính (BOOLEAN, INTEGER,
STD_LOGIC_VECTOR …)
+ Loại_đối_tƣợng: Kiểu đối tƣợng của thuộc tính (TYPE, SIGNAL, FUNCTION…).
Ví dụ
IS giá_trị;-- Xác định giá trị của thuộc tính
ATTRIBUTE number_of_inputs: INTEGER; -- Khai báo chung
ATTRIBUTE number_of_inputs OF nand3: SIGNAL IS 3; -- xác định giá
--trị của thuộc tính
...
inputs <= nand3'number_of_pins; -- Gọi thuộc tính, trả về giá trị 3
i. Biến đổi dữ liệu
VHDL không cho phép thực hiện các phép toán trực tiếp (số học, logic…) giữa các số liệu có kiểu dữ liệu khác nhau. Vì vậy cần có hàm biến đổi dữ liệu từ kiểu này sang kiểu khác theo 2 cách nhƣ sau:
- Viết một đoạn mã VHDL để thực hiện biến đổi dữ liệu
- Sử dụng hàm – FUNCTION trong các PACKAGE đã đƣợc định nghĩa: Nếu các dữ liệu có quan hệ chặt chẽ với nhau (ví dụ nhƣ 2 toán hạng có cùng cơ sở “base”, mặc dù đƣợc
84
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
khái báo theo 2 lớp kiểu khác nhau), thì gói std_logic_1164 của thƣ viện IEEE có cung cấp các hàm biến đổi dữ liệu trực tiếp giữa chúng giống nhƣ “ép kiểu” trong ngôn ngữ lập trình C/C++. Xét ví dụ dƣới đây:
TYPE long IS INTEGER RANGE -100 TO 100;
TYPE short IS INTEGER RANGE -10 TO 10;
-- Kiểu long và short cùng cơ sở là kiểu INTEGER
SIGNAL x : short;
SIGNAL y : long;
...
y<= 2*x + 5; -- lỗi, vì kết quả về trái và vế phải không cùng kiểu
Một số hàm biến dổi dữ liệu đƣợc cung cấp trong gói std_logic_arith nhƣ sau:
y<=long(2*x + 5); --OK, Dữ liệu vế phải được chuyển cùng kiểu vế trái.
+ conv_integer(p) : Biến đổi tham số p có kiểu dữ liệu INTEGER, UNSIGNED, SIGNED, STD_ULOGIC sang kiểu INTEGER. Chú ý là không thực hiện đƣợc với kiểu STD_LOGIC_VECTOR.
+ conv_unsigned(p, b): Biến đổi tham số p có kiểu dữ liệu INTEGER, UNSIGNED,
SIGNED, STD_ULOGIC sang kiểu UNSIGNED kích thƣớc b bit.
+ conv_signed(p, b): Biến đổi tham số p có kiểu dữ liệu INTEGER, UNSIGNED,
SIGNED, STD_ULOGIC sang kiểu SIGNED kích thƣớc b bit.
+ conv_std_logic_vector(p, b): Biến đổi tham số p có kiểu INTEGER, UNSIGNED,
SIGNED, or STD_LOGIC sang kiểu STD_LOGIC_VECTOR kích thƣớc b bit.
j. Định nghĩa các toán tử chồng
VDHL cho phép định nghĩa các toán tử chồng theo các toán tử đã đƣợc định nghĩa
giống nhƣ khái niệm “overloading” trong ngôn ngữ lập trình C++.
Ví dụ toán tử “+” cho dữ liệu kiểu BIT chƣa đƣợc định nghĩa trong các thƣ viện chuẩn, ngƣời sử dụng có thể viết thêm hàm (FUNCTION – sẽ đƣợc đề cập chi tiết ở phần sau) định nghĩa cho toán tử “+” cho kiểu dữ liệu đó nhƣ sau:
FUNCTION "+" (a: INTEGER, b: BIT) RETURN INTEGER IS
BEGIN
IF (b='1') THEN RETURN a+1;
ELSE RETURN a;
END IF;
END "+";
Sử dụng toán tử ―+‖ ở trên như sau:
SIGNAL inp1, outp: INTEGER RANGE 0 TO 15;
SIGNAL inp2: BIT;
(...)
outp <= 3 + inp1 + inp2;
(...)
85
------------------------------
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Trong biểu thức “outp<=3+inp1+inp2;‟‟, phép “+” đầu tiên đã đƣợc định nghĩa trong thƣ viện chuẩn giữa 2 số INTEGER, còn phép cộng thứ 2 là toán tử “+” đã đƣợc định nghĩa theo kiểu “overloading” ở trên.
k. Tổng kết
Bảng tống kết các phép toán trong VHDL nhƣ sau:
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;
Phép toán Toán tử Kiểu dữ liệu
Phép gán <=, :=, => Bất kỳ kiểu dữ liệu nào
NOT, AND, NAND, BIT, BIT_VECTOR, Phép toán logic OR, NOR, XOR, XNOR STD_LOGIC, STD_LOGIC_VECTOR,
STD_ULOGIC, STD_ULOGIC_VECTOR
+, - ,*,/,** INTEGER, SIGNED, UNSIGNED Phép toán số học
(mod, rem, abs)- chỉ dùng cho mô phỏng
Phép quan hệ =, /=, <, >, <=, >= Tất cả các kiểu dữ liệu ở trên
Phép dịch BIT_VECTOR sll, srl, sla, sra, rol, ror
Phép gộp &, ( , , , ) BIT, BIT_VECTOR,
STD_LOGIC, STD_LOGIC_VECTOR,
STD_ULOGIC, STD_ULOGIC_VECTOR
conv_integer(p) Hàm biến đổi dữ liệu conv_unsigned(p, b)
conv_signed(p, b)
conv_std_logic_vector(p, b)
m. Câu hỏi ôn tập
-- Cho các tín hiệu có khai báo như sau:
SIGNAL a : BIT := '1';
SIGNAL b : BIT_VECTOR (3 DOWNTO 0) := "1100";
SIGNAL c : BIT_VECTOR (3 DOWNTO 0) := "0010";
SIGNAL d : BIT_VECTOR (7 DOWNTO 0);
SIGNAL e : INTEGER RANGE 0 TO 255;
1. Xác định kết quả của các phép toán sau
x1 <= a & c;
-> x1 <= ________
x2 <= c & b;
-> x2 <= ________
x3 <= b XOR c;
-> x3 <= ________
x4 <= a NOR b(3);
-> x4 <= ________
x5 <= b sll 2;
-> x5 <= ________
86
SIGNAL f : INTEGER RANGE -128 TO 127;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
x6 <= b sla 2;
-> x6 <= ________
x7 <= b rol 2;
-> x7 <= ________
x8 <= a AND NOT b(0) AND NOT c(1);
-> x8 <= ________
d <= (5=>'0', OTHERS=>'1');
-> d<= ________
2. Xác định kết quả của các thuộc tính sau
-> ______
c'LOW
-> ______
d'HIGH
-> ______
c'LEFT
-> ______
d'RIGHT
-> ______
c'RANGE
-> ______
d'LENGTH
-> ______
c'REVERSE_RANGE
3. Xác định xem các phép toán dƣới đây phép nào đúng, phép nào sai, giải thích?
b(0) AND a
a + d(7)
NOT b XNOR c
c + d
e - f
IF (b IF (b>=a) ... IF (f/=e) ... IF (e>d) ... b sra 1 c srl -2 f ror 3 e*3 5**5 f/4 e/3 d <= c d(6 DOWNTO 3) := b e <= d f := 100 Các đơn vị thiết kế chính là thành phần cấu trúc chính (giống nhƣ khung chƣơng trình)
để viết mã lệnh mô tả VHDL cho mạch hay hệ thống số. Mỗi đơn vị thiết kế sẽ có các nhiệm
vụ riêng biệt khác nhau. 87 VDHL sử dụng 6 đơn vị thiết kế gồm 2 loại: đơn vị cơ bản và đơn vị thiết kế thứ cấp: thủ tục, hàm... nhƣ khai báo các cổng vào/ra, các tham số của khối mạch... hoạt động của khối mạch số. thủ tục ... Quan hệ và các đơn vị thiết kế có quan hệ nhƣ hình sau: Main Code Nội dung LIBRARY Khai báo LIBRARY PACKAGE FUNCTIONS ENTITY PROCEDURES COMPONENTS TYPES CONSTANTS ARCHITECTURE Đây là phần khai báo Tên của thực thể cũng nhƣ tham số, đặc tính và giao diện cổng
vào/ra cho phần tử, khối con hay cả hệ thống số. Ta có thể có tất cả các thông tin để kết nối
phần tử mạch này vào phần tử mạch khác trong hệ thống hoặc thiết kế tác nhân đầu vào phục
vụ cho mục đích mô tả hoạt động của phần tử và hệ thống số sau này. Hoạt động thật sự của
mạch không nằm ở phần khai báo này mà đƣợc viết trong phần ARCHITECTURE tƣơng
ứng. Trong nhiều phần mềm thiết kế cho phép việc khai báo ENTITY này hoàn toàn tự
động. Ngƣời sử dụng chỉ cần sử dụng một bảng số liệu vào nhập vào tên các cổng vào ra,
tham số cho phần tử hay hệ thống và gán kiểu dữ liệu tƣơng ứng cho chúng. Phần mềm sẽ tự
động tạo ra mã mô tả cho phần ENTITY. Cú pháp khai báo chung của một Entity nhƣ sau: 88 entity Tên_thực_thể is generic(--Khai báo danh sách các tham số chung Tên_tham_số : [Kiểu_dữ_liệu] [:=giá_trị_khởi_tạo]; ... ); port(-- Khai báo danh sách đối tượng các port vào ra Tên_cổng : [mode] [Kiểu_dữ_liệu] [:=giá_trị_khởi_tạo]; ... ); Trong khai báo trên: + Tham số khai báo trong phần generic dùng để kiểm soát, thay đổi cấu trúc, hoạt động
của thực thể, chúng sẽ đƣợc truyền giá trị hoặc lấy giá trị mặc định ban đầu khi thực thể đƣợc
khởi tạo. Tham số này rất hữu ích khi thiết kế theo kiểu cấu trúc, sẽ sử dụng nhiều thành phần
cấu trúc cùng kiểu nhƣ khai báo của ENTITY nhƣng có tham số về cấu trúc, hoạt động khác
nhau. + “--“ Dấu đánh dấu dòng chú thích (comment) trong mã mô tả VHDL end Tên_thực_thể; Ví dụ khai báo thực thể cho mạch số “Circuit” nhƣ hình vẽ bên: PLD entity Circuit is Circuit X generic( delay: Time:=1ns); A port(A, B : in std_logic ; Y X : out std_logic; B Z Y : inout std_logic; Z : buffer std_logic) ; end Circuit; Đơn vị thiết kế này cho phép mô tả hoạt động bên trong của thực thể (mạch số). Cú pháp chung của một Architecture: Architecture Tên_kiến_trúc of Tên_thực_thể is -- Thực hiện các khai báo cho kiến trúc ... Begin -- Viết các mô tả hoạt động bên trong cho thực thể ... 89 End Tên_kiến_trúc; VHDL cho phép tạo ra nhiều mô tả Architecture cho một thực thể, cho phép thực hiện
nhiều cách mô tả hoạt động khác nhau cho một thực thể. Mỗi cách mô tả hoạt động sẽ tối ƣu
về mặt thời gian thiết kế hay độ tin cậy hay tối ƣu về tài nguyên sử dụng khi tổng hợp… Thông thƣờng có thể sử dụng 3 cách chính mô tả kiến trúc của một phần tử hay hệ
thống số đó là: mô tả theo mô hình hành vi (Behaviour), mô tả theo mô hình cấu trúc logic
(Structure), và mô hình luồng dữ liệu (RTL). Tuy nhiên để mô tả cho một hệ thống, trong một
kiến trúc có thể kết hợp sử dụng 2 hoặc cả 3 mô hình mô tả trên để thực hiện cho từng thành
phần con tƣơng ứng của hệ thống số. Trong phần sau của tài liệu này sẽ trình bày chi tiết hơn
các phƣơng pháp mô tả này. entity Half_Add is -- Ví dụ các cách mô tả hoạt động khác nhau của
thực thể Half_Add . . . end Half_Add; architecture BEH of Half_Add is -- Kiến trúc mô tả
theo mô hình hoạt động . . . end BEH ; architecture RTL of Half_Add is
. . . -- Kiến trúc mô tả
theo mô hình luồng dữ
liệu end RTL ; architecture XLX of Half_Add is Theo VHDL tiêu chuẩn thì một ENTITY có thể có nhiều ARCHITECTURE mô tả hoạt
động cho nó theo cách cách khác nhau, tuy nhiên đa số các phần mềm thiết kế hiện này trong
một file mã mô tả VHDL thì chỉ cho phép viết một ARCHITECTURE, nếu muốn viết nhiều
các mô tả hoạt động khác nhau thì có thể viết ở nhiều file khác nhau và với tên khác của
ENTITY nhƣng có giao diện hoàn toàn giống nhau. Ví dụ mô tả hoạt động cho mạch “Circuit” nhƣ sau: 90 . . . -- Kiến trúc mô tả
theo mô hình cấu trúc
logic end XLX ; -- Khai báo giao diện PLD entity Circuit is Circuit X A generic( delay: Time:=1ns); Y port(A, B : in std_logic ; B X : out std_logic; Z Y : inout std_logic; Z : buffer std_logic) ; end Circuit; -- Mô tả hoạt động architecture Behavioral of Circuit is constant GND: std_logic:='0'; signal c: std_logic; begin c<= A and B after delay; Y<=Y or Z; -- Y là inout nên có thể --
vừa ghi vừa đọc được X<= c xnor Y; end Behavioral; Package Body là đơn vị thiết kế phụ thuộc đƣợc dùng để chứa những mô tả chỉ tiết cho
các khai báo trong đơn vị thiết kế Package nào đó, mô tả chi tiết nội dung của các hàm, các
thủ tục ... Package Body thƣờng đƣợc viết ngay sau Package. Cú pháp chung các đơn vị
thiết kế Package và Package Body : package My_Pack is -- Cách sử dụng package trong
file mô tả VHDL. library IEEE; -- Thư viện
chuẩn -- Viết khai báo Kiểu dữ liệu, Hằng,
Hàm, thủ tục, component, tín hiệu,
file, Alias… use IEEE.std_logic_1164.all; end package My_pack; use work.My_pack.all . . . package body My_Pack is -- Viết nội dung của Hàm, Thủ tục đã
khai báo ở trên . . .
end My_Pack ; -- Trong phần mềm thiết kế
ISE gói dữ liệu do người sử
dụng tạo ra thường được tổ
chức mặc định trong thư viện
work; 91 entity . . . Trong VHDL có các thƣ viện thiết kế chuẩn, ngoài ra ngƣời thiết kế có thể tạo các thƣ
viện thiết kế riêng. Trong một thiết kế VHDL nhiều đoạn chƣơng trình có thể đƣợc gọi từ các
thƣ viện khác nhau. Phân tích VHDL là một quá trình kiểm tra các đơn vị thiết kế VHDL để cho đúng cú
pháp và ngữ nghĩa, các đơn vị thiết kế VHDL đƣợc lƣu vào thƣ viện để sử dụng sau này. Thƣ
viện thiết kế chứa các những phần tử thƣ viện sau: Các đơn vị thƣ viện là các cấu trúc VHDL có thể đƣợc phân tích riêng rẽ theo trình tự nhất định. Ví dụ cách gọi và sử dụng thƣ viện nhƣ sau: library My_Lib ; -- Gọi thư viện use My_lib.Tên_package.Các_thành_phần_của_Package; Trong VHDL có thƣ viện thiết kế đặc biệt có tên là “WORK”. Khi ngƣời thiết kế biên
dịch một chƣơng trình viết trên VHDL nhƣng không chỉ rõ thƣ viện đích, chƣơng trình này sẽ
đƣợc biên dịch và chứa vào thƣ viện mặc định “WORK”. Các khai báo thƣ viện chuẩn cần thiết cho file mô tả VHDL Bắt đầu của mỗi file mô tả VHDL nào cũng cần khai báo các thƣ viện chuẩn cần thiết: - Có ít nhất 3 package của 3 thƣ viện khác nhau luôn cần đƣợc khai báo cho mỗi file mô tả VHDL là: + ieee.std_logic_1164 (của thƣ viện ieee) + standard (của thƣ viện std) + work (thƣ viện work) -- Ví dụ
use My_Lib.Fast_Counters.all; -- Gọi Package Fast_Counters trong thư viện library ieee; -- Gọi thư viện ieee use ieee.std_logic_1164.all; -- Gọi tất cả các thành phần trong gói -- std_logic_1164 library std; use std.standard.all; library work; use work.all; - Gói standard của thƣ viện std chứa các định nghĩa cho kiểu dữ liệu BIT, BOOLEAN, INTEGER, REAL. 92 -- Chú ý: Riêng thư viện std và work thường xuất hiện mặc định trong chương
trình mô tả, do đó thường không cần khai báo. Trong thƣ viện ieee bao gồm một số package nhƣ sau: các phép toán số học, phép so sánh của chúng, và các hàm chuyển đổi dữ liệu. dữ liệu STD_LOGIC_VECTOR. với kiểu dữ liệu STD_LOGIC_VECTOR. Một thực thể có thể có một vài kiến trúc mô tả hoạt động cho nó. Trong quá trình thiết
kế có thể phải thử nghiệm một vài biến thể của thiết kế bằng cách sử dụng các kiến trúc khác
nhau. Cấu hình là thành phần cơ bản của đơn vị thiết kế. Cấu hình cho phép gắn các phiên bản
của thực thể vào những kiến trúc khác nhau. Cấu hình cũng có thể đƣợc sử dụng để thay thế
một cách nhanh chóng các phần tử của thực thể trong các biểu diễn cấu trúc của thiết kế. Cú pháp để gắn cấu hình nhƣ sau: [Configuration tên_cấu_hình of tên_thực_thể is] – Phần khai báo của cấu -- hình viết trong package và library. for Đặc_tả_của_khối {mệnh_đề_use} -- use entity {các_phần_tử_của_cấu_hình} Các kiểu đặc tả của khối chủ yếu nhƣ sau: end for; -- Đặc tả theo tên cấu hình for Tên_khối_1, Tên_khối_2... : Tên_component use configuration Tên_cấu_Hình [generic map (danh_sách_gán_generic] [port map (danh_sách_gán_chân;] end for; -- Đặc tả theo tên thực thể for Tên_khối_1, Tên_khối_2... : Tên_component use entity Tên_Entity[(Tên_kiến_trúc)] [generic map (danh_sách_gán_generic] [port map (danh_sách_gán_chân;] end for; -- Gắn cấu hình cho tất cả các component for all : Tên_component use configuration Tên_cấu_hình 93 [generic map (danh_sách_gán_generic] [port map (danh_sách_gán_chân;] end for; -- Gán cấu hình cho tất cả các Entity for all : Tên_Component use entity Tên_Entity [(Tên_kiến_trúc)] [generic map (danh_sách_gán_generic] [port map (danh_sách_gán_chân;] end for; mạch sử dụng cấu hình thay đổi cho phần tử XOR. 1. Giả sử ta có các mô tả các cấu hình khác nhau của mạch XOR và INV nhƣ sau: -- Cổng XOR entity XOR_GATE is port(X, Y:in BIT; Z:out BIT); end XOR_GATE; architecture ARCH_XOR_1 of XOR_GATE is begin --Cách mô tả 1 end ARCH_XOR_1; architecture ARCH_XOR_2 of XOR_GATE is begin --Cách mô tả 2 end ARCH_XOR_2; architecture ARCH_XOR_3 of XOR_GATE is begin --Cách mô tả 3 end ARCH_XOR_3; -- Cổng INV entity INV_GATE is port(X:in BIT; Z:out BIT); end INV_GATE; 94 architecture ARCH_INV_1 of INV_GATE is begin -- Cách mô tả 1 end ARCH_INV_1; architecture ARCH_INV_2 of INV_GATE is begin --Cách mô tả 2 2. Mô tả cấu trúc mạch sử dụng cấu hình thay đổi cho phần tử XOR. end ARCH_INV_2; entity PARITY is port(V:in BIT_VECTOR(3 downto 0); EVEN:out BIT); end PARITY; architecture Cfg of PARITY is component XOR_GATE port(X,Y: in BIT; Z: out BIT); end component; component INV_GATE port(X: in BIT; Z: out BIT); end component; -- Gán cấu hình cho mỗi phần tử: for XOR_1,XOR_2:XOR_GATE use entity XOR_GATE(ARCH_XOR_1); end for; for XOR_3:XOR_GATE use entity XOR_GATE(ARCH_XOR_2); end for; for INV_1:INV_GAGE use entity INV_GATE(ARCH_INV_2); end for; -- Khai báo tín hiệu nội bộ signal T1, T2, T3: BIT; begin -- Gọi các cổng và nối chân tín hiệu của chúng XOR_1: XOR_GATE port map (V(0), V(1), T1); XOR_2: XOR_GATE port map (V(2), V(3), T2); XOR_3: XOR_GATE port map (T1, T2, T3); INV_1: INV_GATE port map (T3, EVEN); end Cfg; Mô hình cấu trúc mô tả phần cứng số và phạm vi sử dụng của các đối tƣợng trong VHDL có thể đƣợc tổng kết đơn giản nhƣ Hình 3.5 trong dƣới đây: 95 Phần cứng công nghệ logic số (CPLD/FPGA) entity
entity architecture
architecture process
process Variables
Variables Signals
Signals Input Ports
Input Ports Output Ports
Ports Sau đây là cấu trúc chung đơn giản của một chƣơng trình mô tả VHDL: -- Ví dụ cấu trúc 1 file mô tả cho một hệ thống phần cứng số dùng VHDL -- Khai báo thư viện,(mặc định cần khai báo thư viện IEEE (thư viện -- chuẩn đã được xây dựng). library IEEE;... -- Khai báo gói dữ liệu (package) trong thư viện cần sử dụng: use IEEE.STD_LOGIC_1164.ALL;... -- Khai báo thực thể Entity Tên_thực_thể is -- Khai báo các tham số generic nếu cần: Generic( -- khai báo danh sách các tham số); Port(-- Khai báo danh sách các cổng vào/ra ); End Tên_thực_thể; -- Mô tả hoat động Architecture Tên_kiến_trúc of Tên_thực_thể is {Khai báo:kiểu dữ liệu, các component,các đối tượng constant, signal} Begin { Viết các mô tả dùng cấu trúc lệnh song song } ... Process(-- danh sách tín hiệu kích thích nếu cần) {Khai báo:kiểu dữ liệu, các đối tượng biến constant, variable } Begin { Viết các mô tả dùng cấu trúc lệnh tuần tự } End process; ... {Viết các mô tả dùng cấu trúc lệnh song song hay process khác } ... Ví dụ: End Tên_kiến_trúc; 96 -- Khai báo thư viện chuẩn library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -------------------------------- -- Khai báo giao diện entity Circuit is generic( delay: Time:=1ns); port(A, B : in std_logic ; X : out std_logic; Y : inout std_logic; Z : buffer std_logic) ; end Circuit; -- Mô tả hoạt động architecture Behavioral of Circuit is constant GND: std_logic:='0'; signal c: std_logic; begin c<= A and B after delay; Y<=(Y or Z) or GND; -- Y là inout nên có thể vừa ghi vừa đọc được X<= c xnor Y; end Behavioral; Một trong các nhiệm vụ rất quan trọng là kiểm tra bản mô tả thiết kế. Kiểm tra một mô
hình VHDL đƣợc thực hiện bằng cách quan sát hoạt động của nó trong khi mô phỏng và các
giá trị thu đƣợc có thể đem so sánh với yêu cầu thiết kế. Môi trƣờng kiểm tra có thể hiểu nhƣ một mạch kiểm tra ảo. Môi trƣờng kiểm tra sinh ra
các tác động lên bản thiết kế và cho phép quan sát hoặc so sánh kết quả hoạt động của bản mô
tả thiết kế. Thông thƣờng thì các bản mô tả đều cung cấp chƣơng trình thử. Nhƣng ta cũng có
thể tự xây dựng chƣơng trình thử (testbench). Mạch thử thực chất là sự kết hợp của tổng hợp
nhiều thành phần. Nó gồm ba thành phần. Mô hình VHDL cần kiểm tra, nguồn dữ liệu và bộ
quan sát. Hoạt động của mô hình VHDL đƣợc kích thích bởi các nguồn dữ liệu và kiểm tra
tính đúng đắn thông qua bộ quan sát. Hình 3.6 là sơ đồ tổng quát của một chƣơng trình thử
(Testbench). Testbench đƣợc mô tả nhƣ một Entity không có đầu vào đầu ra, chỉ có tín hiệu bên
trong đƣợc ghép tới khối DUT cần đƣợc kiểm tra theo kiểu cấu trúc. Ngƣời thiết kế sẽ mô tả
các tín hiệu bên trong này tạo ra tín hiệu kích thích cho các đầu vào của DUT và đọc kết quả
ra để quan sát... Để mô tả các tín hiệu vào kích thích thƣờng dùng cách mô tả theo hành vi –
behavioral. 97 Testbench Entity DUT Quan sát
tín hiệu ra Tạo
nguồn tín
hiệu vào
kích thích Trong đó: DUT: (device under test) mô hình VHDL cần kiểm tra Trong các phần mềm thiết kế sau khi hoàn thành các mô tả cho Test_bench, ngƣời thiết
kế sẽ chạy công cụ mô phỏng, các tín hiệu đầu ra của DUT sẽ đƣợc mặc tính đọc ra và cho
phép ngƣời thiết kế quan sát dễ dàng dƣới dạng giản đồ thời gian, hay các thông báo trên màn
hình và các file số liệu nhờ sử dụng các lệnh VHDL Text I/O… Ngƣời thiết kế có thể dễ dàng viết các mô tả kích thích để tạo ra các yêu cầu kiểm tra
tùy ý cho bản thiết kế của mình. Nhiều chức năng mô phỏng, kiểm tra đƣợc hỗ trợ rất mạnh
bởi các phần mềm thiết kế. Ví dụ mô tả cho mạch “Logic_AND” nhƣ sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; -- Khai báo giao diện entity Logic_AND is port(A, B : in std_logic ; Y : out std_logic); end Logic_AND; -- Mô tả hoạt động architecture Beh of Logic_AND is begin Y<= A and B; Viết Testbench cho thực thể “Logic_AND" đã mô tả ở trên: Test_bench A DUT A Quan sát Y Y Mô tả tạo
kích thích Logic_AND B B end Beh; 98 Thực thể Test_bench không có các cổng vào ra mà chỉ khai báo các tín hiệu nội bộ A,
B, Y để nối tới khối DUT cần kiểm tra (Logic_AND). Trong phần kiến trúc mô tả hoạt động
của Test_bench, coi khối Logic_AND nhƣ một component để tạo thành khối Test_bench.
Toàn bộ mã mô tả cho Test_bench nhƣ sau: LIBRARY ieee; USE ieee.std_logic_1164.ALL; -- Khai báo thực thể Test_bench; ENTITY Test_bench IS END Test_bench; -- Phân mô tả kiến trúc của Test_bench ARCHITECTURE behavior OF Test_bench IS -- Khai báo Đối tượng cần kiểm tra và các Khối thành phần ghép nối COMPONENT Logic_AND PORT( A : IN std_logic; B : IN std_logic; Y : OUT std_logic ); END COMPONENT; -- Khai báo các tín hiệu kích kích SIGNAL A : std_logic:='0'; SIGNAL B : std_logic:='0'; SIGNAL Y : std_logic; BEGIN -- Nối chân cổng vào ra của DUT với các tín hiệu của Test_bench uut: Logic_AND PORT MAP( a => a, b => b, y => y ); -- Viết mô tả tạo kích thích tb : PROCESS BEGIN a<='0'; b<='0';Wait for 10ns; a<='0'; b<='1';Wait for 10ns; a<='1'; b<='0';Wait for 10ns; a<='1'; b<='1';Wait for 10ns; END PROCESS; -- *** End Test Bench - User Defined Section *** Kết quả mô phỏng trả về dƣới dạng giản đồ thời gian nhƣ sau: 99 END behavior; Nhƣ đã trình bày trong phần cấu trúc chung của chƣơng trình mô tả VHDL, trong mô tả
một kiến trúc (Architecture) có chứa nhiều cấu trúc lệnh song song. Mỗi cấu trúc lệnh song
song sẽ tƣơng ứng với một thành phần phần cứng nào đó khi thực hiện tổng hợp mạch, mỗi
cấu trúc song song có thể viết ở bất kỳ vị trí nào trong đoạn mô tả Architecture mà chức năng
hoạt động của thực thể không thay đổi. Các cấu trúc lệnh song song có trong VHDL gồm: + Cấu trúc process. + Lệnh gán tín hiệu song song. + Lệnh gán có điều kiện. + Lệnh gán tín hiệu có lựa chọn. + Khối. + Phép gọi thủ tục, hàm song song. + Lệnh lặp Generate + Lệnh gán chân [Nhãn_lệnh:] Process [(Danh sách tín hiệu kích thích)] [ Khai báo:kiểu dữ liệu, các đối tượng biến constant, variable ] Begin { Viết các mô tả dùng cấu trúc lệnh tuần tự } Trong đó các phần đặt trong dấu [ ] có thể có hoặc không. - Nhãn_lệnh: Tuỳ thuộc ngƣời thiết kế đặt tên. - Danh sách tín hiệu kích thích: Danh sách các tín hiệu kích thích Process hoạt động. 100 End process; Nếu Process chứa (danh sách tín hiệu kích thích) thì lúc đó Process sẽ đƣợc thực hiện
khi có bất kỳ sự thay đổi nào của bất kỳ tín hiệu nào trong danh sách tín hiệu kích thích. Điều
này tƣơng đƣơng với Process không chứa danh sách tín hiệu kích thích nhƣng lại chứa lệnh 1
trong các cấu trúc lệnh wait ở vị trí câu lệnh cuối cùng trong Process nhƣ sau: + Wait until + Wait for + Wait on clk, Reset; Ví dụ: Wait on Reset until clk=‟1‟; + Wait until Khi tổng hợp mạch thì mỗi Process sẽ tƣơng ứng với một khối mạch chức năng nào đó.
Còn khi thực hiện mô phỏng, việc thực hiện một Process bao gồm việc thực hiện lặp lại các
cấu trúc lệnh tuần tự chứa bên trong thân của Process. Giống nhƣ một vòng lặp vô hạn và mỗi
bƣớc lặp đƣợc thực hiện mỗi khi có sự thay đổi của bất kỳ tín hiệu nào trong danh sách tín
hiệu kích thích. Ví dụ Process mô tả mạch logic AND nhƣ sau: entity Logic_AND is Port ( A,B : in std_logic; C : out std_logic); end Logic_AND; architecture Behavioral of Logic_AND is begin Process(A,B) begin C<= A and B; end Process; Khi dùng Process để mô tả khối mạch tổ hợp thì tất cả các tín hiệu vào của mạch phải có trong “danh sách tín hiệu kích thích”. Còn khi sử dụng Process để mô tả khối mạch có phần tử tuần tự (phần tử nhớ) thì nếu
muốn thiết kế mạch hoạt động theo tín hiệu clock nào và không đồng bộ với tín hiệu vào nào
(ví dụ hoạt động theo Clk, không đồng bộ với tín hiệu Reset) thì những tín hiệu vào đó phải
đƣợc đƣa vào “danh sách tín hiệu kích thích”: process(Clk, Reset) Một Process liên kết với phần còn lại của thiết kế thông qua các thao tác đọc các giá trị
từ các tín hiệu vào hay các cổng vào và ghi giá trị vào các tín hiệu ra hay cổng ra đƣợc khai
báo ngoài Process. Chú ý khi thiết kế là một tín hiệu có thể đƣợc đƣa vào (đƣợc đọc giá trị
trong Process) nhiều Process nhƣng chỉ nên đƣợc ghi ra bởi một Process. Sự hoạt động đồng thời của mỗi Process và mô hình kết nối của chúng đƣợc mô tả nhƣ Hình 3.8, trong đó tín hiệu sẽ truyền giá trị giữa những Process hoạt động đồng thời: 101 end Behavioral; Phép gán tín hiệu song song sử dụng bên trong các Architecture nhƣng bên ngoài Trong đó Ví dụ mô tả mạch AND và OR có cùng 4 đầu vào nhƣ sau: ... architecture Behavioral of logic1 is signal I1, I2, I3, I4, AND_out, OR_out: std_logic; begin ... AND_out<= I1 and I2 and I3 and I4; -- Mạch AND 4 đầu vào OR_out<= I1 or I2 or I3 or I4; -- Mạch OR 4 đầu vào ... Đoạn chƣơng trình trên tƣơng đƣơng với đoạn chƣơng trình VHDL với các Process chứa các phép gán tín hiệu tuần tự (lệnh tuần tự xem phần tiếp theo): end Behavioral; ... architecture Behavioral of logic1 is 102 signal I1, I2, I3, I4, AND_out, OR_out: std_logic; begin ... process(I1, I2, I3, I4) begin AND_out<= I1 and I2 and I3 and I4; end process; process(I1, I2, I3, I4) begin OR_out<= I1 or I2 or I3 or I4; end process; ... end Behavioral; Phép gán tín hiệu có điều kiện là cấu trúc lệch song song thực hiện phép gán giá trị của các biểu thức cho một tín hiệu đích tùy theo các điều kiện đặt ra. Cú pháp chung: <điều_kiện> else <điều_kiện> else ... Ví dụ: Mô tả cấu trúc chọn kênh 4 đầu vào, 1 đầu ra Z và tín hiệu chọn kênh SEL 2 bit nhƣ sau: architecture ...
begin
Z <= A when Sel=―00‖ else
B when Sel=―10‖ else
C when Sel=―11‖ else
‗X‘ ;
end architecture; A B Z ‗X‘ architecture ...
begin
process(A,B,C, SEL )
begin
case (SEL) is
when ―00‖ =>Z <= A;
when ―10‖ =>Z <= B;
when ―11‖ =>Z <= C;
when others=>Z<= ‗X‘;
end case;
end process;
end architecture ; C 103 SEL Phép gán tín hiệu theo lựa chọn thực hiện gán cho một tín hiệu đích với biểu thức with.
Cấu trúc này có thể coi nhƣ là cấu trúc song song của lệnh tuần tự case, nó có thể thay thế
tƣơng đƣơng với Process chứa lệnh tuần tự case. Phép gán tín hiệu này cũng thƣờng đƣợc
dùng để mô tả các cấu trúc mạch chọn kênh. Cú pháp chung của lệnh with nhƣ sau: With when ... Ví dụ mô tả cấu trúc chọn kênh 4 đầu vào, 1 đầu ra Z và tín hiệu chọn kênh 2 bit Sel nhƣ ở trên dùng lệnh with/select nhƣ sau: when others; architecture...
with SEL select
Z<= A when ―00‖,
B when ―10‖,
C when ―11‖ ,
‗X‘ when others ;
end architecture; architecture ...
begin
process (A,B,C, SEL)
begin
case SEL is
when ―00‖ => Z <= A ;
when ―10‖ => Z <= B ;
when ―11‖ => Z <= C ;
when others => Z <= X‘;
end case;
end process;
end architecture; Block bao gồm tập hợp các cấu trúc lệnh song song. Một kiến trúc có thể phân tách
thành một số cấu trúc logic. Mỗi khối biểu diễn một thành phần của mô hình và thƣờng đƣợc
sử dụng để tổ chức một tập hợp các cấu trúc song song phân cấp. Cú pháp chung: { begin { khai báo sau: - Khai báo hằng, kiểu dữ liệu, tín hiệu. - Thân thủ tục. - Khai báo component. - Luật use – sử dụng trong Configuration. 104 end block; Phép gọi thủ tục, hàm song song tƣơng đƣơng với các process bao gồm các phép gọi thủ
tục tuần tự tƣơng ứng. Mỗi phép gọi thủ tục, hàm tƣơng đƣơng với một process không chứa
dãy danh sách các tín hiệu kích thích, phần khai báo rỗng và phần thân chứa một phép gọi thủ
tục, hàm, tiếp theo là một câu lệnh wait. Chi tiết hơn về thủ tục, và hàm sẽ đƣợc trình bày
trong các phần tiếp theo. Lệnh lặp song Generate có 2 cấu trúc cơ bản: + Lệnh For/Generate: [Tên_nhãn:] For Biến_lặp in Khoảng_lặp Generate [-- Viết_khai_báo_nếu_cần Begin] -- Viết các lệnh song song Ví dụ: End generate; -- Lặp phép gán tín hiệu SIGNAL x,Z: BIT_VECTOR (7 DOWNTO 0); SIGNAL y: BIT_VECTOR (15 DOWNTO 0); ... G1: FOR i IN x'RANGE GENERATE z(i) <= x(i) AND y(i+8); END GENERATE; -- Lặp phép nối chân cho các khối con trong sơ đồ cấu trúc mạch số Component DFF PORT(Clk, Data: IN STD_LOGIC; Q: OUT STD_LOGIC); END Component; ... For i in (0 to 7) generate U1:component DFF port map( CLK => clock, DATA => din (i), Q => dout(i)); + Lệnh If/Generate: end generate; [Tên_nhãn:] if Biểu_thức_boolean generate + Lệnh For/Generate/If: [-- Khai báo nếu cần thiết
begin]
-- Viết các lệnh song song
end generate [Tên_nhãn]; [Tên_nhãn:] For Biến_lặp in Khoảng_lặp Generate [-- Viết_khai_báo_nếu_cần Begin] -- Viết các lệnh song song 105 [Tên_nhãn:] if Biểu_thức_boolean generate [-- Khai báo nếu cần thiết
begin]
-- Viết các lệnh song song
end generate [Tên_nhãn]; Ví dụ: End generate; L : For i in 0 to 7 generate begin R0 : if ( i = 0 ) generate begin U1:component DFF port map (CLK=>clock, DATA=>din, Q=>dout(i)); end generate;
RI : if ( i /= 0 ) generate begin U2:component DFF port map (CLK=>clock,DATA=>dout(i-1),Q=>dout(i)); end generate; end generate; Khi muốn mô tả một mạch số có cấu trúc của gồm nhiều khối con (component) có thể
sử dụng lệnh gán chân để gọi các khối con đó và đặt vào hệ thống, cũng nhƣ kết nối các cổng
vào/ra và tham số chung của khối con đó với các tín hiệu và tham số của hệ thống. Trƣớc khi đƣợc sử dụng các khối con cần đƣợc mô tả trƣớc trong các Entity riêng biệt,
và đƣợc khai báo component trong phần khai báo Architecture của hệ thống. Sau đó có thể
sử dụng lệnh gán chân port map trong phần mô tả của Architecture để gọi component đó và
gán tín hiệu cũng nhƣ tham số cho chúng. Cú pháp lệnh khai báo component và gán chân port map nhƣ sau: Architecture Tên_Kiến_trúc of Tên_thực_thể_chính is -- Khai báo component Component Port( -- Tương tự như đã khai báo trong Entity tương ứng. End component; ... Begin ... -- Gọi và gán chân cho component port map ([ {[ ... Cấu trúc port map cho phép ánh xạ các cổng của phần tử vào các tín hiệu. Ánh xạ này
có thể hiểu nhƣ việc kết nối cổng tƣơng ứng của phần tử vào đƣờng tín hiệu. Cấu trúc port 106 End Tên_kiến_trúc; + Khi sử dụng ánh xạ theo vị trí, chúng ta đƣa ra danh sách các tín hiệu tuân theo đúng trật tự mà cổng đƣợc khai báo. + Đối với trƣờng hợp ánh xạ theo tên, chúng ta sử dụng cấu trúc ánh xạ tƣờng minh đặt tƣơng ứng với mỗi cổng với các tín hiệu thực: Ví dụ: mô tả mô hình cấu trúc một thanh ghi 4 bít đƣợc xây dựng từ 4 Fip-Flops DFF.
Có thể mô tả Triger DFF sau đó sau đó mô tả sơ đồ móc nối các phần tử triger DFF tạo thành
thanh ghi. + Mô tả Fip-Flops DFF nhƣ sau: entity DFF is
port ( D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic) ;
end entity DFF ; architecture RTL of DFF is
begin
process (Clock, Reset)
begin
If (Reset = ‗1‘ ) then Q <= ‗0‘ ;
elsif (Clock‘event and Clock = ‗1‘) then
Q <= D ; Nhƣ vây Flip-Flops DFF đƣợc mô tả ở trên là dạng Flip-Flop có Reset hoạt động ở mức tích cực cao, và không đồng bộ. + Mô tả cấu trúc của thanh ghi 4 bit gồm 4 Flip-Flops DFF ở trên dùng lệnh gán chân nhƣ sau: end if;
end process ; library IEEE; use IEEE.STD_LOGIC_1164.ALL; library work.all entity REG_4 is
port (D_in: in std_logic_vector (3 downto 0);
Clk, Rst: in std_logic;
Q_out: out std_logic_vector 107 (3 downto 0));
end REG_4; architecture Structural of REG_4 is
-- Khai báo component cần sử dụng component DFF
port ( D,Clock : in std_logic;
Reset : in std_logic;
Q : out std_logic);
end component; begin
-- Ánh xạ theo vị trí: U3:DFF port map(D_in(3), Clk, Rst, Q_out(3));
U2:DFF port map(D_in(2), Clk, Rst, Q_out(2));
-- Ánh xạ theo tên: U1:DFF port map(D=>D_in(1), Clock=>Clk, Reset=>Rst, Q=>Q_out(1));
U0:DFF port map(Clock =>Clk, D =>D_in(0), Reset =>Rst,Q =>Q_out(0));
end Structural; mà phải kết nối thông qua tín hiệu nội bộ có cùng kiểu, cùng độ lớn với các cổng vào ra đó. Ví dụ: Mô tả hệ thống số “System” theo phƣơng pháp cấu trúc từ các khối con nhƣ sau: -- Block1.vhd : File mô tả khối con thứ nhất entity Block1 is Port ( a,b : in STD_LOGIC; y : out STD_LOGIC); end Block1; architecture Behavioral of Block1 is begin y<= (not a and b) or (a and not b); 108 end Behavioral; -- Block2.vhd : File mô tả khối con thứ 2 entity Block2 is Port ( a,b : in STD_LOGIC; y : out STD_LOGIC); end Block2; architecture Behavioral of Block2 is begin Y<= a xnor b; end Behavioral; -- System.vhd : Mô tả hệ thống ―System‖ theo mô hình cấu trúc entity System is Port ( a,b,c : in STD_LOGIC; z : out STD_LOGIC); end System; architecture Behavioral of System is -- Khai báo các khối con sẽ dùng trong hệ thống COMPONENT Block1 PORT( a,b : IN std_logic; y : OUT std_logic ); END COMPONENT; COMPONENT Block2 PORT( a,b : IN std_logic; y : OUT std_logic ); END COMPONENT; signal x: std_logic; -- Tín hiệu nội bộ dùng để nối giữa các khối begin U1_Block1: Block1 port map(a,b,x); U2_Block2: Block2 port map(a=>x,b=>c,y=>z); end Behavioral; 1. Mô tả Bộ đệm 3 trạng thái 8 bit: architecture ...
signal I, O: std_logic_vector(7 downto 0); signal En: std_logic; begin
O <= I when (En='0') else (others=>'Z'); -- "ZZZZZZZZ" 109 end architecture; 2. Mô tả Bộ mã hóa n-2n (Binary Decoder hay n-to-2n Decoder) với n=2: entity Encoder4 is Port ( s : in STD_LOGIC_VECTOR (1 downto 0); x : out STD_LOGIC_VECTOR (3 downto 0)); end Encoder4; s x -- Dùng lệnh when/else 00 0001 architecture When_Arch of Encoder4 is 01 0010 begin 10 0100 x<="0001" when (s="00") else 11 1000 "0010" when (s="01") else "0100" when (s="10") else "1000"; end When_Arch; -- Dùng lệnh with/select architecture With_Arch of Encoder4 is begin with s select x <= "0001" when "00", "0010" when "01", "0100" when "10", "1000" when others; end With_Arch; 1. Viết mô tả VHDL cho mạch biến đổi mã Binary – Gray 4 bit dùng cấu trúc lệnh song song? 2. Viết mô tả VHDL cho mạch Mã hóa và Giải mã ƣu tiên 8-3 bằng cấu trúc lệnh song song? 3. Viết mô tả VHDL cho mạch so sánh 8 bít bằng cấu trúc lệnh song song? 3. Viết mô tả VHDL cho mạch cộng 8 bit không dấu bằng cấu trúc lệnh song song? 110 4. Viết mô tả VHDL cho mạch cộng 8 bít có dấu bằng cấu trúc lệnh song song? 5. Viết mô tả VHDL cho mạch cộng/trừ 8 bít có dấu và không dấu bằng cấu trúc lệnh song song? 6. Viết mô tả VHDL cho mạch ALU đơn giản có cấu trúc và chức năng nhƣ dƣới đây? 7. Viết mô tả VHDL cho mạch Nhân và Chia đơn giản 8 bit dấu phảy tĩnh? Trong ngôn ngữ VHDL một cấu trúc song song quan trọng là Process. Cấu trúc này
thƣờng đƣợc sử dụng để mô tả hành vi (chức năng) hoạt động của mạch số. Trong cùng 1 kiến
trúc, tất cả các Process sẽ đƣợc tổng hợp thành một khối mạch chức năng khi tổng hợp mạch,
và chúng đƣợc thực hiện đồng thời khi mô phỏng. 111 đến lệnh cuối và đƣợc kích hoạt trở lại thực hiện lệnh đầu mỗi khi có bất kỳ sự thay đổi nào
trong danh sách tín hiệu kích thích hay trong danh sách tín hiệu trong câu lệnh wait. Các cấu trúc lệnh tuần tự cơ bản trong VHDL gồm: + Phép gán tuần tự cho biến. + Phép gán tuần tự cho tín hiệu. + Câu lệnh if. + Câu lệnh case. + Câu lệnh rỗng Null. + Các lệnh lặp. Cú pháp của phép gán biến nhƣ sau: biến := biểu_thức So sánh kết quả mạch số tổng hợp đƣợc của mỗi ví dụ sau: ... process( Clk )
variable B, C, D : bit := ‗1‘ ;
begin
If (Clk‘event and Clk =‗1‘) then
B := A ;
C := B ;
D := C ;
end if ;
end process ;... ... 112 process( Clk )
variable B, C, D : bit := ‗1‘;
begin
If ( Clk‘event and Clk =‗1‘ ) then
D := C;
C := B;
B := A;
end if;
end process ; Chú ý trong 2 ví dụ trên, giá trị các biến đƣợc cập nhập tức thì, ví dụ thứ nhất khi tổng
hợp mạch chỉ tạo ra một triger D. Còn với ví dụ thứ 2 thứ tự gán biến thay đổi, kết quả tạo ra
3 triger D. Trong ví dụ 1, nếu B,C,D là tín hiệu thì kết quả hoàn toàn khác. Xem ví dụ ở phần
phép gán tín hiệu. Cú pháp của phép gán biến nhƣ sau: Khác với phép gán biến, phép gán tín hiệu trong Process không đƣợc cập nhập ngay tức
thì mà phép gán đó chỉ đƣợc đặt kế hoạch thực hiện và kết quả chỉ đƣợc cập nhập sau khi kết
thúc Process. Tín hiệu chính là các đầu vào của Process (nếu đƣợc đọc trong Process) và là
các đầu ra của Process (nếu đƣợc ghi trong Process). Ví dụ phép gán tín hiệu và kết quả tổng hợp nhƣ sau: Tín_hiệu_đích<= biểu_thức [after giá_trị_thời_gian]; Architecture Behavior of Triger is signal Clk, A, B, C, D : bit := ‗1‘; Begin process( Clk )
begin
If (Clk‘event and Clk =‗1‘) then
B <= A ;
C <= B ;
D <= C ;
end if ;
end process ; End Behavior; Lệnh này cho phép các phép toán đƣợc thực hiện trên một điều kiện nào đó. Có ba dạng cơ bản là: + Dạng 1: if (Điều_kiện) then end if; + Dạng 2: if (Điều_kiện) then else end if; + Dạng 3: 113 if (Điều_kiện_1) then elsif (Điều_kiện_2) then elsif (Điều_kiện_3) then else Trong lệnh if/else, ta phải chú ý một số điều sau: +) Điều kiện đúng đầu tiên đƣợc tìm thấy sẽ đƣợc thực hiện. +) Các điều kiện có thể chồng lấp lên nhau. +) Điều kiện đầu tiên trong lệnh if/else đƣợc ƣu tiên. Ví dụ: end if; process (A, B, C, D, Sel) Z <= A ; Z <= B ; Z <= C ; Z <= D ; begin
If (Sel = ―00‖) then
elsif (Sel = ―01‖) then
elsif (Sel = ―10‖) then
elsif (Sel = ―11‖) then else NUlL;
end if;
end process ; -- Với mô tả trên cấu trúc bên trong
của mạch ghép kênh 4 đầu vào tổng hợp
được thực sự được xây dựng từ 3 mạch
ghép kênh 2 đầu vào. Lệnh case đƣợc sử dụng trong trƣờng hợp có một biểu thức để kiểm soát nhiều rẽ nhánh
trong chƣơng trình VHDL. Các lệnh tƣơng ứng với một trong các lựa chọn sẽ đƣợc thực hiệu
nếu biểu thức kiểm soát có giá trị bằng giá trị tƣơng ứng của lựa chọn đó. Có hai dạng cơ bản: Dạng 1: Case (biểu_thức_kiểm_soát) is When When ... end case; Dạng 2: Case (selector expression) is 114 When When ... When others => Các chú ý khi dùng lệnh case: +) Tất cả các giá trị của biểu thức lựa chọn phải đƣợc chỉ rõ. +) Không có các giá trị lựa chọn bị chồng lấp lên nhau. end case; Câu lệnh rỗng có cú pháp nhƣ sau: Null; Trong VDHL khi chƣơng trình mô phỏng gặp câu lệnh Null nó sẽ bỏ qua lệnh này và
thực hiện lệnh tiếp theo sau. Thông thƣờng lệnh Null dùng để chỉ trƣờng hợp không thực hiện
của lệnh một cách tƣờng minh khi có các điều kiện trả lại giá trị true. Do đó lệnh Null thƣờng
đƣợc dùng trong các câu lệnh case đối với những giá trị lựa chọn không cần thao tác. Ví dụ: process (A, B, C, D, Sel )
begin case Sel is
when ―00‖ => Z <= A ;
when ―01‖ => Z <= B ;
when ―10‖ => Z <= C ;
when others => Null; end case ;
end process ; Lệnh lặp loop chứa thân vòng lặp bao gồm dãy các câu lệnh sẽ đƣợc thực hiện nhiều lần. Cú pháp của lệnh lặp nhƣ sau: [ { {next [ {exit [ - nhau, trong đó mỗi vòng lặp đƣợc kết thúc bởi từ khóa end loop. - chứa các sơ đồ lặp. Với những vòng lặp không chứa [ Ví dụ vòng lặp không chứa sơ đồ lặp: 115 end loop [nhãn]; process ( A, B_bus ) variable i:integer:=0; begin while (i<8) loop C_bus (i) <= A and B_bus (i); i:=i+1; end loop ; end process; Count_down: Process Variable Min,Sec: integer range 0 to 60; Begin L1: loop L2: loop exit L2 when (Sec=0); wait until CLK‘event and CLK=‘1‘; Sec:=Sec-1; End loop L2; Exit L1 when (Min=0); Min:=Min-1; Sec:=60; End loop L1; Ví dụ vòng lặp chứa End process Count_down; process ( A, B_bus )
begin
for i in 7 downto 0 loop
C_bus (i) <= A and B_bus (i);
end loop ; end process; hoặc: process ( A, B_bus )
begin
for i in 0 to 7 loop
C_bus (i) <= A and B_bus (i);
end loop ; Ví dụ vòng lặp chứa end process; process ( A, B_bus ) variable i:integer:=0; begin
while (i<8) loop
C_bus (i) <= A and B_bus (i); i:=i+1;
end loop ; end process; 1. Triger D (DFF) với tín hiệu Reset không đồng bộ 116 entity DFF is
port ( D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic) ;
end entity DFF ; architecture RTL of DFF is
begin
process (Clock, Reset)
begin
If (Reset = ‗1‘ ) then Q <= ‗0‘ ;
elsif (Clock‘event and Clock = ‗1‘) then
Q <= D ; 2. Triger D (DFF) với tín hiệu Reset đồng bộ end if;
end process ; entity DFF is
port ( D, Clock, Reset : in std_logic ;
Q : out std_logic) ;
end entity DFF ; architecture RTL of DFF is
begin
process (Clock, Reset)
begin
If (Clock‘event and Clock = ‗1‘) then if (Reset = ‗1‘ ) then Q <= ‗0‘ ; else Q <= D ; end if; 3. Mô tả Bộ mã hóa n-2n (Binary Decoder hay n-to-2n Decoder) với n=2: end if;
end process ; entity Encoder4 is Port ( s : in STD_LOGIC_VECTOR (1 downto 0); x : out STD_LOGIC_VECTOR (3 downto 0)); end Encoder4; -- Dùng lệnh if architecture When_Arch of Encoder4 is begin process(s) begin if (s="00") then x<="0001"; elsif (s="01") then x<="0010"; elsif (s="10") then x<="0100"; 117 else x<="1000"; end if; end process; end When_Arch; -- Dùng lệnh case architecture With_Arch of Encoder4 is begin process(s) begin case (s) is when "00" => x<="0001"; when "01" => x<="0010"; when "10" => x<="0100"; when others => x<="1000"; end case; end process; 4. Mô tả Bộ đếm nhị phân 4 bit đơn giản: end With_Arch; entity Counter is Port ( Clk : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0)); end Counter; architecture Behavioral of Counter is signal Qtemp: STD_LOGIC_VECTOR (3 downto
0):="0000"; begin Process(Clk) Begin If (Clk'event and Clk='1') then Qtemp<=Qtemp+1; End if; End Process; Q<=Qtemp; -- Kết quả mô phỏng hoạt động bộ đếm Counter 118 End Behavioral; 5. Mô tả Bộ đếm thập phân 2 số (2 Digit) -- Cách mô tả không dùng biến và tín hiệu trung gian entity Cnt2D is Port ( Clk : in STD_LOGIC; Donvi, Chuc : inout STD_LOGIC_VECTOR (3 downto 0):=x"0" ); end Cnt2D; architecture Behavioral of Cnt2D is begin process(Clk) begin if (Clk'event and Clk='1') then if (Donvi=x"9") then if (Chuc=x"9") then Donvi<=x"0"; Chuc <=x"0"; else Chuc<=Chuc+1; Donvi<=x"0"; end if; else Donvi<=Donvi+1; end if; end if; end Process;
end Behavioral;
-- Kết quả mô phỏng hoạt động bộ đếm Cnt2D -- Cách mô tả dùng biến và kiểu số nguyên entity Cnt2D is Port ( Clk : in STD_LOGIC; Donvi1, Chuc1: out Integer range 0 to 9 ); 119 end Cnt2D; architecture Behavioral of Cnt2D is begin process(Clk) variable ChTempt, DvTempt: Integer range 0 to 9:=0; begin if (Clk'event and Clk='1') then if (DvTempt=9) then if (ChTempt=9) then DvTempt:=0; ChTempt:=0; else ChTempt:=ChTempt+1; DvTempt:=0; end if; else DvTempt:=DvTempt+1; end if; end if; Chuc1<=ChTempt; Donvi1<=DvTempt; end Process; -- Kết quả mô phỏng hoạt động bộ đếm Cnt2D end Behavioral; Hàm là một đoạn mã mô tả tuần tự, đƣợc sử dụng xây dựng các toán tử, phép toán mới
cho các bài toán nào đó phải giải quyết mà hàm đó chƣa có trong thƣ viện chuẩn. Các phép
toán thƣờng đƣợc viết là: hàm biến đổi dữ liệu, hàm logic, hàm số học, toán tử, và hàm thuộc
tính… Hàm đƣợc viết một lần và có thể đƣợc sử dụng lại nhiều lần trong 1 ứng dụng và chia
sẻ giữa các ứng dụng, nhƣ vậy sẽ làm cho mã chƣơng trình chính ngắn và dễ hiểu hơn. 120 Các cấu trúc lệnh tuần tự (nhƣ IF, CASE, LOOP, .. trừ lệnh WAIT) có thể đƣợc sử dụng
trong hàm. Chỉ có biến – VARIABLE và hằng CONSTANT, và danh_sách_biến của hàm
mới đƣợc khai báo và sử dụng trong hàm. SIGNAL và COMPONENT bên ngoài không đƣợc
phép sử dụng trong hàm. Cú pháp để khai báo và mô tả hàm (phần FUNCTION BODY) nhƣ sau: -- Khai báo FUNCTION Tên_hàm [(danh_sách_tham_số)] RETURN kiểu_dữ_liệu; -- Function Body (Mô tả hàm) FUNCTION Tên_hàm [(danh_sách_tham_số)] RETURN kiểu_dữ_liệu IS -- Khai báo CONSTANT, VARIABLE nếu có, nhưng không được khai báo SIGNAL -- và COMPONENT BEGIN (Viết mô tả hàm dùng cấu trúc Lệnh tuần tự) Trong đó: danh_sách_tham_số xác định tham số đầu vào cho hàm có thể đƣợc khai
báo là đối tƣợng constant, signal của các kiểu dữ liệu có thể tổng hợp đƣợc nhƣ BOOLEAN,
STD_LOGIC, INTEGER, STD_LOGIC_VECTOR…, nhƣng không đƣợc sử dụng RANGE
với INTEGER và không đƣợc sử dụng TO/ DOWNTO với kiểu dữ liệu VECTOR. Các tham
số có thể đƣợc đọc trong hàm (gọi là tham số vào) đƣợc khai báo là CONSTANT hoặc
SIGNAL, với tham số đƣợc ghi ra hoặc vừa đọc vừa ghi (gọi là tham số ra) đƣợc coi nhƣ là
biến của hàm và chỉ đƣợc khai báo là đối tƣợng SIGNAL. Khi gọi hàm thì các đối tƣợng signal và constant sẽ đƣợc truyền vào hàm tƣơng ứng theo danh_sách_tham_số. END Tên_hàm; trong danh_sách_ tham_số từ khóa của hằng CONSTANT có thể đƣợc bỏ đi. Ví dụ hàm xác định sƣờn dƣơng của tín hiệu clk nhƣ sau: ------ Function body ------- FUNCTION positive_edge(SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN (s'EVENT AND s='1'); Khi sử dụng có thể gọi hàm trên nhƣ sau: END positive_edge; ... Ví dụ hàm biến đổi dữ liệu từ mảng nhị phân sang số nguyên nhƣ sau: IF positive_edge(clk) THEN... ------ Function body ------------- FUNCTION conv_integer(SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER IS VARIABLE result: INTEGER RANGE 0 TO 2**vector'LENGTH-1; BEGIN 121 IF (vector(vector'HIGH)='1') THEN result:=1; ELSE result:=0; END IF; FOR i IN (vector'HIGH-1) DOWNTO (vector'LOW) LOOP result:=result*2; IF(vector(i)='1') THEN result:=result+1; END IF; END LOOP; RETURN result; Khi sử dụng có thể gọi hàm trên nhƣ sau: END conv_integer; Signal y: integer; Signal a: Std_logic_vector (7 downto 0); ... y<= conv_integer(a); -- Tín hiệu a được truyền vào hàm. Hàm có thể đƣợc mô tả trong PACKAGE(+ PACKAGE BODY) của LIBRARY hay trong chƣơng trình chính (Architecture và Entity). Ví dụ cách mô tả hàm trong PACKAGE nhƣ sau: ... --- Xây dựng PACKAGE --- Khai báo thư viện chuẩn --- LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------- PACKAGE my_package IS -- Khai báo Hàm muốn mô tả FUNCTION positive_edge(SIGNAL s: STD_LOGIC) RETURN BOOLEAN; END my_package; ---------------------------------------------- PACKAGE BODY my_package IS FUNCTION positive_edge(SIGNAL s: STD_LOGIC) RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND s='1'; END positive_edge; END my_package; --- Mã chương trình chính LIBRARY ieee; USE ieee.std_logic_1164.all; USE work.my_package.all; ---------------------------------------------- ENTITY DFF IS PORT ( d, clk, rst: IN STD_LOGIC; 122 8q: OUT STD_LOGIC); END DFF; ---------------------------------------------- ARCHITECTURE my_arch OF dff IS BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; ELSE NUlL;
END IF; END PROCESS; Nếu muốn mô tả hàm ngay trong chƣơng trình chính thì toàn bộ hàm đó đƣợc viết trong phần khai báo của ARCHITECTURE. Ví dụ cách dùng này nhƣ sau: END my_arch; --- Khai báo thư viện chuẩn --- LIBRARY ieee; USE ieee.std_logic_1164.all; ---- Khai báo thực thể --------- ENTITY DFF IS PORT ( d, clk, rst: IN STD_LOGIC; 7q: OUT STD_LOGIC); END DFF; ----- Mô tả hoạt động ---------- ARCHITECTURE my_arch OF DFF IS ------- Phần khai báo của ARCHITECTURE FUNCTION positive_edge(SIGNAL s: STD_LOGIC)RETURN BOOLEAN IS BEGIN RETURN s'EVENT AND s='1'; END positive_edge; -------- Viết mô tả cho ARCHITECTURE BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN q <= '0'; ELSIF positive_edge(clk) THEN q <= d; ELSE NUlL;
END IF; END PROCESS; END my_arch; Về cơ bản cú pháp, cách gọi, vị trí của thủ tục - PROCEDURE tƣơng tự nhƣ hàm – FUNCTION, nhƣng thủ tục không đƣợc trả về giá trị. 123 Cú pháp để khai báo và mô tả thủ tục (phần PROCEDURE BODY) nhƣ sau: -- Khai báo PROCEDURE Tên_thủ_tục [(danh_sách_tham_số)]; -- PROCEDURE Body (Mô tả hàm) PROCEDURE Tên_hàm [(danh_sách_tham_số)] IS -- Khai báo CONSTANT, VARIABLE nếu có, nhưng không được khai báo SIGNAL -- và COMPONENT BEGIN (Viết mô tả thủ tục dùng cấu trúc Lệnh tuần tự) Khác đối với Hàm, riêng đối với Thủ tục, ngoài Tín hiệu, hằng thì biến cũng có thể
đƣợc khai báo trong danh_sách_tham_số của thủ tục. Một khác biệt nữa là khi khai báo tham
số trong thủ tục phải xác định rõ chế độ của tham số (in, out, hay inout), và có cú pháp khai
báo nhƣ sau: END Tên_thủ_tục; Chế độ: Với tham số vào (chế độ IN) đƣợc mặc định là CONSTANT, còn với tham số ra (chế độ OUT, INOUT) đƣợc mặc định là VARIABLE. Ví dụ khai báo: PROCEDURE my_procedure ( a: IN BIT; SIGNAL b, c: IN BIT; SIGNAL x: OUT BIT_VECTOR(7 DOWNTO 0); SIGNAL y: INOUT INTEGER RANGE 0 TO 99) IS BEGIN ... Ví dụ mô tả bộ xác định giá trị nhỏ nhất min_out, và giá trị lớn nhất max_out của 2 giá trị đầu vào inp1, inp2 sử dụng hàm trong chƣơng trình chính nhƣ sau: END my_procedure; LIBRARY ieee; USE ieee.std_logic_1164.ALL; ------------------------------------------------------ ENTITY min_max IS GENERIC (limit : INTEGER := 255); 124 PORT ( ena: IN BIT; -- Tín hiệu cho phép enable inp1, inp2: IN INTEGER RANGE 0 TO limit; min_out, max_out: OUT INTEGER RANGE 0 TO limit); END min_max; ------------------------------------------------------ ARCHITECTURE my_architecture OF min_max IS ----- Phần khái báo của ARCHITECTURE PROCEDURE sort (SIGNAL in1, in2: IN INTEGER RANGE 0 TO limit; SIGNAL min, max: OUT INTEGER RANGE 0 TO limit) IS BEGIN IF (in1 > in2) THEN max <= in1; min <= in2; ELSE max <= in2; min <= in1; END IF; END sort; -------------------------- BEGIN PROCESS (ena) BEGIN IF (ena='1') THEN sort(inp1, inp2, min_out, max_out); END IF; END PROCESS; 125 END my_architecture; 1. Viết mô tả VHDL cho hàm mạch tổ hợp có hàm logic nhƣ sau: 2. Viết mô tả VHDL cho mạch logic sau? 3. Viết mô tả VHDL cho các trigơ JK, RS, T có các đầu vào lập và xóa mức tích cực cao? 4. Viết mô tả VHDL cho bộ đếm thập phân tiến 2 digit có Reset không đồng bộ? 5. Viết mô tả VHDL cho bộ đếm thập phân tiến lùi 2 digit có Reset đồng bộ? 6. Mô hình phần cứng nào tổng hợp đƣợc ứng với đoạn mô tả nhƣ sau: entity flop is
port(C, D, CLR : in std_logic;
Q : out std_logic);
end flop;
architecture archi of flop is
begin
process (C, CLR)
begin
if (CLR = '1')then
Q <= '0';
elsif (C'event and C='0')then
Q <= D; 7. Viết mô tả VHDL cho mạch giải mã BCD sang hiện thị LED7 đoạn? 8. Viết mô tả cho mạch điều khiển hiển thị cho cơ cấu chỉ thị số 4 digit có đầu vào là mã BCD 4 bit theo nguyên lý quét? 9. Viết mô tả VHDL cho mạch chọn địa chỉ 74138? 10. Viết mô tả VHDL cho mạch ALU? 126 else NUlL;
end if;
end process;
end archi; 11. Viết mô tả VHDL cho mạch giải mã từ nhị phân sang thập phân, sang mã gray và ngƣợc lại? 12. Viết mô tả VHDL cho IC ghi dịch 8 bit? 13. Viết mô tả VHDL cho mô hình thanh ghi 4 bit hoạt động sƣờn dƣơn của clock, có tín hiệu chốt clock và thiết lập không đồng bộ nhƣ sau: D[3:0] Đầu vào dữ liệu 4 bit Clock sƣờn dƣơng C PRE Tín hiệu thiết lập không đồng bộ mức tích
cực cao CE Tín hiệu chốt Clock mức tích cực cao Đầu ra dữ liệu 4 bit Q[3:0]
14. Viết mô tả VHDL cho mạch sau 15. Viết mô tả VHDL cho mạch sau 127 Trong bài giảng này, khái niệm thiết kế logic dùng HDL (hay gọi đầy đủ là thiết kế
logic số) là quá trình cần thực hiện để có thể biểu diễn, mô tả đầy đủ chức năng logic của các
mạch hay hệ thống số từ đơn giản đến phức tạp dƣới dạng ngôn ngữ mô tả phần cứng tiêu
chuẩn (ngôn ngữ mô tả phần cứng VHLD đƣợc sử dụng cho bài giảng này). Kết quả của quá
trình thiết kế này là mã chƣơng trình mô tả bằng HDL cho mạch và hệ thống số đó phục vụ
mục đích vừa mô phỏng vừa tổng hợp đƣợc thành mạch và hệ thống số thực trên các công
nghệ logic số hiện hành sử dụng các công cụ thiết kế hỗ trợ bởi máy tính – CAD hay EDA. Nhƣ vậy có thể nói quá trình thiết kế logic số là quá trình ánh xạ các yêu cầu kỹ thuật
của mạch hay hệ thống số để giải quyết một bài toán nào đó thành mô tả HDL cho mạch và hệ
thống số đó. Quá trình thiết kế logic dùng HDL thực sự là một “nghệ thuật”. Đó là nghệ thuật
trong việc hiểu đƣợc bài toán và việc mô tả đƣợc giải pháp thực hiện bằng hệ thống số với
nhiều công nghệ logic khác nhau. Mô tả VHDL trong bài giảng này theo hƣớng độc lập với
công nghệ logic số, có nghĩa là mô tả đó có thể đƣợc tổng hợp thành mạch logic số theo các
công nghệ logic khác nhau. Để thành công trong thiết kế logic số ngƣời thiết kế nên theo một quá trình tiêu chuẩn
để có thế xác định đƣợc những điểm mấu chốt và ràng buộc của bài toán cần giải quyết và mô
tả đƣợc giải pháp để giải quyết vấn đề đó bằng mạch logic số. Quá trình này gồm các bƣớc
chính nhƣ sau: - Một cách bắt đầu tốt là coi đối tƣợng đang đƣợc thiết kế nhƣ một hộp đen và xác định
yêu cầu vào/ra của đối tƣợng cần đƣợc thiết kế, nếu cần thiết có thể đặt hộp đen đó trong sơ
đồ tổng thế của hệ thống cần để giải quyết bài toán đƣợc đặt ra. - Sau đó xác định yêu cầu đối với tín hiệu vào, tín hiệu ra, cũng nhƣ tín hiệu điều khiển
cho hộp đen nói trên, xác định dòng tín hiệu vào, cũng nhƣ xác định những hoạt động của tín
hiệu điều khiển tác động đến tín hiệu vào để tạo ra tín hiệu ra, hay xác định sự phụ thuộc của
tín hiệu ra đến tín hiệu vào và tín hiệu điều khiển. Nếu cần thiết có thể vẽ sơ đồ khối tổng thể
của của đối tƣợng cần thiết kế (nếu có thể nên đặt sơ đồ khối này trong sơ đồ khối chung của
hệ thống đầy đủ để giải quyết bài toán đƣợc đặt ra), sơ đồ khối sẽ giúp ta hiểu rõ hơn các cấu
hình chức năng khác nhau của việc xử lý các trƣờng hợp tín hiệu vào và tín hiệu điều khiển để 128 tạo ra trƣờng hợp khác nhau của tín hiệu ra. Việc thuyết minh rõ sơ đồ khối này cũng giúp ta
hiểu rõ hơn đối tƣợng đang cần thiết kế. - Xác định các yêu cầu ràng buộc khác đối với đối tƣợng cần đƣợc thiêt kế nhƣ: Yêu cầu công suất, độ tin cậy, độ bảo mật, yêu cầu công nghệ… Ngày nay hệ thống điện tử nói chung, hệ thống số nói riêng ngày càng có tính năng
mạnh và tốc độ xử lý nhanh, nhƣng cấu tạo phức tạp, cũng nhƣ mật độ tích hợp cao,… Trong
quá trình phát triển hệ thống, mỗi công đoạn có những loại yêu cầu thông tin cụ thể về hệ
thống từ tham số, đặc tính kỹ thuật đến cấu trúc layout của các phần tử vật lý. Với cùng hệ
thống có thể đƣợc miêu tả theo các cách khác nhau và đƣợc kiểm tra theo các khía cạnh khác
nhau. Chúng ta gọi các khía cạnh đó là mô hình biểu diễn (views or representations) cho hệ
thống. Có 3 dạng mô hình biểu điễn hệ thống số nhƣ sau: - Mô tả mức mạch điện (Circuit Level or Transistor Level). - Mô tả mức logic (Logic Lever or Gate Level). - Mô tả mức RTL (Register Transfer Level – Mức truyền đạt thanh ghi). - Mô tả mức hệ thống (System Level or Processor Level). Mô hình hoạt động là mô hình mô tả hoạt động, chức năng của hệ thống dƣới dạng mối
quan hệ giữa đầu vào, đầu ra, và định thời mà không quan tâm đến cấu trúc bên trong của hệ
thống. Mô hình này thƣờng đƣợc biểu diễn bởi mô tả chức năng, hoạt động của hệ thống bằng
ngôn ngữ tự nhiên, giản đồ thời gian (sơ đồ định thời), phƣơng trình logic, bảng trạng thái,
lƣu đồ giải thuật, đồ hình trạng thái. Đây là mô hình có mức độ trừu tƣợng cao nhất, và
thƣờng rất thích hợp cho các mục đích mô phỏng, gỡ rối nhanh cho hệ thống. 129 Mô hình cấu trúc là mô hình mô tả cấu trúc bên trong của hệ thống gồm các thành phần
con và các kết nối giữa chúng. Mô hình này giống nhƣ sơ đồ khối hay mạch nguyên lý của hệ
thống. Tùy theo mức độ trừu tƣợng, Hệ thống số đƣợc mô tả theo mô hình cấu trúc có thể
gồm các cấu trúc cổng logic cơ bản, các Flip-Flop… Kiểu mô tả này cũng độc lập với công
nghệ thực hiện mạch, tuy nhiên để tăng tính tối ƣu cho mạch, mô hình cấu trúc logic thƣờng
này thƣờng sử dụng các cấu trúc logic đã đƣợc xây dựng sẵn, hoặc chọn trong thƣ viện của
nhà cung cấp phù hợp với loại công nghệ sử dụng. Mô hình vật lý là mô hình mô tả đặc tính vật lý của hệ thống và thêm vào các thông tin
chi tiết cho mô hình cấu trúc nhƣ xác định kích thƣớc hay vị trí vật lý của các linh kiện trên
bo mạch hay trên phiến bán dẫn, cũng nhƣ các đƣờng dẫn vật lý của mối đƣờng kết nối. Ví dụ
mô hình biểu diễn mạch in PCB của bo mạch hệ thống, layout của của IC… Nhƣ vậy hệ
thống số đƣợc mô tả ở mức độ chi tiết nhất, tới cấu trúc vật lý bán dẫn, cũng nhƣ cấu trúc bên
trong những tài nguyên đã sẵn có trong cấu kiện, cách này tối ƣu cho việc tổng hợp trên loại
cấu kiện, công nghệ đã sử dụng. Ngày nay hệ thống số có tính năng ngày càng phức tạp và mật độ tích hợp ngày càng
cao (có thể đến hàng trăm triệu Transistor) nên sẽ rất khó cho ngƣời thiết kế, và thậm trí là
máy tính khi xử lý trực tiếp lƣợng số liệu nhƣ vậy. Chìa khóa để quản lý hệ thống phức tạp
nhƣ vậy là mô tả hệ thống với các mức độ trừu tƣợng khác nhau. Mức độ trừu tƣợng chỉ mức
độ đơn giản hóa của mô hình mô tả hệ thống, chỉ mô tả những đặc tính có chọn lọc với mục
địch riêng và bỏ qua những chi tiết kèm theo tức là giảm số lƣợng dữ liệu tới mức có thể quản
lý đƣợc và chỉ biểu diễn những thông tin quan trọng. Mức độ trừu tƣợng càng cao thì chỉ tập
trung vào mô tả những thông tin quan trọng nhất. Ngƣợc lại mức trừu tƣợng càng thấp thì
càng mô tả chi tiết, mức trừu tƣợng này phức tạp nhƣng lại gần với mạch thực. Trong quá
trình thiết kế, thƣờng bắt đầu với mô tả có mức trừu tƣợng cao, sau đó mới thêm vào những
mô tả chi tiết và phát triển mức mô tả có mức độ trừu tƣợng thấp hơn. Có 4 mức độ trừu tƣợng đƣợc sắp xếp theo mức độ tăng dần khi mô tả một hệ thống số: - Mô tả mức mạch điện (Circuit Level or Transistor Level). - Mô tả mức logic (Logic Lever or Gate Level). - Mô tả mức RTL (Register Transfer Level – Mức truyền đạt thanh ghi). - Mô tả mức hệ thống (System Level or Processor Level). Mối quan hệ giữa các mô hình mô tả và mức độ trừu tƣợng đƣợc biểu diễn theo biểu đồ
Y của Gajski và Kuhn (Gajski and Kuhn‟s Y-Chart) nhƣ Hình 4.1. Mỗi trục biểu diễn dạng
mô hình và các mức độ mô tả trừu tƣợng khác nhau cho hệ thống số, với mức độ trừu tƣợng
tăng từ tâm ra ngoài. 130 Với mỗi mức độ mô tả trừu tƣợng khác nhau có các đặc tính khác nhau, Bảng 4.1 trình bày các mức độ mô tả trừu tƣợng và 5 đặc tính chính của chúng: (Mô hình
cấu trúc) (Mô hình hoạt
động) (Mô hình
vật lý) Transistor, Điện
trở,… Mức điện
áp Hàm liên
tục Phƣơng trình vi
phân Cấu trúc
Transistor Hàm boolean Cấu trúc Cell AND, OR, FLIP-
FLOPS,.. logic „0‟,
„1‟ Độ trễ lan
truyền Adder, Mux,
Register,.. Đồ hình trạng thái
(FSM) Sơ đồ mức
RTL Thời điểm
xung nhịp
Clock Số
nguyên,
trạng thái
hệ thống Vi xử lý, Giải thuật Chuỗi sự
kiện Bộ nhớ, .. Sơ đồ mức IPs
(Intellectual
Properties) Kiểu dữ
liệu trừu
tƣợng Trong các đặc tính ở bản trên, các khối cơ bản là các thanh phần chủ yếu đƣợc sử dụng
để mô tả mô hình cấu trúc của hệ thống số, còn các mô tả hoạt động và mô tả vật lý đƣợc sử
dụng cho mô hình hoạt động và mô hình vật lý của hệ thống số. Đặc tính biểu diễn tín hiệu và 131 thời gian là cách biểu diễn giá trị của tín hiệu và cách thay đổi giá trị của chúng theo thời
gian. Đây là mức mô tả có mức độ trừu tƣợng thấp nhất. Hệ thống đƣợc mô tả theo mô hình
cấu trúc sử dụng các cấu trúc cơ bản nhƣ Transistor, Điện trở, Tụ điện, … hay theo mô hình
hoạt động sử dụng hệ phƣơng trình vi phân. Ở mức mô tả này hệ thống số đƣợc tính toán nhƣ
một hệ thống tƣơng tự, mà trong đó tín hiệu tín toán theo mức điện áp biến đổi theo gian và
có giá trị trong khoảng liên lục. Hệ thống cũng có thể đƣơc mô tả theo mô hình vật lý sử dụng
cấu trúc bán dẫn của các cấu kiện và kết nối giữa chúng. Hệ thống đƣợc mô tả sử dụng các cấu trúc cổng logic sơ bản nhƣ AND, OR, XOR,
MUX, phần tử nhớ cơ bản nhƣ Flip-Flops… Tín hiệu đƣợc biểu diễn theo các mức logic „0‟,
„1‟ và hoạt động vào- ra đƣợc tính toán theo hàm boolean. Ở mức mô tả này số lƣợng cổng
NAND 2 đầu tƣơng đƣơng trong mạch đƣợc sử dụng để đánh giá mức độ phức tạp của hệ
thống. Hệ thống đƣợc mô tả sử dụng các mô-đun chức cơ bản nhƣ: các bộ cộng, bộ so sánh,
khối nhớ, thanh ghi, Mux, Demux… Khái niệm truyền đạt thanh ghi thƣờng đƣợc sử dụng
trong 2 trƣờng hợp:Ban đầu, khái niệm truyền đạt thanh ghi đƣợc sử dụng để mô tả phƣơng
pháp thiết kế mà hoạt động của hệ thống số đƣợc xác định bởi cách dữ liệu xử lý và chuyển
đổi giữa các thanh ghi lƣu trữ. Do đó thành phần cơ bản đƣợc sử dụng theo phƣơng pháp thiết
kế này là các mô-đun kích thƣớc trung bình. Sau này khái niệm truyền đạt thanh ghi đƣợc sử
dụng để mô tả mức độ trừu tƣợng mức mô-đun. Biểu diễn số liệu ở mức RTL trừu tƣợng hơn
mức logic. Tín hiệu đƣợc nhóm lại với nhau và đƣợc biểu diễn dƣới các kiểu dữ liệu đặc biệt
có ngữ nghĩa ví dụ nhƣ kểu số nguyên không dấu, kiểu trạng thái hệ thống. Mô tả theo mô
hình hoạt động ở mức này sử dụng những mô tả chung để xác định các phép toán chức năng
và định tuyến dữ liệu, và sử dụng máy trạng thái FSM để mô tả hoạt động của hệ thống. Đặc
điểm quan trọng của mô tả mức RTL là sử dụng tín hiệu clock chung cho các cấu trúc nhớ.
Mô hình vật lý cho mức mô tả RTL đƣợc gọi chung là floorplan. Nó rất hữu ích cho chung ta
tìm ra những đƣờng thấp nhất giữa các phần tử nhờ và xác định chu kỳ clock. Đây là mô tả có mức trừu tƣợng cao nhất. Các khối cơ bản đƣợc sử dụng để xây dựng
hệ thống là các khối IP (Intellectual Properties) nhƣ các bộ xử lý, bộ nhớ, giao tiếp bus,…
Mô tả theo mô hình hoạt động ở mức này giống nhƣ chƣơng trình lập trình theo giải thuật nhƣ
các ngôn ngữ lập trình bao bồm các bƣớc tính toán và truyền thông. Tín hiệu ở mức mô tả này
đƣợc nhóm và biểu diễn dƣới nhiều dạng số liệu. Tham số thời gian đƣợc biểu điễn theo các
bƣớc tính toán, chúng kế hợp tập các hép toán đã đƣợc xác định giữa các điểm đồng bộ liên
tiếp. Nhiều bƣớc tính toán đƣợc thực hiện trên các phần cứng song song và trao đổi dữ liệu
thông qua giao thức bus hoặc giao thức truyền thông xác định. Mô hình vật lý ở mức này
đƣợc gọi là “floor plan”. 132 Sử dụng VHDL cho phép mô tả hệ thống phần cứng số theo các mô hình với các mức
độ trừu tƣợng khác nhau. Tuy nhiên trong bài giảng này chủ yếu tập trung vào mô tả hệ thống
số ở các mức trừu tƣợng logic, RTL, và hệ thống theo mô hình hoạt động và mô hình cấu trúc. Tùy theo mức độ phức tạp của hệ thống cũng nhƣ các yêu cầu ràng buộc khi thiết kế mà
có thể sử dụng kết hợp các mô tả ở các mức độ trừu tƣợng khác nhau và với mô hình khác
nhau. Ví dụ một số dạng mô hình hệ thống số theo các mức trừu tƣợng khác nhau nhƣ sau: Mô hình cấu trúc mức hệ thống điển hình của hệ thống số Hình 4.2. Trong đó hệ thống số đƣợc xây dựng từ các khối chính nhƣ Vi xử lý, Bộ nhớ, giao tiếp bộ nhớ,… + Khối vi xử lý (Microprocessor): Đây là khối xử lý trung tâm của hệ thống thƣờng
đƣợc xây dựng trên cơ sở các bộ Vi xử lý/ Vi điều khiển hoặc đƣợc xây dựng thành các bộ
điều khiển hƣớng ứng dụng theo kiến trúc riêng của ngƣời thiết kế. + Khối bộ nhớ trong: RAM/ROM + Khối giao tiếp với bộ nhớ ngoài: Buffer Memories + Khối giao tiếp BUS: BUS interface circuits + Khối giao tiếp Vào/Ra: I/O các khối giao tiếp với các thiết bị vào/ ra theo các chuẩn giao tiếp số: Ví dụ RS232, LAN, PS2, USB, ... + Các khối xử lý chuyên dụng: Complex ASIC. Các thành phần trên có thể xuất hiện một cách riêng biệt trên mỗi IC số riêng, tuy nhiên
xu hƣớng hiện nay ngƣời ta tích hợp một vài thành phần hoặc tất cả các thành phần trên một
IC duy nhất (các hệ thống SoC). Tùy theo công nghệ đƣợc sử dụng để thực hiện mạch số mà
phƣơng pháp thiết kế hệ thống số khác nhau. Trong bài giảng này chủ yếu tập trung vào Thiết
kế mạch/hệ thống số trên cơ sở tiếp cận theo hƣớng thiết kế vi điện tử dùng HDL và thực hiện
trên các công nghệ logic khả trình PLD (CPLD/FPGA), hệ thống VLSI, ASIC, SoC. Hệ thống số đƣợc mô tả theo mô hình hoạt động ở mức truyền đạt thanh ghi (RTL-
Register Tranfer Level) – gọi tắt là mô hình RTL đƣợc xây dựng từ các cấu trúc Bộ nhớ, khối
điều khiển, đƣờng dữ liệu, điều khiển vào/ra… Các cấu trúc này đƣợc mô tả theo mô hình
hoạt động. Kiểu mô tả này thƣờng đƣợc dùng trong việc kiểm tra, mô phỏng hệ thống, cũng 133 nhƣ cho việc tổng hợp với mức độ độc lập với công nghệ cao. Hiện nay mô hình cấu trúc mức
RTL cũng có thể đƣợc tạo ra tự động từ mô hình Behavioral mức hệ thống nhờ các công cụ
tổng hợp mạnh. Mô hình hoạt động mức RTL của một hệ thống số điển hình nhƣ Hình 4.3 gồm: Datapath để thực hiện các bƣớc xử lý số liệu nhƣ mong muốn. động cho CPU. Thƣờng chỉ có trong các hệ thống phức tạp, đa dụng nhƣ các bộ vi xử lý. thiết bị vào/ra bên ngoài hệ thống, hay còn gọi là khối ngoại vi. Đây là kiểu mô tả hệ thống số theo các thành phần Bộ nhớ, Khối điều khiển, đƣờng dữ
liệu, khối giao tiếp vào/ra sử dụng các cấu trúc Bus, Cấu trúc thanh ghi, Cấu trúc mạch logic 134 tổ hợp, Các phép toán logic, số học cần thiết, Các thủ tục điều khiển Bus để thực hiện truyền
thông giữa các khối trong hệ thống, cũng nhƣ kiến trúc tập lệnh Đây là mức độ mô tả trừu tƣợng nhất, chủ yếu là mô tả theo chức năng của hệ thống số
theo yêu cầu đầu vào và đáp ứng ra sử dụng các cấu trúc lệnh giống nhƣ của ngôn ngữ lập
trình bậc cao nhƣ PROCESS , WAIT, IF, CASE, FOR-LOOP… Mô tả theo cách này tính ngữ
nghĩa tự nhiên và giải thuật rất cao, nhập thiết kế rất nhanh, nhƣng cấu trúc của phần cứng
thƣờng không rõ. Với những hệ thống phức tạp (nhất là có giải thuật phức tạp), yêu cầu cần
thiết kế nhanh, mà không cần yêu cầu về mức độ tối ƣu phần cứng cao thƣờng dùng cách mô
tả này. Ngƣời thiết kế chỉ mô tả chức năng, hành vi đƣợc mong đợi của thiết bị dùng VHDL
từ những mô tả hệ thống dạng văn bản và hay lƣu đồ thuật toán. Phƣơng pháp mô tả này rất
hay dùng cho mục đích mô phỏng. 135 Chức năng hoạt động của hệ thống nhƣ sau: Nếu mỗi khi có một sensor nào đó đƣợc
kích hoạt, thì hệ thống kiểm tra mã bàn phím. Nếu sau 20 giây mà không có mã bàn phím
nhập đúng nhập vào thì còi báo động sẽ đƣợc bật lên. entity Security_1 is
port (Clk, Reset : in std_logic ;
Keypad : in std_logic_vector (3 downto 0) ;
Front_Door, Rear_Door, Window: in boolean ;
Alarm_Siren : out boolean ) ;
end Security_1 ; ------------------------------- constant Delay_Period : time := 20 s; architecture Behavioral of Security_1 is
begin
process (Keypad,Front_Door,Rear_Door,Window)
begin
if (Front_Door or Rear_Door or Window ) then
if (Keypad = ―0011‖) then
Alarm_siren <= false ;
else
Alarm_Siren <= True after Delay_Period ;
end if ;
end if ;
end process ;
end Behavioral; Mô hình theo mô hình Behavioral mức RTL hệ thống số đƣợc xây dựng trên cơ sở khối
đƣờng dữ liệu - Datapath và khối điều khiển. Các khối chức năng đó đƣợc xây dựng từ tập các
thanh ghi (khối mạch có nhớ) và các phép toán đƣợc thực hiện trên dữ liệu số nhị phân đƣợc
lƣu trong các thanh ghi. Luồng dữ liệu và việc xử lý dữ liệu thực hiện trên số liệu đƣợc chứa 136 trong các thanh ghi đƣợc coi nhƣ là hoạt động chuyển đổi giữa các thanh ghi. Hệ thống số
đƣợc biểu diễn theo mô hình này đƣợc xác định bởi 3 thành phần nhƣ sau: - Tập các thanh ghi trong hệ thống (Các khối mạch nhớ, mạch tuần tự). - Các phép toán đƣợc thực hiện trên dữ liệu đƣợc lƣu trong các thanh ghi đƣợc xây dựng nhờ các mạch logic tổ hợp. - Những điều khiển để giám sát chuỗi tuần tự các phép toán trong hệ thống (thƣờng đƣợc xây dựng trên mô hình máy trạng thái). Thanh ghi gồm nhóm các Trigơ chứa dữ liệu nhị phân. Một thanh ghi có thể nạp thông
tin mới, dịch thông tin… Một bộ đếm đƣợc coi nhƣ là một thanh ghi có khả năng tăng, giảm
giá trị tuần tự. Một Trigơ có thể coi nhƣ là thanh ghi 1 bit. Phần mạch gồm có các Trigơ và
các cổng liên quan trong bất cứ mạch tuần tự nào có thể đƣợc gọi là những thanh ghi. Các phép toán đƣợc thực hiện trên dữ liệu chứa trong các thanh ghi là những phép toán
cơ bản có thể đƣợc thực hiện song song trên chuỗi bit trong một chu kỳ clock. Kết quả của
phép toán có thể thay thế dữ liệu trƣớc đó của thanh ghi, hoặc kết quả có thể đƣợc chuyển đến
thanh ghi khác. Có 4 kiểu phép toán nhƣ sau: + Phép chuyển đổi: truyền dữ liệu từ thanh ghi này sang thanh ghi khác. + Phép toán số học. + Phép toán logic. + Phép dịch. Điều khiển khởi tạo chuỗi các phép toán bao gồm tín hiệu định thời cho phép thực hiện
tuần tự các phép toán theo cách đã đƣợc mô tả trƣớc. Có thể coi mô hình RTL là mô hình mô
tả hành vi theo từng xung clock của hệ thống số. Hệ thống số đƣợc mô tả bằng VHDL theo mô hình cấu trúc mức RTL có khả năng tổng
hợp rất cao và rất dễ dàng trong việc trao đổi giữa các công cụ tổng hợp, thiết kế, và có thể
tổng hợp trên các công nghệ PLD khác nhau. Combinatorial Process Clocked Process Một thành phần quan trọng trong mô hình RTL chính là mô hình đƣờng dữ liệu “datapath” nhƣ Hình 4.7. 137 Mô tả VHDL cho mô hình datapath ở trên trên có thể thực hiện theo 2 cách nhƣ sau: Mô tả thành 2 process độc lập cho mạch tuần tự và mạch tổ hợp độc lập: architecture SPLIT of DATAPATH is signal X1, Y1, X2, Y2 : ... begin REG : process (CLK) begins if (CLK'event and CLK = '1') then -- Resisters X1 <= Y0; X2 <= Y1; X3 <= Y2; end if; end process; LOGIC : process (X1, X2) -- combinational logic begin Y1 <= F(X1); Y2 <= G(X2); end process; Cách viết kết hợp mạch tổ hợp và tuần tự trong một process: end SPLIT; architecture COMBINED of DATAPATH is signal X1, X2 : ... begin process (CLK) -- Registers begin if (CLK'event and CLK = '1') then -- Khối mạch tổ hợp được tổng hợp từ biểu thức F,G. X2 <= F(X1); X3 <= G(X2); X1 <= Y0; end if; end process; 138 end COMBINED; Trong mô hình hoạt động mức RTL, khối điều khiển (Controller) thƣờng đƣợc mô tả
theo mô hình máy trạng thái hữu hạn. Có hai dạng mô hình biểu diễn máy trạng thái hữu hạn
là: + Đồ hình trạng thái (State Diagram). + Lƣu đồ máy trạng thái theo giải thuật - ASM (Algorithmic State Machine). Nội dung về máy trạng thái sẽ đƣợc trình bày chi tiết trong các phần sau. Nhƣ đã trình bày trong chƣơng 3, Testbech nhƣ một môi trƣờng kiểm tra ảo, cho phép
tạo các nguồn tín hiệu vào kích thích cho khối cần kiểm tra DUT, bên cạnh đó còn có các mô
tả cho việc đọc dữ liệu ra của khối DUT, so sánh với tín hiệu đầu ra mong muốn để tạo để tạo
ra các thông báo trên màn hình cũng nhƣ đọc hay ghi vào các file số liệu trong quá trình chạy
mô phỏng. Các mô tả này chủ yếu đƣợc viết theo mô hình hoạt động (behavioral) và có thể
chỉ dùng cho mục đích mô phỏng. Tổng quát có 2 mô hình cho chƣơng trình Testbech nhƣ
sau: Testbench Entity DUT Quan sát
tín hiệu ra
theo dạng
sóng Tạo
nguồn tín
hiệu vào
kích thích Trong đó: DUT: (device under test) mô hình VHDL cần kiểm tra Testbench Entity DUT
(Device Under Test) Tiến trình so
sánh tín hiệu ra
thực với tín
hiệu ra mong
muốn Tạo
nguồn tín
hiệu vào
kích thích Thiết kế đúng hay sai? 139 Để viết mô tả dạng tín hiệu thƣờng dùng mô hình thời gian của VHDL sử dụng các lệnh tuần tự hoặc các lệnh song song. Có thể dùng các cấu trúc lệnh gán song song có mệnh đề after Ví dụ lệnh gán liên tiếp: Tín_hiệu<= -- Ví dụ: Wait on clk, Reset + Wait until Ví dụ: Wait until clk=‟1‟ + Wait for Ví dụ: Wait for 10 ns + Wait on Ví dụ: Wait on clk, Reset Ví dụ: Wait on Reset until clk=‟1‟ + Wait until 140 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TestbechCodes is end TestbechCodes; architecture Behavioral of TestbechCodes is signal a:std_logic; -- Dùng lệnh gán song song begin a<= '1', '0' after 100 ns, '1' after 250 ns; -- Giá trị khởi tạo của a là '1', sau đó đạt các giá trị khác nhau sau -- khoảng thời gian xác định so với gốc thời gian bắt đầu khởi tạo tín hiệu end Behavioral; -- Dùng lệnh tuần tự begin process begin a <='1'; wait for 100 ns; a <='0'; wait for 150 ns; a <='1'; wait; -- Dừng lại end process; end Behavioral; -- Khai báo tín hiệu Signal InputxD: std_logic_vector(1 downto 0);
-- Dùng lệnh gán song song InputxD<="00", "01" after 100 ns, "10" after 200 ns, "11" after 300 ns; -- Dùng lệnh tuần tự process begin InputxD<="00"; wait for 100 ns; InputxD<="01"; wait for 100 ns; InputxD<="10"; wait for 100 ns; 141 InputxD<="11"; wait; + Trường hợp 3: Viết mô tả tạo ra sự thay đổi cho các tín hiệu Rst, a, InputxD[1:0] có dạng
nhƣ sau: end process; -- Khai báo tín hiệu signal A, Rst:std_logic; signal InputxD: std_logic_vector(1 downto 0); -- Dùng lệnh gán song song Rst<='1', '0' after 150 ns; A<='1','0' after 100ns,'1' after 250ns,'0' after 350ns,'1' after 450ns; InputxD<="00", "01" after 100 ns, "10" after 200 ns, "11" after 300 ns; -- Dùng lệnh gán song song và tuần tự Rst<='1', '0' after 150 ns; AGen:process begin A<='1'; wait for 100 ns; A<='0'; wait for 150 ns; A<='1'; wait; end process; InputxDGen:process begin InputxD<="00"; wait for 100 ns; InputxD<="01"; wait for 100 ns; InputxD<="10"; wait for 100 ns; InputxD<="11"; wait; end process; 142 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ClkGen is end ClkGen; architecture Behavioral of ClkGen is constant Tclk: Time:=100 ns; constant T2: Time:=30 ns; signal Clk1, Clk2: std_logic:='1'; -- Giá trị khởi tạo phải xác định begin Clk1<= not Clk1 after Tclk/2; Clk2Gen:process begin Clk2<='1'; wait for T2; Clk2<='0'; wait for (Tclk-T2); end process; end Behavioral; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TestVector is end TestVector; architecture Behavioral of TestVector is signal TestVector: std_logic_vector(3 downto 0):=x"0"; signal Clk: std_logic:='1'; begin Clk<= not Clk after 10ns; TestVectorGen:process(clk) Begin If(Clk'event and Clk='1') then TestVector <= TestVector + 1; End if; End process; 143 end Behavioral; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TwoInput is end TwoInput; architecture Behavioral of TwoInput is signal X,Y: std_logic_vector(2 downto 0); begin double_loop: PROCESS BEGIN X<="000"; Y<="000"; for i in 0 to 7 loop for j in 0 to 7 loop wait for 10 ns; X <= X + 1; end loop; Y <= Y + 1; end loop; END PROCESS; end Behavioral; Ngoài mô tả để tạo các nguồn tín hiệu vào kích thích cho khối cần kiểm tra DUT, trong
chƣơng trình Testbench còn thực hiện các tiến trình đọc kết quả đầu ra của DUT, thực hiện
đánh giá kết quả đó hay so sánh với tín hiệu ra mong muốn để đánh giá xem thiết kế có đúng
hay không và tạo các thông báo kết quả trên màn hình. Các lệnh mô tả có thể đƣợc sử dụng
nhƣ sau: báo ra màn hình trong quá trình mô phỏng. Cú pháp lệnh “Assert” nhƣ sau: [Nhãn:] ASSERT boolean_condition -- Biểu thức boolean -- Nếu boolean_condition=False thì thông báo sẽ được viết ra [REPORT "message"] -- Viết thông báo "message" lên màn hình [SEVERITY severity_level];-- Gán mức độ nghiêm trọng của lỗi, có thể gán -- các giá trị sau (Note, Warning, Error (giá trị mặc định,nếu không có 144 -- biểu thức SEVERITY), Failure) REPORT "message" Ví dụ: [SEVERITY severity_level]; VARIABLE a,b : INTEGER;
...
a:= 10;
b:= 11;
ASSERT a /= b -- Thông báo không được đưa ra vì a /= b là TRUE
REPORT "a equal b"
SEVERITY WARNING;
ASSERT a = b -- Sẽ có thông báo là WARNING và "a not equal b"
REPORT "a not equal b"
SEVERITY WARNING;
ASSERT a = b
REPORT "a not equal b"; -- Sẽ có thông báo là "a not equal b"
ASSERT a = b; -- Sẽ có thông báo là ERROR và "Assertion violation"
REPORT "Initialization complete";
-- Thông báo ở màn hình "Initialization complete"
REPORT "Current time = "& time'image(now);
REPORT "Incorrect branch" SEVERITY error; entity Msg is end Msg; architecture Behavioral of Msg is signal clk : std_logic := '0'; begin clk <= not clk after 100 ns; process begin wait for 1000 ns; report "Initialization complete"; report "Current time = " & time'image(now); wait for 1000 ns; report "SIMULATION COMPLETED" severity failure; end process; Kết quả chạy mô phỏng ngoài giản đồ thời gian có có thông báo xuất hiện ở cửa sổ Console trong màn hình Transcript của chƣơng trình mô phỏng (ISE Simulator). 145 end Behavioral; -- Mô tả khối giải mã BCD-7Seg cho LED 7 đoạn Anot chung: entity BCDto7Seg is Port ( BCD : in STD_LOGIC_VECTOR (3 downto 0); Seg : out STD_LOGIC_VECTOR (6 downto 0)); end BCDto7Seg; architecture Behavioral of BCDto7Seg is begin with BCD select --abcdefg Seg<="0000001" when X"0", "1001111" when X"1", "0010010" when X"2", "0000110" when X"3", "1001101" when X"4",-- Error (g) "0100100" when X"5", "0100000" when X"6", "0001111" when X"7", "0000000" when X"8", "0000100" when X"9", "1111110" when others; Viết mô tả testbench đầy đủ kiểm tra BCDto7Seg end Behavioral; LIBRARY ieee; USE ieee.std_logic_1164.ALL; 146 USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY BCDto7Seg_tb IS END BCDto7Seg_tb; ARCHITECTURE behavior OF BCDto7Seg_tb IS COMPONENT BCDto7Seg PORT( BCD : IN std_logic_vector(3 downto 0); Seg : OUT std_logic_vector(6 downto 0) ); END COMPONENT; SIGNAL StimInputs: STD_LOGIC_VECTOR(3 downto 0); SIGNAL CaptureOutputs: STD_LOGIC_VECTOR(6 downto 0); CONSTANT PropDelay: time := 40 ns; CONSTANT SimLoopDelay: time := 10 ns; TYPE vector IS RECORD bcdStimulus: STD_LOGIC_VECTOR(3 downto 0); sevSegOut: STD_LOGIC_VECTOR(6 downto 0); END RECORD; CONSTANT NumVectors: INTEGER:= 10; -- Giá trị Tín hiệu vào/ra mong muốn TYPE vectorArray is ARRAY (0 TO NumVectors - 1) OF vector; CONSTANT vectorTable: vectorArray := ( (bcdStimulus => "0000", sevSegOut => "0000001"), (bcdStimulus => "0001", sevSegOut => "1001111"), (bcdStimulus => "0010", sevSegOut => "0010010"), (bcdStimulus => "0011", sevSegOut => "0000110"), (bcdStimulus => "0100", sevSegOut => "1001100"), (bcdStimulus => "0101", sevSegOut => "0100100"), (bcdStimulus => "0110", sevSegOut => "0100000"), (bcdStimulus => "0111", sevSegOut => "0001111"), (bcdStimulus => "1000", sevSegOut => "0000000"), (bcdStimulus => "1001", sevSegOut => "0000100") ); BEGIN uut: BCDto7Seg PORT MAP (BCD=>StimInputs,Seg=>CaptureOutputs); LoopStim: PROCESS BEGIN FOR i in 0 TO NumVectors-1 LOOP StimInputs <= vectorTable(i).bcdStimulus; WAIT FOR PropDelay; ASSERT CaptureOutputs = vectorTable(i).sevSegOut REPORT "Incorrect Output" 147 SEVERITY error; WAIT FOR SimLoopDelay; END LOOP; WAIT; END PROCESS; Kết quả mô phỏng trên ISE 10.1: END behavior; Gói TextIO chứa các thủ tục vào hàm cho phép ngƣời thiết kế đọc và ghi file text dạng mã ASCII. Gói thủ tục chuẩn TextIO nhƣ sau: -- needed for bootstrap mode -- for specifying widths of output fields 148 -- textio.vhdl
library std; use std.standard.all;
package TEXTIO is
-- Type Definitions for Text I/O
type LINE is access STRING; -- a line is a pointer to a STRING value
type TEXT is file of STRING; -- a file of variable-length ASCII records
type SIDE is (RIGHT, LEFT); -- for justifying output data within fields
subtype WIDTH is NATURAL;
-- Standard Text Files
file INPUT: TEXT open READ_MODE is "STD_INPUT";
file OUTPUT: TEXT open WRITE_MODE is "STD_OUTPUT";
-- Input Routines for Standard Types
procedure READLINE (file F: TEXT; L: inout LINE);
procedure READ (L: inout LINE; VALUE: out BIT; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out BIT);
procedure READ (L: inout LINE; VALUE: out BIT_VECTOR; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out BIT_VECTOR);
procedure READ (L: inout LINE; VALUE: out BOOLEAN; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out CHARACTER; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out CHARACTER);
procedure READ (L: inout LINE; VALUE: out INTEGER; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out INTEGER);
procedure READ (L: inout LINE; VALUE: out REAL; GOOD: out BOOLEAN); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0;
DIGITS: in NATURAL := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0); JUSTIFIED: in SIDE := RIGHT; FIELD: in WIDTH := 0;
UNIT: in TIME := ns); procedure READ (L: inout LINE; VALUE: out REAL);
procedure READ (L: inout LINE; VALUE: out STRING; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out STRING);
procedure READ (L: inout LINE; VALUE: out TIME; GOOD: out BOOLEAN);
procedure READ (L: inout LINE; VALUE: out TIME);
-- Output Routines for Standard Types
procedure WRITELINE (file F: TEXT; L: inout LINE);
procedure WRITE (L: inout LINE; VALUE: in BIT;
procedure WRITE (L: inout LINE; VALUE: in BIT_VECTOR;
procedure WRITE (L: inout LINE; VALUE: in BOOLEAN;
procedure WRITE (L: inout LINE; VALUE: in CHARACTER;
procedure WRITE (L: inout LINE; VALUE: in INTEGER;
procedure WRITE (L: inout LINE; VALUE: in REAL;
procedure WRITE (L: inout LINE; VALUE: in STRING;
procedure WRITE (L: inout LINE; VALUE: in TIME;
-- File Position Predicates
function ENDLINE (L: in LINE) return BOOLEAN;
end TEXTIO; entity LoadCnt is PORT ( data: IN STD_LOGIC_VECTOR (7 DOWNTO 0); load: IN STD_LOGIC; clk: IN STD_LOGIC; rst: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); end LoadCnt; architecture RTL of LoadCnt is SIGNAL cnt: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN counter: PROCESS (clk, rst) BEGIN IF (rst = '1') THEN cnt <= (OTHERS => '0'); ELSIF (clk'event AND clk = '1') THEN 149 IF (load = '1') THEN cnt <= data; ELSE cnt <= cnt + 1; END IF; END IF; END PROCESS; q <= cnt; + Sử dụng TextIO để viết Testbench cho bộ đếm LoadCnt trên: Giả sử có file lƣu các vector kiểm tra cho bộ đếm nhƣ sau: END RTL; #Format is Rst, Load, Data, Q 0 1 11101111 11101111 #load the counter to all 1s 0 0 11101111 11110000 0 1 11111111 11111111 # #reset the counter 0 1 11011111 11011111 1 0 10101010 00000000 0 0 11011111 11100000 #now perform load/increment for each bit # 0 1 11111110 11111110 0 1 10111111 10111111 0 0 11111110 11111111 0 0 10111111 11000000 # # 0 1 11111101 11111101 0 1 01111111 01111111 0 0 11111101 11111110 0 0 01111111 10000000 # # 0 1 11111011 11111011 #check roll-over case 0 0 11111011 11111100 0 1 11111111 11111111 # 0 0 11111111 00000000 0 1 11110111 11110111 # 0 0 11110111 11111000 # End vectors + Mô tả Testbench # LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; USE ieee.std_logic_textio.all; LIBRARY std; USE std.textio.all; 150 ENTITY LoadCnt_tb IS END LoadCnt_tb; ARCHITECTURE behavior OF LoadCnt_tb IS COMPONENT LoadCnt PORT( data : IN std_logic_vector(7 downto 0); load : IN std_logic; clk : IN std_logic; rst : IN std_logic; q : OUT std_logic_vector(7 downto 0) ); END COMPONENT; constant clk_period : time := 1us; FILE vectorFile: TEXT OPEN READ_MODE is "vectorfile.txt";-- Trong cùng -- thư mục project SIGNAL Data: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL Load: STD_LOGIC; SIGNAL Rst: STD_LOGIC; SIGNAL Qout: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL Qexpected: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL TestClk: STD_LOGIC := '0'; CONSTANT ClkPeriod: TIME := 100 ns; BEGIN -- Free running test clock TestClk <= NOT TestClk AFTER ClkPeriod/2; -- Instance of design being tested u1: loadCnt PORT MAP (Data => Data, load => Load, clk => TestClk, rst => Rst, q => Qout ); -- File reading and stimulus application readVec: PROCESS VARIABLE VectorLine: LINE; VARIABLE VectorValid: BOOLEAN; VARIABLE vRst: STD_LOGIC; VARIABLE vLoad: STD_LOGIC; VARIABLE vData: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE vQ: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE space: CHARACTER; BEGIN 151 WHILE NOT ENDFILE (vectorFile) LOOP readline(vectorFile, VectorLine); -- put file data into line read(VectorLine, vRst, good => VectorValid); NEXT WHEN NOT VectorValid; read(VectorLine, space); read(VectorLine, vLoad); read(VectorLine, space); read(VectorLine, vData); read(VectorLine, space); read(VectorLine, vQ); WAIT FOR ClkPeriod/4; Rst <= vRst; Load <= vLoad; Data <= vData; Qexpected <= vQ; WAIT FOR (ClkPeriod/4) * 3; END LOOP; ASSERT FALSE REPORT "Simulation complete" SEVERITY NOTE; WAIT; END PROCESS; -- Process to verify outputs verify: PROCESS (TestClk) variable ErrorMsg: LINE; BEGIN IF (TestClk'event AND TestClk = '0') THEN IF Qout /= Qexpected THEN write(ErrorMsg, STRING'("Vector failed ")); write(ErrorMsg, now); writeline(output, ErrorMsg); END IF; END IF; END PROCESS; + Kết quả mô phỏng: 152 END; VHDL là một ngôn ngữ tiêu chuẩn, đƣợc quy định trong bộ tiêu chuẩn IEEE1076. Ban
đầu VHDL ra đời chủ yếu phục vụ cho việc mô hình hóa và mô phỏng hệ thống số, sau đó
nhiều công cụ đƣợc phát triển để có thể tự động tổng hợp đƣợc mã mô tả VHDL thành mô
hình mạch số vật lý thực hoạt động theo chức năng đã mô tả. Tuy nhiên, hiện nay không phải
tất cả các cấu trúc mã VHDL theo chuẩn IEEE1076 đều có thể tổng hợp đƣợc. Các cấu trúc
mã VHDL chủ yếu đƣợc dùng để mô hình hóa (modeling) và mô phỏng, trong đó chỉ có một
số cấu trúc VHDL có thể tổng hợp đƣợc (synthesis). Đa số các cấu trúc mã VHDL mô tả thiết kế theo mức RTL và các mô tả theo mô hình
cấu trúc sử dụng các cấu trúc lệnh song song và tuần tự không sử dụng mô hình thời gian trễ
đều có thể tổng hợp đƣợc. Một số cấu trúc mã VHDL mô tả theo mô hình hoạt động không sử
dụng mô hình thời gian trễ cũng có thể tổng hợp đƣợc. Các cấu trúc mã VHDL không tổng hợp đƣợc vẫn có thể sử dụng trong khi mô tả
VHDL cho hệ thống cần tổng hợp, nó chủ yếu dùng cho mô phỏng và bị công cụ tổng hợp bỏ
qua. + Các mô hình thời gian trễ không tổng hợp đƣợc, ví dụ: wait for 5 ns a <= b after 10 ns 153 + Các giá trị khởi tạo trong khai báo Signal, Port, hay Variable không tổng hợp đƣợc, và
thƣờng bị các công cụ tổng hợp bỏ qua, do đó cần sử dụng các tín hiệu Set và Reset thay thế
nếu cần thiết. + Các lệnh Report và Assert không tổng hợp đƣợc. + Các phép toán của đối tƣợng kiểu số thực Real không tổng hợp đƣợc bởi các công cụ tổng hợp hiện nay. + Các mô tả Flip-Flops hoạt động đồng thời ở cả sƣờn dƣơng và sƣờn âm xung Clock
hiện chƣa tổng hợp đƣợc bởi đa số các công cụ thiết kế cho CPLD/FPGA, ví dụ mô tả sau
không tổng hợp đƣợc: PROCESS (Clk) BEGIN IF rising_edge(Clk) or falling_edge(CLk) THEN Q <= D ; END IF ; END PROCESS ; Một số mô hình tín hiệu số dùng cho mô tả hệ thống số nhƣ sau: + Tín hiệu đơn + Tín hiệu Bus SIGNAL a : STD_LOGIC; + Ghép tín hiệu thành Bus SIGNAL b : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL b: STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL c: STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(9 DOWNTO 0); + Tách tín hiệu trong Bus 154 d <= a & b & c; -- Sử dụng phép tách SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL b: STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL c: STD_LOGIC; SIGNAL d: STD_LOGIC_VECTOR(9 DOWNTO 0); a <= d(9 downto 6); b <= d(5 downto 1); c <= d(0); -- Sử dụng Alias SIGNAL d: STD_LOGIC_VECTOR(9 DOWNTO 0); ALIAS a: STD_LOGIC_VECTOR(3 DOWNTO 0) IS d(9 downto 6); ALIAS b: STD_LOGIC_VECTOR(4 DOWNTO 0) IS d(5 downto 1); ALIAS c: STD_LOGIC IS d(0); Mô hình cấu trúc là mô hình mô tả cấu trúc bên trong của hệ thống gồm các thành phần
con và các kết nối giữa chúng. Mô hình này giống nhƣ sơ đồ khối hay mạch nguyên lý của hệ
thống. Mô hình cấu trúc của một phần tử (hoặc hệ thống) có thể bao gồm nhiều cấp cấu trúc
bắt đầu từ một cổng logic đơn giản đến xây dựng mô tả cho một hệ thống hoàn thiện. Sử dụng VHDL mô tả hệ thống theo mô hình cấu trúc có thể thực hiện theo 2 cách sau: + Cách thứ nhất đó là mô tả theo mô hình cấu trúc đƣợc phân tách bởi các cấu trúc lệnh
khác nhau dùng trong cùng một file mô tả VHDL. Các tín hiệu đƣơc sử dụng chung phù hợp
giữa các cấu trúc lệnh tạo ra sự kết nối giữa các khối con đƣợc mô tả bởi các cấu trúc lệnh đó. + Cách thứ hai là mỗi khối con sẽ đƣợc mô tả bởi một thực thể riêng, sau đó sử dụng
lệnh component để khai báo các thực thế con đó cho thiết kế, và dùng lệnh port map để gọi
và chọn mỗi khối con component và thực hiện kết nối các khối con đó với nhau tạo ra hệ
thống cần mô tả. Một số lƣu ý trong việc phân chia hệ thống thành các khối con: - Tối thiểu hóa số xung nhip Clock của mối khối: Rất quan trọng cho việc tối ƣu và thực hiện những ràng buộc về định thời. - Nên sử dụng thanh ghi để đệm tín hiệu ra mỗi mô-đun: Phù hợp với mô hình RTL. - Giữ những tín hiệu quan trọng trong một khối. - Tách thành các khối đủ nhỏ để việc kiểm tra nhanh và dễ dàng, việc viết testbench cho mỗi khối con cũng đơn giản hơn. - Kích thƣớc của các khối phù hợp để việc tổng hợp tối ƣu và có thể độc lập với công nghệ và công cụ. 155 Arithmetic y <= a
y <= a+1
y <= a-1
y <= b
y <= b+1
y <= b-1
y <= a+b
y <= a+b+cin Nhƣ vậy bộ ALU có chức năng thực hiện nhiều phép toán số học và logic, các phép
toán cần thực hiện của ALU đƣợc lựa chọn bởi tín hiệu Sel[3:0], nhƣ vậy có thể sử dụng bộ
ALU có cấu trúc mức RTL nhƣ sau: a[n:0] LogicUnit b[n:0] Mux y[n:0] ArithUnit Cin Sel[3:0] entity ALU is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Cin: in std_logic; Sel: in std_logic_vector(3 downto 0); y: out std_logic_vector(n downto 0)); end ALU; architecture Beh of ALU is begin -- Cách sử dụng lệnh tuần tự process(a,b,Cin,Sel) begin case Sel is when "0000" => y <= a; when "0001" => y <= a+1; when "0010" => y <= a-1; when "0011" => y <= b; when "0100" => y <= b+1; when "0101" => y <= b-1; 156 when "0110" => y <= a+b; when "0111" => y <= a+b+cin; when "1000" => y <= NOT a; when "1001" => y <= NOT b; when "1010" => y <= a AND b; when "1011" => y <= a OR b; when "1100" => y <= a NAND b; when "1101" => y <= a NOR b; when "1110" => y <= a XOR b; when others => y <= a XNOR b; end case; end process; end Beh; entity ALU is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Cin: in std_logic; Sel: in std_logic_vector(3 downto 0); y: out std_logic_vector(n downto 0)); end ALU; architecture Struct1 of ALU is signal y1, y2: std_logic_vector(n downto 0); begin -- Mô tả khối ArithUnit ArithUnit: with Sel(2 downto 0) select y1<= a when "000", a+1 when "001", a-1 when "010", b when "011", b+1 when "100", b-1 when "101", a+b when "110", a+b+Cin when others; -- Mô tả khối LogicUnit LogicUnit: with Sel(2 downto 0) select y2<= NOT a when "000", NOT b when "001", a AND b when "010", a OR b when "011", a NAND b when "100", a NOR b when "101", 157 a XOR b when "110", a XNOR b when others; -- Mô tả khối Mux Mux: with Sel(3) select y<= y1 when '0', y2 when others; end Struct1; -- Mô tả Mô-đun ArithUnit entity ArithUnit is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Cin: in std_logic; Sel: in std_logic_vector(2 downto 0); y: out std_logic_vector(n downto 0)); end ArithUnit; architecture Beh of ArithUnit is begin with Sel select y <= a when "000", a+1 when "001", a-1 when "010", b when "011", b+1 when "100", b-1 when "101", a+b when "110", a+b+Cin when others; -- Mô tả Mô-đun LogicUnit end Beh; entity LogicUnit is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Sel: in std_logic_vector(2 downto 0); y: out std_logic_vector(n downto 0)); end LogicUnit; architecture Beh of LogicUnit is begin with Sel select y <= NOT a when "000", NOT b when "001", a AND b when "010", 158 a OR b when "011", a NAND b when "100", a NOR b when "101", a XOR b when "110", a XNOR b when others; -- Mô tả Mô-đun Mux end Beh; entity Mux2 is Generic(n: natural:=8); Port( y1,y2: in std_logic_vector(n downto 0); Sel : in std_logic; y : out std_logic_vector(n downto 0)); end Mux2; architecture Beh of Mux2 is begin with Sel select y<= y1 when '0', y2 when others; -- Mô tả bộ cấu trúc bộ ALU end Beh; entity ALU is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Cin: in std_logic; Sel: in std_logic_vector(3 downto 0); y: out std_logic_vector(n downto 0) ); end ALU; architecture Struct2 of ALU is -- Khai báo các Component Component ArithUnit is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Cin: in std_logic; Sel: in std_logic_vector(2 downto 0); y: out std_logic_vector(n downto 0)); end Component; Component LogicUnit is Generic(n: natural:=8); Port( a,b: in std_logic_vector(n downto 0); Sel: in std_logic_vector(2 downto 0); y: out std_logic_vector(n downto 0)); end Component; 159 Component Mux2 is Generic(n: natural:=8); Port( y1,y2: in std_logic_vector(n downto 0); Sel: in std_logic; y: out std_logic_vector(n downto 0)); end Component; -- Khai báo tín hiệu nội bộ kết nối giữa các khối con Signal y1,y2: std_logic_vector(n downto 0); begin -- Gọi và kết nối các Khối con U1: ArithUnit Generic map(n) Port map(a,b,Cin,Sel(2 downto 0),y1); U2: LogicUnit Generic map(n=>n) Port map(a=>a,b=>b,Sel=>Sel(2 downto 0),y=>y2); U3: Mux2 Generic map(n) Port map(y1,y2,Sel(3),y); end Struct2; Để mô tả mạch tổ hợp có thể dùng các cấu trúc lệnh song song, và các Process tổ hợp (dùng các lệnh tuần tự). Sử dụng Process tổ hợp Sử dụng các cấu trúc
lệnh song song Mô tả mạch tổ hợp có thể dùng các cấu trúc lênh song song trong VHDL nhƣ sau: - Phép gán tín hiệu song song (<=) - Phép gán tín hiệu có điều kiện (when-else) - Phép gán tín hiệu theo lựa chọn (with-select-when) - Lệnh lặp song song (for-generate) Một số gợi ý về việc dùng lệnh song song để mô tả mạch tổ hợp nhƣ sau: Mạch tổ hợp gồm có: Dùng lệnh + Hàm logic đơn giản + Phép toán số hợp đơn giản (Cộng, Trừ, Nhân) Lệnh gán tín hiệu song song + Phép dịch và quay theo hằng số (<=) 160 Mạch tổ hợp gồm có: Dùng lệnh + Các bộ ghép kênh, phân kênh Lệnh gán tín hiệu có điều kiện (when-else) + Các bộ mã hóa, giải mã Lệnh gán tín hiệu theo lựa chọn (with-select-when) + Các bộ đệm 3 trạng thái - Các đối tƣợng đƣợc sử dụng trong các biểu thức ở vế trái/vế phải của phép gán <= when-else with select <= + Các tín hiệu nội bộ (khái báo trong phần
kiến trúc) + Các tín hiệu nội bộ (khái báo trong phần
kiến trúc) + Các cổng ở các chế độ (out, inout) + Các cổng ở các chế độ (in, inout) - Các phép toán số học có thể tổng hợp đƣợc (thành mạch tổ hợp) + Phép cộng (+) + Phép nhân (*) + Phép so sánh
(=, >,>=, <, <=) + Phép trừ (-) + Phép chia cho một số là lũy thừa của 2 (/2**6) - Để tổng hợp thành các phép toán của số không dấu: USE ieee.std_logic_unsigned.all USE ieee.std_logic_arith.all và sử dụng tín hiệu kiểu STD_LOGIC_VECTOR và sử dụng tín hiệu kiểu UNSIGNED - Để tổng hợp thành các phép toán của số có dấu: USE ieee.std_logic_signed.all USE ieee.std_logic_arith.all và sử dụng tín hiệu kiểu STD_LOGIC_VECTOR và sử dụng tín hiệu kiểu SIGNED - Các phép toán của tín hiệu (biến) kiểu Integer, Natural và các kiểu con (Subtype) của
chúng có thể tổng hợp đƣợc trong giới hạn nhƣ sau: - (231-1) (231 -1) với kiểu INTEGER các kiểu con của nó.
0 231 -1 với kiểu NATURAL và các kiểu con của nó. - Các phép toán của tín hiệu (biến) kiểu Integer, Natural và các kiểu con của chúng kém linh
hoạt và khó kiểm soát hơn các phép toán của tín hiệu (biến) kiểu STD_LOGIC_VECTOR UNSIGNED, SIGNED. do đó không đƣợc khuyến khích sử dụng. Mạch logic tổ hợp có thể mô tả bằng Process tổ hợp dùng các cấu trúc lệnh tuần tự. Tuy nhiên có một số quy tắc cần chú ý khi sử dụng nhƣ sau: 161 1. Tất cả các tín hiệu vào của mạch tổ hợp phải có trong danh sách tín hiệu kích thích của Process. 2. Không có bất kỳ tín hiệu nào khác ngoài các tín hiệu vào có trong danh sách tín hiệu kích thích. 3. Không sử dụng lệnh tuần từ nào có chứa các điều kiện kiểm tra sƣờn dƣơng và sƣờn âm của tín hiệu nào đó. 4. Hoặc phải gắn giá trị mặc định cho tất cả các tín hiệu ra hoặc tất cả các tổ hợp của tín
hiệu đầu vào cần đƣợc xác định trong các cấu trúc lệnh IF và CASE để tránh tổng hợp thành
các mạch chốt. 5. Khi mô tả mạch logic tổ hợp các biến đƣợc khai báo trong process không đƣợc gán
giá trị mặc định trƣớc vì để mạch tổng hợp đƣợc không chứa các phần tử nhớ. Nếu trong mã
mô tả có các biến đƣợc gán giá trị mặc định trƣớc thì chƣơng trình tổng hợp sẽ tạo ra các phần
tử nhớ để lƣu trữ các giá trị khởi tạo, mạch trở thành mạch có nhớ. + Xác định tất cả các trƣờng hợp của lệnh IF: + Gán giá trị mặc định cho tín hiệu ra: IF A = B THEN AeqB <= '1' ; AeqB <= '0' ;
IF A = B THEN AeqB <= '1' ; ELSE + Xác định tất cả các trƣờng hợp của lệnh CASE: + Gán giá trị mặc định cho tín hiệu ra: AeqB <= '0' ; Z <= "00"; CASE y IS WHEN S1 => Z <= "10"; CASE y IS WHEN S2 => Z <= "01"; WHEN S1 => Z <= "10"; WHEN OTHERS => Z <= "00"; WHEN S2 => Z <= "10"; Ví dụ Mô tả mạch tổ hợp dùng Process tổ hợp nhƣ sau: END CASE; END CASE; process (D, En) begin -- gán mặc định đầu ra process(A,B)
begin
Z <= A or B ;
end process; Q <= 0; if En = ‗1‘ then Q <= D ; end if ; Trƣờng hợp process tổ hợp không có phép gán giá trị mặc định cho đầu ra nên kết quả tổng hợp là mạch bị biến thành mạch chốt theo mức. 162 end process; -- Trong process không gán giá trị mặc
định Bảng trạng thái mạch chốt D-Latch Giản đồ thời gian (Tổng hợp thành mạch chốt theo mức) process (D, En)
begin
if En = ‗1‘ then Q <= D ;
end if ;
end process ; Có thể sử dụng các toán hạng logic để mô tả các hàm logic xác định (hàm boolean): Trong đó toán hạng “Not” có độ ƣu tiên cao nhất, còn các phép toán khác có độ ƣu tiên
nhƣ nhau. Do đó nếu không có dấu nhóm “( )” thì các toán hạng có độ ƣu tiên nhƣ sau sẽ
đƣợc thực hiện lần lƣợt từ trái sang phải. Ví dụ mô tả hàm: y = + Các mô tả sai: y <= a and not b or c and d ; y <= ((a and (not b)) or c) and d ; + Mô tả đúng: y <= (a and not b) or (c and d) ; not and or nand nor xor xnor Nếu mạch tổ hợp có sơ đồ cầu trúc đƣợc xây dựng từ các cổng logic cơ bản thì có thể sử dụng các toán hạng logic để mô tả cấu trúc đó. Ví dụ mô tả mạch ghép kênh Mux 2-1 có sơ đồ mạch nhƣ sau: Y<= (not s and a) or (s and b) 1. Mô tả Bộ đệm 3 trạng thái 8 bit: 163 architecture ...
signal I, O: std_logic_vector(7 downto 0); signal En: std_logic; begin
O <= I when (En='0') else (others=>'Z'); -- "ZZZZZZZZ" 2. Mô tả bộ đệm cho BUS hệ thống: end architecture; library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Tristate is generic ( width : integer := 7 ); port (En1, En2, En3 : in std_logic; Inp1, Inp2, Inp3: in std_logic_vector(width downto 0); Tribus: out std_logic_vector (width downto 0)); end Tristate; architecture RTL of Tristate is begin Tribus <= Inp1 when (En1 = '1') else (others => 'Z'); Tribus <= Inp2 when (En2 = '1') else (others => 'Z'); Tribus <= Inp3 when (En3 = '1') else (others => 'Z'); end RTL; A[15:0] Y Viết mô tả VHDL cho mạch ghép kênh MUX
16-1 (16 kênh vào A[15:0] và 1 kênh ra Y),
nhƣ vậy cần tín hiệu chọn kênh 4 bit Sel[3:0]. MUX Sel[3:0] -- Khai báo thực thể library IEEE; use IEEE.std_logic_1164.all; entity MUX16 is port ( 164 A : in std_logic_vector(15 downto 0); SEL : in std_logic_vector( 3 downto 0); Y : out std_logic); Có thể sử dụng các cấu trúc lệnh khác nhau kể cả lệnh song song và tuần tự để mô tả bộ
chọn kênh nhƣ trên. Dƣới đây là các mô tả phần architecture khác nhau cho cùng bộ chọn
kênh có khai báo thực thể nhƣ trên: end MUX16; -- Sử dụng lệnh tuần tự if architecture RTL1 of MUX16 is begin p0 : process (A, SEL) begin if (SEL = "0000") then Y <= A(0); elsif (SEL = "0001") then Y <= A(1); elsif (SEL = "0010") then Y <= A(2); elsif (SEL = "0011") then Y <= A(3); elsif (SEL = "0100") then Y <= A(4); elsif (SEL = "0101") then Y <= A(5); elsif (SEL = "0110") then Y <= A(6); elsif (SEL = "0111") then Y <= A(7); elsif (SEL = "1000") then Y <= A(8); elsif (SEL = "1001") then Y <= A(9); elsif (SEL = "1010") then Y <= A(10); elsif (SEL = "1011") then Y <= A(11); elsif (SEL = "1100") then Y <= A(12); elsif (SEL = "1101") then Y <= A(13); elsif (SEL = "1110") then Y <= A(14); else Y <= A(15); end if; end process; 165 end RTL1; -- Sử dụng lệnh tuần tự Case architecture RTL2 of MUX16 is begin p1 : process (A, SEL) begin case SEL is when "0000" => Y <= A(0); when "0001" => Y <= A(1); when "0010" => Y <= A(2); when "0011" => Y <= A(3); when "0100" => Y <= A(4); when "0101" => Y <= A(5); when "0110" => Y <= A(6); when "0111" => Y <= A(7); when "1000" => Y <= A(8); when "1001" => Y <= A(9); when "1010" => Y <= A(10); when "1011" => Y <= A(11); when "1100" => Y <= A(12); when "1101" => Y <= A(13); when "1110" => Y <= A(14); when others => Y <= A(15); end case; end process; end RTL2; -- Sử dụng lệnh song song with-select architecture RTL3 of MUX16 is begin with SEL select Y <= A(0) when "0000", A(1) when "0001", A(2) when "0010", A(3) when "0011", A(4) when "0100", A(5) when "0101", A(6) when "0110", A(7) when "0111", A(8) when "1000", A(9) when "1001", A(10) when "1010", A(11) when "1011", 166 A(12) when "1100", A(13) when "1101", A(14) when "1110", A(15) when others; end RTL3; -- Sử dụng lệnh gán song có điều kiện when-else architecture RTL4 of MUX16 is begin Y <= A(0) when SEL="0000" else A(1) when SEL="0001" else A(2) when SEL="0010" else A(3) when SEL="0011" else A(4) when SEL="0100" else A(5) when SEL="0101" else A(6) when SEL="0110" else A(7) when SEL="0111" else A(8) when SEL="1000" else A(9) when SEL="1001" else A(10) when SEL="1010" else A(11) when SEL="1011" else A(12) when SEL="1100" else A(13) when SEL="1101" else A(14) when SEL="1110" else A(15); end RTL4; -- Sử dụng hàm biến đổi từ vector 4 bit logic sang số Integer trong gói
IEEE.STD_LOGIC_UNSIGNED.ALL; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity MUX16 is port ( A : in std_logic_vector(15 downto 0); SEL : in std_logic_vector( 3 downto 0); Y : out std_logic); end MUX16; architecture RTL5 of MUX16 is begin Y <= A(conv_integer(SEL)); 167 end RTL5; Y[15:0] D MUX Viết mô tả VHDL cho mạch phân kênh
DEMUX 1-16 (1 kênh vào D và 16 kênh ra
Y[15:0]), nhƣ vậy cần tín hiệu phân kênh 4
bit Sel[3:0]. Sel[3:0] -- Khai báo thực thể library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity DEMUX is Port( D : in std_logic; Sel: in std_logic_vector( 3 downto 0); Y : out std_logic_vector( 15 downto 0)); Có thể sử dụng các cấu trúc lệnh khác nhau kể cả lệnh song song và tuần tự để mô tả bộ
phân kênh nhƣ trên. Dƣới đây là các mô tả phần architecture RTL1, Beh dùng lệnh tuần tự để
mô tả cho bộ phân kênh có khai báo thực thể nhƣ trên: end DEMUX; -- Sử dụng lệnh tuần tự Case architecture RTL1 of DEMUX is begin process(D,Sel) begin Y<=(others=>'0'); case SEL is when "0000" => Y(0)<=D; when "0001" => Y(1)<=D; when "0010" => Y(2)<=D; when "0011" => Y(3)<=D; when "0100" => Y(4)<=D; when "0101" => Y(5)<=D; when "0110" => Y(6)<=D; when "0111" => Y(7)<=D; when "1000" => Y(8)<=D; when "1001" => Y(9)<=D; when "1010" => Y(10)<=D; when "1011" => Y(11)<=D; when "1100" => Y(12)<=D; 168 when "1101" => Y(13)<=D; when "1110" => Y(14)<=D; when others => Y(15)<=D; end case; end process; end RTL1; -- Sử dụng hàm biến đổi từ vector 4 bit logic sang số Integer trong gói
IEEE.STD_LOGIC_UNSIGNED.ALL; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DEMUX2 is Port ( D : in STD_LOGIC; Sel : in STD_LOGIC_VECTOR (3 downto 0); Y : out STD_LOGIC_VECTOR (15 downto 0)); end DEMUX2; architecture Beh of DEMUX2 is begin process(D,Sel) begin Y<=(others=>'0'); Y(conv_integer(SEL))<=D; end process; end Beh; Các bộ mã hóa/giải mã đơn giản là đƣợc sử dụng để biến đổi mẫu tín hiệu vào thành
mẫu tín hiệu ra. Ví dụ nhƣ các bộ biến đổi mã nhƣ nhị phân – Gray, nhị phân-BCD, bộ biến
đổi mã BCD 4 bit - mã 7 đoạn 7 bit sử dụng cho màn chỉ thị dùng LED 7 đoạn, Mã hóa ƣu
tiên, giải mã địa chỉ … Ví dụ xây dựng bộ giải mã cho LED 7 đoạn mắc Anốt chung nhƣ hình dƣới đây: a
b
c
d
e
f
g
h Sơ đồ bộ giải mã cho LED 7 đoạn trên nhƣ sau: 169 Vcc Anot I[4:0] Seg[7:0] (abcdefgh) Bộ giải mã LED 7 đoạn (BINto7SEG) là một mạch tổ hợp, khai báo thực thể cho bộ giải mã đó nhƣ sau: -- Khai báo thực thể cho bộ giải mã BINto7SEG entity BINto7SEG is Port ( I : in STD_LOGIC_VECTOR (4 downto 0); -- I(0) điều khiển dấu chấm, I[4:1] giá trị cần hiển thị Seg : in STD_LOGIC_VECTOR (7 downto 0)); -- ―abcdefgh‖ Có thể sử dụng nhiều cấu trúc lệnh VHDL khác nhau để mô tả cho bộ giải mã này, nhƣ lệnh song song with-select, when-else, hay các lệnh tuần tự if, case… end BINto7SEG; architecture RTL1 of BINto7SEG is begin Seg(0)<= not I(0); -- Điều khiển dấu chấm (h) with I(4 downto 1) select --abcdefg Seg(7 downto 1)<= "0000001" when X"0", "1001111" when X"1", "0010010" when X"2", "0000110" when X"3", "1001100" when X"4", "0100100" when X"5", "0100000" when X"6", "0001111" when X"7", "0000000" when X"8", "0000100" when X"9", "0001001" when X"A", "0000000" when X"B", "0110001" when X"C", "0000001" when X"D", "0110000" when X"E", 170 "0011000" when others; -- X"F" end RTL1; có chức năng hoạt động nhƣ một bộ giải mã địa chỉ. Ví dụ bộ mã hóa 3-8 Bộ mã n-to-2n
có bảng trạng thái nhƣ sau: X[2:0] Y[7:0] En En X[2:0]
0
1
1
1
1
1
1
1
1 xxx
000
001
010
011
100
101
110
111 Y[7:0]
zzzzzzzz
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000 Mô tả cho bộ mã hóa Encoder 3-8 sử dụng cấu trúc lệnh song song nhƣ sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Encoder3to8 is Port ( X : in STD_LOGIC_VECTOR (2 downto 0); En: in STD_LOGIC; Y : out STD_LOGIC_VECTOR (7 downto 0)); end Encoder3to8; architecture RTL1 of Encoder3to8 is signal EnX: STD_LOGIC_VECTOR (3 downto 0); begin EnX <=En & X; with EnX select y<= "00000001" when "1000", "00000010" when "1001", "00000100" when "1010", "00001000" when "1011", "00010000" when "1100", "00100000" when "1101", "01000000" when "1110", "10000000" when "1111", (others=>'Z') when others; Mô tả bộ mã hóa Encoder n-to-2n, sử dụng tham số chung Generic 171 end RTL1; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Encoder is Generic (n: integer range 1 to 64:=3); Port ( X : in STD_LOGIC_VECTOR (n downto 0); En : in STD_LOGIC; Y : out STD_LOGIC_VECTOR (2**n-1 downto 0)); end Encoder; architecture Beh of Encoder is begin process(X,En) begin Y<=(others=>'0'); if En='0' then Y<=(others=>'Z'); else Y(conv_integer(X))<='1'; end if; end process; end Beh; Bộ mã hóa ƣu tiên là một mạch tổ hợp cho phép biến đổi đầu vào nhiều bit thành đầu ra
ít bit hơn. Kết quả đầu ra sẽ đƣợc mã hóa theo tín hiệu tích cực nào có mức độ ƣu tiên cao
nhất (không phụ thuộc vào trạng thái của các tín hiệu có mức độ ƣu tiên thấp hơn còn lại). Bộ
mã hóa ƣu tiên có thể đƣợc sử dụng để điều khiển các yêu cầu ngắt hoạt động theo yêu cầu có
độ ƣu tiên cao nhất. Ví dụ bảng trạng thái của bộ mã hóa ƣu tiên 8-3 (8 tín hiệu vào X[7:0] hoạt động ở mức tích cực cao “1” và mức độ ƣu tiên của các tín hiệu giảm dần theo trọng số của nó) nhƣ sau: X[7:0] Y[2:0] En D En
0
1
1
1
1
1
1
1
1
1 X[7:0]
xxxxxxxx
00000000
00000001
0000001x
000001xx
00001xxx
0001xxxx
001xxxxx
01xxxxxx
1xxxxxxx Y[2:0]
zzzz
000
000
001
010
011
100
101
110
111 D
z
0
1
1
1
1
1
1
1
1 172 Mô tả cho bộ mã hóa PriEncoder 8-3 sử dụng cấu trúc lệnh song song nhƣ sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity PriEncoder is Port ( X : in STD_LOGIC_VECTOR (7 downto 0); En : in STD_LOGIC; Y : out STD_LOGIC_VECTOR (2 downto 0); D : out STD_LOGIC); end PriEncoder; architecture RTL1 of PriEncoder is begin Y<= "ZZZ" when En='0' else "111" when X(7)='1' else "110" when X(6)='1' else "101" when X(5)='1' else "100" when X(4)='1' else "011" when X(3)='1' else "010" when X(2)='1' else "001" when X(1)='1' else "000"; D<= 'Z' when En='0' else '0' when X="00000000" else '1'; end RTL1; Các mạch tính toán số học là một thành phần quan trọng trong các bộ vi xử lý. Chúng
ảnh hƣởng đến hiệu năng, tốc độ tính toán của các bộ vi xử lý nên việc thiết kế chúng cũng là
công việc quan trọng trong quá trình thiết kế các bộ vi xử lý, cũng nhƣ vi điều khiển. Các cách mô tả để tổng hợp các mạch tính toán số học phổ biến nhƣ sau: + Mô tả theo mô hình hoạt động dùng các phép toán số học trong VHDL (+,-,*, / -Phép chia cho một số là lũy thừa của 2) – Xem lại những chú ý trong phần 4.6.1-a. + Mô tả theo mô hình mô hình cấu trúc: đây là cách thƣờng đƣợc sử dụng vì yêu cầu cần đảm bảo sự tối ƣu của mạch cũng nhƣ đảm bảo tốc độ tính toán. Sử dụng các phép toán số học trong VHDL thể đƣợc tổng hợp thành các mạch tính toán
số học cho các số có dấu và không dấu phụ thuộc vào phép toán (+,-,*, / -Phép chia cho một
số là lũy thừa của 2), kiểu toán hạng (xem phần 3.3.3-c, và cả gói dữ liệu đƣợc sử dụng cho
mã mô tả. 173 PACKAGE Kiểu toán hạng PACKAGE Kiểu toán hạng numeric_std Unsigned numeric_std Signed std_logic_arith Unsigned std_logic_arith Signed std_logic_unsigned Std_logic_vector std_logic_unsigned Std_logic_vector Bất kỳ kiểu dữ liệu số nào
Bất kỳ kiểu dữ liệu số nào Cùng kiểu L Cùng kiểu L
Cùng kiểu L
Cùng kiểu L Cùng kiểu L Cùng kiểu L Kiểu số nguyên
hoặc dấu phải động
Kiểu số nguyên,
Số Thực, Vật lý
Kiểu số nguyên
hoặc dấu phải động
Kiểu vật lý Cùng kiểu L Kiểu vật lý Kiểu số nguyên,
Số Thực, Vật lý
Kiểu số nguyên
hoặc dấu phải động
Kiểu số nguyên
hoặc số thực
Cùng kiểu L Kiểu số nguyên
Kiểu số nguyên Kiểu số nguyên
Cùng kiểu L
Cùng kiểu L Các công cụ tổng hợp hiện nay cho phép nhận dạng và tổng hợp các phép toán số học trong VHDL thành các mạch sau: + Bộ cộng (Adder) không có nhớ hoặc có nhớ vào và ra: * Carry In * Carry Out * Carry In/Out + Bộ trừ (Subtractor). + Bộ Cộng/Trừ (Adder/subtractor). + Bộ so sánh ( Comparators): =, /=,<, <=, >, >=. + Bộ nhân (Multiplier). + Bộ chia (Divider). use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Adder1 is Port ( Cin : in STD_LOGIC; X,Y : in STD_LOGIC_VECTOR (15 downto 0); S : out STD_LOGIC_VECTOR (15 downto 0); 174 Cout : out STD_LOGIC); end Adder1; architecture Beh of Adder1 is SIGNAL Sum : STD_LOGIC_VECTOR(16 DOWNTO 0) ; begin Sum <= ('0'& X) + Y + Cin ; S <= Sum(15 DOWNTO 0) ; Cout <= Sum(16); end Beh; - Sử dụng phép toán “+” trong thƣ viện IEEE.STD_LOGIC_SIGNED.ALL, trong thƣ viện này kiểu Std_logic_vector đƣợc hiểu số có dấu biểu diễn theo kiểu mã bù 2. - Sử dụng phép toán “+” trong thư viện IEEE.STD_LOGIC_SIGNED.ALL library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity SignedAdder is Port ( Cin : in STD_LOGIC; X,Y : in STD_LOGIC_VECTOR (15 downto 0); S : out STD_LOGIC_VECTOR (15 downto 0); Cout,Overflow : out STD_LOGIC); end SignedAdder; architecture Beh1 of SignedAdder is SIGNAL Sum : STD_LOGIC_VECTOR(16 DOWNTO 0) ; begin -- X,Y được hiểu là số có dấu biểu diễn theo kiểu số bù 2 Sum <= ('0' & X) + Y + Cin ; S <= Sum(15 DOWNTO 0) ; Cout <= Sum(16) ; Overflow <= Sum(16) XOR X(15) XOR Y(15) XOR Sum(15) ; - Sử dụng phép “+” trong thƣ viện IEEE.STD_LOGIC_ARITH.ALL, kết hợp với hàm ép kiểu. end Beh1; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; 175 entity SignedAdder2 is Port ( Cin : in STD_LOGIC; X,Y : in STD_LOGIC_VECTOR (15 downto 0); S : out STD_LOGIC_VECTOR (15 downto 0); Cout,Overflow : out STD_LOGIC); end SignedAdder2; architecture Beh2 of SignedAdder2 is Signal Sum: signed(16 downto 0); Signal SX, SY: signed (15 downto 0); begin SX<=signed(X); SY<=signed(Y); Sum <= ('0' & SX) + SY + Cin ; S <= Std_logic_vector(Sum(15 DOWNTO 0)); Cout <= Sum(16) ; Overflow <= Sum(16) XOR SX(15) XOR SY(15) XOR Sum(15) ; end Beh2; Khi mô tả các bộ nhân, độ dài bit của tích phải bằng tổng độ dài bit của 2 thừa số. Ví dụ Y[11:0]=A[7:0]*B[3:0]. LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all ; entity multiply is port( a : in STD_LOGIC_VECTOR(15 downto 0); b : in STD_LOGIC_VECTOR(7 downto 0); cu : out STD_LOGIC_VECTOR(11 downto 0); cs : out STD_LOGIC_VECTOR(11 downto 0) ); end multiply; architecture Beh of multiply is SIGNAL sa: SIGNED(15 downto 0); SIGNAL sb: SIGNED(7 downto 0); SIGNAL sres: SIGNED(23 downto 0); SIGNAL sc: SIGNED(11 downto 0); SIGNAL ua: UNSIGNED(15 downto 0); SIGNAL ub: UNSIGNED(7 downto 0); 176 SIGNAL ures: UNSIGNED(23 downto 0); SIGNAL uc: UNSIGNED(11 downto 0); begin -- signed multiplication sa <= SIGNED(a); sb <= SIGNED(b); sres <= sa * sb; sc <= sres(11 downto 0); cs <= STD_LOGIC_VECTOR(sc); -- unsigned multiplication ua <= UNSIGNED(a); ub <= UNSIGNED(b); ures <= ua * ub; uc <= ures(11 downto 0); cu <= STD_LOGIC_VECTOR(uc); end Beh; Bộ cộng 1 bit bán phần HA (Half-Adder) có cấu trúc logic, bảng trạng thái và mô tả VHDL nhƣ sau: + Ai là chữ số cột thứ i của số A. + Bi là chữ số cột thứ i của số B. + Si là kết quả phép cộng ở cột
thứ i. Ai
0
0
1
1 Bi
0
1
0
1 Si
0
1
1
0 Ci
0
0
0
1 + Ci là giá trị nhớ sang cột có
trọng số cao hơn kế tiếp. -- Mô tả bộ HA theo mô hình cấu trúc library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity HA is Port ( Ai,Bi : in STD_LOGIC; Si,Ci : out STD_LOGIC); end HA; architecture Structural of HA is begin Si<=Ai xor Bi; Ci<=Ai and Bi; 177 end Structural; Bộ cộng 1 bit toàn phần FA (Full-Adder) có cấu trúc logic, bảng trạng thái và mô tả VHDL nhƣ sau: Ai
(A)
0
0
0
0
1
1
1
1 Bi
(B)
0
0
1
1
0
0
1
1 Ci-1
(Cin)
0
1
0
1
0
1
0
1 Si
(S)
0
1
1
0
1
0
0
1 Ci
(Cout)
0
0
0
1
0
1
1
1 -- Mô tả bộ HA theo mô hình cấu trúc library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity FA is Port ( A,B,Cin : in STD_LOGIC; S, Cout : out STD_LOGIC); end FA; architecture Structural of FA is begin S<= A xor B xor Cin; Cout<= (A and B) or (A and Cin) or (B and Cin); Mạch cộng toàn phần song song 8 bit RPADDER (Carry Ripple Adder) có thể đƣợc xây dựng từ 8 bộ cộng toàn phần 1 bit FA mắc liên tiếp nhƣ Hình 4.13. 178 end Structural;
3. Bộ cộng toàn phần song song 8 bit Mô tả VHDL cho bộ cộng toàn phần 8 bit trên dùng lệnh song song nhƣ sau library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity RPADDER is Generic (N : Natural:=8); Port ( A,B : in STD_LOGIC_VECTOR (N-1 downto 0); Cin : in STD_LOGIC; S : out STD_LOGIC_VECTOR (N-1 downto 0); Cout: out STD_LOGIC); end RPADDER; architecture Structural1 of RPADDER is component FA port ( A,B,Cin : in STD_LOGIC; S, Cout : out STD_LOGIC); end component; signal C: STD_LOGIC_VECTOR (N downto 0); begin C(0)<=Cin; Gen:for i in A'range generate begin FAi: FA port map(A=>A(i), B=>B(i), Cin=>C(i), S=>S(i), Cout=>C(i+1)); end generate; Cout<=C(N); end Structural1; -- Có thể mô tả theo cấu trúc mức cổng logic như sau 179 architecture Structural2 of RPADDER is signal C: STD_LOGIC_VECTOR (N downto 0); begin C(0)<=Cin; Gen:for i in A'range generate begin S(i)<=A(i) xor B(i) xor C(i); C(i+1)<= (A(i) and B(i)) or (A(i) and C(i)) or (B(i) and C(i)); end generate; Cout<=C(N); end Structural2; Bộ dịch Barrel là một mạch logic tổ hợp quan trọng, đƣợc sử dụng khá phổ biến trong
các bộ Vi xử lý và Vi điều khiển. Bộ dịch Barrel có chức năng dịch hay quay dữ liệu đầu vào
N bit đi một số xác định vị trí trong một phép toán thực hiện duy nhất (hay một xung nhịp duy
nhất, nếu mạch sử dụng thanh ghi đệm dữ liệu). Chúng đƣợc sử dụng trong các bộ ALU của
các bộ vi xử lý mạnh, đặc biệt cho phép thực hiện các phép toán dấu phẩy động. Sơ đồ cấu trúc mạch của bộ dịch Barrel 8 bit sử dụng các bộ ghép kênh MUX nhƣ Hình
4.14. Đầu vào là Vector 8 bit. Đầu ra là phiên bản dịch trái logic của đầu vào, với lƣợng dịch
đƣợc định nghĩa bởi vector đầu vào 3 bit “Shift” (dịch từ 0 đến 7). Nhƣ vậy mạch gồm có 3
bộ dịch Barrel riêng lẻ, mỗi bit Shift sẽ điều khiển một bộ dịch. Ngoài ra bộ Barrel đầu tiên
chỉ có 1 đầu “0” đƣợc kết nối với một bộ MUX, trong khi bộ Barrel thứ 2 có 2 đầu vào “0” và
bộ Barrel cuối cùng có tới 4 đầu vào “0”. Mô tả VHDL cho bộ dịch Barrel theo mô hình hoạt động nhƣ sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity BARREL is Port (Inp : in STD_LOGIC_VECTOR (7 downto 0); Shift : in STD_LOGIC_VECTOR (2 downto 0); Outp : out STD_LOGIC_VECTOR (7 downto 0)); end BARREL; architecture Beh of BARREL is begin PROCESS (inp, shift) VARIABLE temp1: STD_LOGIC_VECTOR (7 DOWNTO 0); VARIABLE temp2: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN ---- Bo dich thu nhat ----- 180 IF (shift(0)='0') THEN temp1 := inp; ELSE temp1(0) := '0'; FOR i IN 1 TO inp'HIGH LOOP temp1(i) := inp(i-1); END LOOP; END IF; ---- Bo dich thu 2 ----- IF (shift(1)='0') THEN temp2 := temp1; ELSE FOR i IN 0 TO 1 LOOP temp2(i) := '0'; END LOOP; FOR i IN 2 TO inp'HIGH LOOP temp2(i) := temp1(i-2); END LOOP; END IF; ---- Bo dich thu 3 ----- IF (shift(2)='0') THEN outp <= temp2; ELSE FOR i IN 0 TO 3 LOOP outp(i) <= '0'; END LOOP; FOR i IN 4 TO inp'HIGH LOOP outp(i) <= temp2(i-4); END LOOP; END IF; END PROCESS; 181 end Beh; Kết quả mô phỏng hoạt động của bộ Barrel nhƣ sau: Khi mô tả VHDL với mục đích tổng hợp đƣợc, tất cả các cấu trúc ngôn ngữ và lệnh của
chƣơng trình sẽ đƣợc ánh xạ vào phần cứng cụ thể. Một cách để giảm kích thƣớc chung của
phần cứng tổng hợp đƣợc là xác định và sử dụng các tài nguyên có thể đƣợc sử dụng chung
cho nhiều phép toán khác nhau. Phƣơng pháp thiết kế nhƣ vậy đƣợc gọi phƣơng pháp thiết kế
dùng chung phép toán. Các phần mềm tổng hợp hiện nay chƣa đủ mạch để có thể tự động
phát hiện và chuyển đổi các mô tả ban đầu sang kiểu dùng chung tài nguyên, do đó mã VHDL
mô tả cho các hệ thống số cần thể hiện rõ đƣợc sự dùng chung tài nguyên đó. Trong một số cấu trúc VHDL, các phép toán có thể loại trừ lẫn nhau, ví dụ chỉ một phép
toán cần đƣợc thực hiện tại một thời điểm. Cấu trúc này bao gồm lệnh gán tín hiệu song song 182 có điều kiện when-else (hay tƣơng đƣơng là lệnh tuần tự if trong process), và lệnh gán tín
hiệu song song có lựa chọn with-select (hay tƣơng đƣơng là lệnh tuần tự case trong process). Nhƣ đã trình bày trong chƣơng 3, cấu trúc lệnh gán tín hiệu song song có điều kiện when-else nhƣ sau: ... Các With ... Các giá trị lựa chọn cũng loại trừ lẫn nhau, chỉ một biểu thức thực sự đƣợc thực hiện và
gán vào đầu ra tại thời điểm biểu _thức_lựa_chọn có giá trị bằng giá_trị_lựa_chọn tƣơng ứng.
Tình huống cũng xảy ra tƣơng tự với lệnh tuần tự if và case dùng trong process. Nhƣ vậy nếu có một phép toán nào đó đƣợc sử dụng chung cho các biểu_thức thì có thể
sử dụng chung phép toán đó. Việc dùng chung thƣờng đƣợc thực hiện bằng cách định tuyến
dữ liệu phù hợp vào hoặc ra phép toán dùng chung đó. Phƣơng pháp thiết kế này có thể đƣợc
minh họa rõ hơn thông qua các ví dụ dƣới đây. Các cách mô tả tƣơng đƣơng Sơ đồ khối mạch tổng hợp đƣợc Mô tả ban đầu cho mạch: r <= a+b when boolean_exp else + Cần dùng 2 mạch “+” và 1 mạch Mux, tại
mỗi thời điểm chỉ có một bộ “+” cần hoạt
động, nhƣ vậy có thể mô tả theo cách dùng
chung mạch “+”. a+c; Mạch “+” và mạch boolean_exp hoạt động đồng thời, có thể tránh đƣợc Hazard. 183 Trễ lan truyền: T1=(Tadder,Tboolean)+Tmux Mô tả dùng chung mạch “+”: + Nếu s=boolean_exp, hàm boolean của r nhƣ
sau: => r=(a+b).s+(a+c).s‟=a+(b.s+c.s‟) src0 <= b when boolean_exp else c; Trễ lan truyền: T2=Tboolean+Tmux+ Tadder
tăng hơn mạch ban đâu, nếu mạch
boolean_exp đơn giản, độ trễ nhỏ thì lỗi
Hazard không đáng kể. r <= a + arc0; Mô tả ban đầu cho mạch: Process(a,b,c,d,…) begin if boolean_exp_1 then r<=a+b; elsif boolean_exp_2 then r<=a+c; else r<=d+1; end if; Sơ đồ khối mạch tổng hợp đƣợc nhƣ sau: + Cần dùng 3mạch “+” và 2 mạch Mux, tại mỗi thời điểm chỉ có một bộ “+” cần hoạt động, nhƣ vậy có thể mô tả theo cách dùng chung mạch “+”. + Độ trễ lan truyền T1=(TAdder, Tboolean_exp)+2.TMux 184 end process; Mô tả theo cách dùng chung mạch “+”: Process(a, b,c ,d, . . .) begin if boolean_exp_1 then srcO <= a; srcl <= b; e1sif boolean_exp_2 then srcO <= a; srcl <= c; else srcO <= d; srcl <= (0=>‘1‘, others=>‘0‘); end if; end process; Sơ đồ khối mạch tổng hợp đƣợc nhƣ sau: + Cần dùng 1 mạch “+” và 4 mạch Mux, Nếu dung lƣợng cổng của bộ “+” lớn hơn bộ Mux thì mạch tổng hợp đƣợc cần ít tài nguyên hơn. + Độ trễ lan truyền: T1=TAdder+ Tboolean_exp+2.TMux, lớn hơn mạch ban đầu r <= srcO + srcl; Các cách mô tả tƣơng đƣơng Sơ đồ khối mạch tổng hợp đƣợ 185 Mô tả ban đầu cho mạch: with sel_exp select r <= a+b when "00", a+c when "01", + Cần dùng 3 mạch “+” và 1 mạch Mux, tại mỗi
thời điểm chỉ có một bộ “+” cần hoạt động, nhƣ
vậy có thể mô tả theo cách dùng chung mạch
“+”. + Độ trễ lan truyền T1=(TAdder, Tsel_exp)+TMux Mô tả theo cách dùng chung mạch “+”: Sơ đồ khối mạch tổng hợp đƣợc nhƣ sau: d+1 when others; with sel_exp select src0<= a when "00"|"01", d when others; with sel_exp select src1 <= b when "00", c when "01", (0=>'1', others=>'0') when others; + Cần dùng 1 mạch “+” và 2 mạch Mux. + Độ trễ lan truyền: T1= TMuxr+ Tsel_exp+TAdder,
lớn hơn mạch ban đầu. r <= src0+scr1; Mô tả ban đầu cho mạch: process(a,b,c,d,...) begin if boolean_exp then x<=a+b; y<=(others=>'0'); else x<=(0=>'1',others=>'0'); y<=c+d; end if; Sơ đồ khối mạch tổng hợp đƣợc nhƣ sau: 186 end process; + Cần dùng 2 mạch “+” và 2 mạch Mux. + Độ trễ lan truyền T1=(TAdder, Tboolean_exp)+TMux Mô tả theo cách dùng chung mạch “+”: process(a,b,c,d,...) begin if boolean_exp then scr0<=a; src1<=b; x<=sum; y<=(others=>'0'); else src0<=c; src1<=d; x<=(0=>'1', others=>'0'); y<=sum; end if; end process; Sơ đồ khối mạch tổng hợp đƣợc nhƣ sau: + Cần dùng 1 mạch “+” và 4 mạch Mux. + Độ trễ lan truyền: T1=TAdder+ Tboolean_exp+2.TMux, lớn hơn mạch ban đầu 187 sum<=src0+src1; Trong các hệ thống số lớn, phức tạp ví dụ nhƣ các bộ Vi xử lý, có rất nhiều chức năng.
Trong đó có một số chức năng đƣợc lặp lại và có những đặc tính chung. Nhƣ vậy có thể có
một số chức năng dùng chung một mạch hay hay dùng 1 chức năng để xây dựng các chức
năng khác. Đó là phƣơng pháp thiết kế dùng chung chức năng. Không giống nhƣ phƣơng
pháp thiết kế dùng chung phép toán, phƣơng pháp thiết kế dùng chung chức năng không có
một cách hệ thống nào để nhận dạng và thiết kế các chức năng dùng chung. Nó phụ thuộc vào
hệ thống cụ thể, và phụ thuộc vào cách hiểu cũng nhƣ cách tiếp cận hệ thống của ngƣời thiết
kế. Để minh họa phƣơng pháp thiết kế này, có thể xét một số ví dụ nhƣ dƣới đây: Ví dụ xây dựng mạch Cộng-Trừ 2 số có dấu 8 bit: Bảng chức năng của mạch Cộng-Trừ (AddSub) 2 số có dấu 8 bit nhƣ Hình 4.15-a. Trong đó tín hiệu Ctrl đƣợc sử dụng để lựa chọn phép toán mong muốn. Mô tả VHDL cho bộ cộng-trừ AddSub nhƣ sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity AddSub is Port ( a,b : in SIGNED(7 downto 0);-- Biểu diễn theo mã bù 2 Ctrl: in STD_LOGIC; r : out SIGNED(7 downto 0)); -- Biểu diễn theo mã bù 2 end AddSub; architecture Direct_Arch of AddSub is begin r<= a+b when Ctrl='0' else a-b; Với mô tả nhƣ trên sơ đồ khối của mạch AddSub tổng hợp đƣợc có thể nhƣ Hình 4.15- b, trong đó sử dụng 1 bộ Mux, 1 bộ “+” và 1 bộ “-“ 2 số có dấu 8 bit. Với phép “-“ 2 số có dấu biểu diễn theo mã bù 2 có thể chuyển sang thực hiện bằng . Nhƣ vậy có thể thiết kế bộ AddSub theo phƣơng phép “+” nhƣ sau:
pháp dùng chung chức năng (dùng 1 bộ “+”). , nhƣ Xét vậy có thể thực hiện phép “-“ 2 số có dấu 8 bit sử dụng bộ “+” 2 số có dấu 9 bit theo cách sau: . Mặt khác: Mô tả VHDL cho bộ cộng-trừ AddSub theo phƣơng pháp dùng chung chức năng nhƣ sau: 188 end Direct_Arch; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity AddSub2 is Port ( a,b : in SIGNED(7 downto 0); Ctrl: in STD_LOGIC; r : out SIGNED(7 downto 0)); end AddSub2; architecture Shared_Arch of AddSub2 is signal sum: SIGNED(8 downto 0); signal src0, src1: SIGNED(8 downto 0); begin src0<=a&'1'; src1(0)<='0' when Ctrl='0' else '1'; src1(8 downto 1) <= b when Ctrl='0' else signed(not std_logic_vector(b)); sum <= src0+src1; r <=sum(8 downto 1); Sơ đồ khối của mạch AddSub theo cách mô tả dùng chung chức năng nhƣ trên có thể tổng hợp đƣợc nhƣ Hình 4.15-c. a. Bảng chức năng b. Sơ đồ khối ban đầu c. Sơ đồ khối mạch theo phƣơng pháp dùng chung chức năng “+” end Shared_Arch; 189 Mạch logic tuần tự (hay còn gọi là mạch dãy - Sequential Circuit) là mạch hoạt động có
tính chất kế tiếp nhau, tức là trạng thái hoạt động của mạch không những phụ thuộc trực tiếp
đầu vào mà còn phụ thuộc vào trạng thái hiện tại của mạch. Nói cách khác các hệ thống này
làm việc theo nguyên tắc có nhớ. Sơ đồ khối chung của mạch tuần tự nhƣ Hình 4.16, trong đó
mạch tuần tự bao gồm phần tử nhớ (lƣu trạng thái hiện tại của mạch) và mạch logic tổ hợp
(xác định các điều kiện chuyển trạng thái tiếp theo và xác định đầu ra dựa vào tín hiệu vào và
trạng thái hiện tại). Có 2 kiểu mạch tuần tự chính phân loại theo thời điểm chuyển trạng thái của mạch mỗi khi có tín hiệu đầu vào mới đó là: + Mạch tuần tự đồng bộ: Hoạt động của mạch đƣợc xác định theo các tín hiệu của nó
tại các thời điểm rời rạc, trạng thái mới và kết quả đầu ra mới mỗi khi có tín hiệu vào mới
không đƣợc cập nhật ngay mà thƣờng đƣợc cập nhật đồng bộ theo tín hiệu đồng hồ Clock (tại
thời điểm có sƣờn dƣơng hoặc sƣờn âm của tín hiệu Clock). + Mạch tuần tự không đồng bộ: Trạng thái mới, kết quả đầu ra mới đƣợc cập nhật ngay
tại thời điểm có tín hiệu vào mới. Hoạt động của mạch liên tục mỗi khi tín hiệu vào thay đổi. Trong thực tế mạch tuần tự có thể vừa hoạt động đồng bộ theo tín hiệu Clock đối với
một số tín hiệu vào nào đó vừa hoạt động không đồng bộ với tín hiệu vào khác. Ví dụ Triger
D có thể vừa hoạt động với tín hiệu Reset đồng bộ, vừa hoạt động với tín hiệu Set không đồng
bộ. Trong chƣơng này chủ yếu tập trung vào mô tả và thiết kế mạch tuần tự đồng bộ hoặc
có đồng thời cả 2 chế độ đồng bộ và không đồng bộ. Mô tả và thiết kế mạch không đồng bộ
có thể đƣợc trình bày trong các tài liệu sau này. Mạch tuần tự có thể đƣợc mô tả bằng các lệnh tuần tự trong Process tuần tự hay tiến
trình hoạt động theo xung nhịp clock (clocked process). Trong process tuần tự có sử dụng
lệnh xác định sƣờn dƣơng hay sƣờn âm của xung nhịp Clock và có mô tả hoạt động của mạch
tại các thời điểm đó. Ví dụ: lệnh xác định sƣờn dƣơng (Clk‟event and Clk = „1‟),
rising_edge(Clk) hay sƣờn âm (Clk‟event and Clk = „0‟), falling_edge(Clk). Một số lƣu khi sử dụng lệnh tuần tự mô tả mạch tuần tự cho mục đích tổng hợp đƣợc: + Nên sử dụng lệnh If và Case cho Process tuần tự, hạn chế sử dụng lệnh lặp Loop và biến Variable. 190 + Tín hiệu xung nhịp clock bắt buộc phải có trong danh sách tín hiệu kích thích của
Process, và chỉ có các tín hiệu vào khác của mạch hoạt động theo chế độ không đồng bộ, ví dụ
Set hay Reset không đồng bộ. + Không đƣợc sử dụng Process không có danh sách tín hiệu kích thích. + Mỗi tín hiệu ra chỉ đƣợc gán trong một Process, để tránh xung đột. + Các biểu thức, lệnh trễ thời gian không tổng hợp đƣợc, ví dụ nhƣ: wait for 5 ns, a <= b after 10 ns. + Các giá trị khởi tạo cho tín hiệu hay biến không tổng hợp đƣợc và sẽ đƣợc bỏ qua bởi
công cụ tổng hợp, do đó nên dùng các tín hiệu Set và Reset thay thế cho việc khởi tạo giá trị
ban đầu. + Các công cụ tổng hợp hiện nay vẫn chƣa tổng hợp đƣợc mỗi khối mạch (mô tả bởi 1
process) hoạt động đồng thời ở cả sƣờn dƣơng và sƣờn âm của clock. Ví dụ mô tả sau không
thể tổng hợp đƣợc: PROCESS (clk) BEGIN IF (clk’EVENT AND clk=‘1’ ) THEN counter <= counter + 1; ELSIF (clk’EVENT AND clk=‘0’ ) THEN counter <= counter + 1; END IF; + Để mô tả các giải thuật nên thực hiện bằng các ngôn ngữ lập trình sau đó thực hiện chuyển đổi mã chƣơng trình đó sang VHDL sử dụng lệnh IF, CASE, LOOP, và Biến. + Mạch tuần tự đồng bộ hoàn toàn sẽ đƣợc mô tả bằng Process đồng bộ, với danh sách
tín hiệu kích thích chỉ có duy nhất tín hiệu clock, mọi biến đổi của mạch đƣợc đồng bộ theo
sƣờn clock), ví dụ Process(Clk). + Mạch tuần tự không đồng bộ hoàn toàn đƣợc mô tả bằng Prcocess không đồng bộ, với
danh sách tín hiệu kích thích không chỉ có tín hiệu Clock mà còn có các tín hiệu không đồng
bộ khác, ví dụ Process(Clk, Reset). END PROCESS; Từ mô tả VHDL, các công cụ tổng hợp hiện nay cho phép nhận dạng và tổng hợp các phần tử nhớ nhƣ Flip-Flops, Thanh ghi, Bộ nhớ gồm có các tín hiệu điều khiển nhƣ sau: + Set (Preset) / Clear (Reset) đồng bộ mức tích cực thấp hoặc cao. + Set (Preset) / Clear (Reset) không đồng bộ mức tích cực thấp hoặc cao. + Clock Enable mức tích cực thấp hoặc cao. + Mô tả DFF làm việc theo sườn dương với các tín hiệu Reset không đồng bộ: 191 process ( Clk, Reset )
begin + Mô tả DFF làm việc theo sườn âm với các tín hiệu Reset đồng bộ: if reset = ‗0‘ then
Q <= ‗0‘ ;
elsif (Clk`event and Clk = ‘1’) then
Q <= D ;
end if ;
end process ; process (Clk)
begin
if (Clk`event and Clk = ‘0’) then if reset = ‗1‘ then Q <= ‗0‘ ; elsif Q <= D ;
end if ; + Mô tả DFF sử dụng hàm xác định sƣờn dƣơng tín hiệu Clk: rising_edge(Clk) hoặc sƣờn âm falling_edge(Clk): end if ;
end process ; library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity DFF is Port (D,Clk,Set,Reset: in STD_LOGIC; Q : out STD_LOGIC); end DFF; architecture Beh of DFF is begin Process(Clk) => DFF hoạt động tích
cực ở sƣờn dƣơng Clk và có tín
hiệu Set, Reset đồng bộ và có
mức tích cực cao. begin if rising_edge(Clk) then if Reset='1' then Q<='0'; elsif Set='1' then Q<='1'; else Q<=D; end if; end if; end process; 192 end Beh; Process(Clk, Reset) begin if Reset='0' then Q<='0'; elsif Falling_edge(Clk) then if Set='1' then Q<='1'; else Q<=D; end if; end if; => DFF hoạt động tích
cực ở sƣờn âm Clk và có tín
hiệu Set đồng bộ mức tích cực
cao, tín hiệu Reset không đồng
bộ mức tích cực thấp. + Mô tả DFF có tín hiệu Clock Enable: end process; entity DFF is Port ( D,Clk, Set, Rst: in STD_LOGIC; CE: in STD_LOGIC; -- Clock Enable Q : out STD_LOGIC); end DFF; architecture Beh of DFF is begin Process(Clk) begin if Rising_edge(Clk) then => DFF hoạt động tích
cực ở sƣờn dƣơng Clk và có tín
hiệu Set đồng bộ tích cực cao,
Rst đồng bộ tích cực thấp và
tín hiệu Clock Enable (CE). if Rst='0' then Q<='0'; elsif Set='1' then Q<='1'; elsif CE='1' then Q<=D; end if; end if; end process; end Beh; - Sử dụng hàm rising_edge(Clk) và falling_edge(Clk) hay (Clk'event and Clk='1'), cũng
nhƣ (Clk'event and Clk='0') mô tả sƣờn dƣơng và âm, về mặt tổng hợp thì không có sự khác
biệt, nhƣng khi mô phỏng kết quả sẽ có một số điểm khác nhau. Ví dụ nếu nếu Clk thay đổi từ
„Z‟ lên „1‟ thì (Clk'event and Clk='1')=True trong khi đó rising_edge(Clk)=False. - Các tín hiệu vào không đồng bộ phải đƣợc đƣa vào danh sách tín hiệu kích thích và
mô tả trƣớc lệnh rising_edge(Clk), còn các tín hiệu đồng bộ không đƣợc đƣa vào danh sách
tín hiệu kích thích và đƣợc mô tả sau lệnh rising_edge(Clk). 193 Triger T (Toggle – lật) có chức năng duy trì và chuyển đổi trạng thái tùy thuộc vào tín
hiệu đầu vào T trong điều kiện định thời của xung nhịp Clk. TFF có vừa có thể đƣợc thiết lập
nhƣ một phần tử nhớ và vừa có thể thiết lập nhƣ một bộ chia đôi tần số xung Clk. Mô tả
VHDL cho T FF nhƣ sau: entity TFF is Port ( T, Clk : in STD_LOGIC; Q : out STD_LOGIC); end TFF; architecture Beh of TFF is signal Temp: STD_LOGIC; begin process (Clk) Qn
Qn-1
Not Qn-1 Clk
begin T
0
1 if Clk'event and clk='1' then if T='1' then Temp <= not Temp; end if; end if; end process; Q<=Temp; end Beh; - Mô tả Thanh ghi 8 bit (Reg8) có Reset đồng bộ và mức tích cực thấp: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Reg8 is Port ( D : in STD_LOGIC_VECTOR (7 downto 0); Clk: in STD_LOGIC; Reset: in STD_LOGIC; Q : out STD_LOGIC_VECTOR (7 downto 0)); end Reg8; architecture Beh of Reg8 is begin Process(Clk) begin if Rising_edge(Clk) then if Reset='0' then Q<=(others=>'0'); else Q<=D; end if; 194 end if; end process; - Mô tả thanh ghi dịch nối tiếp 4 bit: end Beh; Entity Shifter4 is Port ( Sin,Clock, Enable : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0)); End Shift4; Architecture Beh of Shifter4 is signal Qt:STD_LOGIC_VECTOR (3 downto 0); Begin PROCESS (Clock) BEGIN IF rising_edge(Clock) THEN IF Enable = '1' THEN Qt(0) <= Qt(1) ; Qt(1) <= Qt(2); Qt(2) <= Qt(3) ; Qt(3) <= Sin; END IF ; END IF ; END PROCESS ; Q <= Qt; End Beh; 195 library IEEE; use IEEE.STD_LOGIC_1164.ALL; Entity ShifterN is Generic (N: Integer:=8); Port ( Sin : in STD_LOGIC; D : in STD_LOGIC_VECTOR (N-1 downto 0); Clock : in STD_LOGIC; Load,Enable : in STD_LOGIC; Q : out STD_LOGIC_VECTOR (N-1 downto 0)); End ShifterN; Architecture Beh of ShifterN is signal Qt: STD_LOGIC_VECTOR(N-1 DOWNTO 0); Begin PROCESS (Clock) BEGIN IF rising_edge(Clock) THEN IF Load = '1' THEN Qt <= D ; ELSIF Enable = '1' THEN Genbits: FOR i IN 0 TO N-2 LOOP Qt(i) <= Qt(i+1) ; END LOOP; Qt(N-1) <= Sin ; END IF; END IF ; END PROCESS ; Q <= Qt; 196 end Beh; library ieee; use ieee.std_logic_1164.all; entity Latch is port( D : in std_logic_vector(3 downto 0); G, PRE : in std_logic; Q : out std_logic_vector(3 downto 0)); end latch; architecture archi of latch is begin process (PRE, G) begin if (PRE='1') then Q <= "1111"; elsif (G='0') then Q <= D; end if; end process; end archi; Trong thực tế có nhiều loại bộ đếm có các chức năng khác nhau, ví dụ bộ đếm tiến, đếm
lùi, bộ đếm mã nhị phân, mã thập phân, mã gray, bộ đếm vòng,… Sử dụng VHDL hoàn toàn
có thể mô tả đƣợc hoạt động của các loại bộ đếm này. Tuy nhiên từ mô tả VHDL, các công cụ
tổng hợp hiện nay chỉ mới cho phép nhận dạng đƣợc chức năng và tổng hợp đƣợc các bộ đếm
mã nhị phân có dấu và không dấu với các tín hiệu điều khiển nhƣ sau: + Set (Preset) / Clear (Reset) đồng bộ mức tích cực thấp hoặc cao. + Set (Preset) / Clear (Reset) không đồng bộ mức tích cực thấp hoặc cao. + Load – Nạp (từ tín hiệu hay hằng số) đồng bộ/không đồng bộ. + Chế độ đếm lên, Xuống, hay Lên/Xuống (Up, Down, Up/Down). + Clock sƣờn dƣơng/âm. + Clock Enable mức tích cực thấp hoặc cao. + Tổng hợp của tất cả các tín hiệu điều khiển trên. Bộ đếm thƣờng mã nhị phân có thể đƣợc mô tả theo mô hình hoạt động sử dụng các
phép toán “+” (đếm lên) hoặc “-“ (đếm xuống) số không dấu hoặc có dấu, tƣơng ứng sẽ tổng
hợp đƣợc các bộ đếm lên hoặc xuống số có dấu hoặc không dấu. Để mô tả chức năng đếm có thể dùng phép toán nhƣ sau: Q<=Q+1 Q<=Q-1 Phép gán tín hiệu tuần tự với các kiểu dữ liệu số
(Integer, Std_logic_vector, Signed, Unsigned) 197 Q:=Q+1 Q:=Q-1 Phép gán biến tuần tự với các kiểu dữ liệu số
(Integer, Std_logic_vector, Signed, Unsigned) Bộ đếm nhị phân n bit là bộ đếm có giá trị đếm trong khoảng từ 0 đến 2n-1 (đếm lên từ 0 đến 2n-1 và trở lại 0, hoặc đếm xuống từ 2n-1 về 0 và trở lại 2n-1). - Bộ đếm lên nhị phân 8 bit không dấu, Reset đồng bộ mức tích cực thấp: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity upCounter is Port ( Clk : in STD_LOGIC; Reset : in STD_LOGIC; Cnt : out STD_LOGIC_VECTOR(7 downto 0)); end upCounter; architecture Beh of upCounter is signal Q: STD_LOGIC_VECTOR(7 downto 0); begin UpCounter8bit:process(Clk) begin if rising_edge(Clk) then if Reset='0' then Q<=(others=>'0'); else Q<=Q+1; end if; end if; end process; Cnt<=Q; end Beh; - Bộ đếm xuống nhị phân 8 bit không dấu, Reset không đồng bộ mức tích cực cao: -- Phải sử dụng tín hiệu trung gian Q vì không thể gán trực tiếp
Cnt<=Cnt+1,vì Cnt là tín hiệu ra nên không được phép đọc vào ở biểu thức
(Cnt+1). library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity DownCounter is Port ( Clk : in STD_LOGIC; ResetxA : in STD_LOGIC; Cnt : out STD_LOGIC_VECTOR(7 downto 0)); end DownCounter; 198 architecture Beh of DownCounter is signal Q: STD_LOGIC_VECTOR(7 downto 0); begin DownCounter8bit:process(Clk, Reset) begin if ResetxA='1' then Q<=(others=>'1'); elsif rising_edge(Clk) then Q<=Q-1; end if; end process; Cnt<=Q; - Bộ đếm lên có nạp từ tín hiệu vào và Reset đồng bộ end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity UpCounter2 is Port(Clk : in STD_LOGIC; D : in STD_LOGIC_VECTOR (7 downto 0); Load, Rst : in STD_LOGIC; Cnt : out STD_LOGIC_VECTOR (7 downto 0)); end UpCounter2; architecture Beh of UpCounter2 is signal Q: STD_LOGIC_VECTOR(7 downto 0); begin UpCounter:process(Clk) begin if rising_edge(Clk) then if Load='1' then Q<=D; -- Nạp từ tín hiệu vào D elsif Rst='1' then Q<=(others=>'0'); else Q<=Q+1; end if; end if; end process; Cnt<=Q; - Bộ đếm nhị phân không dấu tiến 4 bit đầu ra Q [3:0] hoạt động với sƣờn dƣơng clock, có nạp đồng bộ hằng số “1010” mức tích cực cao: end Beh; 199 library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity counter is
port( Clk, SLOAD : in std_logic;
Q : out std_logic_vector(3 downto 0));
end counter;
architecture archi of counter is
signal tmp: std_logic_vector(3 downto 0);
begin
process (Clk)
begin
if (Clk'event and Clk='1') then
if (SLOAD='1') then tmp <= "1010";
else tmp <= tmp + 1; - Bộ đếm nhị phân không dấu xuống 4 bit đầu ra Q [3:0] hoạt động với sƣờn âm clock, có nạp không đồng bộ hằng số “1111” mức tích cực thấp: end if;
end if;
end process;
Q <= tmp;
end archi; library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity counter is
port( Clk, S : in std_logic;
Q : out std_logic_vector(3 downto 0));
end counter;
architecture archi of counter is
signal tmp: std_logic_vector(3 downto 0);
begin
process (Clk,S)
begin
if (S=’0’) then tmp<= "1111"; elsif (Clk'event and Clk='0') then
tmp <= tmp - 1; end if;
end process;
Q <= tmp; - Mô tả bộ đếm sử dụng kiểu dữ liệu số nguyên Integer: end archi; library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity iCounter is Port ( D : in Integer range 0 to 255; Load : in STD_LOGIC; Clk : in STD_LOGIC; Q : inout Integer range 0 to 255); end iCounter; 200 architecture Beh of iCounter is begin process(Clk) begin if rising_edge(Clk) then if Load='1' then Q<=D; else Q<=Q+1; end if; end if; end process; - Mô tả bộ đếm dùng biến, dùng hàm biến đổi dữ liệu end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; entity vCounter is Port ( Clk, Rst : in STD_LOGIC; Cnt : out STD_LOGIC_VECTOR(7 downto 0)); end vCounter; architecture Beh of vCounter is begin vCounter: process(Clk) variable Q: integer range 0 to 255; begin if rising_edge(Clk) then if Rst='0' then Q:=0; else Q:=Q+1; end if; end if; Cnt<=conv_std_logic_vector(Q,8); end process; end Beh; Bộ đếm thập phân có thể coi là bộ đếm mã BCD (đếm lên: 090, đếm xuống :
909). Bộ đếm này có thể có 1 số (1 digit) hay nhiều số (nhiều digit), mỗi digit sẽ là mã
BCD 4 bit nhận các giá trị thập phân từ 09 (từ “0000””1001” hay x”0” x”9”). Ví dụ bộ
đếm lên 3 digit có thể coi đó là bộ đếm thập phân từ (000 đến 999). - Mô tả Bộ đếm lên thập 1 digit đơn giản, Reset đồng bộ tích cực thấp: 201 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity UpCnt1Digit is Port (Clk : in STD_LOGIC; Reset : in STD_LOGIC; Digit : out STD_LOGIC_VECTOR (3 downto 0)); end upCnt1Digit; architecture Beh of UpCnt1Digit is Signal Q: STD_LOGIC_VECTOR (3 downto 0); begin process(Clk) begin if rising_edge(Clk) then if Reset='0' then Q<=x"0"; elsif Q=x"9" then Q<=x"0"; else Q<=Q+1; end if; end if; end process; Digit<=Q; Kết quả mô phỏng cho bộ đếm trên nhƣ sau: - Mô tả Bộ đếm lên thập 2 digit đếm từ 00 đến 99, Reset đồng bộ tích cực thấp: end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity UpCnt2Digit is Port(Clk : in STD_LOGIC; Reset : in STD_LOGIC; Digit1: out STD_LOGIC_VECTOR (3 downto 0); -- Đơn vị Digit2: out STD_LOGIC_VECTOR (3 downto 0)); -- Chục end UpCnt2Digit; 202 architecture Beh of UpCnt2Digit is Signal Q1,Q2: STD_LOGIC_VECTOR (3 downto 0); begin process(Clk) begin if rising_edge(Clk) then if Reset='0' then Q1<=x"0"; Q2<=x"0"; else if Q1=x"9" then Q1<=x"0"; if Q2=x"9" then Q2<=x"0"; else Q2<=Q2+1; end if; else Q1<=Q1+1; end if; end if; end if; end process; Digit1<=Q1; Digit2<=Q2; Kết quả mô phỏng cho bộ đếm trên nhƣ sau: - Mô tả bộ đếm thập phân lên/xuống 3 số có khoảng giá trị từ 123 đến 678, có tín hiệu nạp song song tín hiệu tích cực cao, tín hiệu Reset tích cực thấp: end Beh; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity UpDownCounter is 203 Port ( Clk,Up,Load,Rst: in STD_LOGIC; D1,D2,D3: in STD_LOGIC_VECTOR (3 downto 0); Digit1 : out STD_LOGIC_VECTOR (3 downto 0); Digit2 : out STD_LOGIC_VECTOR (3 downto 0); Digit3 : out STD_LOGIC_VECTOR (3 downto 0)); end UpDownCounter; -- Mô tả theo mô hình hoạt động mức hệ thống: architecture Beh of UpDownCounter is Signal Q1,Q2,Q3: STD_LOGIC_VECTOR (3 downto 0); begin process(Clk) begin if rising_edge(Clk) then if Load='1' then Q3<=D3; -- Nạp song song Q2<=D2; Q1<=D1; elsif Up='1' then -- Đếm lên if Rst='0' then Q3<=x"1"; Q2<=x"2"; Q1<=x"3"; else if (Q3=x"6") and (Q2=x"7") and (Q1=x"8") then Q3<=x"1"; Q2<=x"2"; Q1<=x"3"; elsif Q1=x"9" then Q1<=x"0"; if Q2=x"9" then Q2<=x"0"; if Q3=x"9" then Q3<=x"0"; else Q3<=Q3+1; end if; else Q2<=Q2+1; end if; else Q1<=Q1+1; end if; end if; else -- Đếm xuống 204 if Rst='0' then Q3<=x"6"; Q2<=x"7"; Q1<=x"8"; else if (Q3=x"1") and (Q2=x"2") and (Q1=x"3") then Q3<=x"6"; Q2<=x"7"; Q1<=x"8"; elsif Q1=x"0" then Q1<=x"9"; if Q2=x"0" then Q2<=x"9"; if Q3=x"0" then Q3<=x"9"; else Q3<=Q3-1; end if; else Q2<=Q2-1; end if; else Q1<=Q1-1; end if; end if; end if; end if; end process; Digit1<=Q1; Digit2<=Q2; Digit3<=Q3; end Beh; Có thể thực hiện chia tần số bằng bộ đếm, trong đó xung đầu vào cần chia tần đƣợc đƣa
tới đầu vào Clock của bộ đếm, đầu ra của bộ đếm chính tín hiệu đã đƣợc chia tần (hệ số chia
bằng mode đếm). Ví dụ bộ đếm mode N có thể thực hiện chia tần N lần. Ví dụ mô tả bộ chia tần số xung đầu vào 100MHz (Clk100M) thành xung có tần số 10MHz (Clk10M)? Để thực hiện bộ chia tần trên cần sử dụng bộ đếm nhị phân mode 10 (=100MHz/10kHz). Mô tả VHDL và kết quả mô phỏng của bộ chia tần này nhƣ sau: library IEEE; 205 use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity FreqDivider is Port ( Clk100M : in STD_LOGIC; Clk10M : out STD_LOGIC); end FreqDivider; architecture Beh of FreqDivider is Signal Cnt: integer range 0 to 9; begin process(Clk100M) begin if rising_edge(Clk100M) then if (Cnt=9) then Cnt<=0; Clk10M<='1'; else Cnt<=Cnt+1; Clk10M<='0'; end if; -- Clk10M có độ rộng xung bằng chu kỳ của xung Clk100M end if; end process; end Beh; Máy trạng thái hữu hạn FSM (Finite State Machine) hay còn gọi là Automat trạng thái
hữu hạn là mô hình mô tả hoạt động của một số loại mạch tuần tự có số trạng thái hữu hạn,
nhất là các mạch tuần tự lớn, phức tạp. Mô hình một FSM bao gồm các thành phần sau: + Biểu diễn các trạng thái. + Các tín hiệu vào + Các tín hiệu ra. 206 + Tập hàm xác định/Biểu diễn chuyển trạng thái + Hàm xác định các hoạt động ứng với mỗi trạng thái (xác định đầu ra ứng với mỗi trạng thái. Bên cạch đó một FSM còn cần đƣợc xác định các đặc tính nhƣ sau: - Máy trạng thái đồng bộ/không đồng bộ. - Máy trạng thái Mealy hay Moore - Trạng thái khởi tạo - Các trạng thái không sử dụng . Mỗi trạng thái xác định điều kiện bên trong duy nhất của hệ thống, theo thời gian FSM
chuyển từ trạng thái này sang trạng thái khác. Trạng thái mới đƣợc xác định bởi hàm xác định
chuyển trạng thái theo trạng thái hiện tại và các tín hiệu vào. FSM đồng bộ: Sự chuyển trạng thái đƣợc điều khiển bởi tín hiệu clock và chỉ xảy ra tại
sƣờn kích khởi dƣơng (hoặc âm) của tín hiệu clock. Trong bài giảng này chủ yếu tập trung
vào thiết kế, mô tả mạch tuần tự đồng bộ nói chung và FSM đồng bộ nói riêng. Hàm xác định đầu ra xác định giá trị của của các tín hiệu ra. Nếu tín hiệu ra có hàm xác
định chỉ phụ thuộc vào trạng thái hiện tại thì gọi là đầu ra Moore, còn tín hiệu ra nào có hàm
xác định phụ thuộc vào cả trạng thái hiện tại và tín hiệu vào thì gọi là đầu ra Mealy. Nếu FSM
chỉ có các đầu ra Moore thì đƣợc gọi là máy trạng thái Moore, còn nếu chỉ có các đầu ra
Mealy thì đƣợc gọi là máy trạng thái Mealy. Tuy nhiên FSM thực tế có thể gồm có cả các đầu
ra Moore và Mealy. Kiến trúc mạch tuần tự của máy trạng thái hữu hạn nhƣ sau: tại. Đầu ra Đầu vào Xác định
Đầu ra Thanh ghi
trạng thái
hiện tại Xác định
Trạng thái
tiếp theo Clock hiệu vào. Đầu ra Đầu vào Xác định
Đầu ra Thanh ghi
trạng thái
hiện tại Xác định
Trạng thái
tiếp theo Clock 207 Trong thực tế hệ thống số thƣờng đƣợc mô tả bằng việc kết hợp cả mô hình Moore và Mealy và sử dụng thêm thanh ghi đầu ra: Đầu ra Thanh
ghi
đầu ra Moore Moore Đầu vào Xác định
Đầu ra Xác định
Trạng thái
tiếp theo Mealy Thanh ghi
trạng thái
hiện tại Mealy Clock Thanh
ghi
đầu ra Ứng dụng chính của FSM là để mô tả các phép toán (hoạt động) đƣợc thực hiện theo một
chuỗi các bƣớc. Các hệ thống số lớn thƣờng có các giải thuật và thực hiện nhiệm vụ phức tạp,
chúng có thể đƣợc biểu diễn nhƣ là chuỗi các hành động dựa trên trạng thái hệ thống và các
lệnh bên ngoài. FSM có thể có chức năng nhƣ là mạch điều khiển (Controller) để phối hợp và
quản lý hoạt động của các khối khác trong hệ thống (đó là khối đƣờng dữ liệu Data Path theo
mô hình RTL). Một đồ hình trạng thái SD gồm các nút trạng thái (biểu diễn bằng vòng tròn) và các cung có hƣớng biểu diễn chuyển đổi giữa các trạng thái. Cách biểu diễn nút trạng thái và các cung chuyển trạng thái nhƣ sau: Mỗi nút biểu diễn một trạng thái duy nhất, có nhãn là tên trạng thái (state_Name) hoặc
mã trạng thái, mỗi cung biểu diễn một chuyển đổi từ trạng thái đó đến 1 trạng thái khác và
đƣợc đặt nhãn bằng điều kiện để thực hiện chuyển đổi đó. B biểu thức xác định định điều kiện
trạng thái “logic expression(Inputs)” là hàm phụ thuộc vào trạng thái hiện tại và các đầu vào - 208 Inputs. Với FSM đồng bộ, tại thời điểm sƣờn clock, nếu biểu thức điều kiện chuyển trạng thái
“logic expression(Inputs)” =‟1‟ hay “True” thì chuyển đổi trạng thái đó đƣợc thực hiện. Ngoài ra nếu điều kiện chuyển trạng thái ghi là not (logic expression) hay thì điều kiện chuyển trạng thái tƣơng đƣơng là “logic expression(Inputs)”=‟0‟. Giá trị đầu ra Inputs cũng có thể đƣợc xác định trên đồ hình trạng thái, hàm xác định giá
trị cho các đầu ra moore (mo) thƣờng đƣợc viết ngay trong nút biểu diễn trạng thái, còn các
đầu ra mealy (me) phụ thuộc vào cả trạng thái hiện tại và đầu vào nên thƣờng đƣợc viết dƣới
các biểu thức điều kiện của các cung chuyển trạng thái. Để đơn giản, trên đồ hình trạng thái có thể chỉ nên biểu diễn các tín hiệu ra đƣợc gán giá
trị tích cực, thƣờng thì các tín hiệu ra đƣợc biểu diễn trên đồ hình mặc định sẽ đƣợc gán giá trị
tích cực bằng (ví dụ „1‟). Tất cả các tín hiệu ra sẽ đƣợc gán giá trị mặc định (ví dụ „0‟) nếu
hàm xác định của nó không đƣợc viết trên đồ hình. Bên cạch đó nếu hàm xác định đầu ra phức tạp thì có thể dùng bảng trạng thái kèm với
đồ hình trạng thái để biểu diễn hàm xác định này hoặc ô viết hàm xác định hàm ra ngay cạnh
mỗi nút trạng thái. Ví dụ các biểu diễn đồ hình trạng thái của bộ kiểm tra chẵn lẻ nhƣ sau: Bộ kiểm tra lẻ Cách biểu diễn FSM đầy đủ Cách biểu diễn FSM rút gọn I Out Reset Clk Odd Parity
Checker
(FSM) + I là chuỗi tín hiệu nhị phân
vào nối tiếp. + Nếu số bít „1‟ trong chuỗi
bit vào I là số lẻ thì Out=‟1‟. + Mạch sẽ có 2 trạng thái
chẵn (Even) và lẻ (Odd). Đồ
hình trạng thái của mạch
nhƣ hình bên. + Out là đầu ra moore. 209 Bộ phân xử ngắt - Arbiter Cách biểu diễn FSM đầy đủ Cách biểu diễn FSM rút gọn Ví dụ đồ hình trạng thía Mealy: Lƣu đồ giải thuật máy trạng thái (Algorithmic state machine charts: ASM charts) là sự trừu tƣợng hóa hoạt động của máy trạng thái theo lƣu đồ giải thuật. Các thành phần của một ASM nhƣ Hình 4.20. Trong đó mỗi trạng thái có thể đƣợc mô tả chi tiết bởi 3 thành phần chính nhƣ sau: - Hộp trạng thái: Có để đƣợc dùng để xác tính các hành động và tín hiệu ra kiểu Moore. - Hộp kiểm tra điều kiện: Xác định các điều kiện chuyển trạng thái và điều kiện xác định các đầu ra hay hành động kiểu Mealy. - Hộp xác định tín hiệu ra có điều kiện: Có để đƣợc dùng để xác tính các hành động và tín hiệu ra kiểu Mealy, theo các điều kiện đầu vào đã kiểm tra. Bên cạnh đó “Tên trạng thái”, cũng nhƣ “mã hóa trạng thái” cũng có thể đƣợc xác định rõ trong các thành phần của ASM. 210 Một máy trạng thái có thể đƣợc biểu diễn theo đồ hình trạng thái FSMD hoặc lƣu đồ
giải thuật máy trạng thái ASM. Hai cách biểu diễn là hoàn toàn tƣơng đƣơng. Tuy nhiên với
những máy trạng thái mà các mô tả đầu ra là chuỗi nhiều hoạt động với các điều kiện khác
nhau thì ASM hay đƣợc sử dụng hơn, ví dụ nhƣ khi mô tả các bộ vi xử lý, kiến trúc máy tính
thì ASM thƣờng đƣợc sử dụng. Một số ví dụ biểu diễn tƣơng đƣơng sử dụng FSMD và ASM cho cùng một máy trạng thái nhƣ sau: 211 Bảng sau cho biết khả năng mô tả đồ hình trạng thái dùng VHDL: - Trạng thái logic hiện tại
- Xác định trạng thái logic tiếp theo
- Xác định đầu ra
- Đặt tên cho các trạng thái 212 5
6 - Đánh giá mỗi trạng thái
- Đánh giá các điều kiện đầu vào - Lệnh Case
- Lệnh if/else Cách sử dụng kiểu dữ liệu liệt kê để đặt tên cho các trạng thái nhƣ sau: architecture RTL of FSM is
. . .
type My_State is ( Init, Load, Fetch, Stor_A, Stor_B) ;
--Mã hóa mạch định:000, 001, 010, 011, 100 signal Current_State, Next_State : My_State;
. . . Begin ... Cách sử dụng hằng để mã hóa các trạng theo nhƣ mong muốn nhƣ sau: End RTL; subtype My_State is std_logic_vector( 0 to 5 ) ;
constant Init : My_State := ―111000‖ ;
constant Load : My_State := ―101010‖ ;
constant Init : My_State := ―000011‖ ;
signal Current_State, Next_State : My_State ;
. . . begin - Để mô tả quá trình chuyển đổi trạng thái và cập nhật kết quả đầu ra ứng với mỗi trạng thái thông thƣờng sử dụng cách mô tả bằng nhiều tiến trình + Tiến trình cập nhập trạng thái mới của hệ thống (tiến trình Sync). . . . Sync: process ( CLK , RST)
begin . . . + Tiến trình kiểm tra điều kiện chuyển đổi trạng thái (tiến trình Comb). end process Sync ; Comb: process ( Current_State, In1, In2…)
begin . . . + Tiến trình cập kết quả đầu ra ứng với mỗi trạng thái (tiến trình Outputs). end process Comb ; Outputs: process ( Current_State, In1, In2…)
begin . . . end process Outputs ; 213 Hoạt động của đèn giao thông tại một ngã tƣ có nhiều chế độ
khác nhau tùy theo từng thời điểm trong ngày. Tuy nhiên về cơ
bản thì tại thời điểm ban ngày hoạt động của đèn gồm có 4
trạng thái chính nhƣ sau: RG timeRG (20s) RY timeRY (5s) GR timeGR (20s) Cột đèn giao thông cho 2
hƣớng tại một ngã tƣ. YR timeYR(5s) Đồ hình trạng thái mô tả hoạt động của bộ đèn giao thông trên
nhƣ sau: Mô tả VHDL cho bộ điều khiển đèn giao thông tại ngã tư theo mô hình trên
như sau: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TrafficLight is Port ( Clk : in STD_LOGIC; Rst : in STD_LOGIC; L1 : out STD_LOGIC_VECTOR (2 downto 0); L2 : out STD_LOGIC_VECTOR (2 downto 0)); end TrafficLight; architecture Beh_Good_Code of TrafficLight is type my_state is(RG,RY,GR,YR); signal cst,nst : my_state ; 214 constant TRG: integer := 10 ;-- timeRG constant TRY: integer := 2 ;-- timeRY constant TGR: integer := 10 ;-- timeGR constant TYR: integer := 2 ;-- timeYR constant Tmax:integer := 100; SIGNAL CNT : integer; SIGNAL clk1s: std_logic; SIGNAL T,T1 : integer range 0 to Tmax; Signal Timer: integer range 0 to Tmax:=0; begin -- Tạo xung clk 1s FreqDiv: PROCESS( CLK) -- 10Hz begin if(clk'event and clk='1') then if(rst= '1') then CNT<= 0; CLK1S<='0'; ELSE IF(CNT =9) THEN CLK1S<='1'; CNT<=0; ELSE CNT<=CNT+1; CLK1S<='0'; END IF; END IF; END IF; END PROCESS; Sync: PROCESS(CLK1S,T1) BEGIN IF (CLK1S='1'AND CLK1S'EVENT) THEN IF RST='1' then CST<=GR; T1<=TGR; Timer<=0; ELSE if (Timer=T1) then CST<=NST; T1<=T; Timer<=0; else Timer<=Timer+1; end if; end if; 215 end if; end process; comb:process(cst) begin case cst is when gr => nst<= YR; T<=TYR; when YR => nst<= RG; T<=TRG; when RG => nst<= RY; T<=TRY; when others => nst<= GR; T<=TGR; end case; end process; outputs:process(CST) begin case CST is when GR => L1<= "010"; L2<= "100"; when YR => L1<= "001"; L2<= "100"; when RG => L1<= "100"; L2<= "010"; when others => L1<= "100"; L2<= "001"; end case; end process; end Beh_Good_Code; UP UpdownCounter Z RESET CLK Hình 9.10 – Mô hình bộ đếm thuận nghịch Hoạt động của bộ đếm có thể đƣợc mô tả theo đồ hình trạng thái (Mô hình Máy trạng thái Mealy) nhƣ hình 9.11. Bộ đếm có tín hiệu RESET đồng bộ, mức tích cực cao: Khi RESET=‟1‟ bộ đếm sẽ đƣợc xóa về trạng thái S0. Khi UP=‟1‟ – Bộ đếm thực hiện đếm lên (đếm thuận), ngƣợc lại UP=‟0‟ bộ đếm thực hiện đếm xuống (Đếm nghịch). 216 Hình 9.11 – Đồ hình trạng thái của bộ đếm thập phân thuận nghịch Mô tả VHDL cho đồ hình trạng thái trên nhƣ sau: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY FSM IS PORT (CLK,RESET,UP: IN std_logic; Z : OUT std_logic); END; ARCHITECTURE BEHAVIOR OF FSM IS SIGNAL sreg : std_logic_vector (3 DOWNTO 0); SIGNAL next_sreg : std_logic_vector (3 DOWNTO 0); CONSTANT S0 : std_logic_vector (3 DOWNTO 0) :="0000"; CONSTANT S1 : std_logic_vector (3 DOWNTO 0) :="0001"; CONSTANT S2 : std_logic_vector (3 DOWNTO 0) :="0010"; CONSTANT S3 : std_logic_vector (3 DOWNTO 0) :="0011"; CONSTANT S4 : std_logic_vector (3 DOWNTO 0) :="0100"; CONSTANT S5 : std_logic_vector (3 DOWNTO 0) :="0101"; CONSTANT S6 : std_logic_vector (3 DOWNTO 0) :="0110"; CONSTANT S7 : std_logic_vector (3 DOWNTO 0) :="0111"; CONSTANT S8 : std_logic_vector (3 DOWNTO 0) :="1000"; CONSTANT S9 : std_logic_vector (3 DOWNTO 0) :="1001"; SIGNAL next_Z : std_logic; 217 BEGIN Sync: PROCESS (CLK) –- Cập nhật trạng thái mới của bộ đếm BEGIN IF CLK='1' AND CLK'event THEN if RESET='1' then sreg<= S0; else sreg <= next_sreg; end if; END IF; END PROCESS; Comb: PROCESS (sreg,UP) –- Kiểm tra điều kiện chuyển trạng thái BEGIN CASE sreg IS WHEN S0 => IF ( UP='0' ) THEN next_sreg<=S9; ELSE next_sreg<=S1; END IF; WHEN S1 => IF ( UP='0' ) THEN next_sreg<=S0; ELSE next_sreg<=S2; END IF; WHEN S2 => IF ( UP='0' ) THEN next_sreg<=S1; ELSE next_sreg<=S3; END IF; WHEN S3 => IF ( UP='0' ) THEN next_sreg<=S2; ELSE next_sreg<=S4; END IF; WHEN S4 => IF ( UP='0' ) THEN next_sreg<=S3; ELSE next_sreg<=S5; END IF; WHEN S5 => IF ( UP='0' ) THEN next_sreg<=S4; ELSE next_sreg<=S6; END IF; WHEN S6 => IF ( UP='0' ) THEN next_sreg<=S5; ELSE next_sreg<=S7; END IF; 218 WHEN S7 => IF ( UP='0' ) THEN next_sreg<=S6; ELSE next_sreg<=S8; END IF; WHEN S8 => IF ( UP='0' ) THEN next_sreg<=S7; ELSE next_sreg<=S9; END IF; WHEN S9 => IF ( UP='0' ) THEN next_sreg<=S8; ELSE next_sreg<=S0; END IF; WHEN OTHERS => next_sreg<=S0; END CASE; END PROCESS; Outputs: PROCESS (sreg,UP) —-Tính kết quả đầu ra BEGIN IF UP='1' THEN if sreg=S9 then Z<= '1'; else Z<= '0'; end if; ELSE if sreg=S0 then Z<= '1'; else Z<= '0'; end if; END IF; END PROCESS; 219 END BEHAVIOR; 220 1. Viết mô tả VHDL theo mô hình hoạt động của bộ so sánh (=, /=,<, <=, >, >=) 2 số 8 bit không dấu? 2. Viết mô tả VHDL theo mô hình hoạt động của bộ so sánh (=, /=,<, <=, >, >=) 2 số 8 bit có dấu? 3. Viết mô tả VHDL theo mô hình hoạt động cho bộ chia số có dấu hoặc không dấu 16 bit cho 2n? 4. Thiết kế, viết mô tả VHDL và testbench cho mạch nhân và chia 8 bit dấu phẩy tĩnh theo mô hình cấu trúc. 5. Thiết kế, viết mô tả VHDL và testbench cho mạch cộng nhớ nhanh CLA(Carry Look Ahead Adder) 8 bit theo mô hình cấu trúc. 6. Mô tả bộ đếm tiến 60 7. Mô tả Bộ đếm và hiển thị thời gián thực (giờ, phút, giây) 221 Trong các thiết kế số thực tế đều biểu diễn dƣới dạng số nhị phân. Vì vậy để hiển thị các
số thập phân ngƣời ta phải dùng màn chỉ thị số. Và màn chỉ thị số thông dụng nhất chính là
LED 7 đọan. sau đây là mô hình LED 7 đoạn: a, Anốt chung b, Catốt chung - Sơ đồ nguyên lí của LED 7 thanh 222 Để hiện thị các số từ 0 đến 9 ta cần xác định vị trí các LED sáng. Chẳng hạn ta lấy ví dụ đối với loại Anốt chung: Để thiết kế đƣợc tối ƣu, ngƣời ta thƣờng sử dụng nguyên lý quét để tiết kiệm chân điều khiển và điện năng. Sau đây là sơ đồ nguyên lý khi sử dụng nguyên lý quét: Nguyên lí quét : + Ban đầu LED 1 sẽ đƣợc hiển thị bằng cách cấp nguồn cho LED1, và dữ liệu sẽ đƣợc đƣa váo các chân điều khiển của LED1. + Sau đó lần lƣợt các LED2, LED3,LED4 đƣợc hiển thị với dữ liệu tƣơng ứng của tƣng con LED 7 thanh trong rất nhiều chu kì. + Và cứ tiếp tục nhƣ vậy các LED đƣợc quét theo thứ tự. + Do sự lƣu ảnh trên võng mạc nên khi ta quan sát gần nhƣ sáng liên tục. 223 Chọn Kênh ROM MẠCH
CÔNG SUẤT KHỐI ĐIỀU KHIỂN KHỐI CHIA
TẦN CLK Phân tích chứ năng của từng khối: + Khối chọn kênh: Khối có chức năng chọn dữ liệu điều khiển hàng. + Khối chia tần: Có nhiệm vụ tạo các tần số phù hợp với các khối để điều khiển. + ROM : Lƣu các mã từ thập phân sang LED 7 đoạn. + Khối Công suất: Do dòng đƣa vào điều khiển từ kit là nhỏ vì vậy ta phải dùng khối công suất. + Khối điều khiển: Đây là khối đƣa ra các tín hiệu điều khiển chung cho tất cả các khối bên trong. Từ sơ đồ triển khai ở phần trên sử dụng phần mềm ISE để nhập thiết kế, thực hiện tổng
hợp và nạp cấu hình cho CPLD trên KIT. Dùng ngôn ngữ mô tả phần cứng VDHL để nhập
thiết kế. Bộ điều khiển màn chỉ thị LED đƣợc môt tả trong thực tế có mô hình sau: 224 HN HT SEG(abcdefg) HC HDV AN CLK library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity LED7THANH_VHDL is Port ( HN : in STD_LOGIC_VECTOR (3 downto 0); HT : in STD_LOGIC_VECTOR (3 downto 0); HC : in STD_LOGIC_VECTOR (3 downto 0); HDV : in STD_LOGIC_VECTOR (3 downto 0); CLK : in STD_LOGIC; SEG : out STD_LOGIC_VECTOR (6 downto 0); AN : out STD_LOGIC_VECTOR (3 downto 0)); end LED7THANH_VHDL; architecture Behavioral of LED7THANH_VHDL is -- khai bao cac tin hieu signal count_chiatan:std_logic_vector(5 downto 0):="000000"; signal CLK_1M: std_logic:='0'; signal Temp : std_logic_vector(3 downto 0); signal countmode4: std_logic_vector(1 downto 0):="00"; begin -- xay dung bo chia tan (tan so xung clk chuan la 50M) process(CLK,count_chiatan) begin if(CLK'event and CLK='1') then 225 if(count_chiatan>"110010") then count_chiatan<="000000"; else count_chiatan <= count_chiatan + 1; end if; end if; end process; process(count_chiatan) begin if(count_chiatan="110010") then CLK_1M<= not CLK_1M; end if; end process; -- Xay dung bo dieu khien, thuc te chinh la bo dem mode 4 process(CLK_1M,countmode4) begin if(CLK_1M'event and CLK_1M='1') then countmode4<=countmode4+1; end if; end process; -- khoi deu khien quet LED, va chon kenh process(countmode4) begin case countmode4 is when "00" => temp<=HN;AN<="1000"; when "01" => temp<=HT;AN<="0100"; when "10" => temp<=HC;AN<="0010"; when others => temp<=HDV;AN<="0001"; end case; end process; -- khoi luu cac ma with temp select --abcdefg Seg<="0000001" when X"0", "1001111" when X"1", "0010010" when X"2", "0000110" when X"3", 226 "1001100" when X"4", "0100100" when X"5", "0100000" when X"6", "0001111" when X"7", "0000000" when X"8", "0000100" when X"9", "1111110" when others; end Behavioral; Hiển thị trên ma trận LED là một phƣơng pháp đang rất hay sử dụng. Trên thực tế LED
ma trận thƣờng đƣợc sử dụng làm LED quang báo, tuy nhiên trong tƣơng lai màn hình LED
với độ phân giải cao sẽ là một xu hƣớng. Do ƣu điểm chính là tiết kiệm năng lƣợng. Sau đây
là hình ảnh ma trận LED (8x8) hay sử dụng để ghép lại thành các ma trân lớn hơn. Các tín hiệu điều khiển hàng đƣợc nối với Anode của tất cả các led trên cùng một hàng.
Các tín hiệu điểu khiển cột cũng đƣợc nối với Cathode của tất cả các led trên cùng một cột.
Khi có một tín hiệu điều khiển ở cột và hàng, các chân Anode của các led trên hàng tƣơng
ứng đƣợc cấp điện áp cao, đồng thời các chân Cathode của các led trên cột tƣơng ứng đƣợc
đƣợc cấp điện áp thấp .Tuy nhiên lúc đó chỉ có một số led trên 1 hàng hoặc 1 cột sáng, vì nó
có đồng thời điện thế cao trên Anode và điện thế thấp trên Cathode. Nguyên lý quét: (Ví dụ hiển thị chữ K) 227 + Đầu tiên ta sẽ cho tất cả các vị trí cột 1 sáng bằng cách nối đất cột 1 và nối nguồn vào tất cả các hàng. + Sau đó ta cho các vị trí hàng thứ 4 ở cột 2 sáng + Tiếp đó ta cho vị trí hàng thứ 3,5 của cột thứ 3 sáng: + Sau đó ta sẽ cho vị trí hàng thứ 2,6 của cột thứ 4 sáng: 228 + Tƣơng tự ta cho vị trí hàng thứ 1,7 của cột thứ 5 sáng: + Và ta cho vị trí hàng thứ 8 của cột thứ 6 sáng: +Tƣơng tự ở các cột thứ 7,8 ta không cho sáng ở tất cả các vị trí. + Sau đó ta quay lại cho hiển thị ở cột 1,2,3,4,5.. cứ nhƣ vậy quá trình quẻt đƣợc quét liên tục các cột. Do hiện tƣợng lƣu ảnh trên võng mạc nên khi đó ta có cảm giác là liên tục. 229 Bộ đệm âm Khối nhớ
2 Clk Bộ chọn
kênh MA TRẬN LED Bộ
chia
tần Mode 8 Bộ đệm
dƣơng Khối nhớ
1 Phân tích chức năng của các khối: + Bộ chia tần: Có tác dụng tạo ra 1 Clock có tần số f=1/T, với T là thời gian hiển thị 1
hiệu ứng. Đầu vào điều khiển là xung chuẩn của kit và đầu ra của bộ chia tần là 1 Clock và
đƣợc đƣa vào để điều khiển . + Mode 8 : Đây là bộ đếm đến mode 8, hay chính là bộ đếm để điều khiển quét theo cột. + Khối nhớ 1 : Đây là ROM lƣu các giá trị để điều khiển cột. Đầu vào là các bit
đầu ra của bộ đếm 8. Và các già trị của các bit này sẽ tƣơng ƣng với địa chỉ của giá trị
xuất ra điều khiển cột. + Khối nhớ 2: Đây là nơi lƣu các gia tri để điều khiển hàng. 230 Từ sơ đồ triển khai ở phần trên sử dụng phần mềm ISE để nhập thiết kế, thực hiện tổng
hợp và nạp cấu hình cho CPLD trên KIT. Dùng ngôn ngữ mô tả phần cứng VDHL để nhập
thiết kế. Bộ điều khiển Ma trận LED đƣợc môt tả trong thực tế có mô hình sau: COLUM CLK ROW -------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity matranled_2d is Port ( CLK : in STD_LOGIC; COLUM : out STD_LOGIC_VECTOR (7 downto 0); ROW : out STD_LOGIC_VECTOR (7 downto 0)); end matranled_2d; architecture Behavioral of matranled_2d is signal dem: integer range 0 to 125000:=0; signal count_mode8: std_logic_vector (2 downto 0):="000"; signal clk2khz: std_logic :='0'; signal temp : std_logic_vector(63 downto 0); constant a:std_logic_vector(63 downto 0):=X"FF0000E7E70000FF"; -- khoi nho 2 chinh la luu cac gia tri cua hang so begin ------chia tan-------------- -- xung chuan cua kit la 50Mhz -- ta dung bo dem de tao cac xung co tan so la 2khz process(clk) --xung 2Kz begin if clk='1' and clk'event then if dem = 12500 then 231 dem <= 0; clk2khz <= not clk2khz; else dem <= dem +1; end if; end if; end process; -- bo dem mode 8 process(clk2khz) begin if clk2khz='1' and clk2khz'event then count_mode8 <= count_mode8 + 1; end if; end process; -- khoi nho 1 process(count_mode8) begin case count_mode8 is when "000" => colum<= "10000000"; when "001" => colum<= "01000000"; when "010" => colum<= "00100000"; when "011" => colum<= "00010000"; when "100" => colum<= "00001000"; when "101" => colum<= "00000100"; when "110" => colum<= "00000010"; when others => colum<= "00000001"; end case; end process; -- bo chon kenh row <= a(63 downto 56) when count_mode8 =x"0" else a(55 downto 48) when count_mode8 =x"1" else a(47 downto 40) when count_mode8 =x"2" else a(39 downto 32) when count_mode8 =x"3" else a(31 downto 24) when count_mode8 =x"4" else a(23 downto 16) when count_mode8 =x"5" else a(15 downto 8) when count_mode8 =x"6" else a(7downto 0); 232 end Behavioral; Xuất phát bài toán điều khiển đèn trang trí ví dụ nhƣ điều khiển bộ đèn nháy, có thể thử
nghiệm bài toàn này trên KIT phát triển CPLD nhƣ sau: Thiết kế cấu hình cho CPLD thành
bộ điều khiển dãy 8 đèn led đơn sáng theo quy luật nào đó. Sơ đồ khối của ứng dụng nhƣ sau: LED8 ..... LED1 Chuyển mạch DIP-SW CPLD S(3 0) 0 1 Bộ điều khiển K(8 1) - điều khiển hiển thị
cho từng LED tƣơng ứng CLK Trong sơ đồ trên: Chuyển mạch DIP-SW cho phép lựa chọn các chế độ làm việc khác
nhau cho Bộ điều khiển. Bộ điều khiển sẽ tạo ra các tín hiệu điều khiển cơ cấu 8 LED sáng
lần lƣợt tuần tự từ LED1 đên LED8, tạo ra chế độ sáng tuần tự. Chu kỳ sáng sẽ đƣợc lựa chọn
bởi chuyển mạch DIP-SW, theo bảng sau: Chế độ
1
2
3
4
5 S
0000
0001
0011
0111
1111 Chu kỳ sáng - T
10 ms
50 ms
100 ms
200 ms
500 ms Từ sơ đồ ứng dụng xây dựng sơ đồ triển khai thiết kế cho bộ điều khiển nhƣ hình
4.13.Theo sơ đồ từ tín hiệu CLK 10MHz đƣợc đƣa ra các bộ chia tần để tạo ra các tín hiệu
xung chuẩn T1, T2, T3, T4, T5 có chu kỳ tƣơng ứng là: 10ms, 50ms, 100ms, 200ms, 500ms.
Các xung này đƣợc đƣa qua bộ chọn kênh đƣợc điều khiển bởi đầu vào S, xung đƣợc chọn sẽ
điều khiển bộ dịch vòng 8 bit để tạo tín hiệu K(8 1) dùng để điều khiển cho các LED đơn. Từ sơ đồ triển khai ở phần trên sử dụng phần mềm ISE để nhập thiết kế, thực hiện tổng
hợp và nạp cấu hình cho CPLD trên KIT. Dùng ngôn ngữ mô tả phần cứng VDHL để nhập
thiết kế. Bộ điều khiển có sơ đồ nguyên lý ở trên sẽ đƣợc mô tả trong thực thể "Controller"
có mô hình nhƣ sau: 233 Controller 4 8 K S
CLK T2 T1 T3 Chia tần
1 Chia tần
3 Chia tần
2 Chia tần
4 Chia tần
5 CLK
10MHz T4 T5 S Chọn kênh CPLD Bộ dịch vòng 8 bit K(8 1) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; use IEEE.numeric_std.all; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity Controller is Port ( S : in std_logic_vector(3 downto 0); CLK : in std_logic; K : out std_logic_vector(7 downto 0)); end Controller; 234 architecture Behavioral of Controller is constant hs1: std_logic_vector(16 downto 0):="11000011010011111"; -- Chia 100000 tao ra 10 ms constant hs2: std_logic_vector(2 downto 0):="100"; -- Chia 5 de tao ra 50 ms constant hs3: std_logic:='1'; -- Chia 2 de tao ra 100 ms constant hs4: std_logic:='1'; -- Chia 2 de tao ra 200 ms constant hs5: std_logic_vector(2 downto 0):="100"; -- Chia 5 de tao ra 500 ms signal chiatan1: std_logic_vector(16 downto 0):=(others=>'0'); signal chiatan2: std_logic_vector(2 downto 0):=(others=>'0'); signal chiatan3: std_logic:='1'; signal chiatan4: std_logic:='1'; signal chiatan5: std_logic_vector(2 downto 0):=(others=>'0'); signal T1,T2,T3,T4,T5,T : std_logic; -- Dau ra cac bo chia tan signal Q: std_logic_vector(2 downto 0):="000"; begin -- Chia tan 1 process (CLK) begin if CLK'event and CLK='1' then if chiatan1=hs1 then chiatan1<=(others=>'0'); T1<='1'; else chiatan1 <= chiatan1 +1; T1<='0'; end if; end if; end process; -- Chia tan 2 process (T1) begin if T1'event and T1='1' then if chiatan2=hs2 then chiatan2<=(others=>'0'); T2<='1'; else chiatan2 <= chiatan2 +1; T2<='0'; end if; end if; end process; -- Chia tan 3 235 process (T2) begin if T2'event and T2='1' then if chiatan3=hs3 then chiatan3<='0'; T3<='1'; else chiatan3 <= '1'; T3<='0'; end if; end if; end process; -- Chia tan 4 process (T3) begin if T3'event and T3='1' then if chiatan4=hs4 then chiatan4<='0'; T4<='1'; else chiatan4 <= '1'; T4<='0'; end if; end if; end process; -- Chia tan 5 process (T3) begin if T3'event and T3='1' then if chiatan5=hs5 then chiatan5<=(others=>'0'); T5<='1'; else chiatan5 <= chiatan5 +1; T5<='0'; end if; end if; end process; -- Thuc hien bo chon kenh with S select --abcdefgh T<=T1 when "0000", T2 when "0001", T3 when "0011", 236 T4 when "0111", T5 when others; -- Dich vong 8 bit process(T) begin if T'event and T='1' then Q<=Q+1; end if; end process; with Q select K<= "11111110" when O"0", "11111101" when O"1", "11111011" when O"2", "11110111" when O"3", "11101111" when O"4", "11011111" when O"5", "10111111" when O"6", "01111111" when others; end Behavioral; Xuất phát từ bài toán đếm số lƣợng khách hàng trong cửa hàng, thiết bị sẽ đƣợc đặt tại
cửa ra vào, khi đó dùng 2 sensor: một sensor phát hiện có ngƣời đi vào, và một sensor phát
hiện ngƣời đi ra, 2 sensor gửi tín hiệu điều khiển vào bộ đếm thuận nghịch, chỉ thị bộ đếm sẽ
xác định số ngƣời trong cửa hàng. Để thực hiện ví dụ này trên bo mạch phát triển, 2 sensor sẽ
đƣợc minh hoạ bằng 2 nút bấm UP và DOWN, chúng gửi tín hiệu điều khiển bộ đếm thuận
nghịch, đƣợc thiết kế trong CPLD. Khi UP đƣợc bấm bộ đếm tăng lên 1 đơn vị, khi DOWN
đƣợc bấm bộ đếm giảm đi một đơn vị. Sơ đồ khối của ứng dụng nhƣ hình vẽ 4.10. Vcc B1 CLK DOWN UP B2 Tạo CLK
10MHz Bộ đếm thuận nghịch
thập phân 2 digit b/ Xây dựng sơ đồ triển khai ứng dụng 237 CPLD abcdefgh chuc Bộ đếm
thập phân Down B1 DOWN Up Bắt phím AN1 Điều
khiển cơ
cấu chỉ
thị số UP B2 AN2 donvi CLK CLK Chia tần T (10Hz) Từ sơ đồ khối của ứng dụng xây dựng đƣợc sơ đồ triển khai của ứng dụng nhƣ hình vẽ 4.11. Phƣơng pháp thiết kế đƣợc sử dụng phƣơng pháp thiết kế mạch số đồng bộ. Trong đó khối "Bắt phím" xác định khi nào phím đƣợc bấm, mỗi lần bấm phím đầu ra
Down hoặc Up sẽ cho ra môt xung dƣơng có độ rộng Tclk (Chu kỳ xung CLK), khối này
cũng nhận xung CLK và xung T tấn số 10Hz vào để thƣc hiện các bƣớc định thời và chống
nẩy nẩy phím. Khối này sẽ có sơ đồ nguyên lý nhƣ sau (chỉ minh họa quá trình bắt phím
DOWN): DOWN B1 K2 K1 K3 T D Q D Q CLK D Q Bộ đếm thập phân đồng bộ 2 digit, có kết quả đƣa ra là giá trị hàng chục "chuc" - 4 bit
và giá trị hàng đơn vị "donvi" - 4 bit, chúng đƣợc đƣa qua khối "điều khiển cơ cấu chỉ thị số"
để giải mã và điều khiển hiện thị kết quả bằng màn hình chỉ thị số dùng 2 LED 7 đoạn theo
chế độ quét động. Từ sơ đồ triển khai ở phần trên sử dụng phần mềm ISE để nhập thiết kế, thực hiện tổng
hợp và nạp cấu hình cho CPLD trên KIT. Dùng ngôn ngữ mô tả phần cứng VDHL để nhập
thiết kế. Bộ đếm thuận nghịch có sơ đồ nguyên lý ở trên sẽ đƣợc mô tả trong thực thể
"UpdownCounter" có mô hình nhƣ sau: UpdownCounter B1
B2
CLK 238 use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; --- Khai bao thưc the entity UpDownCounter is Port ( B1: in std_logic; B2: in std_logic; CLK: in std_logic; Seg: out std_logic_vector(7 downto 0); AN: out std_logic_vector(1 downto 0)); end UpDownCounter; --- Mo ta hoat dong Cho thuc the architecture Behavioral of UpDownCounter is signal UP,DOWN,Mode,T: std_logic; signal K1,K2,K3: std_logic_vector(1 downto 0); signal donvi,chuc, Temp: std_logic_vector(3 downto 0); signal chiatan: std_logic_vector(14 downto 0); begin ---- Mo ta khoi Chia tan process (CLK) begin if CLK'event and CLK='1' then chiatan <= chiatan +1; end if; end process; T<=chiatan(14); ---- Mo ta khoi Bat phim process(T) begin if T'event and T='1' then K1<=(B2,B1); end if; end process; process(CLK) begin if CLK'event and CLK='1' then K2<=K1; K3<=K2; end if; end process; (UP,DOWN)<=not K2 and K3; ---- Mo ta Bo dem thap phan dong bo process (CLK) begin if CLK'event and CLK= '1' then 239 if UP='1' then if donvi = X"9" then donvi<=X"0"; if chuc = X"9" then chuc<=X"0"; else chuc<=chuc+1; end if; else donvi<=donvi+1; end if; elsif DOWN='1' then if donvi = X"0" then donvi<=X"9"; if chuc = X"0" then chuc<=X"9"; else chuc<=chuc-1; end if; else donvi<=donvi-1; end if; end if; end if; end process; ---- Mo ta khoi Dieu khien hien co cau chi thi so with temp select --abcdefgh Seg<="00000011" when X"0", "10011111" when X"1", "00100101" when X"2", "00001101" when X"3", "10011001" when X"4", "01001001" when X"5", "01000001" when X"6", "00011111" when X"7", "00000001" when X"8", "00001001" when X"9", "11111101" when others; with T select temp<=donvi when '1', chuc when others; with T select AN<="01" when '1', "10" when others; end Behavioral; Trong thực tế phép đo tần số là một trong những phép đo lƣờng điện tử thông dụng.
Trong đó phƣơng pháp đo dùng máy đếm tần đƣợc sử dụng chủ yếu. Phƣơng pháp đó này
hoàn toàn có thể đƣợc thử nghiệm trên KIT phát triển CPLD. Với những mạch ứng dụng sẵn 240 có trên KIT phát triển ta có thể thiết kế một bộ đếm tần số tự động thay đổi thang đo có sơ đồ
tổng quát nhƣ sau: Hz fx kHz
MHz Mạch vào
và tạo dạng
xung Bộ đếm tần số
CPLD CLK Mạch vào sẽ có nhiệm vụ biến đổi tín hiệu vào thành dạng xung có mức logic CMOS và
có cùng chu kỳ với tín hiệu vào. Dạng xung này đƣợc đƣa vào bộ đếm tấn để thực hiện đo tần
số, kết quả sẽ đƣợc chỉ thị trên cơ cấu chỉ thị số LED 7 đoạn trên KIT phát triển. Kết quả sẽ
đƣợc hiển thị dấu phảy động, ngoài ra còn có 3 đèn led để chỉ thị đơn vị đo tƣơng ứng. Do là
thử nghiệm nên chúng tôi không thiết kế phần mạch vào và tạo dạo xung mà dùng ngay tín
hiệu vào fx có dạng xung vuông, nên đƣợc đƣa thẳng vào Bộ đếm tần số. Tham số của bộ đếm tần phụ thuộc rất nhiều vào lƣợng tài nguyên của CPLD, sẽ đƣợc
xác định sau khi thử nghiệm thiết kế, vì thiết kế sẽ đƣợc thực hiện với sử tối đa tài nguyên của
CPLD. Dùng CPLD tần số lớn nhất có thể đƣợc không quá tần số làm việc của CPLD -
khoảng hơn 100MHz, giới hạn tần số nhỏ nhất có thể đo đƣợc, với độ chính xác cao phụ
thuộc vào lƣợng tài nguyên có trong CPLD. Phƣơng pháp đo này nói chung sai số lƣợng tử là
không lớn, sai số lớn nhất chính là do hạn chế của cơ cấu chỉ thị số, chỉ hiển thị đƣợc 4 số. Từ sơ đồ khối tổng quan trên, Bộ đếm tần có thể đƣợc thực hiện theo sơ đồ triển khai
nhƣ hình 4.15. Trong sơ đồ trên tần số cần đo fx đƣợc đƣa vào bộ "Chuẩn hoá xung vào" tạo
ra xung fx0 có cùng chu kỳ nhƣng có độ rộng xung bằng chu kỳ Tclk của xung CLK. Xung
CLK vào có tần số 10MHz đƣợc đƣa qua "bộ chia tần số nhiều đầu ra", tạo ra các xung định
thời T1, T2, T3, T4 có chu kỳ 1s; 100 ms, 10ms, 1ms. Các xung này đƣợc đƣa vào bộ chọn
kênh để chọn xung định thời phù hợp với giải tần số tín hiệu đo vào. Xung định thời đƣợc lựa
chọn Tch sẽ đƣa vào đề điều khiển "bộ đếm". Kết quả của của "bộ đếm" tỷ lệ với tần số cần
đo. Kết quả này đƣợc đƣa qua "bộ điều khiển chỉ thị số" để giải mã và tạo ra xung điều khiển
cơ cấu chỉ thị số, cho phép hiển thị kết quả là tần số xung cần đo. Giải đồ thời gian minh hoạ
mối quan hệ của các tín hiệu vào bộ đếm nhƣ trong hình vẽ 4.16. 241 8 fx Bộ đếm fx0 Seg Chuẩn hoá
xung vào 4 EN1 AN Bộ điều
khiển chỉ thị
số 3 CLK CLK Unit Tch Chia tần nhiều
đầu ra Chọn
kênh Điều khiển chọn
thang đo T1
T2
T3
T4 CPLD T ch t f x0 Tch t Tx Quá trình đo hoàn toàn tự động chọn thang đo, chọn đơn vị chỉ thị phù hợp, máy đếm
tần cũng có hiển thị thông báo nếu tần số vào quá nhỏ hoặc quá dải tần đo đƣợc. Quá trình
điều khiển tự động trong bộ đếm tần đƣợc mô tả nhƣ trong lƣu đồ thuật toán ở hình 4.17. 242 BEGIN Chọn thang mặc
định Đếm tần Giảm thang đo Đúng Tăng thang đo Qúa thang sai Đúng Nghìn = 0 sai Hiển thị sai Kết thúc? Đúng END Hình 4.17 - Lƣu đồ thuật toán điều khiển trong bộ đếm tần Từ sơ đồ triển khai ở phần trên sử dụng phần mềm ISE để nhập thiết kế, thực hiện tổng
hợp và nạp cấu hình cho CPLD trên KIT. Dùng ngôn ngữ mô tả phần cứng VDHL để nhập
thiết kế. Bộ điều khiển có sơ đồ nguyên lý ở trên sẽ đƣợc mô tả trong thực thể
"FreqCounter" có mô hình nhƣ sau: FreqCounter 8 Fx Seg 4 CLK AN 3 Unit library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following lines to use the declarations that are 243 -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity auto_freq_counter is port( fx : in std_logic; clk: in std_logic; Seg : out std_logic_vector(6 downto 0); dot: out std_logic; AN : out std_logic_vector(2 downto 0); Unit : out std_logic_vector(2 downto 0)); end auto_freq_counter; architecture Behavioral of auto_freq_counter is signal donvi0: std_logic_vector(3 downto 0):="0000"; signal chuc0: std_logic_vector(3 downto 0):="0000"; signal tram0: std_logic_vector(3 downto 0):="0000"; signal donvi: std_logic_vector(3 downto 0):="0000"; signal chuc: std_logic_vector(3 downto 0):="0000"; signal tram: std_logic_vector(3 downto 0):="0000"; signal temp: std_logic_vector(3 downto 0):="0000"; signal scale: std_logic_vector(1 downto 0):="00"; signal over, over1: std_logic:='0'; signal chiatan: std_logic_vector(19 downto 0):=x"00000"; signal Tch :std_logic:='1'; signal fx1,fx2, fx3: std_logic; begin -- Chia tan tao xung mo cong - tu dong chon thang do process (clk) begin if clk='1' and clk'event then if(over1='0') then case scale is when "00" => if chiatan=x"F423F" then --clk=10MHz, T=0,1s. chiatan<=x"00000"; Tch<='1'; else chiatan<=chiatan+1; Tch<='0'; end if; 244 when "01" => if chiatan=x"1869F" then --T=0,1ms; chiatan<=x"00000"; Tch<='1'; else chiatan<=chiatan+1; Tch<='0'; end if; when "10" => if chiatan=x"0270F" then --1us chiatan<=x"00000"; Tch<='1'; else chiatan<=chiatan+1; Tch<='0'; end if; when others => if chiatan=x"F423F" then chiatan<=x"00000"; Tch<='1'; else chiatan<=chiatan+1; Tch<='0'; end if; end case; else chiatan<=x"00000"; Tch<='1'; end if; end if; end process; -- Tao xung vao process(clk) begin if clk='1' and clk'event then fx1<=fx; fx2<=fx1; end if; end process; fx3<= fx1 and (not fx2); -- dong bo xung dem fx va clk -- counting process(clk) begin if clk='1' and clk'event then 245 if over1='1' then over1<='0'; end if; if (Tch='1') then donvi<=x"0"; chuc<=x"0"; tram<=x"0"; if over='0' then donvi0<=donvi; chuc0<=chuc; tram0<=tram; --Decrease Scale; if tram=x"0" then if scale/="00" then scale<=scale-1; end if; end if; else donvi0<=x"A"; chuc0<=x"A"; tram0<=x"A"; over<='0'; end if; else if fx3='1' and over='0' then if donvi=x"9" then donvi<=x"0"; if chuc=x"9" then chuc<=x"0"; if tram=x"9" then -- over range if scale/="10" then scale<=scale+1; end if; over<='1'; over1<='1'; else tram<=tram+1; end if; else chuc<=chuc+1; end if; else donvi<=donvi+1; end if; end if; end if; end if; end process; 246 --------------- -- Display Frequency process (chiatan(12 downto 11)) begin case chiatan(12 downto 11) is when "00" => AN<="001"; temp<=donvi0; if (scale="10") and (temp/=x"A") then dot<='0'; else dot<='1'; end if; when "01" => AN<="010"; temp<=chuc0; if scale="01" then dot<='0'; else dot<='1'; end if; when "10" => AN<="100"; temp<=tram0; if scale="00" then dot<='0'; else dot<='1'; end if; when others => dot<='1'; AN<="000"; end case; end process; ------------------------------- 11110100001000111111111 with temp Select -- abcdefgh Seg<="0000001" when x"0", "1001111" when X"1", "0010010" when x"2", "0000110" when X"3", "1001100" when X"4", "0100100" when X"5", "0100000" when X"6", "0001111" when X"7", "0000000" when X"8", "0000100" when X"9", 247 "1111110" when X"A", "1111111" when others; end Behavioral; VGA ( Video Graphíc array) là 1 chuẩn hiẻn thị ra đời từ những năm 1980 ở các thế hệ
máy tính IBM PC. Ở thiết kế này chúng ta sẽ tạo ra khối giao tiếp VGA chuẩn 8 màu , độ
phân giải 640x480 . Thiết kế tƣơng thích màn hình CRT hoặc LCD hỗ trợ chuẩn VGA. Các ký hoạ phác thảo một màn hình CRT đơn sắc đựoc thể hiện trên Hình 5.15 248 Kết quả kết hợp mầu từ 3 mầu cơ bản nhƣ bảng sau: Các súng điện tử (cathode) tạo ra các tia điện tử tập trung, đi qua ống chân không và
cuối cùng đập vào màn hình có phosphorescent tạo nên các điểm sáng trên màn hình. Cƣờng
độ tia điện tử và độ sáng của điểm ảnh đƣợc xác định bằng mức điện áp của tín hiệu video
mono. Mức điện áp của tín hiệu mono nằm trong khoảng từ 0 - 0.7v. Có 2 cuộn dây thẳng đứng và nằm ngang cuốn tạo ra từ trƣờng lái tia điện tử đến vị trí
điểm sáng. Thông thƣờng các tia điện tử quét khắp màn hình từ trái sang phải và từ trên
xuống dƣới. Bộ tạo dao động và bộ khuếch đại bên trong màn hình tạo ra dạng sóng răng cƣa
để điều khiển 2 cuộn dây. Ví dụ khi tia điện tử quét từ cạnh bên trái màn hình sang cạnh bên
phải màn hình là điện áp trên cuộn dây ngang tăng dần. Sau khi đến cạnh bên phải , tia điện
tử nhanh chóng trở về cạnh bên trái khi điện áp trở về 0. Mối quan hệ giửa điện áp răng cƣa
và vị trí quét đƣợc thể hiện trong hình dƣới. 249 HÌnh 5.2.2- Đồ thị thời gian xung quét mành 250 Hai tín hiệu đồng bộ Hsync và Vsync dùng để điều khiển sự tạo dạng sóng răng cƣa.
Đây là các tín hiệu số. Cấc màn hình CRT màu về cơ bản cũng hoạt động giống nhƣ trên
ngoại trừ việc nó có 3 tia điện tử kích thích 3 màu cơ bản Red,Green, Blue để tạo thành 1
pixel. VGA trong thiết kế này có 5 tín hiệu điều khiển chính, bao gồm tín hiệu dồng bộ ngang ,dọc Hsync,Vsync . Và 3 tín hiệu cho tia màu R,G,B. Bộ điều khiển VGA đồng bộ tín hiệu VGA và đièu khiển dữ liệu ra cho pixel. Sơ đồ khối của bộ đièu khỉên VGA đƣợc thể hiện trong hình dƣới. Bao gồm 1 mạch đồng bộ VGA_Syncvà 1 mạch tạo pixel Các tín hiệu Hsync, Vsync kết nối với cổng VGA điều khiển quét ngang,dọc màn hình . Hai tín hiệu đƣa ra dựa trên 1 bộ đếm có đầu ra là pixel_x, pixel_y. Hai tín hiệu này cho
biết vị trí tƣơng đối của điểm ảnh . Mạch VGA_sync cũng cho ra tín hiệu video_on dùng để
kích hoạt hay vô hiệu hoá màn hình hiển thị. Mạch tạo pixel tạo ra các tín hiệu tuơng ứng với
các màu cơ bản . Tín hiệu Hsync xác định thời gian cần thiết để quét hết chiều ngang màn hình, tín hiệu
Vsync xác định thời gian quét hết màn hình . Thiết kế dựa trên 1 VGA 640x480 pixel ,tốc độ
quét mỗi pixel là 25MH . Chi tiết thời gian quét 1 hàng đƣợc thể hiện hình 5.2.2 . Một chu kì quét hàng bao gồm
800 pixel và chia làm 4 vùng . Vùng hiển thị 1 hàng bao gồm 640 pixel bắt đầu từ pixel 49
đến 688 ,phần còn lại video_on để ở chế độ disable. Tƣơng tự khi quýet dọc có 525 dòng
đƣợc quét, trong đó có 480 dòng ở chế độ hiển thị. c. Xây dựng thuật toán, code Nếu tần số của thiết bị thực thi là 25MH, mạch đồng bộ có thể xây dựng bằng 2 bộ
đếm . Một bộ đếm mod 800 để đồng bộ quét ngang. Một bộ đếm mod 525 cho việc đồng bộ
quét dọc. 251 Thiết kế trên đƣợc thực hiện trên kit spartan 3AN với clock hệ thống là 50MHz, do đó
cầ phải tạo một bộ chia tần xuống 25MHz. Bộ chia tần này có thể chỉ đơn giản là một bộ đếm
mod2. Chúng ta tạo ra một tín hiệu Tick 25MHz để cho phép hoặc dừng bộ đếm, tín hiệu này
cũng đƣợc kết nối với p_tick, đƣa ra ngoài bộ VGA_sync để kết hợp với bộ tạo pixel. library ieee; use ieee.std_logic_1164.all ; use ieee.numeric_std.all ; entity vga_sync is port( clk, reset: in std_logic; hsync , vsync : out std_logic ; video_on, p_tick: out std_logic; pixel_x , pixel_y : out std_logic_vector(9 downto 0) ); end vga_sync ; architecture arch of vga_sync is -- VGA 640-by -480 sync parameters constant HF: integer:=16 ; --h. front porch constant HB: integer:=48 ; --h. back porch constant HR: integer:=96 ; --h. retrace constant VD: integer :=480; --vertical display area constant VF: integer :=10; -- v. front porch constant VB: integer :=33; -- v. back porch constant VR: integer :=2; -- v. retrace -- mod2 counter signal mod2_reg, mod2_next : std_logic; constant HD: integer :=640;--horizontal display area -- sync counters signal v_count_reg,v_count_next : unsigned(9 downto 0) ; signal h_count_reg,h_count_next : unsigned (9 downto 0); -- output buffer signal v_sync_reg , h_sync_reg : std_logic ; signal v_sync_next , h_sync_next : std_logic; -- status signal signal h_end , v_end , pixel_tick: std_logic; -- registers begin process (clk , reset) begin if reset='1' then mod2_reg <= '0'; v_count_reg <= (others=>'0'); h_count_reg <= (others=>'0'); 252 v_sync_reg <= '0'; h_sync_reg <= '0'; elsif (clk'event and clk='0') then mod2_reg <= mod2_next ; v_count_reg <= v_count_next; h_count_reg <= h_count_next; v_sync_reg <= v_sync_next ; h_sync_reg <= h_sync_next ; end if ; end process; -- mod-2 circuit to generate 25 MHz enable tick mod2_next <= not mod2_reg; -- 25 MHz pixel tick pixel_tick <= '1' when mod2_reg='1' else '0'; h_end <= -- end of horizontal counter '1' when h_count_reg=(HD+HF+HB+HR-1) else --799 '0'; v_end <= -- end of vertical counter '1' when v_count_reg=(VD+VF+VB+VR-1) else --524 '0'; -- mod-800 horizontal sync counter process (h_count_reg,h_end,pixel_tick) begin if pixel_tick='1' then -- 25 MHz tick if h_end='1' then h_count_next <= (others=>'0'); h_count_next <= h_count_reg + 1; else end if ; else h_count_next <= h_count_reg; end if ; end process; process (v_count_reg,h_end,v_end,pixel_tick) begin -- mod 525 vertical sync counter if pixel_tick='1' and h_end='1' then if (v_end='1') then v_count_next <= (others=>'0'); else v_count_next <= v_count_reg + 1; 253 end if ; else v_count_next <= v_count_reg; end if ; end process; -- horizontal and vertical sync, buffered to avoid glitch h_sync_next <= '1' when (h_count_reg >=(HD+HF)) --656 and (h_count_reg<=(HD+HF+HR-1)) else --751 '0'; v_sync_next <= '1' when ( v_count_reg >= ( VD+VF ) ) --490 and (v_count_reg<=(VD+VF+VR-1)) else --491 '0'; -- video on/off video_on <= '1' when (h_count_reg '0'; -- output signal hsync <= h_sync_reg ; vsync <= v_sync_reg ; pixel_x <= std_logic_vector(h_count_reg); pixel_y <= std_logic_vector(v_count_reg); p_tick <= pixel_tick; end arch; -- Khối mạch tạo RGB để test.---------------------------------------------- library ieee; use ieee.std_logic_1164.all ; entity vga_test is port ( clk, reset: in std_logic; sw: in std_logic_vector (2 downto 0) ; hsync , vsync : out std_logic; rgb : out std_logic_vector (2 downto 0) ); end vga_test ; architecture arch of vga_test is signal rgb_reg: std_logic_vector (2 downto 0) ; signal video_on: std_logic ; begin -- instantiate VGA sync circuit vga_sync_unit : entity work.vga_sync 254 port map(clk=>clk, reset=>reset , hsync=>hsync , p_tick=>open, pixel_x=>open, pixel_y=>open, vsync=>vsync, video_on=>video_on ); -- rgb buffer process (clk , reset) begin if reset='1' then rgb_reg <= (others=>'0'); elsif (clk'event and clk='1') then rgb_reg <= sw; end if; end process ; rgb <= rgb_reg when video_on='1' else "000"; end arch; 255 LCD là một thiết bị dùng để hiển thị các kí tự, nó hiện đang đƣợc sử dụng nhiều. trong
những năm gần đây ,màn hình LCD ngày càng đƣợc sử dụng rộng rãi và đang dần thay thế
các đèn LED.đó là vì các nguyên nhân sau: - Màn hình LCD có giá thành hạ - Khả năng hiển thị số,kí tự và đồ hoạ tốt hơn nhiều so với đèn LED * Sơ đồ khối của ứng dụng nhƣ hình trên: * Mô tả các chân của LCD Chân
1
2
3
4 Kí hiệu
VSS
VCC
VEE
RS I/O
-
-
-
I 5
6
7
8
9
10
11
12
13
14 I
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O
I/O mô tả
đất
nguồn dƣơng
nguồn điều khiển tƣơng phản
RS=0 chon thanh ghi lệnh
RS=1 chọn thanh ghi dữ liệu
R/W=1 đọc dữ liệu.R/W=0 ghi
cho phép
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit
bus dữ liệu 8 bit R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
* Nguyên lý hoạt động của LCD: tƣơng ứng thì VEE đƣợc dùng để điều khiển độ tƣơng phản của LCD. - Chân chọn thanh ghi RS (Register Select): Có hai thanh ghi trong LCD, chân
RS(Register Select) đƣợc dùng để chọn thanh ghi, nhƣ sau: Nếu RS = 0 thì thanh ghi mà lệnh
đƣợc chọn để cho phép ngƣời dùng gửi một lệnh chẳng hạn nhƣ xoá màn hình, đƣa con trỏ về
đầu dòng v.v… Nếu RS = 1 thì thanh ghi dữ liệu đƣợc chọn cho phép ngƣời dùng gửi dữ liệu
cần hiển thị trên LCD. - Chân đọc/ ghi (R/W): Đầu vào đọc/ ghi cho phép ngƣời dùng ghi thông tin lên LCD khi R/W = 0 hoặc đọc thông tin từ nó khi R/W = 1. - Chân cho phép E (Enable): Chân cho phép E đƣợc sử dụng bởi LCD để chốt dữ liệu
của nó. Khi dữ liệu đƣợc cấp đến chân dữ liệu thì một xung mức cao xuống thấp phải đƣợc áp
đến chân này để LCD chốt dữ liệu trên các chân dữ liêu. Xung này phải rộng tối thiểu là
450ns.
- Chân D0 - D7: Đây là 8 chân dữ liệu 8 bít, đƣợc dùng để gửi thông tin lên LCD hoặc
đọc nội dung của các thanh ghi trong LCD. Để hiển thị các chữ cái và các con số, chúng ta
gửi các mã ASCII của các chữ cái từ A đến Z, a đến f và các con số từ 0 - 9 đến các chân này
khi bật RS = 1 Cũng có các mã lệnh mà có thể đƣợc gửi đến LCD để xoá màn hình hoặc đƣa
con trỏ về đầu dòng hoặc nhấp nháy con trỏ. * Sau đây là bảng mã lệnh của LCD: 256 Mã (Hex) Lệnh đến thanh ghi của LCD
Xoá màn hình hiển thị
Trở về đầu dòng
Giảm con trỏ (dịch con trỏ sang trái)
Tăng con trỏ (dịch con trỏ sang phải)
Dịch hiển thị sang phải
Dịch hiển thị sang trái
Tắt con trỏ, tắt hiển thị
Tắt hiển thị, bật con trỏ
Bật hiển thị, tắt con trỏ
Bật hiển thị, nhấp nháy con trỏ
Tắt con trỏ, nhấp nháy con trỏ
Dịch vị trí con trỏ sang trái
Dịch vị trí con trỏ sang phải
Dịch toàn bộ hiển thị sang trái
Dịch toàn bộ hiển thị sang phải
Ép con trỏ về đầu dòng thứ nhất
Ép con trỏ về đầu dòng thứ hai
Hai dòng và ma trận 5 × 7 1
2
4
5
6
7
8
A
C
E
F
10
14
18
1C
80
C0
38 * Giản đồ thời gian của hoạt động điều khiển LCD: + Thời gian thiết lập trƣớc khi E lên cao đối với RS và R/W : tối thiểu là 40 ns + Độ rộng xung cho phép : tối thiểu là 230ns + Thời gian duy trì sau khi E chuyển xuống thaaps đối với RS và R/W là 10 ns * Khởi tạo cho LCD: 257 Sau đây là một ví dụ thể hiện giao tiếp giữa FPGA với LCD: - Các bƣớc điều khiển LCD: + Chờ 45ms + Ghi 0X"38", chờ 4,1ms + Ghi 0X"38", chờ 100us + Ghi 0X"38", chờ 40us + Ghi 0X"38", chờ 40ms + Ghi 0X"0F", chờ 4,1ms + Ghi 0x01, chờ 1.64ms. + Ghi 0x06, chờ 40us. 258 + Ghi ASCII „H‟, chờ 40us. + Ghi ASCII „e‟, chờ 40us. + Ghi ASCII „l‟, chờ 40us + Ghi ASCII „l‟, chờ 40us. + Ghi ASCII „o‟, chờ 40us. + Ghi ASCII „ ‟, chờ 40us. + Ghi ASCII „ a‟, chờ 40us. + Ghi ASCII „ l‟, chờ 40us. + Ghi ASCII „l ‟, chờ 40us. * Đồ hình trạng thái của khối điều khiển: * Mô hình tổng quát của khối điều khiẻn: E CLK RS reset Data * Mô tả bằng VHDL library IEEE; 259 use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LCD_Controller is Port ( Clk : in STD_LOGIC; Reset : in STD_LOGIC; RS : out STD_LOGIC; Data : out STD_LOGIC_VECTOR (7 downto 0); E : out STD_LOGIC); end LCD_Controller; architecture Behavioral of LCD_Controller is -- 16 state FSM. Pwr_Up, Pwr_Up_Delay, Off_Pwr_Up_Delay, type StateType is (
Write_Data,Data_Setup_Delay, E_Pulse_Hi, E_Hi_Time,
E_Pulse_Lo,Proc_Comp_Delay, Load_Next_Data, End_State,
End_Pad_12,End_Pad_13, End_Pad_14, End_Pad_15, End_Pad_16 ); signal State, Next_State: statetype := Pwr_Up; -- Instruction Counter. signal Inst_Cnt: STD_LOGIC_VECTOR (3 downto 0) := "0000"; signal Inst_Cnt_E: STD_LOGIC; signal Data_RS_Bus: STD_LOGIC_VECTOR(8 downto 0); -- *** Delay Elements. -- Individual Delay Control. signal Ind_Delay_Ctrl: STD_LOGIC_VECTOR(3 downto 0); signal Delay_Switch_Out: STD_LOGIC_VECTOR(3 downto 0); signal Delay_TO: STD_LOGIC; -- 45ms Delay. signal Delay_45ms_E: STD_LOGIC := '0'; signal Delay_45ms: STD_LOGIC_VECTOR (20 downto 0) :=
"000000000000000000000"; -- 4ms Delay. signal Delay_4ms_E: STD_LOGIC := '0'; signal Delay_4ms_I: STD_LOGIC := '0'; signal Delay_4ms: STD_LOGIC_VECTOR (17 downto 0) := "000000000000000000"; -- 2ms Delay. signal Delay_2ms_E: STD_LOGIC := '0'; signal Delay_2ms_I: STD_LOGIC := '0'; 260 signal Delay_2ms: STD_LOGIC_VECTOR (16 downto 0) := "00000000000000000"; -- 100us Delay. signal Delay_100us_E: STD_LOGIC := '0'; signal Delay_100us_I: STD_LOGIC := '0'; signal Delay_100us: STD_LOGIC_VECTOR (12 downto 0) := "0000000000000"; -- 40us Delay. signal Delay_40us_E: STD_LOGIC := '0'; signal Delay_40us_I: STD_LOGIC := '0'; signal Delay_40us: STD_LOGIC_VECTOR (10 downto 0) := "00000000000"; -- 240ns Delay. signal Delay_240ns_E: STD_LOGIC := '0'; signal Delay_240ns: STD_LOGIC_VECTOR (3 downto 0) := "0000"; -- 80ns Delay. signal Delay_80ns_E: STD_LOGIC := '0'; signal Delay_80ns: STD_LOGIC_VECTOR (1 downto 0) := "00"; begin --------------------------------------------------------------------------- -- Power Up Delay. --------------------------------------------------------------------------- -- Power Up Delay Switch. process (State) begin if ((State = Pwr_Up) or (State = Pwr_Up_Delay)) then Delay_45ms_E <= '1'; else Delay_45ms_E <= '0'; end if; end process; -- 45ms Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_45ms <= "000000000000000000000"; else if (Delay_45ms_E = '1') then Delay_45ms <= Delay_45ms + 1; end if; 261 end if; end if; end process; --------------------------------------------------------------------------- -- Instruction Counter. --------------------------------------------------------------------------- -- Instruction Counter Chip Enable Toggle. process (State) begin if (State = Load_Next_Data) then Inst_Cnt_E <= '1'; else Inst_Cnt_E <= '0'; end if; end process; -- Instruction Counter. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Inst_Cnt <= "0000"; else if (Inst_Cnt_E = '1') then Inst_Cnt <= Inst_Cnt + 1; end if; end if; end if; end process; -- Instruction/Data Set with RS bit. process (Inst_Cnt) begin case (Inst_Cnt) is when "0000" => Data_RS_Bus <= '0' & x"38"; when "0001" => Data_RS_Bus <= '0' & x"38"; when "0010" => Data_RS_Bus <= '0' & x"38"; when "0011" => Data_RS_Bus <= '0' & x"38"; when "0100" => Data_RS_Bus <= '0' & x"0f"; when "0101" => Data_RS_Bus <= '0' & x"01"; when "0110" => Data_RS_Bus <= '0' & x"06"; when "0111" => Data_RS_Bus <= '1' & x"48"; when "1000" => Data_RS_Bus <= '1' & x"65"; when "1001" => Data_RS_Bus <= '1' & x"6c"; 262 when "1010" => Data_RS_Bus <= '1' & x"6c"; when "1011" => Data_RS_Bus <= '1' & x"6f"; when "1100" => Data_RS_Bus <= '1' & x"20"; when "1101" => Data_RS_Bus <= '1' & x"61"; when "1110" => Data_RS_Bus <= '1' & x"6c"; when others => Data_RS_Bus <= '1' & x"6c"; end case; end process; -- Route Data_RS_Bus to RS and Data bus on the LCD. RS <= Data_RS_Bus(8); Data <= Data_RS_Bus(7 downto 0); --------------------------------------------------------------------------- -- Bulk Delay Control. --------------------------------------------------------------------------- -- Delay Controller. process (Inst_Cnt) begin case (Inst_Cnt) is when "0000" => Ind_Delay_Ctrl <= "1000"; when "0001" => Ind_Delay_Ctrl <= "0010"; when "0010" => Ind_Delay_Ctrl <= "0001"; when "0011" => Ind_Delay_Ctrl <= "0001"; when "0100" => Ind_Delay_Ctrl <= "0001"; when "0101" => Ind_Delay_Ctrl <= "0100"; when "0110" => Ind_Delay_Ctrl <= "0001"; when "0111" => Ind_Delay_Ctrl <= "0001"; when "1000" => Ind_Delay_Ctrl <= "0001"; when "1001" => Ind_Delay_Ctrl <= "0001"; when "1010" => Ind_Delay_Ctrl <= "0001"; when "1011" => Ind_Delay_Ctrl <= "0001"; when "1100" => Ind_Delay_Ctrl <= "0001"; when "1101" => Ind_Delay_Ctrl <= "0001"; when "1110" => Ind_Delay_Ctrl <= "0001"; when others => Ind_Delay_Ctrl <= "0001"; end case; end process; -- Delay Switch. process (State, Ind_Delay_Ctrl) begin if ((State = E_Pulse_Lo) or (State = Proc_Comp_Delay)) then Delay_Switch_Out <= Ind_Delay_Ctrl; 263 else Delay_Switch_Out <= "0000"; end if; end process; -- Wiring to each CE signals. Delay_4ms_E <= Delay_Switch_Out(3); Delay_2ms_E <= Delay_Switch_Out(2); Delay_100us_E <= Delay_Switch_Out(1); Delay_40us_E <= Delay_Switch_Out(0); -- 4ms Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_4ms <= "000000000000000000"; else if (Delay_4ms_E = '1') then Delay_4ms <= Delay_4ms + 1; end if; end if; end if; end process; -- 4ms Delay Timeout Indicator. process (Delay_4ms) begin if (Delay_4ms = "111111111111111111") then Delay_4ms_I <= '1'; else Delay_4ms_I <= '0'; end if; end process; -- 2ms Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_2ms <= "00000000000000000"; else if (Delay_2ms_E = '1') then Delay_2ms <= Delay_2ms + 1; 264 end if; end if; end if; end process; -- 2ms Delay Timeout Indicator. process (Delay_2ms) begin if (Delay_2ms = "11111111111111111") then Delay_2ms_I <= '1'; else Delay_2ms_I <= '0'; end if; end process; -- 100us Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_100us <= "0000000000000"; else if (Delay_100us_E = '1') then Delay_100us <= Delay_100us + 1; end if; end if; end if; end process; -- 100us Delay Timeout Indicator. process (Delay_100us) begin if (Delay_100us = "11111111111") then Delay_100us_I <= '1'; else Delay_100us_I <= '0'; end if; end process; -- 40us Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then 265 Delay_40us <= "00000000000"; else if (Delay_40us_E = '1') then Delay_40us <= Delay_40us + 1; end if; end if; end if; end process; -- 40us Delay Timeout Indicator. process (Delay_40us) begin if (Delay_40us = "11111111111") then Delay_40us_I <= '1'; else Delay_40us_I <= '0'; end if; end process; -- Delay Timeout Selector. process (Inst_Cnt, Delay_4ms_I, Delay_2ms_I, Delay_100us_I, Delay_40us_I) begin case (Inst_Cnt) is when "0000" => Delay_TO <= Delay_4ms_I; when "0001" => Delay_TO <= Delay_100us_I; when "0010" => Delay_TO <= Delay_40us_I; when "0011" => Delay_TO <= Delay_40us_I; when "0100" => Delay_TO <= Delay_40us_I; when "0101" => Delay_TO <= Delay_2ms_I; when "0110" => Delay_TO <= Delay_40us_I; when "0111" => Delay_TO <= Delay_40us_I; when "1000" => Delay_TO <= Delay_40us_I; when "1001" => Delay_TO <= Delay_40us_I; when "1010" => Delay_TO <= Delay_40us_I; when "1011" => Delay_TO <= Delay_40us_I; when "1100" => Delay_TO <= Delay_40us_I; when "1101" => Delay_TO <= Delay_40us_I; when "1110" => Delay_TO <= Delay_40us_I; when others => Delay_TO <= Delay_40us_I; end case; end process; --------------------------------------------------------------------------- -- Enable Pulse Generation. --------------------------------------------------------------------------- 266 -- 80ns Delay Chip Enable Toggle. process (State) begin if ((State = Write_Data) or (State = Data_Setup_Delay)) then Delay_80ns_E <= '1'; else Delay_80ns_E <= '0'; end if; end process; -- 80ns Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_80ns <= "00"; else if (Delay_80ns_E = '1') then Delay_80ns <= Delay_80ns + 1; end if; end if; end if; end process; -- 240ns Delay Chip Enable Toggle. process (State) begin if ((State = E_Pulse_Hi) or (State = E_Hi_Time)) then Delay_240ns_E <= '1'; else Delay_240ns_E <= '0'; end if; end process; -- 240ns Delay Chip Enable Toggle. process (State) begin if ((State = E_Pulse_Hi) or (State = E_Hi_Time)) then E <= '1'; else E <= '0'; end if; end process; 267 -- 240ns Delay Element. process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then Delay_240ns <= "0000"; else if (Delay_240ns_E = '1') then Delay_240ns <= Delay_240ns + 1; end if; end if; end if; end process; --------------------------------------------------------------------------- -- State switcher. --------------------------------------------------------------------------- process (Clk) begin if (Clk'event and Clk = '1') then if Reset = '1' then State <= Pwr_Up; else State <= Next_State; end if; end if; end process; --------------------------------------------------------------------------- -- State machine => Updates the next state. ---------------------------------------------------------------------------
process (State, Delay_45ms, Delay_80ns, Delay_240ns, Delay_TO, Inst_Cnt) begin case (State) is when Pwr_Up => Next_State <= Pwr_Up_Delay; when Pwr_Up_Delay => if (Delay_45ms = "111111111111111111111") then Next_State <= Off_Pwr_Up_Delay; else Next_State <= Pwr_Up_Delay; end if; when Off_Pwr_Up_Delay => Next_State <= Write_Data; when Write_Data => 268 Next_State <= Data_Setup_Delay; when Data_Setup_Delay => if (Delay_80ns = "11") then Next_State <= E_Pulse_Hi; else Next_State <= Data_Setup_Delay; end if; when E_Pulse_Hi => Next_State <= E_Hi_Time; when E_Hi_Time => if (Delay_240ns = "1111") then Next_State <= E_Pulse_Lo; else Next_State <= E_Hi_Time; end if; when E_Pulse_Lo => Next_State <= Proc_Comp_Delay; when Proc_Comp_Delay => if (Delay_TO = '1') then Next_State <= Load_Next_Data; else Next_State <= Proc_Comp_Delay; end if; when Load_Next_Data => if (Inst_Cnt = "1111") then Next_State <= End_State; else Next_State <= Write_Data; end if; when End_State => Next_State <= End_Pad_12; when End_Pad_12 => Next_State <= End_Pad_13; when End_Pad_13 => Next_State <= End_Pad_14; when End_Pad_14 => Next_State <= End_Pad_15; when End_Pad_15 => Next_State <= End_Pad_16; when End_Pad_16 => Next_State <= End_Pad_16; end case; end process; 269 ----------------------------------------------------------------------- end Behavioral; Ở dạng đơn giản, bàn phím đƣợc tổ chức theo kiểu ma trận các hàng và các cột.Khi một
phím đƣợc nhấn thì một hàng và một cột đƣợc tiếp xúc với nhau, các hàng và các cột còn lại
không có sự tiếp xúc nào. Cách quét và xác định phím: Để phát hiện phím nhấn, bộ điều khiến sẽ nối đất tất cả các
hàng bằng cách đặt giá trị 0 lên các chốt ra, sau đó đọc các cột. Nếu dữ liệu đọc đựơc ở các
cột có giá trị: colum3-colum0=1111 tức là không có phím nào đƣợc nhấn và qua trình này cứ
tiếp tục cho đến khi phát hiện ra phím đƣợc nhấn. Ví dụ nếu colum3-colum0 = 1101 có nghĩa
là phím ở cột colum1 đƣợc nhấn. sau khi 1 phím nhấn đã đƣợc đã đƣợc phát hiện, bộ điều
khiển sẽ chuyển qua quá trình xác định phím nhấn đó. Bắt đầu từ hàng trên cùng,, bộ diều
khiển sẽ nối đất hàng đó bằng cách đƣa vào một điện áp thấp cho hàng row0, sau đó nó tiến
hành đọc các cột. Nếu dữ liệu đọc đƣợc có giá trị hoàn toàn là 1 tứ là không phím nào ở hàng
này đƣợc kích hoẩtc thì quá trình sẽ chuyển sang hàng tiếp theo. Bộ đièu khiển lại nối đát
hàng tiếp theo, đọc giá trị ở các cột và kiểm tra xem có giá trị nào bằng 0 không. quá trình này
tiếp tục cho đến khi có hàng đƣợc xác định. sau khi xác định xong hàng có phím nhấn nhiệm
vụ tiếp theo là tìm xem cột nào có phím nhấn. Việc này khá đơn giản bởi vì VĐK biết đƣợc
bất cứ thời điểm nào hàng nào và cột nào đƣợc truy nhập. Sau đây là lƣu đồ thuật toán điều khiển quét bàn phím nhƣ hình dƣới đây: 270 Quá trình điều khiển gồm có các giai đoạn chính: + Để đảm bảo rằng phím nhấn trƣớc đó đã nhả ra, các giá trị 0 cùng một lúc điện áp đến
tất cả các hàng, và tiến hành đọc nhiều lần giá trị các cột cho đến khi tất cả các cột cho đến
khi tất cả các trụ cột có giá trị cao. + Để kiểm tra xem có phím nào đƣợc nhấn, các cột đƣợc quét theo một chu trình lặp
cho đến khi một trong các cột có giá tri 0 . Cần nhớ rằng các chốt lối ra lối với các hàng vấn
còn giá trị 0 ban đầu. có nghĩa là chúng đƣợc nối đất. sau khi phát hiện đƣợc ra phím nhấn, bộ
điều khiển sẽ cho thên 20ns, rồi mới qué các cột một lần nữa. Làm nhƣ vậy với 2 mục đích : - Bảo đảm việc phát tns hiệu ra phím nhấn không phải do lỗi xung nhiễu gây ra - Trễ 20ms ngăn ngừa việc coi phím ddos đƣợc nhấn nhiều lần. Nếu sau khi giữ chậm 20ms phím đó vấn còn bị nhấn thì bộ điều khiển sẽ chuyển sang bƣớc tiếp theo là xác định phím đó thuộc về hàng nào. + Để phát hiện phím nhấn thuộc về hàng nào, cần nối đất từng hàng một và mỗi lần nhƣ
vậy phải đọc giá trị các cột. Nếu tất cả các cột đều ở mức cao có nghĩa là phím đựoc nhấn
không thuộc hàng đó; vì vậy cần nối đất hàng tiếp theo vàcứ thế tiếp tục cho đén khi tìm đƣợc 271 hàng có phím đƣợc nhấn. Khi tìm hàng có phím nhấn có nghĩa chúng ta đƣợc thông tin cần
thiết để xác định vị trí phím . + Sơ đồ tổng quát: Colum CLK Row Button --------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---------------------------------------------------- entity banphim4x4_vhdl is Port ( clk : in STD_LOGIC; colum : in STD_LOGIC_VECTOR (3 downto 0); row : inout STD_LOGIC_VECTOR (3 downto 0):="0000"; button : out std_logic_vector (3 downto 0)); end banphim4x4_vhdl; architecture Behavioral of banphim4x4_vhdl is signal button0,button1,button2,button3: std_logic_vector(3 downto 0); signal CLK_chiatan :std_logic:='0'; signal dem: std_logic_vector (4 downto 0):="00000"; signal count_mod4: std_logic_vector (2 downto 0) := "000"; begin -- khoi chia tan: process(clk) begin if clk='1' and clk'event then 272 if dem = 20 then dem <= "00000"; clk_chiatan <= not clk_chiatan; else dem <= dem +1; end if; end if; end process ; -- bo dem mode 4 process(clk_chiatan) begin if(clk_chiatan'event and clk_chiatan='1') then if(count_mod4=4) then count_mod4<="000"; else count_mod4<=count_mod4 +1; end if; end if; end process; process(count_mod4) begin case count_mod4 is when "000" => button<=button0; row<="0111"; when "001" => button<=button1; row<="1011"; when "010" => button<=button2; row<="1101"; when "011" => button<=button3; row<="1110"; when others => button<=button0; row<="0111"; end case; end process; -- quet hang thu nhat: process(CLK) begin if clk'event and clk='1' and row(0)='0' then if (colum="1110") then button0<= x"0"; elsif (colum="1101") then button0<= x"1"; elsif (colum="1011") then button0<= x"2"; elsif (colum="0111") then button0<= x"3"; else button0<= X"0"; end if; end if; end process; -- quet hang thu hai: process(CLK) begin if clk'event and clk='1' and row(1)='0' then 273 if (colum="1110") then button1<= x"4"; elsif (colum="1101") then button1<= x"5"; elsif (colum="1011") then button1<= x"6"; elsif (colum="0111") then button1<= x"7"; else button1<= X"0"; end if; end if; end process; -- quet hang thu ba: process(CLK) begin if clk'event and clk='1' and row(2)='0' then if (colum="1110") then button2<= x"8"; elsif (colum="1101") then button2<= x"9"; elsif (colum="1011") then button2<= x"A"; elsif (colum="0111") then button2<= x"B"; else button2<= X"0"; end if; end if; end process; -- quet hang thu tu: process(CLK) begin if clk'event and clk='1' and row(3)='0' then if (colum="1110") then button3<= x"C"; elsif (colum="1101") then button3<= x"D"; elsif (colum="1011") then button3<= x"E"; elsif (colum="0111") then button3<= x"F"; else button0<= X"0"; end if; end if; end process; end Behavioral; Kết nối của cổng PS2 là kết nối song công. Host có thể gửi lệnh xuống chuột hoặc bàn
phím để cài đặt các tham số . Tuy nhiên trong thiết kế này của chúng ta chƣa xét đến tính
năng này. 274 Hình dƣới đây mô tả cấu trúc dữ liệu truyền qua PS2. 275 Dữ liệu đƣợc truyền nối tiếp trên đƣờng ps2d , mỗi bít sẽ đƣợc nhận ra khi có sƣờn âm
của tín hiệu ps2c. Thời gian của tín hiệu clock là khoảng 60-100ps ( 10khz- 16.7khz) . Và dữ
liệu phải đƣợc đặt trên dây data tổn định trƣớc,sau khi có sƣờn âm của clock ( thời gian này
khoảng 5ps) . Chúng ta sẽ xây dựng một mạch nhận dữ liệu nối tiếp, có 3 trạng thái. Mặc định đƣợc
hoạt động trong trạng thái nghỉ. Một bộ phận có chức năng phát hiện sƣờn âm của tín hiệu
ps2c,sau đó tín hiệu Fall_edge đƣợc đƣa lên mức tích cục. Khi xuất hiên sƣờn âm đầu tiên của
tín hiệu clock ( fall_edge=1) và chân cho phép nhận rx_en ở mức tích cực ( rx_en=1) , bít
đầu tiên sẽ đƣợc đọc vào. Lần lƣợt đọc hết các bít còn lại. Khi kết thúc 1 chuỗi bít, tín hiệu
rx_done_tick đƣợc đặt lên mức tích cực. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; Use ieee.numeric_std.all; Entity PS2Rx is Port ( clk,reset:in std_logic; ps2d,ps2c:in std_logic;--keydata,keyclock rx_en:in std_logic; rx_done_tick : out std_logic; dout: out std_logic_vector(7 downto 0) ); End PS2Rx; Architecture arch of PS2Rx is Constant BRK: std_logic_vector(7 downto 0):=x"F0"; Type statetype is(idle,dps,load); signal state_reg,state_next: statetype; signal filter_reg,filter_next:std_logic_vector(7 downto 0); signal f_ps2c_reg,f_ps2c_next:std_logic; signal n_reg,n_next:unsigned(3 downto 0); signal fall_edge:std_logic; signal b_reg,b_next:std_logic_vector(10 downto 0); Begin --------------------------------------------------------------------------- --filter and falling edge tick generation for ps2c --------------------------------------------------------------------------- Process(clk,reset) Begin if reset='1' then filter_reg<=(others=>'0'); f_ps2c_reg<='0'; 276 elsif (clk'event and clk='1') then filter_reg<=filter_next; f_ps2c_reg<=f_ps2c_next; End if; End process; filter_next<=ps2c & filter_reg(7 downto 1); f_ps2c_next<='1' when filter_reg= "11111111" else '0' when filter_reg="00000000" else f_ps2c_reg; fall_edge<=f_ps2c_reg and(not f_ps2c_next); --fsmd to extract the 8_bit data --------------------------------------------------------------------------- --registers process(clk,reset) begin if reset='1'then state_reg<=idle; n_reg<=(others=>'0'); b_reg<=(others=>'0'); elsif(clk'event and clk='1')then state_reg<=state_next; n_reg<=n_next; b_reg<=b_next; end if; end process; --next_state logic process(state_reg,n_reg, b_reg, fall_edge, rx_en, ps2d) begin rx_done_tick<='0'; state_next<=state_reg; n_next<=n_reg; b_next<=b_reg; case state_reg is when idle=> if fall_edge='1' and rx_en='1'then --shift in start bit b_next<=ps2d & b_reg(10 downto 1); n_next<="1001"; state_next<=dps; end if; when dps=> --8data+1parity+1stop if fall_edge='1' then b_next<=ps2d & b_reg(10 downto 1); if n_reg=0 then 277 state_next<=load; else n_next<=n_reg - 1; end if; end if; when load=> --1 extra clock to complete fhe last shift state_next<=idle; rx_done_tick<='1'; end case; end process; --output dout<=b_reg(8 downto 1);--data bits end arch; Dữ liệu sau khi đƣợc mạch nhận, nhận và convert từ 8bit nối tiếp sang song song đƣợc
đƣa tới mạch Scancode dùng để xác định phím nào đƣợc ấn . ( Chú ý, 8bit dữ liệu bàn phím
gửi đến mạch nhận là các mã phím bấm đƣợc mã hóa theo chuẩn do các hãng sản suất quy
định, thông dụng nhất là mã nhƣ mô tả hình 5.3.3) . Dữ liệu sau đó sẽ đƣợc đƣa qua một khối
FIFO có tác dụng nhƣ bộ đệm dữ liệu. Tùy vào thiết kế mà chúng ta sẽ xây dựng bộ scancode
khác nhau. Ví dụ sau khi bấm phím, scancode sẽ chuyển mã phím nhận đƣợc sang mã ASCII
. Ở thiết kế này chúng ta sẽ không đi vào chi tiết mà chỉ dừng ở khối nhận dữ liệu. ------------------------------------------------- 278 UART (universal asynchronous receiver and transmitter) là một giao thức truyền thông
nối tiếp bất đồng bộ. Năm 1960 hiệp hội điện tử EIA đẫ xây dựng một chuẩn giao tiếp gọi là
RS232 , năm 1963 chuẩn này đuơcj cải tiến thành RS232A, tiếp sau là RS232B, RS232C.
Tuy nhiên trong thiết kế này chúng ta chủ yếu đề cập tới RS232 ,là chuẩn phổ biến nhất. Do
RS232 sử dụng mức điện áp từ -25v đến +25v cho các mức 0,1, do đó để tƣơng thích với các
linh kiện TTl hiện nay,chúng ta cần chú ý chuyển đổi điện áp cho tƣơng thích( ví dụ sử dụng
MAX232 ). Một UART bao gồm một mạch truyền dữ liệu hoạt động nhƣ 1 thanh ghi dịch từ song
song sang nối tiếp, 1 mạch nhận dữ liệu hoạt động nhƣ thanh ghi dịch từ nối tiếp sang song
song. Dữ liệu đƣợc truyền từng bit theo gói , bít đầu tiên đƣợc truyền là bit Start (mức logic 0)
, tiếp theo đến các bit data, bit chẵn lẽ nếu có, cuối cùng là bit stop( logic 1) . Trƣớc khi
truyền hay nhận dữ liệu cần đƣợc cài đặt các tham số nhƣ tốc độ truyền, có thể là
2400,4800,9600, hoặc 19,200 bauds. Ở thiết kế này chúng ta sẽ thiết kế 1 bộ UART 19200
baud, 8 bit dữ liệu, 1 bit stop và không có bit chẵn lẻ. Tỉ lệ phổ biến nhất đƣợc sử dụng để lấy mẫu tín hiệu là bằng 16 lần tốc độ truyền, có
nghĩa là mỗi bit nối tiếp đƣợc lấy mẫu 16 lần. Giả sử kết nối sử dụng N bit dữ liệu và M bit
stop, khối nhận thực hiện nhƣ sau. - Chờ tín hiệu tới mức '0' bào hiệu bắt đầu bit start, khởi đôgj bộ đếm đánh dấu điểm lấy mẫu ( sampling tick counter). - Khi bộ đếm đến 7, tín hiệu đạt tới điểm giữa của bit start. thì xóa bộ đếm về 0 và khởi động lại bộ đếm. - Khi bộ đếm đến 15, thời điểm đang ở giữa bit dữ liệu đầu tiên, đọc giá trị bằng cách dịch bít vào 1 thanh ghi. Sau đó khởi động lại bộ đếm. - Thực hiện lại bƣớc trên N-1 lần để nhận hết các bít dữ liệu - Thực hiên hiện tiếp bƣớc trên M lần cho việc nhận bit stop. - Khối baud rate generator: Tạo điểm đánh dấu lấy mẫu ( sample ticks). 279 - Khối receiver : Nhận dữ liệu , chuyển thành các bít song song - Interface circuit : cung cấp bộ đệm FIFO, giao tiếp với hệ thống. * Trong thiết kế này tốc đọ truyền nối tiếp baud rate = 19200 do đó tốc đọ lấy mẫu =
19200*16=307200 ticks per second . Thiết kế thực hiện trên kit Spartan 3AN của xilinx, có
clock system = 50Mhz ,do đó cần có bộ đếm mod (50.000.000/ 307200) = 163. Lƣu đồ thuật toán của thiết kế đƣợc mô tả trong Hằng số D_BIT chỉ ra số bit dữ liệu, SB_tick chỉ ra số dấu ticks cần lấy mẫu cho Stop bit , ví dụ 16,24,32 tƣơng ứng 1bit stop, 1.5 bit , 2 bit. -------------------------------------- library ieee; use ieee.std_logic_1164.all ; use ieee.numeric_std.all ; entity uart_rx is generic( DBIT : integer := 8; -- # data bits SB_TICK: integer:=16 -- # ticks for stop bits ); port ( clk, reset: in std_logic; rx: in std_logic; s_tick: in std_logic; rx_done_tick: out std_logic ; dout: out std_logic_vector (7 downto 0) ) ; end uart_rx ; architecture arch of uart_rx is type state_type is (idle, start, data, stop); signal s_reg , s_next : unsigned (3 downto 0) ; signal n_reg , n_next : unsigned (2 downto 0) ; signal b_reg , b_next : std_logic_vector (7 downto 0) ; signal state_reg , state_next : state_type; begin -- FSMD state & data registers process (clk , reset) begin if reset='1' then state_reg <= idle; s_reg <= (others=> '0' ) ; n_reg <= (others=> '0'); b_reg <= (others=>'0'); 280 elsif (clk'event and clk='1') then state_reg <= state_next; s_reg <= s_next; n_reg <= n_next; b_reg <= b_next; end if ; end process; -- next-state logic & data path functional units/routing process (state_reg , s_reg ,n_reg ,b_reg, S_tick ,rx) begin state_next <= state_reg; s_next <= s_reg; n_next <= n_reg; b_next <= b_reg; rx_done_tick <='0'; case state_reg is when idle => if rx='0' then state_next <= start; s_next <= (others=> '0' ) ; end if; when start => if (s_tick = '1') then if s_reg=7 then state_next <= data; s_next <= (others=>'0'); n_next <= (others=>'0'); else s_next <= s_reg + 1; end if ; end if ; when data => if (s_tick = '1') then if s_reg=15 then s_next <= (others=>'0'); b_next <= rx & b_reg(7 downto 1) ; if n_reg= (DBIT -1) then state_next <= stop ; else n_next <= n_reg + 1; end if; 281 else s_next <= s_reg + 1; end if ; end if ; when stop => if (s_tick = '1') then if s_reg=(SB_TICK - 1) then state_next <= idle ; rx_done_tick <= '1' ; else s_next <= s_reg + 1; end if; end if ; end case; end process; dout <= b_reg; end arch; 282 --------------------------------------- * Thiết kế mạch giao tiếp có thêm bộ đệm dữ liệu. 283 Có thể sử dụng kích thuwocs bộ đệm tùy thuộc ứng dụng, ở đây chúng ta xây dựng 1 bộ đệm đơn giản. ----------------------------------------- library ieee; use ieee.std_logic_1164.all ; entity flag_buf is generic (W : integer :=8 ) ; port( clk, reset: in std_logic; clr_flag, set_flag : in std_logic ; din: in std_logic_vector (W-1 downto 0) ; dout : out std_logic_vector (W-1 downto 0) ; 284 flag: out std_logic ); end flag_buf ; architecture arch of flag_buf is signal buf_reg,buf_next: std_logic_vector (W-1 downto 0) ; signal flag_reg , flag_next : std_logic ; begin -- FF & register process (clk, reset) begin if reset='1' then buf_reg <= (others=>'0'); flag_reg <= '0'; elsif (clk'event and clk='1') then buf_reg <= buf_next ; flag_reg <= flag_next; end if ; end process; --next state logic process (buf_reg ,flag_reg ,set_flag ,clr_flag ,din) begin buf_next <= buf_reg; flag_next <= flag_reg; if (set_flag='1') then buf_next <= din; flag_next <= '1'; elsif (clr_flag= '1') then flag_next <= '0'; end if ; end process; -- output logic dout <= buf_reg; flag <= flag_reg; end arch; Dựa vào các khối trên, tƣơng tự ta sẽ thiết kế khối truyền dữ liệu. 285 ------------------------- Sơ đồ khối mạch giao tiếp UART ------------------code khối nhận dư liệu-----------------------------------
---- library ieee; use ieee.std_logic_1164.all ; use ieee.numeric_std.all ; entity uart_tx is generic( DBIT : integer := 8 ; -- # data bits SB_TICK: integer:=16 -- # ticks for stop bits ); port ( clk, reset: in std_logic; tx_start : in std_logic; s_tick: in std_logic ; din: in std_logic_vector (7 downto 0) ; tx_done_tick: out std_logic; tx: out std_logic ); end uart_tx ; architecture arch of uart_tx is type state_type is (idle, start, data, stop); signal state_reg, state_next : state_type; signal s_reg , s_next : unsigned (3 downto 0) ; signal n_reg , n_next : unsigned (2 downto 0) ; 286 signal b_reg ,b_next : std_logic_vector (7 downto 0) ; signal tx_reg , tx_next : std_logic ; begin -- FSMD state C? data registers process (clk, reset) begin if reset='1' then state_reg <= idle; s_reg <= (others=>'0' ); n_reg <= (others=>'0'); b_reg <= (others=>'0'); tx_reg <= '1'; elsif ( clk'event and clk='1' ) then state_reg <= state_next; s_reg <= s_next; n_reg <= n_next; b_reg <= b_next; tx_reg <= tx_next; end if ; end process; -- next-state logic & datapath functional units /routing process (state_reg , s_reg ,n_reg ,b_reg, s_tick, tx_reg,tx_start,din) begin state_next <= state_reg; s_next <= s_reg; n_next <= n_reg; b_next <= b_reg; tx_next <= tx_reg ; tx_done_tick <= '0'; case state_reg is when idle => tx_next <= '1' ; if tx_start='1' then state_next <= start; s_next <= (others=>'0'); b_next <= din; end if ; when start => tx_next <= '0'; if (s_tick = '1') then if s_reg=15 then state_next <= data; s_next <= (others=>'0'); 287 n_next <= (others=>'0'); else s_next <= s_reg + 1; end if ; end if; when data => tx_next <= b_reg(0) ; if (s_tick = '1') then if s_reg=15 then s_next <= (others=>'0'); b_next <= '0' & b_reg (7 downto 1); if n_reg= (DBIT -1) then state_next <= stop ; else n_next <= n_reg + 1; end if ; else s_next <= s_reg + 1; end if; end if ; when stop => tx_next <= '1'; if (s_tick = '1') then if s_reg= (SB_TICK -1) then state_next <= idle; tx_done_tick <= '1'; else s_next <= s_reg + 1; end if ; end if ; end case; end process; tx <= tx_reg; end arch; 288 -------------------------------------------- Trong quá trình viết mã chƣơng trình VHDL, để thuận lợi cho việc sử dụng lại thiết kế,
kiểm tra thiết kế, cũng nhƣ trao đổi thiết kế giữa các thành viên trong một nhóm, các đối
tƣợng nên đƣợc đặt tên theo một quy ƣớc chung. Điều đó sẽ giúp cho việc nhận dạng loại đối
tƣợng, đặc tính của chúng một cách dễ dàng hơn. Tuy nhiên mỗi công cụ tổng hợp có thể có
các quy định đặt tên khác nhau, nhƣng về cơ bản chúng đều có nhiều điểm chung. Những quy
ƣớc đặt tên dƣới đây đã đƣợc sử dụng cho công cụ tổng hợp XST của Xilinx. Sử dụng các ký tự A-Z, a-z, $, _ , - , các số 0-9 để đặt tên. Tên phải chứa ít nhất một và bắt đầu bằng ký tự chữ (không phải ký tự số). Tên không dài quá 256 ký tự. Tránh đặt tên trùng với các từ khóa đã đƣợc sử dụng bởi chƣơng trình tổng hợp gồm: Nên sử dụng các tên có ngữ nghĩa (theo tiếng anh) và giống nhƣ trong sơ đồ khối
của mạch, của hệ thống. Nên đặt theo mục đích sử dụng (ví dụ: AdrCounter), không
cần thiết chứa kích thƣớc hay kiểu của đối tƣợng (ví dụ không nên đặt:
UpCounter8Bit). Tên nên bao gồm từ 2 đến 6 chuỗi ký tự con: o Chuỗi ký tự con bắt đầu bằng 1 chữ in hoa, còn lại là chữ thƣờng. o Chuỗi ký tự con nên dùng chữ viết tắt có nghĩa của hành động (ví dụ: Sel, Inc,
Add, Load) và của đối tƣợng (ví dụ Reg, Mux, Data, Key), hay mục đích của đối
tƣợng. Tên của đối tƣợng ứng với phần cứng (ví dụ tên của Signals, Entities/Architectures, Components) nên bắt đầu bằng chứ in hoa. Ví dụ Clk, UpCounter...) 289 Tên của đối tƣợng mà không ứng với phần cứng nào (ví dụ tên của Variables, Types) và tên của Nhãn (labels) nên bắt đầu bằng chữ thƣờng. Sử dụng hậu tố để xác định đặc tính đặc biệt hoăc kiểu tên (ví dụ SamplexD, hậu tố xD chỉ đó là tín hiệu địa chỉ (Address) hoặc số liệu (Data). Sử dụng cùng tên cho tín hiệu xuyên suốt các mức, hoặc thêm tiền tố (prefix) và các
tên ở mức cao hơn chỉ khối nguồn ra hoặc đích đến của tín hiệu (ví dụ: IdlexD-
>CtrlIdexD, InDataxDI->PipeInDataxD). Không sử dụng “_” cho tên cổng, nhƣng có thể sử dụng cho tên hằng. Nên đặt thống nhất với tên của Entity và tên của Module, để các công cụ tổng hợp dễ
dàng tạo ra script file khi biên dịch thiết kế hơn. Nếu thiết kế có nhiều hơn một Entity
hoặc Module thì chúng nên đƣợc lƣu trong các file riêng biệt phù hợp. Đặt tên file có chứa toàn bộ tên hoặc viết tắt tên đơn vị thiết kế bằng chữ thƣờng và thêm phần mở rộng bằng hậu tố .vhd hoặc .vhdl. Chỉ sử dụng chữ in hoa và dấu “_” (ví dụ: WIDTH, RAM_DEPTH, LFSR_INIT). Tránh dùng “_” cho generics (vì sẽ gây nhầm lẫn khi tổng hợp). Bắt đầu bằng ký tự in hoa. Sử dụng hậu tố theo ngữ cảnh, nhóm hậu tố x[CRSDTA], x[NP], hoặc x[?Z?B?[IO]]. - Các thành phần hậu tố x[CRSDTA] xác định loại tín hiệu xC ClkxC clock clock xR RstxRB Reset mức tích cực thấp reset control/status xS SelInputxS, FullxS Tín hiệu điều khiển và trạng thái data/address xD SamplexD, RamAdrxD Tín hiệu địa chỉ và dữ liệu xT ScanEnxT, RamIsolxT Tín hiệu kiểm tra test asynchronous xA StrobexA Tín hiệu không đồng bộ - Hậu tố xN hoặc xP: xác định trạng thái tiếp theo (next) hoặc trạng thái hiện tại (present), ví dụ StatexDN/StatexDP, AddrCntxDN/AddrCntxDP. - Hậu tố xZ : xác định tín hiệu 3 trạng thái. - Hậu tố xB: xác định tín hiệu mức tích cực thấp - Hậu tố xI, xO hoặc xIO xác định tín hiệu vào (Input) hoặc tín hiệu ra (Output) của Entity, ví dụ CoeffxDI, FullxSO, ExtRamxDZIO. 290 Bắt đầu bằng chữ thƣờng ví dụ (temp, i, currentState). Không sử dụng hậu tố (để tránh nhầm với Tín hiệu). Sử dụng hậu tố “Type” hoặc tên xác định kiểu, ví dụ: stateType, stdLogicArray. Đặt tên có ngữ nghĩa miêu tả đƣợc mục đích của mạch, ví dụ DesEngine Đặt theo kiểu mô tả (Ví dụ: Behavioral, Procedural, Dataflow, Structural) hoặc theo đặc tính kiến trúc xác định. Đặt tên theo Entity tƣơng ứng kèm với hậu tố “Cfg”, ví dụ: DesEngineCfg. Đặt theo tên của thiết kế cùng với hậu tố “Pkg” (ví dụ: DesEnginePkg). Đặt theo tên của Entity kèm hậu tố “Tb”, ví dụ: DesEngineTb, DesEngineTbPkg). Đặt tên của thƣ viện kèm hậu tố “Lib”, ví dụ: ArithLib. Đặt nhãn trƣớc tất cả các cấu trúc lệnh song song phức tạp. Bắt đầu bằng chữ thƣờng và sử dụng hậu tố tƣơng ứng với chức năng của khối mạch nhƣ sau: register Reg stateReg counter Cnt addressCnt Comb combinationa
l nextStateCom
b testbench Tb stimulusTb Blk inputPortBlk Inst datapathInst Gen reduceAndGen 291 292 -- This packages defines a standard for designers
-- to use in describing the interconnection data types
-- used in vhdl modeling. Declares std_logic, rising_edge(), etc
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- This package defines a set of arithmetic, conversion, and
-- comparison functions for SIGNED, UNSIGNED, SMALL_INT, INTEGER,
-- STD_ULOGIC, STD_LOGIC, and STD_LOGIC_VECTOR.
library IEEE;
use IEEE.STD_LOGIC_ARITH.all; entity ENTITY_NAME is port (
PORT_NAME: PORT_NAME: in BOOLEAN;
PORT_NAME: in INTEGER range 0 to 31;
PORT_NAME: inout BIT;
PORT_NAME: buffer BIT_VECTOR (3 downto 0);
PORT_NAME: out STD_LOGIC;
PORT_NAME: out STD_LOGIC_VECTOR (0 to 3);
); end entity ENTITY_NAME; architecture ARCH_NAME of ENTITY_NAME is
begin logical : and, or, nand, nor, xor, xnor, not
relational : =, /=, <, <=, >, >=
arithmetic : +, -, *, /, rem, mod, abs, **
concatenation: & Declaration:
component COMPONENT_NAME is port ( LABEL1: COMPONENT_NAME port map (
COMP_PORT_NAME => SIG_NAME,
COMP_PORT_NAME => SIG_NAME Instantiation:
); 293 constant CONST_NAME: -- Examples:
constant CONST_NAME: BOOLEAN := TRUE;
constant CONST_NAME: INTEGER := 31;
constant CONST_NAME: BIT_VECTOR (3 downto 0) := "0000";
constant CONST_NAME: STD_LOGIC := 'Z';
constant CONST_NAME: STD_LOGIC_VECTOR (3 downto 0) := "0-0-"; signal SIG_NAME: -- integer type
type TYPE_MAME is range 0 to 255;
subtype TYPE_MAME is integer range 0 to 7;
-- array type
type TYPE_NAME is array (0 to 31) of BIT;
-- enumeration type
type TYPE_NAME is (ST1, ST2, ST3, ST4, ST5);
subtype S_TYPE_NAME is TYPE_NAME range ST2 to ST4;
--example enumerated states
type STATES is (INIT, LOAD, FETCH, JUMP);
signal cs, ns : STATES; LABEL1: -- optional label
process ()
-- declarations
begin --wait on CLK, RESET;
--wait until CLK'event and CLK='1'; end process; variable VAR_NAME: 294 if O <= A; O <= B; O <= C; O <= D; if SEL = ―00‖ then
elsif SEL = ―01‖ then
elsif SEL = ―10‖ then
else
end if; case LABEL1:
for I in function FUNC_NAME ({ 295 procedure PROC_NAME ({ --synchronous RESET active High 296 DFF w/ Asynchronous Reset:
process (CLK, RESET)
begin
if RESET='1' then --asynchronous RESET active High
DOUT <= '0';
elsif (CLK'event and CLK='1') then --CLK rising edge
DOUT <= DIN;
end if;
end process;
DFF w/ Synchronous Reset and Clock Enable:
process (CLK)
begin
if CLK'event and CLK='1' then --CLK rising edge
if RESET='1' then
DOUT <= '0';
elsif EN = ‗1‘ then –-clock enable
DOUT <= DIN;
end if;
end if;
end PROCESS;
-- Example Stimulus:
Reset <= ‗0‘, ‗1‘ after 20 ns;
Clk <= NOT clk after clk_period/2 ns;
STIM: process
begin
DATA<="0110";
LOAD<='0';
wait for 350 ns;
LOAD<='1';
wait for 50 ns;
LOAD<='0';
wait for 100 ns;
wait;
end process; Công nghệ CPLD/FPGA đang đƣợc phát triển rất mạng trên thế giới. Hiện nay Xilinx là
hãng đi đầu trong công nghệ CPLD/FPGA, sản phẩm của Xilinx bao gồm: các vi mạch CPLD
và FPGA, phần mềm thiết kế, các dịch vụ hỗ trợ thiết kế và các chƣơng trình nguồn. Trong
báo cáo này chúng tôi sẽ tóm tắt những vi mạch phổ biến giúp cho việc lựa chọn vi mạch khi
thiết kế đƣợc dễ dàng. Xilinx hiện đang cung cấp hai họ sản phẩm CPLD: XC9500 và CoolRunner. Họ CPLD XC9500 là loại vi mạch logic khả trình phức hợp với hiệu suất cao, nhiều đặc
tính và linh hoạt. Họ vi mạch này cho tốc độ cao, thích hợp với các hệ thống yêu cầu phát
triển thiết kế dễ dàng, vòng đời hệ thống lâu hơn, có khả năng nâng cấp nhiều phần. Họ vi
mạch này có mật độ tài nguyên từ 36 tới 288 macrocell, bao gồm các loại 2.5v (XC9500XV),
3.3v(XC9500XL), và 5v (XC9500). Tất cả các chân I/O đều có thể gắn trực tiếp trên các hệ
thống sử dụng nguồn 3v và 5v, công nghệ đóng vỏ CSP và BGA hiện đại, nhỏ gọn, dễ sử
dụng, cho phép tới 192 tín hiệu vào/ra. Các vi mạch này có khả năng lập trình trong hệ thống.
Dựa trên công nghệ xử lý tiên tiến, họ XC9500 có tốc độ nhanh, định thời chính xác, pin
locking tốt hơn, và có giao diện JTAG linh hoạt. Tất cả các vi mạch XC9500 đều có chất
lƣợng và độ tin cậy cao, với khả năng lập trình/xoá khoảng 10.000 lần và lƣu trữ dữ liệu
trong vòng 20 năm. yyy = Số các Macrocell
VD: 36, 72, 144, 288… XC = Xillinx XC
9500 k = Mức điện áp hoạt động x = Số seri
Ví dụ: 95 None = 5V
XL = 3.3V
XV = 2.5V - Hƣớng dẫn cách ký hiệu trong CPLD XC9500 Dòng sản phẩm này đƣợc cung cấp công cụ xử lý lỗi và hoàn thiện sản phẩm JTAG
theo tiêu chuẩn 1149.1 IEEE. Công cụ xử lý lỗi JTAG bao gồm các chuẩn: BYPASS,
SAMPLE/PRELOAD, EXTEST. Ngoài ra, còn có một số chuẩn chỉ có cho dòng XC9500
nhƣ: INTEST (kiểm tra chức năng hệ thống), HIGHZ (chức năng truyền tin), USERCODE
(theo dõi lập trình). Dòng XC9500 đƣợc hỗ trợ một loạt các công cụ gỡ rối và hoàn thiện sn
phẩm theo chuẩn công nghiệp, bao gồm: Corelis, JTAG, Asset Intertech. Các công cụ này cho
phép xây dựng vector kiểm tra để phân tích, kiểm tra và gỡ rối các lỗi sai hỏng trong hệ 297 thống. Dòng này còn đƣợc hỗ trợ bởi các chuẩn ATE, bao gồm: Teradyne, Hewlett Packard
và Genrad. Cũng giống nhƣ các họ sản phẩm điện tử khác, mỗi tên gọi của từng sản phẩm trong họ
CPLD XC9500 đều chứa đựng những thông tin về sản phẩm, bảng sau cho chúng ta biết cách
ký hiệu trong họ CPLD XC9500: Bảng thống kê danh sách và tham số của các vi mạch dòng XC9500 5V nhƣ sau: 36
800
5
34 72
1600
7,5
72 108
2400
7,5
108 144
3200
7,5
133 216
4800
10
166 288
6400
15
192 Dòng CPLD XC9500XL chủ yếu ứng dụng trong các hệ thống yêu cầu thời gian thiết
kế nhanh, có khả năng nâng cấp theo trƣờng. Dòng vi mạch lập trình trong hệ thống này cho
hiệu năng cao, lập trình với độ tin cậy cao, giá thành thấp. Dòng XC9500XL sử dụng
WebPowered qua các phần mềm miễn phí WebFITTER và WebPACK ISE. Dòng này có một
số đặc tính nổi bật nhƣ giá thành macrocell thấp, kiến trúc cố định lối vào ra linh hoạt, lập
trình có độ tin cậy cao giúp giảm độ rủi ro khi thiết kế hệ thống. Về mặt hiệu năng: tốc độ
truyền tín hiệu giữa hai chân là 5ns, tần số làm việc của hệ thống là 222 MHz. Dòng CPLD 2.5v XC9500XV của Xilinx dựa trên kiến trúc hiện đại, kết hợp độ linh
hoạt hệ thống với chi phí thấp, nhờ đó gim thời gian hoàn thiện sản phẩm và giảm chi phí sn
xuất. Hoạt động với điện áp 2.5v, dòng thiết bị này giảm 30% công suất tiêu thụ so với dòng
CPLD 3.3v, nhờ đó giảm tổn hao nhiệt, tăng độ tin cậy của thiết bị. Dòng XC9500XV với
công cụ phần mềm WebPOWERED hiện đang là dòng CPLD có giá thành thấp và dễ sử dụng
nhất. Sản xuất trên quy trình hiện đại nhất, dòng CPLD XC9500XV có đầy đủ các đặc tính
kiến trúc và mật độ nhƣ dòng sản phẩm XC9500XL. Các vi mạch có từ 36 tới 72, 144, 288
macrocell. Dòng sản phẩm này có hiệu năng cao, thể hiện qua các thông số: trễ truyền giữa
hai chân là 3.5ns, tần số làm việc hệ thống là 275 MHz. Dòng XC9500XV cũng có khả năng
lập trình trong hệ thống thông qua giao diện JTAG 1149.1 và 1532 IEEE. Nhờ đó, dòng sản
phẩm này có thể đƣợc thiết kế, kiểm tra, lập trình và nâng cấp từ xa. Các đặc tính đặc trƣng cho dòng XC9500XV bao gồm: các khối 54 đầu vào, khả năng
cố định lối vào/ra linh hoạt, hysteresis để giảm hệ số nhiễu, mạch bus-hold điều khiển I/O,
khả năng cách nhiệt, quản lý đồng bộ toàn hệ thống và đồng bộ từng phần. Dòng CoolRunner bao gồm 2 sản phẩm: CoolRunner XPLA3 (3.3v) và CoolRunner II (1.8v). CoolRunner kết hợp các đặc tính: công suất cực thấp, tốc độ cao, mật độ lớn, số lƣợng
cổng I/O trong một thiết bị đủ lớn. Dòng CoolRunner 3.3v có mật độ từ 32 tới 512 macrocell.
CPLD CoolRunner dựa trên công nghệ Fast Zero Power, giảm công suất dự phòng tới mức tối
thiểu (gần nhƣ bằng 0). Với đặc tính tiêu thụ công suất thấp, dòng sản phẩm này chủ yếu đƣợc 298 ứng dụng trong các thiết bị dùng nguồn pin, nhƣ: máy tính xách tay, điện thoại cầm tay, các
thiết bị hỗ trợ cá nhân kỹ thuật số, trò chơi điện tử, thiết bị truy nhập Web... Trong quá trình hoạt động, dòng CPLD này cũng sử dụng công suất thấp hơn nhiều so
với các họ CPLD khác. Do đó, dòng sản phẩm này thƣờng đƣợc ứng dụng trong các thiết bị
yêu cầu hiệu suất cao, nhạy với nhiệt nhƣ chuyển mạch viễn thông, hội nghị video, bộ mô
phỏng, bộ kiểm tra,... Họ sản phẩm CoolRunner II mở rộng các ứng dụng CPLD, trong họ sản phẩm này có thêm các đặc tính nhƣ LVTTL và SSTL, chế độ Clocking... Dòng CoolRunner XPLA3 của Xilinx chủ yếu ứng dụng trong các thiết bị nhạy với
công suất, và các thiết bị cầm tay. Dòng XPLA3 dựa trên công nghệ Fast Zero Power (FZP),
tốc độ truyền giữa hai chân thực tế là 5ns, dòng nguồn ở chế độ dự phòng dƣới 100 A. Trong
dòng sản phẩm này, phƣơng pháp khuếch đại sense (sử dụng để thực hiện các hạng tích trong
khi thiết kế PLD trƣớc đây) đã đƣợc thay bằng chuỗi phân tầng các cổng CMOS, nhờ đó giảm
đƣợc công suất tiêu thụ so với các họ CPLD khác. Thiết bị CoolRunner là dòng thiết bị duy
nhất kết hợp công nghệ CMOS và công nghệ FZP. Kiến trúc XPLA3 bao gồm: một lối vào tuần tự trực tiếp, nhiều tín hiệu xung nhịp,
công cụ lập trình JTAG, các cổng I/O 5v và một cấu trúc PLA hoàn chỉnh. Kiến trúc này có
tốc độ cao, kết hợp phân bố logic linh hoạt, nhờ đó có thể thay đổi thiết kế mà không phi thay
đổi các lối vào/ra của vi mạch. Kiến trúc XPLA3 bao gồm một dãy 48 hạng tích đƣợc sắp xếp
tùy ý tại các macrocell trong khối logic. Nhƣ vậy cho phép phân phối logic trong các khối
logic hiệu qu hn, đồng thời có thể sử dụng không hạn chế số lƣợng hạng tích trong mỗi
macrocell theo yêu cầu thiết kế. Ngoài ra, thay đổi số lƣợng hạng tích trong một macrocell
không làm ảnh hƣởng tới tốc độ làm việc của thiết bị. Dòng XPLA3 còn có giao diện JTAG
theo chuẩn IEEE 1149.1, cho phép lập trình trong hệ thống ISP và lập trình lại cho thiết bị.
Dòng CPLD XPLA3 đƣợc lập trình lại bằng điện, sử dụng các chƣơng trình nạp, xoá chuẩn
cung cấp bởi nhà sản xuất nhƣ Data I/O, BP Microsystems và SMS. Khối kết nối Khối logic Khối logic I/O0 I/O1 I/O1
I/O0 ZIA PLA
Logic I/O
Logic PLA
Logic I/O
Logic I/O15 I/O15 16 Macrocells trong một khối logic
2 đến 24 khối Logic trong một thiết bị (32 tới 384 Macrocells).
- Sơ lƣợc kiến trúc dòng Coolruner XPLA3 Kiến trúc XPLA3 nhƣ trong 0. Kiến trúc này bao gồm các khối logic liên kết với nhau
nhờ mảng kết nối không tiêu thụ công suất (ZIA). ZIA thực chất là một chuyển mạch điểm 0. 299 Mỗi khối logic có 36 đầu vào từ ZIA và 16 macrocell. Điều khác biệt của kiến trúc XPLA3 so
với các họ CPLD khác là phân bố logic bên trong mỗi khối và kỹ thuật đƣợc sử dụng để xây
dụng các khối logic. Dòng sản phẩm CoolRunner II của Xilinx kết hợp đặc tính tốc độ cao và dễ sử dụng của
họ XC9500/XL/XV với đặc tính công suất cực thấp của họ XPLA3. Nhờ khả năng lập trình
trong hệ thống ISP, một thiết bị CPLD có thể sử dụng cho nhiều ứng dụng khác nhau nhƣ:
truyền dữ liệu tốc độ cao, các hệ thống máy tính, các thiết bị cầm tay… Xilinx cung cấp đặc
tính FZP (Fast Zero Power), cho công suất tiêu thụ cực thấp. Các đặc tính thiết kế đƣợc hỗ trợ
bởi các chuẩn Xilinx ISE 4.1i, WebFITTER và ISE WebPACK. Dòng này sản xuất dựa trên công nghệ CMOS, nhờ đó gim đƣợc tổn hao nhiệt, các thiết
bị có kích thƣớc nhỏ, hoạt động với tốc độ cao. Dòng này có mật độ lớn, ngoài ra còn có một
loạt các đặc tính khác, phù hợp sử dụng trong các hệ thống thực hiện nhiều chức năng nhƣ:
bốn khối I/O (thích hợp sử dụng cho các hệ thống từ 384 đến 512 macrocell), mỗi khối gồm
các chân I/O sử dụng chung một điện áp chuẩn; bộ chia xung nhịp; cổng dữ liệu DataGATE
(có chức năng chặn và chốt đầu vào để tiết kiệm công suất). Hiện nay Xilinx cung cấp 2 dòng FPGA là Spartan và Virtex Giải pháp Virtex-II là FPGA cơ bản đầu tiên, giải pháp này một lần nữa đƣa ra một tiêu
chuẩn mới đánh giá hiệu suất, đồng thời đƣa ra một loạt các đặc tính chƣa từng có đƣợc hỗ trợ
bởi IBM, Wind River Systems, Conexant, RocketChips, The MathWorks, và các hãng công
nghệ hàng đầu khác. FPGA Platform cung cấp các giao diện vào/ra của hệ thống, XtremeDSP cho hiệu suất
DSP cao chƣa từng thấy (nhanh hơn 100 lần so với các bộ vi xử lý DSP hàng đầu), cung cấp
công nghệ xử lý Empower cho các yêu cầu xử lý hệ thống hiệu suất cao, độ linh hoạt lớn. Với mật độ tài nguyên từ 40000 lên tới 10 triệu cổng, giải pháp Virtex - II cung cấp bộ nhớ hiện đại cho hệ thống và DSP tốc độ cực nhanh, nhờ cơ cấu nhúng IP linh hoạt. Ngoài ra, các tính năng mới trong hệ thống sẽ giải quyết các vấn đề thiết kế cấp hệ
thống, bao gồm giao diện hệ thống linh hoạt với tính toàn vẹn tín hiệu (SystemIO, DCI), quản
lý đồng bộ hệ thống phức tạp (quản lý đồng bộ số DCM), và quản lý EMI trên bo mạch
(EMIControl). Giải pháp Virtex-II đƣợc thực hiện nhƣ các công cụ thiết kế tiên tiến, đem lại những ƣu
điểm về thời gian nhƣ: thiết kế nhanh, tổng hợp gọn, các thuật toán thiết kế thông minh, kiểm
tra hiệu quả. Cơ cấu này không chỉ cho khả năng kết hợp nhiều dạng IP mềm mà còn có khả
năng gắn thêm các phần cứng IP nhƣ các bộ xử lý hay các cổng I/O nối tiếp cỡ Gigabit vào
các sản phẩm của họ Virtex-II thế hệ tiếp theo. Họ Virtex là họ FPGA đầu tiên cung cấp một triệu cổng trên một hệ thống. Các vi mạch
hiện đại nhất trong họ Virtex-E ra đời năm 1999, cung cấp hơn ba triệu cổng trên một hệ
thống. Vi mạch Virtex-EM ra đời năm 2000. Vi mạch Virtex 4 ra đời năm 2004 là FPGA đầu
tiên sử dụng công nghệ 90nm, có tốc độ làm việc lớn, rất giầu tài nguyên các cổng logic - lên 300 tới hàng chục triệu cổng và có tích hợp thêm nhiều khối logic chức năng chuyên biệt nhƣ
quản lý xung clock, bộ nhớ RAM FIFO, công nghệ XStremeDSP, Vi xử lý nhúng POWERPC
tốc độ 400MHz, Tri-Mode Ethernet MAC... FPGA Spartan sử dụng trong những ứng dụng với số lƣợng lớn, giá thành thấp, thƣờng
đƣợc sử dụng để thay thế cho mảng cổng logic cố định và cho các sản phẩm dùng cho từng
ứng dụng cụ thể (ASSP) nhƣ các bộ chip giao diện bus. Họ vi mạch này bao gồm bốn loại:
Spartan IIE (1.8v), Spartan II (2.5v), Spartan XL (3.3v) và Spartan (5v). Họ Spartan-IIE (1.8v) cung cấp một số công nghệ FPGA tiến bộ nhất hiện nay, bao gồm
hỗ trợ lập trình cho các đa chuẩn I/O (bao gồm LVDS, LVPECL, HSTL), RAM on-chip và
các vòng khóa trễ số, cho cả quản lý đồng bộ chip và quản lý đồng bộ bo mạch. Ngoài ra, vi
mạch Spartan-IIE không cần sử dụng các vòng khóa pha, FIFO, bộ chuyển đổi I/O, bộ khởi
động bus hệ thống nhƣ các họ vi mạch trƣớc. Họ Spartan III đƣợc phát triển trên cơ sở kiến trúc của Virtex II ngoài các khối logic
còn có các khối quản lý clock số, DLL, tổ hợp tần số, dịch pha, nhân cứng 18 bit, khối
RAM... Các dòng CPLD XC9500 bao gồm ba dòng XC9500, XC9500XL và XC9500XV.
Trong đó, dòng XC9500XL hoạt động ở hiệu điện thế 3,3V và hiệu điện thế các pin I/O có
thể là 5,0V, 3,3V hoặc 2.5V. Đồng thời, dòng CPLD này cũng có đơn giá macrocell thấp
nhất. Các tính năng chính: Số lƣợng macrocell có thể từ 36 đến 288. Số lƣợng cổng có thể sử dụng từ 800 đến 6400 cổng. Trễ logic giữa các pin là 5ns, tốc độ bên trong có thể lên tới 208MHz Tiêu thụ ít điện năng. Hiệu điện thế các pin I/O có thể là 5,0V, 3,3V hoặc 2.5V.
Ma trận lập trình dùng công nghệ FastCONNECT IITM. Các khối Function có thể có đến 54 input. Mỗi macrocell có thể có tới 90 product-terms. Có thể đảo tín hiệu clock địa phƣơng. Có tín hiệu điều khiển bật tắt pin output. Cũng nhƣ các dòng CPLD khác, XC9500XL có các đặc điểm kiến trúc sau: Kiến trúc đồng nhất. Các khối chức năng (FB) giống nhau. Các macrocell giống nhau. Các pin I/O giống nhau 301 Mỗi cấu kiện XC9500XL là một hệt thống con bao gồm nhiều các khối chức năng
(Function Blocks, viết tắt là FB) và các khối giao diện I/O (IOB) đƣợc kết nối bằng ma trận
kết nối FastCONNECT II. Các khối giao diện IOB làm nhiệm vụ bộ đệm cho các input và
output. Mỗi FB có thể có 54 input và 18 output. Macrocells 36 72 144 288 Usable Gates 800 1,600 3,200 6,400 Registers 36 72 144 288 TPD (ns) 5 5 5 6 TSU(ns) 3.7 3.7 3.7 4.0 TCO(ns) 3.5 3.5 3.5 3.8 fSYSTEM (MHz) 178 178 208 - Kiến trúc XC9500XL CPLD Khối chức năng (FB) Sơ đồ khối chức năng của XC9500XL đƣợct trình bày ở 0 . Mỗi khối chức năng có 18
macrocell độc lập, mỗi macrocell có thể làm chức năng của một hàm tổ hợp (combinational)
hoặc có thanh ghi (registered). Các khối chức năng cũng có thể nhận các tín hiệu vào nhƣ tín
hiệu Set/Reset, Clock.Mỗi khối chức năng có thể có 18 output kết nối với ma trận kết nối
FastCONNECT hoặc các chân vào ra I/O. Số hạng tích tối đa là 90, có thể đƣợc phân phối tới
các macrocell bằng Produc term Allocator. Các logic trong FB đƣợc thực hiện theo kiểu tổng
của các hạng tích (sum-of-product) 302 - Sơ đồ khối chức năng (function block) của XC9500XL Macrocell - Sơ đồ macrocell 0 trình bày sơ đồ của một macrocell. Mỗi macrocell có thể đƣợc cấu hình thành một
hàm tổ hợp hoặc có thanh ghi (combinational hoặc registered function). Trong mỗi macrocell,
năm hạng tích từ ma trận AND có thể đƣợc dùng là input dữ liệu vào các cổng OR, XOR để
tạo thành các hàm tổ hợp hoặc là các tín hiệu điều khiển bao gồm clock, điều khiển clock,
set/reset, điều khiển output. Bộ cấp phát hạng tích (Product term allocator) trong mỗi
macrocell sẽ lựa chọn việc sử dụng năm hạng tích này. 303 Thanh ghi trong macrocell có thể cấu hình thành flip-lop loại D, loại T hoặc có thể bỏ
qua (bypass) trong trƣờng hợp hoạt động nhƣ một hảm tổ hợp. Mỗi thanh ghi có set/reset
không đồng bộ. Trong quá trình khởi động, các thanh ghi đƣợc đặt các giá trị đặt trƣớc hoặc 0
nếu không xác định. Mỗi macrocell cũng có các tín hiệu Global nhƣ Global Clocks, Global set/reset.
Macrocell có thể kết nối tín hiệu clock, set/reset từ các tín hiệu global clock, global set/reset
hoặc các tín hiệu clock, set/reset đƣợc tạo ra trong macrocell. Product Term Allocator Product term allocator điều khiển việc gán các produc term cho các Macrocell. Trong 0,
năm đầu vào đƣợc tạo thành hàm OR trong Bộ cấp phát hạng tích. Bộ cấp phát này có thể gán
các hạng tích trong 1 khối FB để có thể tạo ra các hàm logic với nhiều hạng tích hơn. Mỗi
macrocell có thể gán với các hạng tích trong các macrocell khác trong cùng một FB. Ngoài ra, Bộ cấp phép hạng tích có thể kết hợp một phần tổng các hạng tích của một số
macrocell có nghĩa là các hạng tích từ một Bộ cấp phát có thể đƣợc gán với nhiều macrocell
khác nhau. – Bộ cấp phát hạng tích qua nhiều macrocell 304 Ma trận kết nối FastCONNECT II Ma trận kết nối FastCONNECT II kết nối các tín hiệu tới đầu vào của FB. Tất cả các
đầu ra IOB output và các đầu ra FB có thể kết nối tới ma trận kết nối FastCONNECT II. Tối
đa 54 tín hiệu có thể kết nối với mỗi FB ở cùng một tốc độ trễ. - Ma trận kết nối FastCONNECT II Các khối vào ra (IOB) Các khối vào ra IOB là giao diện giữa các logic bên trong cấu kiện và các chân I/O. Mỗi
IOB bao gồm input buffer, output driver, output enable selection mux và kết nối đất GND có
thể lập trình đƣợc. Các input buffer có thể tƣơng thích đƣợc với các chuẩn 5V CMOS, 5V TTL, 3,3V
CMOS và 2,5V CMOS do đó dòng CPLD này có thể kết nối đƣợc với nhiều chuẩn điện thế
khác nhau. Các tín hiệu đầu ra cũng có thể tƣơng thích với 3,3V CMOS hoặc 2,5V CMOS
bằng cách cấp nguồn điện cho các tín hiệu ra (VCCIO) hiệu điện thế tƣơng ứng. Mỗi IOB có một nối đất GND có thể lập trình đƣợc. Nhờ đó các chân không dùng đến có thể nối đất. Các I/O trên mỗi cấu kiện XC9500XL tƣơng thích với chuẩn hiệu điện thế 5V. Do đó có thể kết nối tín hiệu 5V thẳng tới các chân CPLD. Pin locking (khóa vị trí chân) Dòng CPLD XC9500XL có khả năng khóa vị trí các chân trong quá trình thiết kế. Nhờ
đó, các thiết kế có thể đƣợc thay đổi, các tín hiệu bên trong IC có thể đƣợc kết nối lại, nhƣng
vị trí các chân vào/ra không thay đổi. Khi thiết kế cần nhiều cổng logic hơn, cấu kiện mới có
chân tƣơng thích có thể thay vào vị trí cũ mà không phải thiết kế board lại. 305 - Sơ đồ khối IOB 306 Dòng CPLD CoolRunner XPLA3 đƣợc thiết kế với mục đích dành cho các thiết bị di
động, cầm tay và các thiết bị tiêu thụ ít điện năng. Dòng CPLD này đƣợc thiết kế với công
nghệ Fast Zero Power (FZP) kết hợp việc giảm năng lƣợng tiêu thụ đồng thời vẫn đạt tốc độ
cao. Dòng CPLD này có thể hoạt động ở tốc độ >200Mhz. Các tính năng chính: Kiến trúc PLA Hoạt động ở tốc độ cao, tiêu thụ năng lƣợng ít. Tốc độ có thể lên tới hơn 200Mhz. Hoạt động ở hiệu điện thế core 3,3V. Tƣơng thích với 5V I/O Số lƣợng macrocell từ 32 đến 512 macrocell. 64 128 256 384 512 Macrocells 32 1,500 3,000 6,000 9,000 12,000 Usable Gates 750 Registers 32 64 128 256 384 512 TPD (ns) 4.5 5.5 5.5 7.0 7.0 7.0 TSU(ns) 3.0 3.5 3.5 4.3 4.3 3.8 TCO(ns) 3.5 4 4 4.5 4.5 5.0 Fsystem (MHz) 213 192 175 154 135 135 ICCSB (μA) 17 17 17 18 18 18 Các đặc điểm kiến trúc Cũng nhƣ các dòng CPLD khác, kiến trúc của CoolRunner II là sự kết hợp các
macrocell thành các khối chức năng (FB). Các khối chức năng đƣợc kết nối với nhau bằng
mảng kết nối Zero-power Interconnect Array (ZIA). Mỗi FB có 40 đầu vào từ ZIA và có 16
macrocell. Khối chức năng (FB) Mỗi khối chức năng của CoolRunner bao gồm 16 macrocell và 40 đầu vào cho các tín
hiệu từ ZIA. Logic bên trong là PLA với 48 product terms. Tất cả các khối chức năng đều
giống nhau. Trong mỗi product term có 8 tín hiệu điều khiển LCT đến mỗi macrocell , các tín
hiệu này có thể dùng nhƣ clock không đồng bộ, reset, preset và điều khiển tín hiệu ra. Mỗi macrocell có thể hỗ trợ các logic tổ hợp hoặc registered. Các thanh ghi trong
macrocell có thể thiết lập thành thanh ghi dạng D hoặc T và có các tín hiệu reset và preset
không đồng bộ. 307 - Kiến trúc dòng CoolRunner XPLA3 Kiến trúc macrocell Nhƣ đã đề cập ở trên, mỗi macrocell có thể reset hoặc preset khi khởi động. Các thanh
ghi trên macrocell có thể đƣợc thiết lập thành flìp flop loại latch, D hoặc T hoặc bỏ qua nếu
mạch logic chỉ là logic tổ hợp. 308 Mỗi flip flop có thể lấy tín hiệu clock từ một trong 8 nguồn trong đó có một tín hiệu là Universal clock. Xilinx CoolRunner II CPLD là sự kết hợp giữa tốc độ và tính dễ sử dụng của các dòng
XC9500 CPLD và khả năng tiêu thụ điện năng thấp của công nghệ XPLA3. Cấu kiện CPLD
CoolRunner II thích hợp với các ứng dụng yêu cầu tốc độ cao và điện năng tiêu thụ thấp. Các tính năng chính: Kiến trúc PLA Hoạt động tối ƣu đối với hệ thống 1,8V đồng thời có thể hoạt động ở các hiệu điện thế I/O từ 1,5V đến 3,3V. Số lƣợng macrocell từ 32 đến 152 macrocell. Có nhiều bank I/O trên cùng cấu kiện. Tiêu thụ điện năng cực thấp. Có các chế độ clock mềm dẻo để tiết kiệm năng lƣợng tiệu hao. Bảo mật thiết kế. Ngoài ra CoolRunner II còn có một số tính năng sau Chia tần số clock: Trong cấu tạo của CoolRunnerII có bộ chia tần số clock. Tín hiệu clock có thể đƣợc
chia ở các tỉ lệ 2,4,6,8,10,12,14,16. Nhờ đó từ một tần số clock có thể tạo ra đƣợc nhiều tần số
clock khác nhau mà không cần phải lập trình tạo bộ chia. 309 Sử dụng clock 2 sƣờn (DualEDGE) CoolRunner II có thể hoạt động ở cả 2 sƣờn dƣơng và âm của tín hiệu clock
khi tính năng DualEDGE đƣợc kích hoạt ở các macrocell. Điều này cần thiết đối
với một số giao diện memory VD DDR RAM. CoolClock Khi kết hợp tính năng chia tần số clock với tính năng DualEDGE, CoolRunnerII
có thể hoạt động ở trạng thái tiêu thụ ít năng lƣợng hơn. Điều này đƣợc thực hiện bằng
cách chia đôi tần số tín hiệu clock đầu vào, và sử dụng tính năng DualEDGE ở các
macrocell. Điều này làm cho các hệ thống vẫn hoạt động ở tần số clock đầu vào,
nhƣng các macrocell chỉ hoạt động ở tần số bằng một nửa tần số clock đầu vào. 310 Các đặc điểm kiến trúc Cũng nhƣ các dòng CPLD khác, kiến trúc của CoolRunner II là sự kết hợp các
macrocell thành các khối chức năng (FB). Các khối chức năng này đƣợc kết nối với nhau
bằng các ma trận kết nối Advance Interconnect Matrix (AIM). Các khối chức năng (FB) có
cấu hình PLA. Kiến trúc của CoolRunner II đƣợc trình bày trong - Kiến trúc CoolRunner II
CPLD, mỗi FB có 16 macrocell. Macrocells 32 64 128 256 384 512 Max I/O 33 64 100 184 240 270 TPD (ns) 3.8 4.6 5.7 5.7 7.1 7.1 TSU (ns) 1.9 2.0 2.4 2.4 2.9 2.6 TCO(ns) 3.7 3.9 4.2 4.5 5.8 5.8 323 263 244 256 217 179 FSYSTEM1
(MHz) - Kiến trúc CoolRunner II CPLD Khối chức năng (FB) Mỗi khối chức năng của CoolRunner II bao gồm 16 macrocell và 40 đầu vào cho các tín
hiệu từ AIM. Logic bên trong là PLA với 56 product terms. Tất cả các khối chức năng đều
giống nhau. Các product terms có thể đƣợc chia sẻ, nhờ đó hiệu suất sử dụng chip tăng lên. 311 Kiến trúc macrocell của CoolRunner II đƣợc trình bày ở hình trên. Tƣơng tự nhƣ
CoolRunner. Khi đƣợc cấu hình thành các flipflop, các flipflop có thể lấy tín hiệu clock,
set/reset từ nhiều nguồn khác nhau, ngoài ra, mỗi flipflop có thể dùng clock một sƣờn hoặc cả
hai sƣờn. Các macrocell cũng có thể đƣợc đặt cấu hình thành ở dạnh latch. Các khối I/O Các khối I/O của CoolRunner II có thể tự động tƣơng thích với một số chuẩn I/O hoặc
có thể đƣợc đặt cấu hình để tƣơng thích với các chuẩn này. Các khối I/O của CoolRunner II
có thể hoạt động ở các chuẩn 1,5V,1,8V,2,5V,3,3V. 312 Dòng FPGA Spartan-3 đƣợc thiết kế cho các ứng dụng tiết kiệm chi phí. So với các
dòng FPGA Spartan trƣớc đó, dòng Spartan 3 đƣợc tăng thêm về tài nguyên logic, dung lƣợng
RAM, số I/O và khả năng quản lý tín hiệu clock. Các tính năng chính: 1. Giá thành thấp. 2. Mật độ logic cao, có thể lên tới 74.880 cells 3. Số lƣợng I/O lớn, tối đa 784 chân. 4. Tốc độ truyền dữ liệu I/O lớn. 5. Hỗ trợ nhiều chuẩn giao tiếp: 18 chuẩn single-ended signal, 8 chuẩn differential I/O. 6. Kết cuối bằng DCI (trở kháng điều khiển số). 7. Hỗ trợ DDR, DDR2 SDRAM. 8. Có các bộ nhân nhúng 18X18. 9. Có quản lý tín hiệu clock DCM 10. Hỗ trợ các nhân vi xử lý nhúng MircoBlaze và PicoBlaze 50K
XC3S50
200K
XC3S200
400K
XC3S400
XC3S1000
1M
XC3S1500 1.5M
2M
XC3S2000
4M
XC3S4000
5M
XC3S5000 1,728
4,320
8,064
17,280
29,952
46,080
62,208
74,880 192
480
896
1,920
3,328
5,120
6,912
8,320 72K
216K
288K
432K
576K
720K
1,728K
1,872K 4
12
16
24
32
40
96
104 2
4
4
4
4
4
4
4 124
173
264
391
487
565
712
784 Các đặc điểm kiến trúc Cấu tạo của Spartan 3 có các phần tƣơng tự nhƣ các FPGA khác: 1. Các khối logic có thể cấu hình đƣợc (CLB) là các khối LUT dạng RAM.
Chức năng của các khối này để thiết lập các logic và các khối lƣu trữ có thể
là flipflop hoặc Latch. 2. Các khối I/O (IOB) có chức năng điều khiển dữ liệu giữa các chân I/O và
các khối logic bên trong cấu kiến. Mỗi khối IOB có thể hỗ trợ dữ liệu 2
chiều hoặc hoạt động ở 3-trạng thái. 313 3. Các khối RAM ở dạng 18kbit. Ngoài ra Spartan 3 có thêm các thành phần 1. Các khối nhân nhúng cứng 18X18bit. 2. Các khối quản lý tín hiệu clock số DCM cung cấp các khả năng phân phối, trễ, nhân, chia và điều khiển pha của tín hiệu clock. Các thành phần của Spartan 3 nhƣ 0dƣới đây. Các khối IOB Cấu trúc của khối IOB đƣợc thể hiện ở 0. Có 3 đƣờng tín hiệu chính: 1. Đƣờng input dẫn tín hiệu từ chân input, qua một thành phần gây trễ có thể lập trình
đƣợc vào input của FPGA. Ngoài đƣờng input trực tiếp, có một đƣờng khác qua
thành phần dự trữ IQ1 và IQ2. 2. Đƣờng output, bắt đầu từ O1 và O2, dẫn tín hiệu từ các logic bên trongcủa FPGA
qua 1 mux (multiplexer) và một bộ điều khiển 3 trạng thái tới chân tín hiệu ra IOB. 3. Đƣờng 3-trạng thái dùng khi đầu ra là trờ kháng cao. Đƣờng này bắt đầu từ T1, T2,
qua multiplexer ra output.Ngoài ra, đƣờng này có thể có thêm thành phần nhớ. 4. Tất cả các tín hiệu đi vào các khối IOB có thêm chức năng inverter. Trong mỗi IOB có 3 cặp thành phần lƣu trữ, tùy theo yêu cầu có thể thiết lập cấu
hình thành phần lƣu trữ này thành D flipflop hoặc latch theo level. Ngoài ra, cặp thành
phần lƣu trữ này có thể dùng với một multiplexer đặc biết để có thể giao tiếp với DDR
RAM. Ngoài ra, mỗi khối IOB còn có các tín hiệu tới hiệu điện thế Vcc, hiệu điện thế tham chiếu VREF, I/O của các khối IOB khác, các tín hiệu clock, SET/RESET và CE. 314 - Cấu trúc của khối IOB Các khối CLB Các khối CLB là thành phần chính chứa các tài nguyên logic. Mỗi CLB bao gồm 4 slice
kết nối với nhau nhƣ 0, 4 slice này đƣợc chia là 2 cặp: cặp trái và cặp phải. Mỗi cặp đƣợc sắp
xếp theo cột và có tín hiệu carry chain độc lập. 315 - Sắp xếp của các slice trong khối CLB Cặp slice bên trái có thể cấu hình thành các mạch logic tổ hợp hoặc có thể dự trữ dữ liệu
dƣới dạng RAM phân phối. Còn cặp slice bên phải chỉ có thể cấu hình thành các mạch logic.
Lý do là ở cấu tạo của các cặp slice này. Tất cả 4 slice đều có chung các thành phần: 2 logic
function generators, 2 thành phần dữ trữ (storage elemtents), các mux, carry logic, và các
cổng số học. Các thành phần này giúp các slice có thể cấu hình thành các hàm logic, các hàm
số học hoặc chức năng ROM. Tuy nhiên ở các slice bên trái có thêm các chức năng: dự trữ dữ
liệu dùng RAM phân phối và shift dữ liệu với thanh ghi 16 bit. Các khối RAM Tất cả các cấu kiến Spartan-3 hỗ trợ các khối RAM, các khối RAM này có thể thiết lập
cấu hình, chạy đồng bộ. Mỗi khối là 18Kbit. Tỉ lệ kích thƣớc của mỗi khối RAM có thể lập
trình đƣợc. Ngoài ra, các khối RAM có thể kết nối với nhau để tạo thành khối RAM có kích
thƣớc lớn hơn, rộng hơn. Các khối nhân cứng nhúng Tất cả các Cấu kiện Spartan-3 đều có các khối nhân cứng nhúng. Các khối nhân này nhận 2 tín hiệu đầu vào là 18 bit, tín hiệu đầu ra là 36 bit. Số lƣợng các khối nhân cứng nhúng trong một cấu kiện Spartan 3 dao động từ 4 đến 104 khối tùy theo từng loại cấu kiện. Quản lý clock số DCM Các cấu kiện Spartan 3 có các bộ quản lý tín hiệu clock số DCM. Các khối DCM dùng
Delay-Locked Loop (DLL), dùng tín hiệu hồi tiếp để điều khiển tín hiệu clock đầu ra một
cách chính xác. Trừ cấu kiện Spartan nhỏ nhất có 2 bộ DCM, mỗi cấu kiện có 4 bộ DCM. 316 Các bộ DCM hỗ trợ 3 chức năng chính Giảm clock skew. Tổng hợp tần số Dịch chuyển pha Mạng lƣới tín hiệu clock Các cấu kiện Spartan 3 có 8 tín hiệu đầu vào cho Global Clock ký hiệu GCLK0->
GCLK7. Các tín hiệu đầu vào này kết nối với một mạng lƣới có dung kháng thấp và skew
nhỏ, phù hợp với việc truyền tải các tín hiệu cao tần. Interconnect Mạng lƣới interconnect kết nối các tín hiệu giữa các thành phần trong Spartan 3. Có 4 loại interconnect: Long line, hex line, double line và direct line. Long line: kết nối mỗi 6 CLB với nhau (cứ cách 6 CLB có một đƣờng Long line). Hex line: kết nối mỗi 3 CLB với nhau. Double line: kết nối mỗi cặp CLB. Direct line: kết nối CLB tới các CLB liền kề. Virtex là dòng chip FPGA đƣợc thiết kế nhằm mục đích cung cấp các giải pháp logic
khả lập trình có khả năng xử lý cao, dung lƣợng cổng logic lớn. Các chip Virtex đƣợc thiết kế
với kiến trúc cải tiến so với các dòng FPGA trƣớc đó, có thêm nhiều tính năng mới, thêm
nhiều tài nguyên kết nối mềm dẻo, tốc độ cao và công nghệ cải tiến. Nhờ đó, các chip FPGA
Virtex thƣờng đƣợc dùng cho các ứng dụng đòi hỏi tốc độ cao, dung lƣợng cổng lớn, đồng
thời thời gian đƣa sản phẩm ra thị trƣờng ngắn. Các tính năng chính: 1. Là dòng FPGA có mật độ cổng logic cao, tốc độ hoạt động cao: a. Mật độ lên đến 1 triệu cổng logic. b. Tốc độ lên đến 200MHz Hoạt động với nhiều giao diện chuẩn: 16 giao diện. 2. Có mạch quản lý tín hiệu clock nhúng: 3. Có hệ thống bộ nhớ theo lớp 4. Kiến trúc mềm dẻo có thể cân bằng giữa tốc độ và mật độ. 5. Dùng cấu tạo SRAM. 6. 317 57,906
XCV50
108,904
XCV100
164,674
XCV150
236,666
XCV200
322,970
XCV300
468,252
XCV400
661,111
XCV600
XCV800
888,439
XCV1000 1,124,022 16x24
20x30
24x36
28x42
32x48
40x60
48x72
56x84
64x96 1,728
2,700
3,888
5,292
6,912
10,800
15,552
21,168
27,648 180
180
260
284
316
404
512
512
512 Các đặc điểm kiến trúc Các cổng logic của Virtex dựa trên công nghệ SRAM. Do đó, cấu hình của chip đƣợc
thay đổi bằng cách nạp vào các ngăn bộ nhớ. Để thay đổi cấu hình, Virtex có thể tự đọc cấu
hình từ PROM hoặc cấu hình có thể đƣợc ghi vào trong Virtex. Tƣơng tự nhƣ các cấu kiện FPGA khác, kiến trúc của Virtex bao gồm một mảng của các
khối CLB, bao quanh là các khối vào ra (IOB), các thành phần này có thể kết nối với nhau
thông qua các tài nguyên kết nối linh động, tốc độ cao: Các CLB cung cấp các thành phần căn bản cho việc cung cấp logic. Các khối IOB cung cấp giao diện giữa các chân vào/ra và các CLB. Ma trận kết nối các CLB với nhau gọi là Ma trận kết nối tổng quát (GRM). Ngoài ra, kiến trúc của Virtex còn có các mạch sau kết nối đến GRM Các khối nhớ cứng, mỗi khối 4096 bit. Các khối quản lý clock DLL. Các khối nhớ đệm 3-trạng thái Các khối IOB Cấu trúc của các khối IOB nhƣ trong 0. Các khối IOB của Virtex hỗ trợ nhiều loại giao diện khác nhau. Mỗi khối IOB có 3 thành phần dự trữ có thể đƣợc cấu hình thành D flipflop hoặc latch.
Mỗi khối IOB có một tín hiệu CLK đƣợc chia sẻ bởi 3 flipflop và một tín hiệu CLK độc lập
cho mỗi khối flipflop. Ngoài các tín hiệu điều khiển CLK, CE, các flipflop này có chung tín hiệu Set/Reset. Tất cả các pad đều đƣợc bảo vệ trƣớc sự phóng tĩnh điện hoặc hiệu điện thế khởi động cao. Ở các pad này có thể có các điện trở pull up hoặc pull down. 318 Ở trƣớc flipflop của đầu vào có một khối trễ để giảm thời gian hold time từ pad đến pad.
Các tín hiệu đầu vào này có thể hỗ trợ nhiều chuẩn hiệu điện thế khác nhau, trong một số
trƣờng hợp, cần phải cung cấp hiệu điện thế chuẩn VREF. Đầu ra của khối IOB có một bộ đệm 3-trạng thái. Các tín hiệu đầu ra có thể kết nối trực
tiếp đến bộ đệm này hoặc đi qua một khối flipflop. Bộ đệm này có thể đƣợc điều khiển trực
tiếp từ các tín hiệu logic bên tronghoặc qua một flipflop để cung cấp tín hiệu đồng bộ. - Cấu trúc của khối IOB trong Virtex Các băng I/O (IO Banking) Để có thể làm việc với nhiều chuẩn hiệu điện thế khác nhau, một số chuẩn yêu cầu có
tín hiệu làm chuẩn VCCO hoặc VREF. Các hiệu điện thế này đƣợc kết nối từ ngoài vào đến các
chân cho từng khối IOB, gọi là các băng I/O. Do đó, mỗi băng I/O có thể hoạt động ở các
chuẩn khác nhau. Tuy mỗi băng có thể có nhiều chân để kết nối tới hiệu điện thế chuẩn, các
hiệu điện thế này phải giống nhau. Các khối CLB Mỗi khối CLB bao gồm 4 khối logic cell (LC), đƣợc bố trí trong 2 slice. Ngoài các slice, các khối CLB có thêm các logic để tạo các hàm logic tổ hợp của 5-6 input. Trong mỗi slice của Virtex có 2 bảng lookup LUT có 4 đầu vào. Các hàm logic đƣợc
tạo ra từ các bảng LUT này. Ngoài ra, mỗi bảng LUT này có thể cấu hình thành khối RAM
đồng bộ 16X1 bit hoăc 2 khối LUT trong 1 slice có thể kết hợp tạo thành khối RAM đồng bộ
16X2 bit hoặc 32X1 bit. Các LUT cũng có thể cấu hình thành thanh ghi dịch chuyến 16 bit
phục vụ cho các ứng dụng DSP. 319 Trong Virtex slice, các thành phần dự trữ có thể cấu hình thành các D flipflop hoặc các
latch. Các tín hiệu đầu vào cho các flipflop hoặc các latch này có thể lấy từ các tín hiệu bên
trong slice hoặc các tín hiệu đầu vào của slice. - Cấu trúc CLB của Virtex Ngoài các tín hiệu CLK và CE, mỗi slice có các tín hiệu Set và Reset đồng bộ. (SR và BY). Để kết hợp các tín hiệu đầu ra, trong các slice còn có các bộ Mux 4:1, Các bộ này có thể kết hợp với nhau tạo thành hàm có số lƣợng tín hiệu vào cao hơn, hoặc các bộ mux lớn hơn. Để kết nối các tín hiệu bên trong, mỗi CLB có thêm 4 đƣờng kết nối, mỗi LC một
đƣờng. Các đƣờng này cung cấp đƣờng dẫn chó các tín hiệu đầu vào hoặc các kết nối bên
trong mà không sử dụng đến các tài nguyên kết nối logic. Các logic số học Để phục vụ chó các phép tính số học tốc độ cao, các CLB trong Virtex có 2 đƣờng tín
hiệu Carry riêng biệt. Ngoài ra các logic số học có các cổng XOR để một cổng cộng (Full
Adder) có thể đƣợc hình thành trong một LC, các cổng AND để cấu hình các khối nhân. Các khối BUFT Mỗi CLB có 2 khối điều khiển 3 trạng thái (BUFT) có thể điều khiển các bus ở trên chip. Mỗi khối BUFT có một chân điều khiển độc lập và một tín hiệu đầu vào độc lập. Các khối SelectRAM Các khối Virtex FPGA có các khối RAM lớn có sẵn. Các khối RAM này đƣợc tổ chức
thành các cột, tổng cộng có 2 cột RAM chay dọc theo cạnh chip. Số lƣợng các khối có thể từ
8 đến 32 khối. Tổng cộng dung lƣợng RAM có thể từ 32kbits đến 128kbits. Các khối RAM
này có các tài nguyên kết nối dành riêng để cung cấp giao diện hiệu quả tới các khối CLB và
các khối RAM khác. Ma trận kết nối khả lập trình 320 1. Các kết nối giữa các LUT, flipflop và GRM. 2. Các đƣờng hồi quy của các CLB, nhờ đó có thể cung cấp các kết nối tốc độ cao đến các LUT trong một khối CLB. 3. Các đƣờng kết nối trực tiếp cung cấp các kết nối tốc độ cao giữa các CLB cạnh nhau, nhờ đó không phải dùng đến GRM. Các kết nối chung là các kết nối chủ yếu trong Virtex. Các tài nguyên kết nối chung
đƣợc bố trí thành các kênh kết nối ngang và các kênh kết nối dọc để kết nối các hàng và các
cột CLB. Các cấu kiện Virtex có các kết nối dành riêng cho việc giao diện giữa CLB và IOB. Các
kết nối này gọi là VersaRing. Nhờ các kết nối này, các tính năng nhƣ thay đổi chân IO hoặc
khóa chân IO là khả thi. Nhờ đó các thiết kế mới có thể tƣơng thích với các thiết kế cũ. Một số loại tín hiệu yêu cầu các tài nguyên kết nối đặc biệt để có thể khai thác tối đa
hiệu quả. Trong kiến trúc của Virtex, các tài nguyên kết nối dành riêng cung cấp cho 2 loại tín
hiệu Các tài nguyên hàng ngang đƣợc cung cấp cho các bus 3 trạng thái trong chip. 2 mạng lƣới dành riêng cho mỗi CLB cung cấp tín hiệu Carry cho các CLB. Các tài nguyên kết nối toàn chip dùng để phân phối tín hiệu clock và các tín hiệu khác có số đầu ra (fanout) nhiều. Có 2 loại tài nguyên kết nối toàn chip: Các tài nguyên kết nối toàn chip chính là 4 mạng lƣới kết nối dành riêng cho các tín
hiệu clock có số đầu ra lớn. Mỗi mạng tín hiệu clock GCLK có thể kết nối điều
khiển tất cả các CLB, IOB và các khối RAM. Các tài nguyên kết nối toàn chip phụ bao gồm 24 đƣờng trục: 12 ở trên đỉnh chip và 12 dƣới đáy chip. Phân phối tín hiệu CLK Các tín hiệu CLK trong Virtex đƣợc phân phối bởi các tài nguyên kết nối toàn chip
chính. Có 4 bộ đệm global đƣợc cung cấp: 3 ở trên đỉnh chip và 2 ở đáy chip. Bốn bộ đệm này
dùng để điều khiển 4 mạng lƣới kết nối chính. 321 - Phân phối tín hiêu CLK trong Virtex Delay-locked loop (DLL) Kết nối với mỗi bộ đệm đầu vào cho các tín hiệu global clock là một bộ DLL số. Nhờ
bồ DLL số này, các skew giữa các pad của tín hiệu CLK đầu vào và các chân đầu vào của
CLK bên trong cả thiết bị. Mỗi DLL có thể điều khiên 2 mạng lƣới global clock.. Các DLL
này giám sát tín hiệu CLK đầu vào và phân phối các tín hiệu CLK, sau đó tự động thay đổi trễ
của CLK. Ngoài việc triệt tiêu các trễ của các tín hiệu CLK, các ĐL có thể cung cấp các tinh năng
điều khiển CLK khác nhƣ nhân đôi tần số CLK, hoặc chia tần số CLK bởi 1,5 ;2 2,5; 3;3,5;4;
5 ;8;18. Các DLL này cũng có thể hoạt động nhƣ một bộ phản chiếu tín hiệu CLK. 322 Không chỉ là nhà cung cấp các chip logic khả trình CPLD/FPGA, Xilinx còn cung cấp
các công cụ thiết kế điện tử hoàn chỉnh, cho phép thực hiện thiết kế trên các thiết bị logic khả
trình của hãng. Các công cụ này kết hợp công nghệ CAD tiên tiến với giao diện đồ họa linh
hoạt, dễ sử dụng để ngƣời thiết kế có đƣợc thiết kế tối ƣu. Bộ công cụ phần mềm hiện đang
đƣợc sử dụng rộng rãi là ISE với phiên bản mới nhất ISE Design Suite 12.1 (7/2010). Xilinx cũng cung cấp ISE dƣới dạng các gói phần mềm có cấu hình khác nhau với giá thành khác nhau: + ISE WebPACK: Bản miễn phí có thể dùng để thiết kế cho tất cả các họ CPLD của
Xilinx và một số loại FPGA dung lƣợng thấp và trung bình. Với môn học Thiết kế logic số,
sinh viên chỉ cần sử dụng bản WebPACK từ phiên bản 8.1 trở lên. ISE WebPACK có thể tải
đƣợc miễn phí trên mạng (http://www.xilinx.com/support/download/index.htm). + ISE Design Suite - Logic Editions: Bản ISE này có thể thiết kế cho tất cả các loại FPGA và CPLD của Xilinx, tuy nhiên cần phải phải trả phí để đƣợc sử dụng bản này. Ngoài ra Xilinx còn phát triển các bộ công cụ phần mềm tiện ích khác nhƣ System
Generator hỗ trợ cho các thiết kế DSP (Digital Signal Processor: Bộ xử lý tín hiệu số) hay
EDK (Embedded Dvelopment Kit: Bộ phần mềm phát triển hệ thống) hỗ trợ cho các thiết kế
nhúng. ISE có thể đƣợc dùng kết hợp với phần mềm mô phỏng ModelSim của Mentor Graphics phiên bản XE đƣợc phát triển riêng hỗ trợ cho các họ CPLD/FPGA của Xilinx. Phần mềm ISE WebPACK cho phép thiết kế với tất cả các họ CPLD cũng nhƣ
một số loại FPGA dung lƣợng thấp và chung bình, hỗ trợ cả VHDL, Verilog, và có
đầy đủ các tính năng mô phỏng. ISE WebPACK có miễn phí thể tải từ trang web của Xilinx
(http://www.xilinx.com/support/download/index.htm). Hoặc cài đặt từ DVD đƣợc cung
cấp miễn phí bởi Xilinx. Tổng quát lƣu đồ thiết kế cho PFGA và CPLD gồm các bƣớc chính sau: (trong mỗi bƣớc chính có thể có vài quá trình) Thiết kế đƣợc tạo dùng Schematic Editor, hoặc dùng các ngôn ngữ mô tả phần cứng (HDL) nhƣ VHDL, Verilog, hay đồ hình trạng thái dùng cộng cụ StateCad. 323 Sau khi đã đƣợc tạo ra, thiết kế sẽ đƣợc tổng hợp (synthesis) từ dạng schematic hoặc ngôn ngữ mô tả phần cứng sang format dạng logic chứa các thành phần cấu tạo của PLD. Design Entry Schematic
ECS HDL
Verilog/VHDLL State Machines
StateCad Design Verification
Functional Simulation
(ISE Simulator, ModelSim) Design Synthesis
Xilinx Synthesis Tool
(XST) Design Implementation Translate
Map Place and
Route Static Timing Analysis (ECS) ModelSim XE Timing Simulation
Configuration Download (iMPACTE) Quá trình implementation chuyển format logic sang format vật lý. Các thông tin trong
format vật lý chứa các mô tả mạch thực chất của FGPA và PLD. Sau đó, file chứa các mô tả
các mạch này sẽ đƣợc tổng hợp thành một file dạng bitstream để có thể nạp vào FPGA và
CPLD Sau khi file bitstream đƣợc tạo ra, file này có thể đƣợc nạp vào CPLD, FPGA hoặc có thể đƣợc nạp vào PROM, EPROM để nạp vào CPLD,FPGA sau này. 324 Dùng cáp, mô phỏng ở mức độ cổng (gate level), ta có thể kiểm tra xem thiết kế có đạt yêu cầu về thời gian hay không. - Tạo dự án thiết kế mới: Bắt đầu phần mềm ISE, chọn: Start → Programs→ Xilinx ISE 10.1→ ISE → Project Navigator Tạo một thiết kế mới nhƣ sau: Bƣớc 1: Chọn File→New Project Hình 3.2 Cửa sổ thiết kế - Tên thiết kế Bƣớc 2: Đặt tên thiết kế là “Tutorial” và đƣờng dẫn lƣu file thiết kế. Bƣớc 3: Chọn Next> Bƣớc 4: Nhập những thông số cho project mới nhƣ sau: Device Family: CoolRunner-II xc2c256 Device: TQ144 Package: Speed Grade: -7 Synthesis Tool: XST (VHDL/Verilog) Simulator: ISE Simulator (VHDL/Verilog) Language: VHDL 325 Hình 3.3 Chọn các thông số cho chip CPLD Bƣớc 5: Chọn Next>. Chọn tiếp Next> trong cửa sổ New Source. Bƣớc 6: Chọn tiếp Next> trong cửa sổ Add Existing Source. Chọn Finish. Bƣớc 7: Tạo một nguồn mới cho thiết kế bằng cách chọn Project →New Source. Lƣƣ đồ thiết kế của FPGA và CPLD giống nhau ở quá trình Tổng hợp (synthesis) và
quá trình thiết lập các constraints. Do đó, trong phần này, các quá trình này sẽ đƣợc trình bày
chung. Các quá trình sau sẽ đƣợc trình bày riêng cho CPLD và FPGA. Tổng hợp (Synthesis) là quá trình dịch một bán thiết kế từ ngôn ngữ bậc cao ( VD
VHDL, Verilog) hoặc từ bản vẽ schematic thành một file NCD (native circuit description)
netlist của các cổng đƣợc kết nối với nhau. Các cổng này đƣợc lựa chọn từ các thƣ viện do
nhà sản xuất linh kiện cung cấp. Đầu ra của quá trình này là một thiết kế ở mức gate-level để
sau này có thể nạp vào các linh kiện. Một số chƣơng trình tổng hợp phổ biến nhƣ sau: 5. FGPAC Compiler.
6. LeonardoSpectrum.
7. Synplify
8. Xilinx XST. Quá trình tổng hợp có thể cho ngƣời sử dụng một số tùy chọn (options). Các tùy chọn
này có 3 loại chính: tùy chọn cho việc tổng hợp, tùy chọn cho ngôn ngữ HDL, tùy từ những
tính năng riêng của từng thiết bị. Trƣớc khi tổng hợp, một số dòng lệnh có thể phải sửa chữa bởi vì có một số cấu trúc có
thể mô phỏng đƣợc nhƣng không thể tổng hợp đƣợc. Lý do là vì các cấu trúc của lệnh để mô
phỏng và các cấu trúc của các lệnh có thể tổng hợp đƣợc là khác nhau. 326 Trƣớc khi tổng hợp, ta có thể kiểm tra thiết kế bằng cách nháy đúp vào Check Syntax. chƣơng trình sẽ kiểm tra các lỗi syntax và thông báo. Để tổng hợp, nháy đúp chuột trái vào Systhesize trong mục Implement Design. Chƣơng
trình sẽ tổng hợp thiết kế từ file HDL hoặc schematic. Sau khi tổng hợp xong, đầu ra của
chƣơng trình là file NCD. Ta cũng có thể xem RTL schematic và báo cáo của quá trình tổng
hợp. Thiết kế sau khi tổng hợp phải đảm báo tối thiểu hai yêu cầu quan trọng sau 1. Thiết kế phải đảm bảo tốc độ của chip.
2. Thiết kế phải vừa trong kích thƣớc của chip. Sau khi tổng hợp xong, ta có thể xem báo cáo về số lƣợng tài nguyên chíp đƣợc sử dụng
và tốc độ dự kiến của thiết kế. Chỉ đến khi thiết kế đƣợc map vào trong chip, ta mới có thể
xác định đƣợc dung lƣợng thực sự sử dụng. Dƣới đây là bảng các nội dung tóm tắt của báo
cáo quá trình tổng hợp. TABLE OF CONTENTS 1) Synthesis Options Summary 2) HDL Compilation 3) HDL Analysis 4) HDL Synthesis 5) Advanced HDL Synthesis 5.1) HDL Synthesis Report 6) Low Level Synthesis 7) Final Report 7.1) Device utilization summary 7.2) TIMING REPORT 327 Trong các phần trên, quan trọng nhất là phần Final Report. Tất cả các thông tin về thiết kế ở trong phần này: =============================================================== * Final Report * =============================================================== Final Results RTL Top Level Output File Name : jc2_top.ngr Top Level Output File Name : jc2_top Output Format : NGC Optimization Goal : Speed Keep Hierarchy : NO Design Statistics # IOs : 8 Macro Statistics : # Registers : 4 # 1-bit register : 4 # Multiplexers : 4 # 2-to-1 multiplexer : 4 Cell Usage : # BELS : 17 # AND2b1 : 2 # AND3b1 : 2 # AND3b2 : 2 # GND : 1 # INV : 3 # LUT3 : 4 # OR2b2 : 1 # OR3 : 2 # FlipFlops/Latches : 6 # FDC : 2 # FDE : 4 # IO Buffers : 8 # IBUF : 4 # OBUF : 4 ============================================================= 328 Device utilization summary: --------------------------- Selected Device : 3s50pq208-5 Number of Slices: 4 out of 768 0% Number of Slice Flip Flops: 6 out of 1536 0% Number of 4 input LUTs: 4 out of 1536 0% Number of bonded IOBs: 8 out of 124 6% ============================================================== TIMING REPORT NOTE: THESE TIMING NUMBERS ARE ONLY A SYNTHESIS ESTIMATE. FOR ACCURATE TIMING INFORMATION PLEASE REFER TO THE TRACE REPORT GENERATED AFTER PLACE-and-ROUTE. Clock Information: --------------------------+------------------------+-------+ Clock Signal | Clock buffer(FF name) | Load | --------------------------+------------------------+-------+ clk | IBUF | 6 | --------------------------+------------------------+-------+ Timing Summary: --------------- Speed Grade: -5 Minimum period: 2.928ns (Maximum Frequency: 341.530MHz) Minimum input arrival time before clock: 4.814ns Maximum output required time after clock: 5.443ns Maximum combinational path delay: No path found Timing Detail: -------------- All values displayed in nanoseconds (ns) ------------------------------------------------------------------ Timing constraint: Default period analysis for Clock 'clk' Delay: 2.928ns (Levels of Logic = 2) Source: run_reg/I_36_32 (FF) Destination: run_reg/I_36_32 (FF) Source Clock: clk rising Destination Clock: clk rising Data Path: run_reg/I_36_32 to run_reg/I_36_32 Gate Net Cell:in->out fanout Delay Delay Logical Name (Net Name) ---------------------------------------- ------------ 329 FDC:C->Q 6 0.626 0.688 I_36_32 (Q) AND3b1:I0->O 1 0.479 0.240 I_36_40 (A1) OR3:I1->O 1 0.479 0.240 I_36_41 (AD) FDC:D 0.176 I_36_32 ---------------------------------------- Total 2.928ns (1.760ns logic, 1.168ns route) (60.1% logic, 39.9% route) ----------------------------------------------------------------- Timing constraint: Default OFFSET IN BEFORE for Clock 'clk' Offset: 4.814ns (Levels of Logic = 5) Source: left (PAD) Destination: run_reg/I_36_32 (FF) Destination Clock: clk rising Data Path: left to run_reg/I_36_32 Gate Net Cell:in->out fanout Delay Delay Logical Name (Net Name) ---------------------------------------- ------------ IBUF:I->O 2 1.679 0.465 I9 (XLXN_22) INV:I->O 3 0.479 0.577 I10 (XLXN_17) begin scope: 'run_reg' AND3b2:I1->O 1 0.479 0.240 I_36_37 (A0) OR3:I2->O 1 0.479 0.240 I_36_41 (AD) FDC:D 0.176 I_36_32 ---------------------------------------- Total 4.814ns (3.292ns logic, 1.522ns route) (68.4% logic, 31.6% route) ------------------------------------------------------------------ Timing constraint: Default OFFSET OUT AFTER for Clock 'clk' Offset: 5.443ns (Levels of Logic = 1) Source: U1_Q_3 (FF) Destination: q<3> (PAD) Source Clock: clk rising Data Path: U1_Q_3 to q<3> Gate Net Cell:in->out fanout Delay Delay Logical Name (Net Name) ---------------------------------------- ------------ 330 FDE:C->Q 3 0.626 0.577 U1_Q_3 (U1_Q_3) OBUF:I->O 4.240 I16 (q<3>) ---------------------------------------- Total 5.443ns (4.866ns logic, 0.577ns route) (89.4% logic, 10.6% route) Quá trình gán pin và các giới hạn sẽ thiết lập các cấu hình về các chân input, output và
các cấu hình về thời gian của thiết kế. Các thông số này đƣợc thiết lập trong file User
Constraints File (UCF). Các thông số giới hạn đƣợc tạo ra bằng cách dùng công cụ Xilinx
Constraints Editor. Công cụ này cung cấp giao diện đồ họa. Ngoài ra, các thông số này có thể
đƣợc tạo ra trực tiếp bằng cách chữa file UCF hoặc các attributes trong VHDL. Trƣớc khi gán các giới hạn, ta cần chạy quá trình Translate để tạo ra một file NGD. File
này sẽ đƣợc sử dụng bởi Xilinx Constraints Editor. Xilinx Constraints Editor có thể đƣợc kích
hoạt từ mục Processes for Current Source windows trong Project Navigator. Sử dụng công cụ
này đơn giản hóa việc thiết lập các thông số constraints, ngƣời sử dụng không cần thiết biết
cấu trúc của file UCF. Hơn nữa, Constrains Editor tự động đọc file thiết kế và liệt kê tất cả
các net và các thành phần trong thiết kế. Tuy nhiên một số tham số constraints có thể không
có sẵn trong Constraints Editor. Trong trƣờng hợp này, các tham số này có thể đƣợc thiết lập
bằng cách edit file UCF. Các constraints đƣợc phân làm 3 loại chính nhƣ sau Các giới hạn về thời gian (timing constraints) Các giới hạn về thời gian đƣợc thiết lập cho các net hoặc các path trong thiết kế.
Các giới hạn về thời gian này sẽ quy định tốc độc của IC. Việc đặt ra các giới hạn về
thời gian sẽ giúp cho phần mềm tổng hợp tìm cách sắp xếp các cổng logic gần nhau để
cho các tài nguyên kết nối sẽ gần hơn, tăng tốc độ của chip đƣợc thiết kế. Gán các chân IC (pin) Gán các chân IC sẽ gán các chân input và output vào các vị trí pin cố định.
Ngoài ra, các chuẩn IO cũng có thể gán cho các chân này. Sau khi hoàn thành, thông
tin về vị trí các chân IC sẽ đƣợc ghi vào file UCF. Các giới hạn về diện tích (area constraints) Các giới hạn về diện tích sẽ giới hạn vị trí của các cổng logic trong chip. Sau khi hoàn thành, thông tin về các giới hạn này này đƣợc ghi vào file UCF. Sau khi hoàn thành quá trình thiết lập các thông số constraints, quá trình Translate sẽ phải đƣợc chạy lại để cập nhật thiết kế với các thông số mới. 331 Quá trình implement dùng file netlist và các giới hạn của thiếu kế (constraints) để tạo ra
thiết kế theo sơ đồ các Macrocell bên trong CPLD. Các giới hạn (constraints) đƣợc đặt ra theo
yêu cầu của ngƣời thiết kế nhằm đảm bảo sự phù hợp của thiết kế và của con chip CPLD. Dịch là quá trình đầu tiên của implement. Quá trình dịch sẽ tổng hợp tất cả các file netlist của thiết kế và các file giới hạn để tạo ra một file NGD (Native Generic Database). 332 Quá trình translate đồng thời tự động tạo ra một file báo cáo (translattion report). Quá trình Fit map netlist vào trong một CPLD cụ thể và tạo ra một file JEDEC (.jed). File này chứa cấu hình nạp của CPLD. Trƣớc khi chạy Fit, cần thiết lập các thông số. Đối với mỗi dòng CPLD khác nhau, các
thông số này khác nhau. Ngƣời sử dụng cần tham khảo thông tin riêng về từng dòng CPLD để
có những thông số thích hợp. Để chạy Fit, nháy đúp chuột trái trên Fit . Quá trình Fit sẽ map các logic của thiết kế
vào trong CLPD dự định. Đồng thời quá trình này còn tạo ra thông tin về thời gian của các
logic trong thiết kế. Sau khi chạy xong quá trình Fit, ta có thể xem báo cáo. Dƣới đây là mẫu báo cáo của quá trình Fit. Báo cáo này có một số thông tin chính nhƣ sau: 1. Fitting status: Quá trình Fit có thành công hay không
2. Device use: CPLD đƣợc dùng.
3. Resouces summary: Tóm tắt các tài nguyên đƣợc dùng nhƣ số Macrocell, số Producterms, số thanh ghi, số pin, số FBI sử dụng. 4. Thông tin chi tiết về các tài nguyên sử dụng 333 demo_bd Successful G.35 55/64 (86%) 92/224 (42%) 38/64 (60%) 25/64 (40%) 86/160 (54%) Input 4 4 22 I/O 34 Output 19 19 2 GCK/IO 1 Bidirectional 0 0 0 GTS/IO 4 GCK 1 1 1 GSR/IO 0 GTS 0 0 GSR 1 1 Total Macrocells Available 64 Registered Macrocells 38 Non-registered Macrocells driving I/O 16 Signal mapped onto global clock net (GCK0) clk_rc Reset Signal mapped onto global output enable net
(GSR) Để xem cấu trúc của CPLD đã đƣợc Fit, ta có thể dùng Xilinx Chip Viewer. Chƣơng
trình này hiển thị hình ảnh của CPLD với các khối macrocell và cái tài nguyên sau quá trình
Fit. 334 Sau khi hoàn thành quá trình Fit, ta có thể tạo File lập trình và nạp vào CPLD. Chƣơng
trình sử dụng để nạp cấu hình vào CPLD là iMPACT. Chƣơng trình này sẽ tự động phát hiện
ra chip CPLD. Để nạp CPLD, ta click chuột phải vào hình CPLD trên cửa số và chọn Program. Ngoài những quá trình cơ bản ở trên, một số quá trình sau có thể đƣợc sử dụng: Quá trình tạo báo cáo về thời gian sẽ tạo ra báo cáo về so sánh giữa các constraints về thời gian yêu cầu và thời gian thực tế trong thiết kế. Trong quá trình này, ta có thể phân tích các kết quả thời gian của quá trình sau khi Fit
bằng công cụ Analyze Post-Fit Stating Timing. Công cụ này sẽ mở ra một cửa số Timing
Analyzer, trong đó ta có thể chọn các đƣờng routing và xem thời gian trong thiết kế để phân
tích. Một trong những tính năng của CPLD là khoảng trễ giữa các macrocell là cố định. Do
đó, báo cáo về thời gian có thể cung cấp cho chúng ta các thông tin về trễ giữa các logic, thời
gian setup ... 335 15.000 ns. 66.667 MHz. Limited by Clock Pulse Width for clk_scaler<8>_MC.Q 7.500 ns. 10.700 ns. -0.400 ns. 46.700 ns. TS_clk_osc 20.0 0.0 0 0 Quá trình tạo ra model để mô phỏng sau khi Fit sẽ tạo ra một model sử dụng ngôn ngữ
HDL. Khác với thiết kế, model này sẽ mô tả cấu hình thật của thiết kế với các cổng logic và
thông số về thời gian ở trong CPLD. Model này có thể dùng để mô phỏng xem trên thực tế,
CPLD của ta có hoạt động đúng nhƣ trong thiết kế hay không. Sau khi mô phỏng, ta có thể đo
các tham số về thời gian của thiết kế. 336 ------------------------------------------------- Release 6.3i - XPower SoftwareVersion:G.35 Copyright (c) 1995-2004 Xilinx, Inc. All rights reserved. Design: demo_bd Part: XC2C64-7VQ100 Vcc: 1.80V Default Ext. Load: 10.00pF Data version: PREVIEW,1.0 Power summary: I(mA) P(mW) ----------------------------------------------------- Total estimated power consumption: Vcc 1.80V: 0.017 0.031 --- Global Resources: 0.000 0.000 Zia: 0.000 0.000 Clocks: 0.000 0.000 Signals: 0.000 0.000 Output Loads: 0.000 0.000 Inputs: 0.000 0.000 Function Blocks: 0.000 0.000 --- Quiescent Vcc 1.80V: 0.017 0.031 Thermal summary: --------------------------------------------------- Estimated junction temperature: 25.0C Ambient temp: 25.0C Case temp: 25.0C Theta J-A: 53.2C/W DataGATE and CoolCLOCK were not used in this design, see Xilinx Appnote XAPP377 to reduce power consumption! Analysis completed: Mon Apr 30 10:11:13 2007 ----------------------------------------------------- 337 Quá trình Map sẽ lấy một file NGD là input và map một thiết kế logic vào trong một
FPGA. File NGD chứa các mô tả logic bao gồm các thành phần theo lớp, các thành phần căn
bản của Xilinx FPGA và các macro chứa các mô tả về các macro. Đầu ra của quá trình Map là
một file NCD (Native Circuit Description), là mộtbản mô tả của thiết kế đã đƣợc map vào
trong các thành phần của Xilinx FPGA. File NCD có thê đƣợc đặt vào (place) và tạo kết nối
giữa các thành phần (route). Khi chạy công cụ Map, nó sẽ thực hiện những việc sau: 1. Lựa chọn FPGA của Xilinx, package và tốc độ (các thông tin này do ngƣời thiết kế đặt ra) 2. Đọc thông tin từ file input.
3. Thực hiện việc kiểm tra quy định thiết kế DRC (Design Rule Check) trong file input. Nếu có lỗi DRC, quá trình Map sẽ tự đồng dừng lại và báo lỗi. 4. Bỏ đi những logic không dùng đến. Nếu tồn tại các thành phần hoặc các nét không dùng đến, các phần này sẽ bị bỏ đi. 5. Map các pad và các logic vào các khối IOB.
6. Map các logic và các thành phần cùa FPGA (IOB, CLB,..)
7. Cập nhật thông tin từ file input NGD và ghi những thông tin này lại để phục vụ cho việc back-annotation. 8. Tạo ra một file giới hạn vật lý (physical constraints file).
9. Chạyl ại quá trình DRC trên thiết kế đã đƣợc Map.
10. Tạo ra file NCD, mô tả thiết kế vật lý theo các thành phần của FPGA nhƣ CLB, IOBs….. 11. Tạo ra một file báo cáo của quá trình Map. 338 Sau khi đã Map xong, ta có thể chay Generate Post-Map timing để phân tích thông tin về thời gian của thiết kế sau khi đã map vào FPGA. Design Information ------------------ Command Line : C:/Xilinx/bin/nt/map.exe -intstyle ise -p xc3s50-pq208-5 -cm area -pr b -k 4 -c 100 -tx off -o jc2_top_map.ncd jc2_top.ngd jc2_top.pcf Target Device : x3s50 Target Package : pq208 Target Speed : -5 Mapper Version : spartan3 -- $Revision: 1.16.8.2 $ Mapped Date : Tue May 01 15:30:35 2007 Design Summary -------------- Number of errors: 0 Number of warnings: 0 Logic Utilization: Number of Slice Flip Flops: 6 out of 1,536 1% Number of 4 input LUTs: 6 out of 1,536 1% Logic Distribution: Number of occupied Slices: 4 out of 768 1% Number of Slices containing only related logic: 4 out of 4 100% Number of Slices containing unrelated logic: 0 out of 4 0% *See NOTES below for an explanation of the effects of unrelated logic Total Number of 4 input LUTs: 6 out of 1,536 1% Number of bonded IOBs: 8 out of 124 6% Total equivalent gate count for design: 84 Additional JTAG gate count for IOBs: 384 Peak Memory Usage: 64 MB 339 Sau khi đã tạo ra một file NCD, ta có thể place và route file này vào FPGA. Quá trình
Place and Routing lấy một file input NCD, place và route thiết kế vào một file NCD khác.
Công cụ để Place and Routing là FPGA Editor. Công cụ này có thể dùng làm các việc sau: Place và route các thành phần quan trọng bằng tay trƣớc khi tự động Place và route toàn bộ thiết kế. Thay đổi việc place và rout trƣớc đây. Quá trình PAR bao gồm những công đoạn sau: Place: công cụ PAR sẽ chạy qua nhiều qua để place các thành phần của thiết kế vào
FPGA. Sau khi place xong, PAR ghi lại fiel NCD. Trong công đoạn này, PAR place
các thành phần dựa theo các yếu tố nhƣ các constraints đã đƣợc ngƣời thiết kế đặt ra (
VD : các yêu cầu về thời gian, các giới hạn về vị trí các thành phần), chiều dài của các
kết nối và các tài nguyên kết nối sẵn có. Routing: Sau khi đã place xong, PAR sẽ thực hiện route để kết nối các thành phần của
thiết kế. Công đoạn route đƣợc thực hiện dựa trên giải pháp cho thiết kế để có thể đạt
các yêu cầu về thời gian. Sau khi route xong, PART sẽ ghi lại thông tin vào file NCD.
Tại thời điểm này, thisết kế có thể đƣợc phân tích về mặt thời gian. Ngoài file output NCD, quá trình PAR tạo ra báo cáo và file chứa thông tin của các
pins. Báo cáo này chứa thông tin về quá trình PAR và các message về các giới hạn của thiết
kế. Báo cáo sẽ cung cấp thông tin về mật độ sử dụng các thành phần của FPGA, các pha
của quá trình place, thông tin về tín hiệu CLK và các thông tin về các tín hiệu khác. Dƣới đây
là một ví dụ về báo cáo PAR. Device utilization summary: Number of External IOBs 8 out of 124 6% Number of LOCed External IOBs 0 out of 8 0% Number of Slices 4 out of 768 1% Overall effort level (-ol): Standard (set by user) Placer effort level (-pl): Standard (set by user) Placer cost table entry (-t): 1 Router effort level (-rl): Standard (set by user) Phase 1.1 Phase 1.1 (Checksum:989697) REAL time: 2 secs 340 WARNING:Place:410 - The input design contains local clock signal(s). To get the better result, we recommend users run map with the "-timing" option set before starting the placement. Phase 3.3 Phase 3.3 (Checksum:1c9c37d) REAL time: 2 secs Phase 4.5 Phase 4.5 (Checksum:26259fc) REAL time: 2 secs Phase 5.8 . Phase 5.8 (Checksum:98bd2b) REAL time: 2 secs Phase 6.5 Phase 6.5 (Checksum:39386fa) REAL time: 2 secs Phase 7.18 Phase 7.18 (Checksum:42c1d79) REAL time: 2 secs Writing design to file jc2_top.ncd. Total REAL time to Placer completion: 2 secs Total CPU time to Placer completion: 1 secs Phase 1: 29 unrouted; REAL time: 2 secs Phase 2: 25 unrouted; REAL time: 2 secs Phase 3: 8 unrouted; REAL time: 2 secs Phase 4: 0 unrouted; REAL time: 2 secs Total REAL time to Router completion: 2 secs Total CPU time to Router completion: 1 secs Generating "par" statistics. ************************** Generating Clock Report ************************** +--------------+----------+------+------+------------+-------------+ 341 | Clock Net | Resource |Locked|Fanout|Net Skew(ns)|Max Delay(ns)| +---------------+----------+------+------+------------+-------------+ | XLXN_15 | Local | | 4 | 0.070 | 1.895 | +-------------+----------+------+------+------------+-------------+ The Delay Summary Report The SCORE FOR THIS DESIGN is: 122 The NUMBER OF SIGNALS NOT COMPLETELY ROUTED for this design is: 0 The AVERAGE CONNECTION DELAY for this design is: 1.010 The MAXIMUM PIN DELAY IS: 1.895 The AVERAGE CONNECTION DELAY on the 10 WORST NETS is: 1.077 Listing Pin Delays by value: (nsec) d < 1.00 < d < 2.00 < d < 3.00 < d < 4.00 < d < 5.00 d >= 5.00 --------- --------- --------- --------- --------- --------- 16 13 0 0 0 0 Generating Pad Report. All signals are completely routed. Total REAL time to PAR completion: 3 secs Total CPU time to PAR completion: 1 secs Tùy theo từng thiết kế và nhu cầu, ta có thể chạy một số quá trình khác nhƣ sau Sau khi file NCD đã đƣợc place và route, file này sẽ đƣợc sử dụng để tạo ra file
Bitstream (.bit). Công cụ để tạo ra file Bitstream là BitGen. File Bit chứa các thông tin về cấu
hình của các logic và các kết nối bên trong FPGA từ file NCD và các thông tin về thiết bị
FPGA sắp đƣợc lập trình. Sau khi tạo ra bit file, ta có thể nạp vào FPGA dùng công cụ iMPACT GUI, hoặc ta có
thể chuyển format của Bit file sang dạng PROM file để nạp vào PROM. Công cụ để thay đổi
format là PROMGen. 342 [1]. Volnei A. Pedroni, Circuit Design with VHDL, Massachusetts Institute of Technology, 2004. [2]. Pong P. Chu, RTL Hardware Design using VHDL – Coding for Efficiency, Portability, and Scalability”, Wiley, ISBN 978-0-471-72092-8, 2006 [3] M. Morris Mano, Digital Design, Third Edition, Prentice Hall, 2002 [4]. VHDL for Programmable Logic by Kevin Skahill, Addison Wesley, 1996 [5]. The Designer's Guide to VHDL by Peter Ashenden, Morgan Kaufmann, 1996. [6]. Analysis and Design of Digital Systems with VHDL by Dewey A., PWS Publishing, 1993.. [7] Tài liệu các hãng, các phần mềm thiết kế mạch logic số, các dòng chip của: Xilinx, Altera, Actel,… [8] Tài liệu các hãng, các phần mềm thiết kế điện tử của: Altium, Cadence, Mentor Graphic, Proteus,… 3433.3.4 Các đơn vị thiết kế trong VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
- Đơn vị thiết kế cơ bản:
Library: Cho phép tạo thƣ viện trong VHDL
Package: Tạo các gói giữ liệu trong Library, nhƣ các khai báo các đối tƣợng, khai báo
Entity: (Thực thể) - cho phép khai báo các giao diện của một khối thiết kế số nào đó:
- Đơn vị thiết kế thứ cấp (Phụ thuộc vào một đơn vị thiết kế cơ bản):
Architecture: Mô tả hoạt động bên trong của một Entity hay đây chính là phần mô tả
Package Body: Mô tả chỉ tiết cho các khai báo trong Package nhƣ viết các hàm, các
Configuration: Đơn vị thiết kế cấu hình cho phép gắn các phiên bản của thực thể vào
những kiến trúc khác nhau. Cấu hình cũng có thể đƣợc sử dụng để thay thế một cách nhanh
chóng các phần tử của thực thể trong các biểu diễn cấu trúc của thiết kế.
Hình 3.3 - Các thành phần cơ bản của mã VHDL
a. Entity - (Thực thể) :
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ [mode]: chỉ hƣớng tín hiệu của cổng có thể là: (in, out, inout hoặc buffer). Trong đó
cổng dạng in chỉ dùng để đọc dữ liệu. Cổng dạng out chỉ dùng để gán giá trị dữ liệu. Cổng
inout cho phép đồng thời vừa đọc vừa gán giá trị dữ liệu ở trong và ngoài chƣơng trình. Cổng
dạng buffer cho phép cả 2 thao tác đọc và gán dữ liệu từ bên trong chƣơng trình, nhƣng chỉ
cho phép đọc dữ liệu từ ngoài chƣơng trình.
b. Architecture – (Kiến trúc) :
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Phần khai báo kiến trúc có thể bao gồm các khai báo về các đối tƣợng signal, constant,
kiểu dữ liệu, khai báo các phần tử bên trong hệ thống (component), hay các hàm (function)
và thủ tục (proceduce) sẽ đƣợc sử dụng để mô tả hoạt động của hệ thống. Tên_kiến_trúc là
nhãn đƣợc đặt tuỳ theo ngƣời sử dụng
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
c. Package và Package Body
Package ( gói dữ liệu) là đơn vị thiết kế cơ bản dùng để chứa những khai báo cho các
đối tƣợng, khai báo thủ tục procedure, hàm function, kiểu dữ liệu, component có thể dùng
chung cho những thiết kế, cấu trúc, dự án khác nhau …
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
d. Library (thư viện)
Package: chứa những mô tả khai báo đƣợc dùng chung.
Entity: là những mô tả giao diện thiết kế đƣợc dùng chung.
Architecture: những mô tả hoạt động thiết kế đƣợc dùng chung.
Configuration: là những phiên bản của thực thể đƣợc dùng chung.
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
- std_logic_1164: gói chứa các định nghĩa cho các kiểu dữ liệu đa mức logic là
STD_LOGIC, STD_ULOGIC, và STD_LOGIC_VECTOR và các phép toán logic của chúng.
- std_logic_arith: gói chứa các định nghĩa cho kiểu dữ liệu SIGNED, UNSIGNED và
- std_logic_signed: gói chứa các hàm thực hiện các phép toán theo kiểu có dấu với kiểu
- std_logic_unsigned: gói chứa các hàm thực hiện các phép toán theo kiểu không dấu
e. Configuration (Cấu hình)
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Ví dụ: Sơ đồ logic của mạch tạo bít kiểm tra chẵn lẻ nhƣ Hình 3.4. Mô tả cấu trúc của
Hình 3.4 – Mạch kiểm tra chẵn lẻ
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
3.3.5 Cấu trúc chung của một chƣơng trình mô tả VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Hình 3.5 - Cấu trúc mô tả phần cứng và các đối tƣợng trong VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
3.3.6 Môi trƣờng kiểm tra “testbench”
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Generics – Tạo tham số
Hình 3.6 - Sơ đồ tổng quát chƣơng trình thử Testbench
Hình 3.7 – Mô hình Testbench cho mạch “Logic_AND”
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
3.3.7 Các cấu trúc lệnh song song
a. Cấu trúc Process:
Cấu trúc Process đƣợc tạo thành từ một tập hợp cấu trúc lệnh tuần tự (đƣợc trình bày
chi tiết ở phần sau). Nó cũng là khối cơ bản của việc mô tả hoạt động của thực thể. Tất cả các
Process trong một thiết kế đƣợc thực hiện song song. Mỗi một Process có thể tƣơng đƣơng
với một khối mạch nào đó. Chú ý là tại một thời điểm xác định chỉ có một câu lệnh tuần tự
đƣợc thực hiện trong mỗi cấu trúc Process. Cấu trúc tổng quát của Process nhƣ sau:
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
+ Wait on
; Ví dụ: Wait for 10 ns;
;
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Hình 3.8 - Mô hình kết nối của các Process.
b. Các phép gán tín hiệu song song
Process. Dạng đơn giản nhất của phép gán tín hiệu song song có cú pháp nhƣ sau:
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
c. Phép gán tín hiệu có điều kiện (when/else)
Cấu trúc phép gán tín hiệu có điều kiện có thể coi là cấu trúc song song của lệnh tuần tự
If đƣợc thay thế tƣơng đƣơng với Process chứa lệnh tuần tự if. Cấu trúc này thƣờng dùng để
mô tả cấu trúc mạch logic tổ hợp nhƣ: chọn kênh (mạch ghép kênh), giải mã, mã hóa, cổng 3
trạng thái …
MUX
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
d. Phép gán tín hiệu theo lựa chọn (with/select)
e. Khối (Block)
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
f. Gọi thủ tục, hàm song song
g. Lệnh lặp song song Generate
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
h. Lệnh gán chân
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
map đặt tƣơng ứng mỗi cổng thực của phiên bản với một cổng cục bộ thành phần. Thực hiện
nối các cổng vào ra của các thành phần con với các chân vào ra của hệ thống, hoặc nối với tín
hiệu nội bộ trong hệ thống để kết nối tới các cổng vào ra của các thành phần con khác. Ánh xạ
đƣợc thực hiện theo vị trí theo tên:
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chú ý: Các cổng vào/ra của mỗi thành phần con không đƣợc kết nối trực tiếp với nhau
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
i. Một số ví dụ mô tả dùng lệnh song song
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
x
s
2-4
Encoder
k. Câu hỏi ôn tập
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Khối (Unit)
Arithmetic
Khối (Unit)
Logic
Sel
0000
0001
0010
0011
0100
0101
0110
0111
Phép toán
y <= a
y <= a+1
y <= a-1
y <= b
y <= b+1
y <= b-1
y <= a+b
y <= a+b+cin
Sel
1000
1001
1010
1011
1100
1101
1110
1111
Phép toán
y <= NOT a
y <= NOT b
y <= a AND b
y <= a OR b
y <= a NAND b
y <= a NOR b
y <= a XOR b
y <= a XNOR b
3.3.8 Cấu trúc lệnh tuần tự
Process đƣợc xây dựng từ các cấu trúc lệnh tuần tự. Khi mô phỏng các lệnh tuần tự
trong 1 Process đƣợc thực hiện lần lƣợt trong một chu trình vô hạn bắt đầu từ lệnh thứ nhất
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
a. Phép gán tuần tự cho biến
Phép gán biến đƣợc thực hiện với thời gian mô phỏng bằng 0, và giá trị biến sẽ đƣợc
cập nhật ngay giá trị của biểu thức. Đối tƣợng
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
b. Phép gán tuần tự cho tín hiệu
c. Lệnh if
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
d. Lệnh case:
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
e. Câu lệnh rỗng Null
f. Các lệnh lặp
] loop: vòng lặp với sơ đồ lặp for hoặc vòng lặp while, và vòng lặp không], các lệnh trong dãy lệnh tuần tự sẽ đƣợc
thực hiện cho tới khi đƣợc ngắt bởi câu lệnh exit. Trong đó câu lệnh next cũng đƣợc dùng để
thay đổi trình tự thực hiện thân của vòng lặp.Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
dạng for: dạng while nhƣ sau:g. Một số ví dụ mô tả dùng lệnh tuần tự
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
x
s
2-4
Encoder
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Q
clk Counter
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Donvi
clk Cnt2D
Chuc
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
3.3.9 Hàm và thủ tục
Thủ tục – PROCEDURE, và hàm – FUNCTION còn đƣợc gọi chung là chƣơng trình
con. Về mặt cấu trúc thì hàm và thủ tục khá giống với PROCESS là chúng chỉ chứa các lệnh
tuần tự. Về mặt ứng dụng thì giữa PROCESS và chƣơng trình con có sự khác nhau cơ bản
là: PROCESS đƣợc mô tả ngay trong mã chƣơng trình chính và không phải khai báo, còn
chƣơng trình con thƣờng đƣợc khai báo và mô tả trong thƣ viện LIBRARY để đƣợc sử dụng
chung và chia sẻ giữa các ứng dụng khác nhau, tuy nhiên chƣơng trình con cũng có thể đƣợc
khai báo và mô tả ngay trong mã chƣơng trình chính nếu muốn.
a. Hàm – FUNCTION
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chú ý: Hàm phải đƣợc trả về 1 giá trị duy nhất có kiểu_dữ_liệu nhƣ đã khai báo. Và
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
b. Thủ tục – PROCEDURE
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
CONSTANT Danh_sách_tham_số_hằng
SIGNAL Danh_sách_tham_số_tín_hiệu
VARIABLE Danh_sách_tham_số_biến
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
BÀI TẬP
Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
CHƢƠNG 4 – PHƢƠNG PHÁP THIẾT KẾ LOGIC DÙNG
VHDL
4.0 GIỚI THIỆU CHUNG VỀ THIẾT KẾ LOGIC DÙNG HDL
+ Bước 1 – Tìm hiểu bài toán: Điều đầu tiên ngƣời thiết kế phải làm là hiểu đƣợc bài
toán. Không có một cách tiếp cận duy nhất để hiểu những yêu cầu của tất cả các bài toán phức
tạp. Các yêu cầu của bài toán đôi lúc mơ hồ, không chi tiết, và còn gây khó hiểu. Trong quá
trình thiết kế logic, hệ thống cần đƣợc xây dựng có thể không đƣợc hiểu và định nghĩa rõ ràng
tại thời điểm bắt đầu quá trình thiết kế. Do đó ngƣời thiết kế cần phải xác định rõ đƣợc những
yêu cầu của bài toán và đặt ra nhiệm vụ cần thiết kế. Một số bƣớc tiếp cận thƣờng đƣợc sử
dụng nhƣ sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Bước 2 – Biểu điễn đối tượng cần thiết kế theo các mô hình chuẩn: Sau khi đã hiểu
đƣợc bài toán và xác định đƣợc các yêu cầu thiết kế thì một bƣớc quan trọng tiếp theo quyết
định đến chất lƣợng của mã mô tả HDL đó là biểu diễn mạch hay hệ thống số cần thiết kế
theo các mô hình biểu diễn chuẩn với các mức độ trừu tƣợng khác nhau. Hệ thống số có thể
đƣợc biểu diễn bằng các dạng mô hình chuẩn nhƣ mô hình hoạt động (behavioral views), mô
hình cấu trúc (Structural views), hay mô hình vật lý (Physical views) với các mức độ trừu
tƣợng nhƣ: mức mạch điện hay mức Transistor (Circuit Level or Transistor Level), mức logic
hay mức cổng (Logic Lever or Gate Level), mức RTL (Register Transfer Level – Mức truyền
đạt thanh ghi), mức hệ thống (System Level or Processor Level). Các mô hình biểu diễn này
sử dụng các khái niệm, cũng nhƣ kỹ thuật logic số (hay điện tử số) để làm rõ hơn các yêu cầu,
chức năng kỹ thuật của hệ thống số, các điều kiện, cũng nhƣ mối quan hệ giữa các tín hiệu ra
số với tín hiệu vào số và tín hiệu điều khiển số để giải quyết đƣợc bài toán đã đặt ra. Các mô
hình và mức độ trừu tƣợng của biểu diễn hệ thống số sẽ đƣợc làm rõ hơn ở phần sau.
+ Bước 3 – Mô tả hệ thống số cần thiết kế bằng HDL: Sử dụng một ngôn ngữ mô tả
phần cứng HDL nào đó (ví dụ nhƣ VHDL, Verilog,…) để mô tả hệ thống số từ các mô hình
biểu diễn chuẩn. Sử dụng mã HDL sao cho có thể tổng hợp đƣợc hệ thống thực từ bằng các
công cụ tổng hợp hiện có. Các kỹ thuật mô tả dùng VHDL cũng sẽ dần đƣợc làm rõ trong các
phần tiếp theo.
4.1 MÔ HÌNH BIỂU DIỄN HỆ THỐNG SỐ
4.1.1. Mô hình hoạt động (Behavioral views)
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.1.2. Mô hình cấu trúc (Structural views)
4.1.3. Mô hình vật lý (Physical views)
4.2 CÁC MỨC ĐỘ TRỪU TƢỢNG TRONG MÔ TẢ HỆ THỐNG SỐ
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.1 - Biểu đồ Y
Bảng 4.1 - Đặc tính của các mức mô tả trừu tƣợng
Đặc tính mô tả
Mức độ
trừu tƣợng
Khối cơ bản
Mô tả hoạt động
Mô tả vật lý
Biểu diễn
tín hiệu
Biểu diễn
thời gian
Circuit
Logic
RTL
System
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.2.1. Mô tả mức mạch điện (Circuit Level or Transistor Level)
4.2.2. Mô tả mức logic (Logic Lever or Gate Level)
4.2.3 Mô tả mức RTL (Register Transfer Level – Mức truyền đạt thanh ghi)
4.2.4. Mô tả mức hệ thống (System Level or Processor Level)
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.2.5. Ví dụ các mô hình hệ thống số
+ Ví dụ Mô hình cấu trúc mức hệ thống
Hình 4.2 – Các thành phần của hệ thống số
+ Ví dụ Mô hình hoạt động mức RTL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.3 – Mô hình hoạt động mức RTL của hệ thống số
+ Khối xử lý trung tâm (CPU) : Khối này gồm 2 thành phần:
- Khối Đƣờng dữ liệu (Datapath): Đây là khối chức năng thực hiện các phép xử lý số
liệu của hệ thống số, chúng thƣờng gồm các khối thanh ghi, bộ đếm, ghép kênh, ALU – khối
tính toán số học và logic....
- Khối điều khiển (Control Unit): Thực hiện chức năng điều khiển chính cho khối
- ISA (Instruction set Architecture – Kiến trúc tập lệnh): Tập lệnh để lập trình hoạt
+ Khối bộ nhớ - Memory: Có nhiệm vụ lƣu trữ dữ liệu hoặc chƣơng trình.
+ Khối điều khiển Vào/Ra – Input/Output: Tạo ra các giao diện giao tiếp với các
+ Ví dụ mô hình cấu trúc mức RTL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.4 - Mô hình cấu trúc mức RTL
4.3 MÔ TẢ THEO MÔ HÌNH HOẠT ĐỘNG (BEHAVIORAL)
4.3.1 Mô tả theo mức hệ thống
Ví dụ mô tả hệ thống cảnh báo theo mô hình hành vi “Hệ thống gồm có đầu vào từ các
sensor (Front_Door, Rear_Door, Window), đầu vào từ bàn phím bấm Keypad, tín hiệu Clk,
Reset và đầu ra điều khiển còi báo động Alarm_Siren”.
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.3.2 Mô tả theo mức RTL
Hình 4.5 – Mô hình hoạt động mức RTL
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Mô hình Datapath:
Khối đƣờng dữ liệu Datapath của mô hình hoạt động mức RTL gồm các khối thanh ghi
và các khối mạch logic tổ hợp, và chúng đƣợc mô tả bằng các tiến trình tổ hợp
(combinatorial process) và các tiến hoạt động theo clock (clocked process) hay còn gọi là
process tuần tự.
Hình 4.6 – Process tổ hợp và tuần tự
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.7 - Mô hình Datapath
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Mô hình điều khiển
4.3.3. Viết mô tả Testbench
Generics – Tạo tham số
Hình 4.8 - Sơ đồ tổng quát chƣơng trình thử Testbench đơn giản
Generics – Tạo tham số
Hình 4.9 - Sơ đồ tổng chƣơng trình thử Testbench đầy đủ
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Chương trình thử Testbench đơn giản: Chỉ viết mô tả để tạo các nguồn tín hiệu vào
kích thích cho khối cần kiểm tra DUT, còn tín hiệu ra đƣợc thu thập tự động bởi phần mềm
mô phỏng và đƣa kết quả ra dƣới dạng giản đồ thời gian. Phân tích giản đồ thời gian để xác
định hoạt động của khối DUT. Mô hình Testbench đơn giản này nhƣ Hình 4.8.
+ Chương trình thử Testbench đầy đủ: Ngoài mô tả để tạo các nguồn tín hiệu vào kích
thích cho khối cần kiểm tra DUT, trong chƣơng trình Testbench còn thực hiện các tiến trình
đọc kết quả đầu ra của DUT, thực hiện đánh giá kết quả đó hay so sánh với tín hiệu ra mong
muốn để đánh giá xem thiết kế có đúng hay không, kết quả mô phỏng còn có thể đƣợc ghi và
đọc ra file, cũng nhƣ tạo các thông báo trên màn hình dùng các hàm của gói TextIO. Mô hình
Testbench đầy đủ này nhƣ Hình 4.9.
a. Viết mô tả dạng tín hiệu kích thích
+ Một số mô hình thời gian dùng lệnh gán song song
+ Một số mô hình thời gian dùng lệnh tuần tự
+ Wait on
+ Trường hợp 1: Viết mô tả để tạo ra dạng tín hiệu đơn a nhƣ hình vẽ dƣới đây:
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Trường hợp 2: Viết mô tả tạo ra sự thay đổi cho tín hiệu kiểu Vector
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Trường hợp 4: Mô tả các dạng tín hiệu clock Clk1, Clk2 có chu kỳ 100 ns nhƣ hình vẽ sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Trường hợp 5: Tạo ra tất cả các giá trị của một tín hiệu vector vào . Ví dụ viết mô tả tạo ra
dạng sóng của tín hiệu vào TestVector[3:0] nhƣ giản đồ thời gian dƣới đây:
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Trường hợp 6: Tạo ra tất cả các giá trị 2 tín hiệu đầu vào. Ví dụ có 2 tín hiệu đầu vào
X(1:0) và Y(1:0) nhƣ giản đồ thời gian dƣới đây:
b. Viết mô tả tạo thông báo
+ Lệnh “Assert”: Đây là lệnh tuần tự chỉ dùng cho mô phỏng, đƣợc dùng để viết thông
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Lệnh “Report”: Đây lệnh tuần tự cho phép viết thông báo ra màn hình
Ví dụ Testbech tạo các thông báo:
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ: Viết testbench đầy đủ kiểm tra mạch giải mã BCD-7Segments :
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
c. Viết mô tả sử dụng TextIO
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ sử dụng TextIO để viết Testbench cho bộ đếm như sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
Vectorfile.txt
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.3.4 Mã mô tả VHDL không tổng hợp đƣợc
IEEE 1076
(modeling)
IEEE 1076
(synthesis)
Hình 4.10 – Tập con mã VHDL có thể tổng hợp đƣợc trong bộ tiêu chuẩn IEEE1076
Một số cấu trúc mã VHDL không tổng hợp được cần chú ý
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.4. CÁC MÔ HÌNH TÍN HIỆU SỐ
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.5. MÔ TẢ THEO MÔ HÌNH CẤU TRÖC
Ví dụ: Thiết kế và mô tả VHDL cho bộ ALU có chức năng nhƣ bảng sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
Phép toán không dấu Khối (Unit)
Khối (Unit)
Logic
Sel
0000
0001
0010
0011
0100
0101
0110
0111
Phép toán
y <= NOT a
y <= NOT b
y <= a AND b
y <= a OR b
y <= a NAND b
y <= a NOR b
y <= a XOR b
y <= a XNOR b
Sel
1000
1001
1010
1011
1100
1101
1110
1111
ALU
Hình 4.11 – Sơ đồ cấu trúc bộ ALU
-- Mô tả theo mô hình hoạt động mức hệ thống
Chương 4– Phương pháp thiết kế logic dùng VHDL
- Mô tả theo mô hình cấu trúc thứ nhất
Chương 4– Phương pháp thiết kế logic dùng VHDL
- Mô tả theo mô hình cấu trúc thứ hai
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6. MÔ TẢ MẠCH LOGIC TỔ HỢP
4.6.1. Các cấu trúc lệnh VHDL dùng cho mô tả mạch tổ hợp
Outputs
Inputs
Mạch tổ hợp
(Combinational
)
Hình 4.12 – Các cách mô tả mạch tổ hợp
a. Mô tả mạch tổ hợp dùng cấu trúc lệnh song song
Chương 4– Phương pháp thiết kế logic dùng VHDL
Vế_trái <= Vế_Phải
b. Mô tả mạch tổ hợp dùng Process tổ hợp
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ:
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.2. Mô tả các mạch tổ hợp cơ bản
4.6.2.1. Mô tả hàm boolean
4.6.2.2. Mô tả sơ đồ cấu trúc cổng logic của mạch
4.6.2.3. Mô tả Bộ đệm 3 trạng thái
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.2.4. Mô tả mạch ghép kênh MUX
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.2.5. Mô tả bộ phân kênh DEMUX
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.2.6. Mô tả bộ Mã hóa/Giải mã (Encoder/Decoder)
1. Bộ giải mã LED 7 đoạn
Anot
a
b
f
g
c
e
h
d
Chương 4– Phương pháp thiết kế logic dùng VHDL
a
b
f
g
BINto7SEG
c
e
h
d
-- Mô tả sử dụng lệnh with-select
Chương 4– Phương pháp thiết kế logic dùng VHDL
2. Bộ mã hóa n-to-2n
n-to-2n
Encoder
(n=3)
Chương 4– Phương pháp thiết kế logic dùng VHDL
3. Bộ mã hóa ưu tiên
Priority
Encoder
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.2.7. Các mạch tính toán số học
a. Mô tả theo mô hình hoạt động
Chương 4– Phương pháp thiết kế logic dùng VHDL
Phép toán cho số không dấu (Unsigned):
Phép toán cho số có dấu (Signed):
Toán tử
Kiểu toán hạng trái L
Kiểu toán hạng phải R
Kiểu kết quả
L + R
L - R
L * R
L / R
L mod R
L rem R
1. Ví dụ mô tả bộ cộng 2 số 16 bit không dấu, có nhớ nhƣ sau:
library IEEE;
Chương 4– Phương pháp thiết kế logic dùng VHDL
2. Ví dụ mô tả bộ cộng 2 số 16 bit có dấu, có bit nhớ và tràn nhƣ sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
3. Ví dụ mô tả bộ nhân số có dấu và không dấu:
Chương 4– Phương pháp thiết kế logic dùng VHDL
b. Mô tả theo mô hình cấu trúc
1. Bộ cộng 1 bit bán phần HA
Chương 4– Phương pháp thiết kế logic dùng VHDL
2.Bộ cộng 1 bit toàn phần FA
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.13 – Cấu trúc bộ cộng toàn phần 8 bit
Chương 4– Phương pháp thiết kế logic dùng VHDL
4. Bộ dịch Barrel (Barrel Shifter)
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.14 – Cấu trúc Bộ dịch Barrel 8 bit sử dụng các bộ Mux
4.6.3. Phƣơng pháp thiết kế dùng chung phép toán
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.3.1. Ví dụ dùng chung phép toán 1
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.3.2. Ví dụ dùng chung phép toán 2
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.3.3. Ví dụ dùng chung phép toán 3
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.3.3. Ví dụ dùng chung phép toán 4
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.6.4. Phƣơng pháp thiết kế dùng chung chức năng
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.15 – Mạch cộng-trừ (AddSub) 2 số có dấu
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7. MÔ TẢ MẠCH LOGIC TUẦN TỰ CƠ BẢN
Hình 4.16 – Sơ đồ khối chung của mạch tuần tự
4.7.1. Cấu trúc lệnh VHDL dùng cho mô tả mạch tuần tự
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.2. Mô tả các phần tử nhớ
4.7.2.1. Triger D (DFF - D Flip-Plops)
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chú ý:
rising_edge(Clk) tƣơng đƣơng (Clk'event and Clk='1' and Clk'Last_value='0')
falling_edge(Clk) tƣơng đƣơng (Clk'event and Clk='0' and Clk'Last_value='1')
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.2.3. Triger T (TFF - T Flip-Plops)
4.7.2.3. Thanh ghi (Register)
Chương 4– Phương pháp thiết kế logic dùng VHDL
- Mô tả thanh ghi dịch N bit nối tiếp, nạp song song.
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
- Mô tả mạch chốt 4 bit (D-Latch) có tín hiệu cổng Gate mức tích cực thấp và Preset
không đồng bộ:
4.7.3. Bộ đếm (Counter)
Phép toán
Đếm lên
Đếm xuống
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.3.1. Bộ đếm nhị phân
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.3.2. Bộ đếm thập phân (bộ đếm BCD)
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.3.3. Mạch chia tần số
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7 MÁY TRẠNG THÁI HỮU HẠN – FSM
4.7.1. Giới thiệu chung về máy trạng thái hữu hạn - FSM
Chương 4– Phương pháp thiết kế logic dùng VHDL
- Kiến trúc máy trạng thái Moore: Kết quả đầu ra chỉ phụ thuộc vào trạng thái hiện
Hình 4.17 – Kiến trúc máy trạng thái Moore.
- Kiến trúc máy trạng thái Mealy: Đầu ra phụ thuộc vào cả trạng thái hiện tại và tín
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.18 – Mô hình máy trạng thái Mealy.
Hình 4.19 – Kiến trúc máy trạng thái hỗn hợp Moore và Mealy.
Để mô tả hoạt động của FSM có thể sử dụng bảng trạng thái, ngôn ngữ viết tự nhiên,
tuy nhiên FSM thƣờng đƣợc biểu diễn chủ yếu dƣới dạng Đồ hình máy trạng thái hữu hạn
FSMD (State Diagram) hoặc Lƣu đồ giải thuật máy trạng thái ASM (Algorithm State
Machine). Cả hai mô hình đều biểu diễn các trạng thái của mạch, sự tƣơng tác và chuyển đổi
giữa các trạng thái theo mô hình biểu diễn đồ họa.
4.7.2. Đồ hình máy trạng thái - FSMD
+ Biểu diễn trạng thái và chuyển đổi trạng thái
Chương 4– Phương pháp thiết kế logic dùng VHDL
+ Biểu diễn hàm xác định đầu ra - Inputs
+ Biểu diễn tín hiệu Reset và trạng thái khởi tạo
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.7.3. Lƣu đồ giải thuật máy trạng thái – ASM
Chương 4– Phương pháp thiết kế logic dùng VHDL
Hình 4.20 – Các thành phần của ASM
Ví dụ 1: Máy trạng kiểu Moore
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ 2: Máy trạng thái kiểu Mealy
Ví dụ 3: Bộ Arbiter
4.7.4. Mô tả VHDL cho FSM
Yêu cầu mô tả
STT
1
2
3
4
Sử dụng cấu trúc trong VHDL
- Process hoạt động theo clock (Sync)
- Process tổ hợp (Comp)
- Process tổ hợp (Outputs)
- Kiểu dữ liệu liệt kê
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ: Máy trạng thái mô tả bộ điều khiển đèn giao thông đơn giản tại một ngã tƣ:
Chương 4– Phương pháp thiết kế logic dùng VHDL
Trạng thái
Thời gian
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Ví dụ: bộ đếm thập phân thuận nghịch đồng bộ “UpdownCounter” có mô hình vẽ sau:
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
Chương 4– Phương pháp thiết kế logic dùng VHDL
4.8. PHƢƠNG PHÁP THIẾT KẾ TOP-DOWN
Chương 4– Phương pháp thiết kế logic dùng VHDL
BÀI TẬP
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
CHƢƠNG 5 – THIẾT KẾ CÁC HỆ THỐNG SỐ ỨNG DỤNG
DÙNG VHDL
5.1. THIẾT KẾ MẠCH ĐIỀU KHIỂN HIỂN THỊ LED
5.1.1 Thiết kế mạch điều khiển màn chỉ thị số LED.
a, Phân tích ứng dụng thiết kế.
Hình 5.1 - Sơ đồ cấu trúc bên trong của LED 7 thanh:
Hình 5.2 - Cấu trúc bên trong của LED 7 đoạn
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Số
0
1
2
3
4
5
6
7
8
9
a
0
1
0
0
1
0
0
0
0
0
b
0
0
0
0
0
1
1
0
0
0
c
0
0
1
0
0
0
0
0
0
0
d
0
1
0
0
1
0
0
1
0
0
e
0
1
0
1
1
1
0
1
0
1
f
0
1
1
1
0
0
0
1
0
0
g
1
1
0
0
0
0
0
1
0
0
Hình 5.3 - Sơ đồ nguyên lý phần cứng.
b, Xây dựng sơ đồ triển khai ứng dụng
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
CPLD/
FPGA
Hình 5.4 - Sơ đồ triển khai ứng dụng
c. Thực hiện thiết kế:
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.5 - Mô hình tổng quát của bộ điều khiển
d, Mô tả bằng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.1.2 Thiết kế mạch điều khiển ma trận LED
a, Phân tích ứng dụng và thiết kế
Hình 5.6 - Hình ảnh LED ma trân 8x8
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
b, Xây dựng sơ đồ triển khai ứng dụng mạch điều khiển hiển thị ma trận LED
CPLD/FPGA
Hình 5.7 Mạch điều khiển hiển thị ma trận LED
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
c, Thực hiện thiết kế:
d, Mô tả bằng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.1.3. Thiết kế ứng dụng điều hiển thị 8 led đơn sáng theo quy luật
a/ Phân tích ứng dụng thiết kế
Hình 5.8 - Sơ đồ khối ứng dụng 2
b/ Xây dựng sơ đồ triển khai ứng dụng
c/ Thực hiện thiết kế
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.9 - Sơ đồ triển khai ứng dụng
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.2 THIẾT KẾ BỘ ĐẾM THUẬT NGHỊCH THEO ĐIỀU KHIỂN
a/ Phân tích ứng dụng thiết kế
Hình 5.10 - Sơ đồ khối ứng dụng 1
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.11 - Sơ đồ triển khai ứng dụng 1
c/ Thực hiện thiết kế
Seg (abcdefgh)
AN(0)
AN(1)
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.3. THIẾT KẾ BỘ ĐẾM TẦN TỰ ĐỘNG THAY ĐỔI THANG ĐO
a/ Phân tích ứng dụng thiết kế
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.12 - Sơ đồ triển khai ứng dụng 3
b/ Xây dựng sơ đồ triển khai ứng dụng
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.13 - Sơ đồ triển khai ứng dụng 3
Hình 5.14 - Giản đồ thời gian minh hoạ mối quan hệ xung chuẩn Tch và xung vào chuẩn.
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
c/ Thực hiện thiết kế
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.4. THIẾT KẾ MẠCH GIAO TIẾP ĐIỀU KHIỂN VGA
a. Giới thiệu chuẩn VGA
Hình 5.15 – Sơ đồ khối màn hình CRT
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.16 – Đồ thị thời gian xung quét dòng
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
b, Thiết kế bộ điều khiển .
Hình 5.17 - Sơ Đồ khối bộ điều khiển VGA
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.5. THIẾT KẾ MẠCH ĐIỀU KHIỂN HIỂN THỊ LCD
a, Phân tích ứng dụng thiết kế:
Hình 5.18 – Sơ đồ khối khối mạch điều khiển LCD
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
- Chân VCC, VSS và VEE: Các chân VCC, VSS và VEE: Cấp dƣơng nguồn - 5v và đất
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.19 – Giản đồ thời gian
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.20 - Thủ tục khởi tạo cho LCD
b, Thực hiện thiết kế
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.21 - Đồ hình trạng thái điều khiển cho LCD
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.6 THIẾT KẾ MẠCH ĐIÈU KHIỂN MA TRẬN PHÍM
a/ Phân tích ứng dụng thiết kế
Hình 5.22 - Ma Trận bàn phím
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.23 - Lƣu đồ thuật toán quét bàn phím
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
b, Thực hiện thiết kế:
* Mô tả bằng VHDL:
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.7. THIẾT KẾ GIAO TIẾP PS2 VỚI BÀN PHÍM
Cổng PS2 đƣợc giới thiệu trong máy tính cá nhân của IBM, đây là chuẩn kết nối giao
tiếp bàn phím và chuột vói máy tính. Cổng PS2 có 1 kết nối nguồn làm việc tốt ở 5v, hoặc
3.3v ở các thiết bị cũ . Một chân kết nối với đất. Hai đƣờng dùng cho kết nối, 1 dây cho phép
truyền dữ liệu theo chuỗi nối tiếp, dây con lại chƣa thông tin clock đƣợc xác định khi dữ liệu
hợp lệ và đƣợc nhận. Thông tin đƣợc truyền đi theo gói 11 bit, bao gồm 1 bít Start ,8 bit dữ
liệu, 1 bít dùng cho kiểm tra chẵn lẻ, 1 bít stop.
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.24 - Cấu trúc dữ liệu truyền qua PS2
Hình 5.25 - lƣu đồ thuật toán mạch nhận dữ liệu
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.26 - Mã bàn phím
Hình 5.27 -Sơ đồ khối mạch giao tiếp Ps2.
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
5.8. THIẾT KẾ BỘ ĐIỀU KIỂN TRUYỀN THÔNG NỐI TIẾP UART
a. Thiết kế khối nhận dữ liệu.
Hình 5.28 - Sơ đồ khối bộ nhận dữ liệu UART
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.29 - Lƣu đồ thuật toán mạch receiver
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.30 - Mạch nhận dữ liệu UART có bộ đệm dữ liệu.
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Hình 5.31
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL
Phụ lục I – Quy ước về đặt tên trong VHLD
PHỤ LỤC I – QUY ƢỚC VỀ ĐẶT TÊN TRONG VHDL
I.1. Quy ƣớc chung về đặt tên trong VHDL
o Tên đã dùng cho các tài nguyên của FPGA: Components (Comps), Configurable
Logic Blocks (CLBs), Input/Output Blocks (IOBs), Slices, basic elements (bels),
clock buffers (BUFGs), tristate buffers (BUFTs), oscillators (OSC), CCLK, DP,
GND, VCC, và RST.
o Tên của CLB nhƣ AA, AB, SLICE_R1C2, SLICE_X1Y2, X1Y2, hoặc R1C2
o Tên nguyên gốc nhƣ TD0, BSCAN, M0, M1, M2, hoặc STARTUP.
o Tránh đặt tên của các pin nhƣ P1, A4, PAD1cho tên của component
o Từ khóa đã đƣợc sử dụng bởi VHDL (Sẽ đổi mầu trong trình biên soạn code
VHDL) nhƣ : abs access after alias all and architecture array assert attribute
begin block body buffer bus case component configuration constant disconnect
downto else elsif end, entity exit file for function generate generic guarded if
impure in inertial inout is label library linkage, literal loop map mod nand new
next nor not null of on open or others out package port postponed procedure,
process pure range record register reject rem report, return rol ror select
severity shared signal sla sll, sra srl subtype then to transport type unaffected
units until use variable wait when while with xnor xor…
Phụ lục I – Quy ước về đặt tên trong VHLD
I.2. Quy ƣớc đặt tên các đối tƣợng trong VHDL
+ Tên file:
+ Tên hằng (Constant Names)
+ Tên tín hiệu (Signal Names)
Loại tín hiệu Hậu tố
Ví dụ
Ý nghĩa
Phụ lục I – Quy ước về đặt tên trong VHLD
+ Tên biến (Variable Names)
+ Tên Kiểu dữ liệu (Type Names)
I.3. Quy ƣớc đặt tên các đơn vị thiết kế
+ Tên Entity
+ Tên Architecture
+ Tên Configuration
+ Tên Package
+ Tên Testbench (entity, architecture, package)
+ Tên Library (package)
+ Tên Nhãn (Label)
Cấu trúc
Ví dụ
Hậu
tố
Proces
s
Block
Instance
Generate
Phụ lục I – Quy ước về đặt tên trong VHLD
Phụ lục II – Cấu trúc lệnh cơ bản của VHDL
PHỤ LỤC II – CẤU TRÖC LỆNH CƠ BẢN CỦA VHDL
LIBRARIES
ENTITY
ARCHITECTURE
OPERATORS
COMPONENT
CONSTANTS
Phụ lục II – Cấu trúc lệnh cơ bản của VHDL
SIGNALS
TYPES
PROCESS
VARIABLES
IF-THEN-ELSE
Phụ lục II – Cấu trúc lệnh cơ bản của VHDL
CASE
FOR LOOP
FUNCTION
PROCEDURE
Phụ lục II – Cấu trúc lệnh cơ bản của VHDL
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
PHỤ LỤC III – GIỚI THIỆU CPLD/FPGA CỦA XILINX
III.1. GIỚI THIỆU CHUNG VỀ CPLD/FPGA CỦA XILINX
III.1.1. CPLD của Xilinx
a. XC9500
XCxyyyk
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
* Dòng XC9500 5v
XC9536 XC9572 XC95108 XC95144 XC95216 XC95288
Macrocells
Số cổng logic
tpd (ns)
Số chân I/O
* Dòng XC9500XL 3.3v
* Dòng CPLD 2.5v XC9500XV
b. CoolRunner
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
* XPLA3
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
* CoolRunner II:
III.1.2. FPGA của Xilinx
a. FPGA Virtex
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
b. FPGA Spartan
III.2. CẤU TRÖC CPLD CỦA XILINX
III.2.1 XC9500XL
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Bảng III.1 - Các linh kiện CPLD thuộc dòng XC9500XL
XC9536XL
XC9572XL
XC95144XL
XC95288XL
178
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Product term Allocator.
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- XC9500XL trong một hệ thống 2,5v, 3,3v, 5v.
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
III.2.2. CoolRunner XPLA3
Bảng III.2 - Các thiết bị thuộc dòng CoolRunner XPLA
XCR3032XL
XCR3064XL
XCR3128XL
XCR3256XL
XCR3384XL
XCR3512XL
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Sơ đồ cấu tạo khối chức năng FB của CoolRunner XPLA3.
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Kiến trúc macrocell của CoolRunner XPLA3.
III.2.3 CoolRunner II
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Bộ chia tín hiệu clock của CoonRunner II
- CoolRunner II với tính năng sử dụng clock 2 sƣờn
- CoolRunnerII với tính năng CoolClock
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Bảng III.3 - Các linh kiện thuộc dòng CoolRunner2
XC2C32A XC2C64A XC2C128 XC2C256 XC2C384 XC2C512
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Cấu trúc của một khối chức năng.
* Kiến trúc macrocell
- Kiến trúc macrocell của CoolRunner II.
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
III.3. GIỚI THIỆU CÁC DÕNG FPGA CĂN BẢN
III.3.1. Spartan-3
Bảng III.4 - Các linh kiện dòng Spartan 3
Linh kiện
Số I/O
Logic
Cells
Số
CLB
Số bộ
nhân
Số
cổng
logic
Số
DC
M
Dung
lƣợng
khối
RAM
Dung
lƣợng
RAM
phân
phối
12K
30K
56K
120K
208K
320K
432K
520K
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
- Cấu trúc sắp xếp của Spartan 3
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
III.3.2. Virtex
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Bảng III.5 - Các linh kiện dòng Virtex
Linh kiện
Số cổng
Số CLB
Logic
Cells
Số I/O
tối đa
Dung
lƣợng khối
RAM
32,768
40,960
49,152
57,344
65,536
81,920
98,304
114,688
131,072
Dung lƣợng
SelectRAM+
™ Bits
24,576
38,400
55,296
75,264
98,304
153,600
221,184
301,056
393,216
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Kết nối địa phương: Việc kết nối giữa các thành phần gần nhau đƣợc cung cấp bởi các
khối tài nguyên kết nối địa phƣơng (VersaBlock), các khối này cung cấp 3 loại kêt nối chủ
yếu:
Kết nối chung
Kết nối I/O
Các kết nối dành riêng
Kết nối toàn chip
Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
PHỤ LỤC IV – HƢỚNG DẪN PHẦN MỀM ISE CỦA XILINX
IV.1. GIỚI THIỆU CHUNG
IV.2. HƢỚNG DẪN CÀI ĐẶT
IV.3. THỰC HIỆN LƢU ĐỒ THIẾT KẾ TRÊN ISE
+ Nhập thiết kế (Design Entry)
+ Kiểm tra thiết kế (Design Verification)
+ Tổng hợp (Synthesis)
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Hình IV.1 - Lƣu đồ thiết kế CPLD
+ Implementation
+ Nạp thiết kế vào CPLD và FPGA
+ Kiểm tra (design verification)
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
1. Nhập thiết kế
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Tổng hợp
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Xem báo cáo của quá trình tổng hợp
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Gán pin và các giới hạn
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Implement CPLD
Dịch (translate)
Để chạy quá trình dịch, nháy đúp chuột trái trên Translate trong cửa số Processes for
Sources. Sau khi chạy xong, quá trình này sẽ tạo ra một file NGD và. File này có thể mở bằng
ChipViewer (cho CPLD).
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Fit
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Summary
Design Name
Fitting Status
SW Version
Device Used
Date
RESOURCES SUMMARY
Macrocells Used Pterms Used
Registers Used
Pins Used
Function Block
Inputs Used
PIN RESOURCES
Signal Type
Required
Mapped
Pin Type
Used
Remaining
MACROCELL RESOURCES
GLOBAL RESOURCES
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Tạo file lập trình và nạp CPLD
Tạo ra báo cáo thời gian (Generate timming)
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Summary
Performance Summary
Min. Clock Period
Max. Clock Frequency (fSYSTEM)
Clock to Setup (tCYC)
Pad to Pad Delay (tPD)
Setup to Clock at the Pad (tSU)
Clock Pad to Output Pad Delay (tCO)
Timing Constraints
Pa
Pa
Constraint Name
Requir
ement (ns)
De
lay (ns)
ths
ths
Failing
Tạo ra model để mô phỏng sau khi Fit
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Phân tích công suất tiêu thụ
Xilinx cung cấp một công cụ để phân tích công suất tiêu thụ của CPLD: Xpower
Software. Công cụ này cung cấp thông tin về công suất tiêu tụ, dòng điện và thời gian hoạt
động dự kiến. Sau khi phân tích, ta có thể xem thông tin về dòng tiêu thụ của từng tín hiệu,
từng khối, và tổng công suất tiêu thụ. Ngoài ra, công cụ này cũng cung cấp thông tin về nhiệt
độ hoạt động của IC và tản nhiệt cần thiết cho IC.
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Implement FPGA
Map
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Place and Routing (PAR)
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Báo cáo PAR:
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Chương IV – Hướng dẫn phần mềm ISE của Xilinx
Các quá trình khác (tùy chọn)
Tạo ra báo cáo thời gian sau khi đã Place và Route
Floorplanner
Phân tích công suất tiêu thụ
Tạo file Bitstream
Tài liệu tham khảo
TÀI LIỆU THAM KHẢO
Có thể bạn quan tâm
Tài liêu mới