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 đó: phải là kiểu Bit_vector sẽ đƣợc dịch hoặc quay dữ liệu, xác định số vị trí đƣợc dịch hoặc quay và phải có kiểu số nguyên mang giá trị dƣơng hoặc âm, nếu là giá trị âm sẽ chỉ ra hƣớng ngƣợc lại với giá trị dƣơng . Mỗi phép dịch cho kết qủa cùng dạng và kích thƣớc với toán hạng ban đầu.

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

3.3.4 Các đơn vị thiết kế trong VHDL

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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:

- Đơ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

thủ tục, hàm...

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 đó:

nhƣ khai báo các cổng vào/ra, các tham số của khối mạch...

- Đơ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ả

hoạt động của khối mạch số.

Package Body: Mô tả chỉ tiết cho các khai báo trong Package nhƣ viết các hàm, các

thủ tụ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ế.

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

Hình 3.3 - Các thành phần cơ bản của mã VHDL

a. Entity - (Thực thể) :

Đâ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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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ể;

+ [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.

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;

b. Architecture – (Kiến trúc) :

Đơ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;

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

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 ;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

-- 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;

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 …

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 . . .

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

d. Library (thư viện)

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:

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.

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.

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

Trong thƣ viện ieee bao gồm một số package nhƣ sau:

- 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à

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.

- 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

dữ liệu STD_LOGIC_VECTOR.

- 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

với kiểu dữ liệu STD_LOGIC_VECTOR.

e. Configuration (Cấu hình)

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]

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

[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;

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

mạch sử dụng cấu hình thay đổi cho phần tử XOR.

Hình 3.4 – Mạch kiểm tra chẵn lẻ

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

3.3.5 Cấu trúc chung của một chƣơng trình mô tả VHDL

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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

Hình 3.5 - Cấu trúc mô tả phần cứng và các đối tƣợng trong VHDL

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

3.3.6 Môi trƣờng kiểm tra “testbench”

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

Testbench Entity

Generics – Tạo tham số

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

Hình 3.6 - Sơ đồ tổng quát chƣơng trình thử Testbench

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;

Hình 3.7 – Mô hình Testbench cho mạch “Logic_AND”

98

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

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

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

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:

[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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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 on ; Ví dụ: Wait on clk, Reset;

+ Wait until ; Ví dụ: Wait until clk=‟1‟

+ Wait for ; Ví dụ: Wait for 10 ns;

+ Wait on until ; Ví dụ: Wait on

clk, Reset; Ví dụ: Wait on Reset until clk=‟1‟;

+ Wait until for ;

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;

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

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

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:

Trong đó nhận giá trị của , chú ý là lệnh after chỉ dùng cho mô phỏng còn khi tổng hợp mạch nó sẽ đƣợc bỏ qua. Phép gán song song tƣơng đƣơng một Process chứa 1 phép gán tín hiệu. Phép gán này thƣờng đƣợc dùng để mô tả cấu trúc mạch logic tổ hợp theo biểu_thức boolean.

Ví dụ mô tả mạch AND và OR có cùng 4 đầu vào nhƣ sau:

<= [after ];

...

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

c. Phép gán tín hiệu có điều kiện (when/else)

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:

<= [after ] when

<điều_kiện> else

[after ] when

<điều_kiện> else

...

[after ];

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 …

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

MUX

‗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

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)

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 select

<= [after ]

when ,

[after ] when ,

...

[after ]

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;

e. Khối (Block)

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:

: Block

{}

begin

{} – có trình tự bất kỳ

: xác định các đối tƣợng tồn tại cục bộ trong khối và có thể là các

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;

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

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.

g. Lệnh lặp song song Generate

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

[-- 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;

h. Lệnh gán chân

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 --Giống tên đã khai báo trong Entity tương ứng

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;

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:

+ 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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

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

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

-- 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;

i. Một số ví dụ mô tả dùng lệnh song song

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

2. Mô tả Bộ mã hóa n-2n (Binary Decoder hay n-to-2n Decoder) với n=2:

entity Encoder4 is

x

s

Port ( s : in STD_LOGIC_VECTOR (1 downto 0);

2-4 Encoder

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;

k. Câu hỏi ôn tập

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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?

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

7. Viết mô tả VHDL cho mạch Nhân và Chia đơn giản 8 bit dấu phảy tĩnh?

3.3.8 Cấu trúc lệnh tuần tự

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.

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

111

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

đế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.

a. Phép gán tuần tự cho biến

Cú pháp của phép gán biến nhƣ sau:

biến := biểu_thức

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ỉ đƣợc khai báo và sử dụng trong Process và thủ tục - Procedure, hàm - Function, nó đƣợc sử dụng để lƣu trữ các kết quả trung gian.

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ương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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.

b. Phép gán tuần tự cho 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;

c. Lệnh if

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

;

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.

d. Lệnh case:

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 =>

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

;

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;

e. Câu lệnh rỗng Null

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 ;

f. Các lệnh lặp

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:

[:] [] loop

{}|

{next [] [when <điều_kiện>];}|

{exit [] [when <điều_kiện>];}

- : nhãn của vòng lặp và thƣờng đƣợc dùng để xây dựng những vòng lặp lồng

nhau, trong đó mỗi vòng lặp đƣợc kết thúc bởi từ khóa end 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

chứa các sơ đồ lặp.

Với những vòng lặp không chứa [], 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.

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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 dạng for:

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 dạng while nhƣ sau:

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;

g. Một số ví dụ mô tả dùng lệnh tuần tự

1. Triger D (DFF) với tín hiệu Reset không đồng bộ

116

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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

x

s

Port ( s : in STD_LOGIC_VECTOR (1 downto 0);

2-4 Encoder

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";

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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

Q

clk Counter

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

5. Mô tả Bộ đếm thập phân 2 số (2 Digit)

Donvi

clk Cnt2D

Chuc

-- 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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

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

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

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à

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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);

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

b. Thủ tục – PROCEDURE

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

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ế độ: =in/out/inout.

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

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

BÀI TẬP

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;

Chương 3.Căn bản về ngôn ngữ mô tả phần cứng VHDL

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

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

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:

+ 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:

- 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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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ệ…

+ 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Ố

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

4.1.1. Mô hình hoạt động (Behavioral views)

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

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)

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.

4.1.3. Mô hình vật lý (Physical views)

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.

4.2 CÁC MỨC ĐỘ TRỪU TƢỢNG TRONG MÔ TẢ HỆ THỐNG SỐ

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

Hình 4.1 - Biểu đồ Y

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:

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

(Mô hình cấu trúc)

(Mô hình hoạt động)

(Mô hình vật lý)

Circuit

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

Logic

AND, OR, FLIP- FLOPS,..

logic „0‟, „1‟

Độ trễ lan truyền

RTL

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

System

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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.

4.2.1. Mô tả mức mạch điện (Circuit Level or Transistor Level)

Đâ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.

4.2.2. Mô tả mức logic (Logic Lever or Gate Level)

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.

4.2.3 Mô tả mức RTL (Register Transfer Level – Mức truyền đạt thanh ghi)

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.

4.2.4. Mô tả mức hệ thống (System Level or Processor Level)

Đâ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

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ố

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:

+ Ví dụ Mô hình cấu trúc mức hệ thống

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ớ,…

Hình 4.2 – Các thành phần của hệ thống số

+ 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.

+ Ví dụ Mô hình hoạt động mức RTL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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.

Hình 4.3 – Mô hình hoạt động mức RTL của hệ thống số

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:

+ 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

Datapath để thực hiện các bƣớc xử lý số liệu nhƣ mong muốn.

- ISA (Instruction set Architecture – Kiến trúc tập lệnh): Tập lệnh để lập trình hoạt

độ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ý.

+ 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

thiết bị vào/ra bên ngoài hệ thống, hay còn gọi là khối ngoại vi.

+ Ví dụ mô hình cấu trúc mức RTL

Đâ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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

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

Đâ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.

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”.

135

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.3.2 Mô tả theo mức RTL

Hình 4.5 – Mô hình hoạt động mức RTL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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.

+ 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ự.

Combinatorial Process

Clocked Process

Hình 4.6 – Process tổ hợp và tuần tự

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

Hình 4.7 - Mô hình Datapath

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

+ Mô hình điều khiển

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.

4.3.3. Viết mô tả Testbench

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

Generics – Tạo tham số

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

Hình 4.8 - Sơ đồ tổng quát chƣơng trình thử Testbench đơn giản

Testbench Entity

Generics – Tạo tham số

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?

Hình 4.9 - Sơ đồ tổng chƣơng trình thử Testbench đầy đủ

139

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

Để 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.

+ Một số mô hình thời gian dùng lệnh gán 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<=, after Biểu_thức_thời_gian,...

after Biểu_thức_thời_gian;

-- sau bao giờ cũng lớn hơn các biểu thức thời gian trước đó, đó là khoảng thời gian thiết lập so với gốc thời gian khởi tạo ban đầu.

+ Một số mô hình thời gian dùng lệnh tuần tự

+ Wait on

Ví dụ: Wait on clk, Reset

+ Wait until

Ví dụ: Wait until clk=‟1‟

+ Wait for

Ví dụ: Wait for 10 ns

+ Wait on until

Ví dụ: Wait on clk, Reset

Ví dụ: Wait on Reset until clk=‟1‟

+ Wait until for

+ 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:

140

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

+ Trường hợp 2: Viết mô tả tạo ra sự thay đổi cho tín hiệu kiểu Vector

-- 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";

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

+ 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:

142

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

+ 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:

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;

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:

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;

b. Viết mô tả tạo thông báo

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:

+ Lệnh “Assert”: Đây là lệnh tuần tự chỉ dùng cho mô phỏng, đƣợc dùng để viết thông

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)

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

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;

Ví dụ Testbech tạo các thông báo:

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;

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 :

-- 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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

WAIT FOR SimLoopDelay;

END LOOP;

WAIT;

END PROCESS;

Kết quả mô phỏng trên ISE 10.1:

END behavior;

c. Viết mô tả sử dụng TextIO

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);

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Ví dụ sử dụng TextIO để viết Testbench cho bộ đếm như sau:

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Vectorfile.txt

#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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

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

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

Đ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.

Một số cấu trúc mã VHDL không tổng hợp được cần chú ý

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

+ 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 ;

4.4. CÁC MÔ HÌNH TÍN HIỆU SỐ

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

-- 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);

4.5. MÔ TẢ THEO MÔ HÌNH CẤU TRÖC

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ụ.

Ví dụ: Thiết kế và mô tả VHDL cho bộ ALU có chức năng nhƣ bảng sau:

155

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)

Arithmetic

Khối (Unit) Logic

Sel 0000 0001 0010 0011 0100 0101 0110 0111

y <= a y <= a+1 y <= a-1 y <= b y <= b+1 y <= b-1 y <= a+b y <= a+b+cin

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

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:

ALU

a[n:0]

LogicUnit

b[n:0]

Mux

y[n:0]

ArithUnit

Cin

Sel[3:0]

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

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

- Mô tả theo mô hình cấu trúc thứ nhất

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",

Chương 4– Phương pháp thiết kế logic dùng VHDL

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ả theo mô hình cấu trúc thứ hai

-- 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",

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

Để 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ự).

Outputs

Inputs

Mạch tổ hợp (Combinational )

Sử dụng Process tổ hợp

Sử dụng các cấu trúc lệnh song song

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

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Vế_trái <= Vế_Phải

<= 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.

b. Mô tả mạch tổ hợp dùng Process tổ hợp

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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ớ.

Ví dụ:

+ 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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

-- 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 ;

4.6.2. Mô tả các mạch tổ hợp cơ bản

4.6.2.1. Mô tả hàm boolean

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

4.6.2.2. Mô tả sơ đồ cấu trúc cổng logic của mạch

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)

4.6.2.3. Mô tả Bộ đệm 3 trạng thái

1. Mô tả Bộ đệm 3 trạng thái 8 bit:

163

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.2.4. Mô tả mạch ghép kênh MUX

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);

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

-- 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",

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.2.6. Mô tả bộ Mã hóa/Giải mã (Encoder/Decoder)

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ỉ …

1. Bộ giải mã LED 7 đoạn

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:

Anot

a

b

f

g

c

e

h

a b c d e f g h

d

Sơ đồ bộ giải mã cho LED 7 đoạn trên nhƣ sau:

169

Chương 4– Phương pháp thiết kế logic dùng VHDL

Vcc

a

Anot

b

f

g

I[4:0]

Seg[7:0]

BINto7SEG

c

e

(abcdefgh)

h

d

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;

-- Mô tả sử dụng lệnh with-select

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

"0011000" when others; -- X"F"

end RTL1;

2. Bộ mã hóa n-to-2n

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]

n-to-2n Encoder (n=3)

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

3. Bộ mã hóa ưu tiên

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]

Priority Encoder

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.2.7. Các mạch tính toán số học

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.

a. Mô tả theo mô hình hoạt động

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

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

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

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

1. Ví dụ mô tả bộ cộng 2 số 16 bit không dấu, có nhớ nhƣ sau: library IEEE;

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);

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

2. Ví dụ mô tả bộ cộng 2 số 16 bit có dấu, có bit nhớ và tràn nhƣ sau:

- 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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

3. Ví dụ mô tả bộ nhân số có dấu và không dấu:

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);

Chương 4– Phương pháp thiết kế logic dùng VHDL

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. Mô tả theo mô hình cấu trúc

1. Bộ cộng 1 bit bán phần HA

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;

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

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

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

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4. Bộ dịch Barrel (Barrel Shifter)

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

Kết quả mô phỏng hoạt động của bộ Barrel nhƣ sau:

4.6.3. Phƣơng pháp thiết kế dùng chung phép toán

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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:

<= when <điều_kiện_1> else

when <điều_kiện_2> else

...

Các , , .. là loại trừ lẫn nhau vì chỉ một biểu thức cần đƣợc thực hiện và gán vào đầu ra tại thời điểm điều kiện tƣơng ứng thỏa mãn. Tƣơng tự nhƣ vậy cấu trúc lệnh gán tín hiệu song song có lựa chọn with-select nhƣ sau:

;

With select

<= when ,

when ,

...

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.

when others;

4.6.3.1. Ví dụ dùng chung phép toán 1

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.3.2. Ví dụ dùng chung phép toán 2

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.3.3. Ví dụ dùng chung phép toán 3

Các cách mô tả tƣơng đƣơng

Sơ đồ khối mạch tổng hợp đƣợ

185

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.6.3.3. Ví dụ dùng chung phép toán 4

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

+ 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;

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

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Hình 4.15 – Mạch cộng-trừ (AddSub) 2 số có dấu

189

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

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

Hình 4.16 – Sơ đồ khối chung của mạch tuần tự

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.

4.7.1. Cấu trúc lệnh VHDL dùng cho mô tả mạch tuần tự

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

+ 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;

4.7.2. Mô tả các phần tử nhớ

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.

4.7.2.1. Triger D (DFF - D Flip-Plops)

+ 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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chú ý:

- 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.

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')

- 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

Chương 4– Phương pháp thiết kế logic dùng VHDL

4.7.2.3. Triger T (TFF - T Flip-Plops)

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;

4.7.2.3. Thanh ghi (Register)

- 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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

- Mô tả thanh ghi dịch N bit nối tiếp, nạp song song.

195

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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ộ:

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;

4.7.3. Bộ đếm (Counter)

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:

Phép toán

Đếm lên

Đếm xuống

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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)

4.7.3.1. Bộ đếm nhị phân

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.7.3.2. Bộ đếm thập phân (bộ đếm BCD)

Bộ đếm thập phân có thể coi là bộ đếm mã BCD (đếm lên: 090, đếm xuống : 909). 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ừ 09 (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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

4.7.3.3. Mạch chia tần số

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

+ 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:

- 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

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

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

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

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.

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

Hình 4.19 – Kiến trúc máy trạng thái hỗn hợp Moore và Mealy.

Ứ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ả 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

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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‟.

+ Biểu diễn hàm xác định đầu ra - Inputs

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.

+ Biểu diễn tín hiệu Reset và trạng thái khởi tạo

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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:

4.7.3. Lƣu đồ giải thuật máy trạng thái – ASM

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

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

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:

Ví dụ 1: Máy trạng kiểu Moore

211

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

Bảng sau cho biết khả năng mô tả đồ hình trạng thái dùng VHDL:

Yêu cầu mô tả

STT 1 2 3 4

- 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

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ê

212

Chương 4– Phương pháp thiết kế logic dùng VHDL

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 ;

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ƣ:

213

Chương 4– Phương pháp thiết kế logic dùng VHDL

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:

Trạng thái

Thời gian

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

Ví dụ: bộ đếm thập phân thuận nghịch đồng bộ “UpdownCounter” có mô hình vẽ sau:

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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

Chương 4– Phương pháp thiết kế logic dùng VHDL

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 =>

Chương 4– Phương pháp thiết kế logic dùng VHDL

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;

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

220

Chương 4– Phương pháp thiết kế logic dùng VHDL

BÀI TẬP

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

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ế.

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

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

222

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

Để 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:

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

Để 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:

Hình 5.3 - Sơ đồ nguyên lý phần cứng.

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.

b, Xây dựng sơ đồ triển khai ứng dụng

223

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

Chọn Kênh

ROM

MẠCH CÔNG SUẤT

KHỐI ĐIỀU KHIỂN

KHỐI CHIA TẦN

CLK

CPLD/ FPGA

Hình 5.4 - Sơ đồ triển khai ứng dụng

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.

c. Thực hiện thiết kế:

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

HN

HT

SEG(abcdefg)

HC

HDV

AN

CLK

Hình 5.5 - Mô hình tổng quát của bộ điều khiển

d, Mô tả bằng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

"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;

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ế

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.

Hình 5.6 - Hình ảnh LED ma trân 8x8

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

+ Đầ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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

+ 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

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

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

Hình 5.7 Mạch điều khiển hiển thị ma trận LED

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

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ế:

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

d, Mô tả bằng VHDL

--------------------------------------------------------------------------

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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

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ế

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

Hình 5.8 - Sơ đồ khối ứng dụng 2

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

b/ Xây dựng sơ đồ triển khai ứng dụng

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.

c/ Thực hiện thiết kế

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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)

Hình 5.9 - Sơ đồ triển khai ứng dụng

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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)

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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",

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

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ế

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

Hình 5.10 - Sơ đồ khối ứng dụng 1

b/ Xây dựng sơ đồ triển khai ứng dụng

237

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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)

Hình 5.11 - Sơ đồ triển khai ứng dụng 1

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.

c/ Thực hiện thiết kế

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

Seg (abcdefgh) AN(0) AN(1)

238

use IEEE.STD_LOGIC_1164.ALL;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

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ế

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Hình 5.12 - Sơ đồ triển khai ứng dụng 3

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ố.

b/ Xây dựng sơ đồ triển khai ứng dụng

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Hình 5.13 - Sơ đồ triển khai ứng dụng 3

T

ch

t

f

x0

Tch

t

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.

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

c/ Thực hiện thiết kế

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.

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

--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" =>

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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';

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

---------------

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

-- 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",

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

"1111111" when others;

end Behavioral;

5.4. THIẾT KẾ MẠCH GIAO TIẾP ĐIỀU KHIỂN VGA

a. Giới thiệu chuẩn VGA

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

Hình 5.15 – Sơ đồ khối màn hình CRT

248

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

HÌnh 5.2.2- Đồ thị thời gian xung quét mành

Hình 5.16 – Đồ thị thời gian xung quét dòng

250

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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.

b, Thiết kế bộ điều khiển .

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

Hình 5.17 - Sơ Đồ khối bộ điều khiển VGA

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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';

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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 ;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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 ,

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

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

255

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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:

- Chân VCC, VSS và VEE: Các chân VCC, VSS và VEE: Cấp dƣơng nguồn - 5v và đất

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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:

Hình 5.19 – Giản đồ thời gian

+ 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

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ế

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

+ 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:

Hình 5.21 - Đồ hình trạng thái điều khiển cho LCD

* 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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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";

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

-- 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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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";

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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";

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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.

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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.

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

-----------------------------------------------------------------------

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

end Behavioral;

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ế

Ở 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.

Hình 5.22 - Ma Trận bàn phím

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

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

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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 .

b, Thực hiện thiết kế:

+ Sơ đồ tổng quát:

Colum

CLK

Row

Button

* Mô tả bằng VHDL:

---------------------------------------------------------------------------

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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";

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

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.

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

Hình dƣới đây mô tả cấu trúc dữ liệu truyền qua PS2.

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

275

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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.

-------------------------------------------------

Hình 5.26 - Mã bàn phím

Hình 5.27 -Sơ đồ khối mạch giao tiếp Ps2.

278

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

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ẻ.

a. Thiết kế khối nhận dữ liệu.

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.

Hình 5.28 - Sơ đồ khối bộ nhận dữ liệu UART

- Khối baud rate generator: Tạo điểm đánh dấu lấy mẫu ( sample ticks).

279

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

- 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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

---------------------------------------

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

* Thiết kế mạch giao tiếp có thêm bộ đệm dữ liệu.

283

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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.

Hình 5.30 - Mạch nhận dữ liệu UART có bộ đệm dữ liệu.

-----------------------------------------

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

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

);

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

-------------------------

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

Hình 5.31

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) ;

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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');

Chương 5 – Thiết kế các hệ thống số ứng dụng dùng VHDL

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

--------------------------------------------

Phụ lục I – Quy ước về đặt tên trong VHLD

PHỤ LỤC I – QUY ƢỚC VỀ ĐẶT TÊN TRONG VHDL

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.

I.1. Quy ƣớc chung về đặt tên trong VHDL

 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:

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…

 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

Phụ lục I – Quy ước về đặt tên trong VHLD

 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.

I.2. Quy ƣớc đặt tên các đối tƣợng trong VHDL

+ Tên file:

 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.

+ Tên hằng (Constant Names)

 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).

+ Tên tín hiệu (Signal Names)

 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

Loại tín hiệu Hậu tố

Ví dụ

Ý nghĩa

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

Phụ lục I – Quy ước về đặt tên trong VHLD

+ Tên biến (Variable Names)

 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).

+ Tên Kiểu dữ liệu (Type Names)

 Sử dụng hậu tố “Type” hoặc tên xác định kiểu, ví dụ: stateType, stdLogicArray.

I.3. Quy ƣớc đặt tên các đơn vị thiết kế

+ Tên Entity

 Đặt tên có ngữ nghĩa miêu tả đƣợc mục đích của mạch, ví dụ DesEngine

+ Tên Architecture

 Đặ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ên Configuration

 Đặt tên theo Entity tƣơng ứng kèm với hậu tố “Cfg”, ví dụ: DesEngineCfg.

+ Tên Package

 Đặt theo tên của thiết kế cùng với hậu tố “Pkg” (ví dụ: DesEnginePkg).

+ Tên Testbench (entity, architecture, package)

 Đặt theo tên của Entity kèm hậu tố “Tb”, ví dụ: DesEngineTb, DesEngineTbPkg).

+ Tên Library (package)

 Đặt tên của thƣ viện kèm hậu tố “Lib”, ví dụ: ArithLib.

+ Tên Nhãn (Label)

 Đặ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:

Cấu trúc

Ví dụ

Hậu tố

register

Reg

stateReg

Proces s

counter

Cnt

addressCnt

Comb

combinationa l

nextStateCom b

testbench

Tb

stimulusTb

Blk

inputPortBlk

Block

Inst

datapathInst

Instance

Gen

reduceAndGen

Generate

291

Phụ lục I – Quy ước về đặt tên trong VHLD

292

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

-- 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 ENTITY_NAME is

port ( PORT_NAME: ; -- example:

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

architecture ARCH_NAME of ENTITY_NAME is begin

end ARCH_NAME;

OPERATORS

 logical : and, or, nand, nor, xor, xnor, not  relational : =, /=, <, <=, >, >=  arithmetic : +, -, *, /, rem, mod, abs, **  concatenation: &

COMPONENT

Declaration: component COMPONENT_NAME is port () ; end component COMPONENT_NAME;

LABEL1: COMPONENT_NAME

port map ( COMP_PORT_NAME => SIG_NAME, COMP_PORT_NAME => SIG_NAME Instantiation: );

CONSTANTS

293

constant CONST_NAME: := ;

Phụ lục II – Cấu trúc lệnh cơ bản của VHDL

-- 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-";

SIGNALS

signal SIG_NAME: ; -- example: signal SIG_NAME: BOOLEAN; signal SIG_NAME: INTEGER range 0 to 31; signal SIG_NAME: BIT; signal SIG_NAME: BIT_VECTOR (3 downto 0); signal SIG_NAME: STD_LOGIC; signal SIG_NAME: STD_LOGIC_VECTOR (0 to 3);

TYPES

-- 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;

PROCESS

LABEL1: -- optional label process () -- declarations begin

--wait on CLK, RESET; --wait until CLK'event and CLK='1'; end process;

VARIABLES

variable VAR_NAME: ; -- example: variable VAR_NAME: BOOLEAN; variable VAR_NAME: INTEGER range 0 to 31; variable VAR_NAME: BIT; variable VAR_NAME: BIT_VECTOR (3 downto 0); variable VAR_NAME: STD_LOGIC; variable VAR_NAME: STD_LOGIC_VECTOR (0 to 3);

IF-THEN-ELSE

294

if then elsif then else end if; --example

Phụ lục II – Cấu trúc lệnh cơ bản của VHDL

O <= A;

O <= B;

O <= C;

O <= D; if SEL = ―00‖ then elsif SEL = ―01‖ then elsif SEL = ―10‖ then else end if;

CASE

case is when => when => when OTHERS => end case; -- example: case SEL is when 0 | 1 | 2 => Z <= B; when 3 to 10 => Z <= C; when others => null; end case;

FOR LOOP

LABEL1: for I in to loop end loop; -- example: for I in 1 to 10 loop I_SQR(I) := I * I; end loop;

FUNCTION

function FUNC_NAME ({ PAR_NAME: }) return is --: signal | constant begin -- function body end function FUNC_NAME; -- example: incrementer function INCREMENT (COUNT: INTEGER) return INTEGER is variable TEMP: INTEGER; begin if COUNT >= 255 then TEMP := 0; else TEMP : COUNT + 1; end if; return TEMP; end function INCREMENT;

PROCEDURE

295

Phụ lục II – Cấu trúc lệnh cơ bản của VHDL

procedure PROC_NAME ({ PAR_NAME: }) is --: signal | variable | constant --: in | inout | out begin -- procedure body end procedure PROC_NAME; -- example: adder procedure ADD (signal A0, A1, B0, B1: in STD_LOGIC; signal C0, C1: out STD_LOGIC) is variable X, Y: STD_LOGIC; begin x := B0 and A0; Y := B1 xor A1; C0 <= (B0 and not A0) or ( not B0 and A0); C1 <= (Y and not X) or (not Y and X); end procedure ADD; -- Example Processes :

--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;

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

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.

III.1.1. CPLD của Xilinx

Xilinx hiện đang cung cấp hai họ sản phẩm CPLD: XC9500 và CoolRunner.

a. XC9500

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

XCxyyyk

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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:

* Dòng XC9500 5v

Bảng thống kê danh sách và tham số của các vi mạch dòng XC9500 5V nhƣ sau:

XC9536 XC9572 XC95108 XC95144 XC95216 XC95288

Macrocells Số cổng logic tpd (ns) Số chân I/O

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 XC9500XL 3.3v

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

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.

b. CoolRunner

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

ứ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...

* XPLA3

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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.

* CoolRunner II:

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

III.1.2. FPGA của Xilinx

Hiện nay Xilinx cung cấp 2 dòng FPGA là Spartan và Virtex

a. FPGA 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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...

b. FPGA Spartan

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...

III.2. CẤU TRÖC CPLD CỦA XILINX

III.2.1 XC9500XL

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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.

Bảng III.1 - Các linh kiện CPLD thuộc dòng XC9500XL

XC9536XL

XC9572XL

XC95144XL

XC95288XL

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

178

- 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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.

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

 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

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.

- Sơ đồ khối IOB

306

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

III.2.2. CoolRunner XPLA3

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.

Bảng III.2 - Các thiết bị thuộc dòng CoolRunner XPLA

XCR3032XL

XCR3064XL

XCR3128XL

XCR3256XL

XCR3384XL

XCR3512XL

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- Kiến trúc dòng CoolRunner XPLA3

- Sơ đồ cấu tạo khối chức năng FB của 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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.

- Kiến trúc macrocell của CoolRunner XPLA3.

III.2.3 CoolRunner II

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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- Bộ chia tín hiệu clock của CoonRunner II

 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.

- CoolRunner II với tính năng sử dụng clock 2 sƣờn

 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.

- CoolRunnerII với tính năng CoolClock

310

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

 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.

Bảng III.3 - Các linh kiện thuộc dòng CoolRunner2

XC2C32A XC2C64A XC2C128 XC2C256 XC2C384 XC2C512

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

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.

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

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

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

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

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

Dung lƣợng RAM phân phối 12K 30K 56K 120K 208K 320K 432K 520K

 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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ấu trúc sắp xếp của Spartan 3

 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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ề.

III.3.2. Virtex

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

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

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

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

 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

Ở 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

Phụ lục III – Giới thiệu CPLD/FPGA của Xilinx

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

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:

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.

Kết nối chung

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.

Kết nối I/O

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ũ.

Các kết nối dành riêng

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.

Kết nối toàn chip

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ụ lục III – Giới thiệu CPLD/FPGA của Xilinx

- 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

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

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.

IV.2. HƢỚNG DẪN CÀI ĐẶT

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.

IV.3. THỰC HIỆN LƢU ĐỒ THIẾT KẾ TRÊN ISE

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)

+ Nhập thiết kế (Design Entry)

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.

+ Kiểm tra thiết kế (Design Verification)

+ Tổng hợp (Synthesis)

323

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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)

Hình IV.1 - Lƣu đồ thiết kế CPLD

+ Implementation

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

+ Nạp thiết kế vào CPLD và FPGA

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.

+ Kiểm tra (design verification)

324

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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.

1. Nhập thiết kế

- 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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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.

Xem 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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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)

Gán pin và các giới hạn

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

Implement CPLD

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 (translate)

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

Để 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).

332

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

Quá trình translate đồng thời tự động tạo ra một file báo cáo (translattion report).

Fit

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

Summary

demo_bd

Design Name

Successful

Fitting Status

G.35

SW Version

Device Used

Date

RESOURCES SUMMARY

Macrocells Used Pterms Used

Registers Used

Pins Used

Function Block Inputs Used

55/64 (86%)

92/224 (42%)

38/64 (60%)

25/64 (40%)

86/160 (54%)

PIN RESOURCES

Signal Type

Required

Mapped

Pin Type

Used

Remaining

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

MACROCELL RESOURCES

Total Macrocells Available

64

Registered Macrocells

38

Non-registered Macrocells driving I/O

16

GLOBAL RESOURCES

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

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

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:

Tạo ra báo cáo thời gian (Generate timming)

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

Summary

Performance Summary

15.000 ns.

Min. Clock Period

Max. Clock Frequency (fSYSTEM)

66.667 MHz.

Limited by Clock Pulse Width for clk_scaler<8>_MC.Q

Clock to Setup (tCYC)

7.500 ns.

Pad to Pad Delay (tPD)

10.700 ns.

Setup to Clock at the Pad (tSU)

-0.400 ns.

Clock Pad to Output Pad Delay (tCO)

46.700 ns.

Timing Constraints

Pa

Pa

Constraint Name

Requir ement (ns)

De lay (ns)

ths

ths Failing

TS_clk_osc

20.0

0.0

0

0

Tạo ra model để mô phỏng sau khi Fit

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

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.

-------------------------------------------------

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

Implement FPGA

Map

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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

Place and Routing (PAR)

339

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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.

Báo cáo PAR:

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

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

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)|

Chương IV – Hướng dẫn phần mềm ISE của Xilinx

+---------------+----------+------+------+------------+-------------+

| 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

Các quá trình khác (tùy chọn)

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

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

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

Tài liệu tham khảo

TÀI LIỆU THAM KHẢO

[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,…

343