Thông báo

Tất cả đồ án đều đã qua kiểm duyệt kỹ của chính Thầy/ Cô chuyên ngành kỹ thuật để xứng đáng là một trong những website đồ án thuộc khối ngành kỹ thuật uy tín & chất lượng.

Đảm bảo hoàn tiền 100% và huỷ đồ án khỏi hệ thống với những đồ án kém chất lượng.

ĐỒ ÁN TỐT NGHIỆP ĐIỆN tử TÌM HIỂU VÀ THIẾT KẾ CÁC BÀI THÍ NGHIỆM VỀ FPGA TRÊN KIT UP2 CỦA ALTERA

mã tài liệu 301000600005
nguồn huongdandoan.com
đánh giá 5.0
mô tả 100 MB Bao gồm tất cả file asm, hex, lst....,.lưu đồ giải thuật.. CDR thuyết minh, power point báo cáo, bản vẽ nguyên lý, bản vẽ thiết kế, FILE lập trình, và nhiều tài liệu liên quan kèm theo đồ án này
giá 989,000 VNĐ
download đồ án

NỘI DUNG ĐỒ ÁN

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH

KHOA CƠ KHÍ CHẾ TẠO MÁY

BỘ MÔN CƠ ĐIỆN TỬ


ĐỒ ÁN TỐT NGHIỆP

TÌM HIỂU VÀ THIẾT KẾ CÁC BÀI THÍ NGHIỆM VỀ FPGA TRÊN KIT UP2 CỦA ALTERA

 

ĐỒ ÁN TỐT NGHIỆP  TÌM HIỂU VÀ THIẾT KẾ CÁC BÀI THÍ NGHIỆM VỀ FPGA TRÊN KIT UP2 CỦA ALTERA

TP. HỒ CHÍ MINH, tháng 03 năm 2012

NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP

Bao gồm các vấn đề sau:

  • Tìm hiểu và phân tích cấu trúc của FPGA, những ứng dụng của FPGA trong thực tế.
  • Thiết kế các bài thí nghiệm FPGA dành cho người mới học.
  • Thiết kế hệ thống xử lý ảnh số trên FPGA bằng ngôn ngữ VHDL.

TÓM TẮT ĐỒ ÁN

Nội dung luận văn tốt nghiệp này bao gồm:

  • Tìm hiểu về FPGA, ngôn ngữ lập trình VHDL
  • Tìm hiểu cách thiết kế FPGA
  • Tìm hiểu board thí nghiệm UP2 của Altera và kit phát triển các ứng dụng xử lý ảnh Video Starter Kit của Xilinx.
  • Thiết kế các bài thí nghiệm FPGA cơ bản trên kit UP2.
  • Thiết kế bộ tiền xử lý ảnh sử dụng FPGA trên Video Starter Kit (VSK).

ABSTRACT

This thesis conclude of these following sections:

  • Exploring FPGA’s construction and the Very highspeed Hardware Description Language.
  • Determine the basic steps of programming an FPGA.
  • Exploring the Altera’s UP2 education board and the Xilinx’s Video Starter Kit.
  • Create the basic FPGA example on UP2 education board for one who new to FPGA.
  • Design an Image Processing system base on FPGA XCV2P7 on the Video Starter Kit.

MỤC LỤC

Trang bìa                                                                                                                                    i

Nhiệm vụ đồ án tốt nghiệp                                                                                                     ii

Nhận xét của giáo viên hướng dẫn                                                                                      iii

Nhận xét của giáo viên phản biện                                                                                        iv

Lời cảm ơn                                                                                                                                v

Tóm tắt đồ án                                                                                                                          vi

Abstract                                                                                                                                  vii

Mục lục                                                                                                                                  viii

Danh mục hình vẽ

                                                                                                                                                   xi

CHƯƠNG 1      TỔNG QUAN.. 1

1.1      Giới thiệu đề tài: 1

1.2      Tình hình nghiên cứu: 1

1.2.1       Kit DE2 của Altera: 2

1.2.2       Kit Spartan 3 của Xilinx: 2

1.2.3       Kit UP2 của Altera: 2

1.2.4       Video Starter Kit của Xilinx: 3

1.3      Khái quát luận văn: 4

CHƯƠNG 2      FPGA VÀ NGÔN NGỮ VHDL.. 5

2.1      Giới thiệu về FPGA: 6

2.1.1       Tổng quan: 6

2.1.2       Kiến trúc chung của một FPGA: 6

2.1.2.1   Khối logic FPGA: 7

2.1.2.2   Hệ thống mạch liên kết: 8

2.1.2.3   Các phần tử tích hợp sẵn: 9

2.2      Ngôn ngữ mô tả phần cứng (HDL): 8

2.2.1       Cấu trúc một mô hình hệ thống sử dụng ngôn ngữ VHDL.. 9

2.2.1.1   Entity (Thực thể). 9

2.2.1.2   Architecture (Kiến trúc). 10

2.2.1.3   Configuration (Cấu hình). 12

2.2.1.4   Package (Gói). 13

2.2.2       Mô hình kiểm tra hoạt động (Testbench). 14

2.2.3       Các phát biểu thông dụng trong chương trình VHDL.. 15

2.2.3.1   Phát biểu IF…THEN . 15

2.2.3.2   Phát biểu WHEN…CASE. 16

CHƯƠNG 3      GIỚI THIỆU KIT UP2 CỦA ALTERA VÀ

PHẦN MỀM QUARTUS. 18

3.1      Board thí nghiệm UP2: 19

3.1.1       Giới thiệu: 19

3.1.2       Cấu trúc thiết bị: 20

3.2      Giới thiệu phần mềm Quartus: 27

3.2.1       Cách tạo 1 project mới: 27

3.2.2       Gán chân thiết bị: 29

3.2.3       Mô phỏng: 30

CHƯƠNG 4      CÁC BÀI THÍ NGHIỆM VHDL.. 33

4.1      Bài tập về các cổng logic [3]: 34

4.2      Bài tập điều khiển LED đơn: 35

4.3      Bài tập điều khiển LED 7 đoạn: 37

4.4      Bài tập giao tiếp Mouse (PS2): 39

4.5      Bài tập giao tiếp VGA: 45

CHƯƠNG 5      KHÁI NIỆM XỬ LÝ ẢNH VÀ GIỚI THIỆU VIDEO STARTER KIT CỦA XILINX      49

5.1      Cấu trúc của một hệ thống xử lý ảnh số [2]: 51

5.2      Các kỹ thuật lọc ảnh – lọc tuyến tính và lọc phi tuyến: 52

5.2.1       Vấn đề nhiễu trong xử lý ảnh: 52

5.2.2       Lọc tuyến tính: 53

5.2.2.1   Lọc thông thấp: 54

5.2.2.2   Lọc thông cao: 54

5.2.2.3   Nhân chập: 54

5.2.3       Lọc phi tuyến: 55

5.2.3.1   Bộ lọc thứ bậc (Rank Order Filter): 55

5.2.3.2   Bộ lọc Median: 56

5.3      Giới thiệu phần cứng Video Starter Kit của Xilinx. 58

5.3.1       Tổng quan về VIODC (Video Input/Output Daughter card): 58

5.3.1.1   Giới thiệu: 58

5.3.1.2   Sơ đồ khối của VIODC: 58

5.3.2       Các module demo: 59

5.3.2.1   Module VIODC AD9887A IN: 59

5.3.2.2   Module VIODC DVI VGA OUT: 60

5.3.2.3   Module VIODC VGA CTRL: 62

CHƯƠNG 6      THIẾT KẾ BỘ LỌC MEDIAN TRÊN

 VIDEO I/O DAUGHTER CARD.. 64

6.1      Khối đệm dữ liệu (buffer) : 65

6.1.1       Giới thiệu về toán tử cửa sổ: 65

6.1.2       Thiết kế cửa sổ trượt 3x3 trong FPGA: 66

6.1.3       Thiết kế: 68

6.1.4       Hoạt động: 68

6.2      Khối xử lý ảnh: 69

6.2.1       Kiến trúc của bộ lọc. 69

6.2.2       Các cách tối ưu giải thuật bộ so sánh: 70

6.3      Kết quả thu được: 73

CHƯƠNG 7      KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI. 77

7.1      Kết luận: 77

7.1.1       Phần lập trình FPGA cơ bản trên kit UP2: 77

7.1.2       Phần thiết kế bộ xử lý ảnh trên Video Starter Kit: 77

    7.2      Hướng phát triển đề tài: 78

 


DANH MỤC HÌNH ẢNH MINH HỌA

Hình 1.1 Kit DE2 của Altera. 2

Hình 1.2 Kit Spartan 3 của Xilinx. 3

Hình 1.3 Kit UP2 của Altera. 3

Hình 1.4 Video Starter Kit của Xilinx. 4

Hình 2.1 Cấu trúc của FPGA.. 7

Hình 2.2 Khối logic. 7

Hình 2.3 Sơ đồ thiết kế FPGA.. 14

Hình 2.4 Mô hình kiểm tra hoạt động. 15

Hình 3.1 Sơ đồ khối của board thí nghiệm UP. 20

Hình 3.2 Sơ đồ chân JTAG.. 21

Hình 3.3 Sơ đồ Jumper. 21

Hình 3.4 Chức năng Jumper. 22

Hình 3.5 Số thứ tự các chân trên các header. 23

Hình 3.6 Vị trí LED.. 24

Hình 3.7 LED 7 đoạn. 24

Hình 3.8 Sơ đồ kết nối chân của Led 7 đoạn. 24

Hình 3.9 Port mở rộng. 25

Hình 3.10 Bảng tín hiệu và sự kết nối các chân của EPM7128S vào mỗi chân. 26

Hình 4.1 Mô tả sự dội của nút nhấn. 36

Hình 4.2 Cấu trúc gói dữ liệu từ mouse truyền về. 40

Hình 4.3 Bộ buffer 3 trạng thái 41

Hình 4.4 Sơ đồ sự truyền byte lệnh cho mouse. 42

Hình 4.5 Sơ đồ sự nhận dữ liệu từ mouse. 44

Hình 4.6 Cách thiết kế truyền-nhận 2 chiều. 45

Hình 5.1 Cấu trúc hệ thống xử lý ảnh. 51

Hình 5.2 So sánh giữa bộ lọc median và bộ lọc trung bình. 57

Hình 5.3 VIODC và ML402. 58

Hình 5.4  Sơ đồ khối của VIODC.. 59

Hình 5.5 Thiết kế DVI/VGA tới DVI/VGA.. 59

Hình 5.6 Module VIODC_AD9887A_IN.. 60

Hình 5.7 Khối giao tiếp DVI/VGA.. 61

Hình 5.8 Sơ đồ khối module ngõ ra VIODC_DVI_VGA_OUT.. 62

Hình 5.9 Module VIODC_DEMO_CTRL.. 63

Hình 6.1 Pixel và lân cận. 66

Hình 6.2 Miêu tả quá trình đệm dữ liệu. 66

Hình 6.3 Cửa sổ 3x3 chốt được. 67

Hình 6.4 Giải thuật Median cơ bản. 70

Hình 6.5 Giải thuật Median của Morcego. 70

Hình 6.6 Giải thuật Median của Smith. 71

Hình 6.7 Cấu trúc bên trong mỗi nút 71

Hình 6.8 Cấu trúc bên trong của NETWORK.. 72

Hình 6.9 Ảnh với nhiễu 5 %... 73

Hình 6.10 Ảnh thu được sau khi lọc (5%). 74

Hình 6.11 Ảnh với nhiễu 20 %... 74

Hình 6.12 Ảnh thu được sau khi lọc (20%). 75

Hình 6.13 Ảnh với nhiễu 40%... 75

Hình 6.14 Ảnh thu được sau khi lọc (40%). 76

 

CHƯƠNG 1TỔNG QUAN

1.1Giới thiệu đề tài:

Trong những năm gần đây công nghệ FPGA phát triển rất nhanh trên thế giới, đây là công nghệ tiên tiến cung cấp cho chúng ta một phương thức thiết kế các hệ thống số một cách nhanh chóng, và đặc biệt thích hợp với việc thử  nghiệm trước khi đưa vào sản xuất hàng loạt.

  Công nghệ FPGA dựa trên việc lập trình trên phần mềm và tổng hợp thành các file thích hợp để nạp vào chip FPGA. Có rất nhiều ngôn ngữ mô tả phần cứng ra đời như AHDL, Verilog,…và VHDL là ngôn ngữ lập trình phần cứng mới nhất với cấu trúc dễ hiểu, nên được sử dụng phổ biến trên thế giới và nhiều trường đại học đã đưa vào giảng dạy cho sinh viên các ngành điện tử.

Nếu như trước đây, vấn đề xử lý ảnh số chỉ có thể thực hiện trên máy tính, thì ngày nay, với sức mạnh vượt trội của FPGA và các ngôn ngữ mô tả phần cứng, ta có thể thực hiện việc xử lý ảnh ngay trên phần cứng, và có thể triển khai trên hệ thống một cách dễ dàng.

Với mong muốn được tiếp cận với các xu hướng công nghệ mới, nâng cao tầm hiểu biết của sinh viên, em đã bắt tay vào nghiên cứu về FPGA và ngôn ngữ VHDL, và thể hiện qua các bài thí nghiệm trên kit phát triển UP2 của Altera, cùng với 1 bộ xử lý ảnh trên Video Starter Kit của Xilinx.

1.2Tình hình nghiên cứu:

Xilinx là công ty đầu tiên bán ra FPGA và luôn chiếm thị phần lớn nhất. Ngoài ra còn có Alterna, Lattice, Actel, Quick Logic. Nhiều nhà sản xuất hiện đang cung cấp rất nhiều cấu trúc và phương pháp xử lý khác nhau. Vì vậy, việc chọn một cấu trúc và một phương pháp xử lý để có thể đáp ứng được các yêu cầu về chức năng và độ ổn định, đối với một hệ thống trong thực tế là vấn đề mang tính quyết định.

Để thuận lợi cho việc tiếp cận FPGA đối với các sinh viên đại học, hay những kỹ sư mới tốt nghiệp, các hãng nói trên đã sản xuất ra các bộ kit thí nghiệm với độ phức tạp tăng dần, như kit giáo dục UP1, UP2, DE1, DE2 của Altera, kit Spartan 3 của Xilinx với độ phức tạp nâng cao hơn, và các loại kit chuyên dụng cho việc thiết kế các ứng dụng xử lý ảnh như Video Starter Kit của Xilinx.

Do trong điều kiện ở Việt Nam, Xilinx và Altera là 2 hãng có sản phẩm được sử dụng nhiều nhất trong các công ty thiết kế FPGA, và nội dung của luận văn này xoay quanh 2 kit UP2 của Altera và Video Starter Kit của Xilinx.

1.2.1Kit DE2 của Altera:

Board DE2 cung cấp cho người sử dụng nhiều đặc điểm linh hoạt để học tập và có thể phát triển nhiều dự án đa phương tiện khác nhau. Chúng được thiết kế không những phù hợp cho môi trường học tập ở các trường đại học và cao đẳng mà còn phù hợp với cả trong môi trường làm việc công nghiệp. Các khối thiết kế ứng dụng trên KIT được chọn lọc dựa trên những thiết kế phổ biến nhất trong các sản phẩm đa phương tiện như DVD, VCD, MP3 player. KIT DE2cho phép người dùng nhanh chóng thấu hiểu được những thủ thuật để thiết kế các dữ án công nghiệp. Ngoài ra nó còn cung cấp một nền tảng kiến thức cơ bản cho người dùng đam mê trong lĩnh vực thiết kế vi mạch như phát triển những hệ thống kỹ thuật số tinh vi. 

Hình 1.1 Kit DE2 của Altera

1.2.2Kit Spartan 3 của Xilinx:

FPGA Spartan 3 có bộ đa hợp 18 bit, 216 Kbit Block RAM, và có tần số clock nội là 500MHz. Ngoài ra, trên board còn có các cổng VGA, PS2, connector mở rộng 40 chân, chip nhớ SRAM 1 Mb.

Hình 1.2 Kit Spartan 3 của Xilinx

1.2.3Kit UP2 của Altera:

Đây là phần cứng được sử dụng trong luận văn, kit UP2 được phát triển để đáp ứng nhu cầu nghiên cứu về  FPGA của các sinh viên đại học, với nhiều tính năng có thể sử dụng được như kết nối với cổng VGA của máy tính, cổng PS2… Trên board bao gồm 2 FPGA thuộc họ Max7000 và Flex10k của Altera.

Hình 1.3 Kit UP2 của Altera

1.2.4Video Starter Kit của Xilinx:

Đây là kit phát triển cao cấp của Xilinx, chuyên dùng cho việc thiết kế các ứng dụng xử lý tín hiệu số, xử lý ảnh… VSK cung cấp hầu như tất cá các chuẩn kết nối video hiện nay như S-video, VGA, DVI, HDMI…

Hình 1.4 Video Starter Kit của Xilinx

1.3Khái quát luận văn:

Nội dung luận văn bao gồm các vấn đề sau:

  • Giới thiệu về FPGA: chương 2 đưa ra một cái nhìn tổng quan về kiến trúc FPGA và cấu trúc của một mô hình hệ thống sử dụng ngôn ngữ VHDL.
  • Khảo sát các kit thí nghiệm UP2 và VSK:  cấu trúc phần cứng của board UP2 được mô tả trong phần đầu chương 3, và chương 5 giới thiệu về những phần được sử dụng trong luận văn của Video Starter Kit.
  • Tìm hiểu các công cụ hỗ trợ: cách tạo project và sử dụng phần mềm Quartus được mô tả trong phần 2 của chương 3.
  • Xây dựng các bài thí nghiệm trên kit UP2: toàn bộ chương 4 là các mô tả về giải thuật sử dụng trong các bài thí nghiệm, phần phụ lục là các chương trình mẫu.
  • Thiết kế bộ xử lý ảnh động trên Video Starter Kit: chương 6 mô tả cách thiết kế bộ lọc Median trên FPGA, từ việc đệm dữ liệu đến việc đồng bộ tín hiệu ngõ ra, và kết quả đạt được.
  • Kết luận: chương 7 đánh giá về các kết quả đạt được, cũng như trình bày về hướng phát triển đề tài.

 


CHƯƠNG 2                        FPGA VÀ NGÔN NGỮ VHDL

 

Nội dung chương

 

2.1      Giới thiệu về FPGA: 6

2.1.1       Tổng quan: 6

2.1.2       Kiến trúc chung của một FPGA: 6

2.2      Ngôn ngữ mô tả phần cứng (HDL): 8

2.2.1       Cấu trúc một mô hình hệ thống sử dụng ngôn ngữ VHDL.. 9

2.2.2       Mô hình kiểm tra hoạt động (Testbench). 14

2.2.3       Các phát biểu thông dụng trong chương trình VHDL.. 15

 

 


Chương này giới thiệu một cách tổng quan về cấu trúc phần cứng của FPGA, ngôn ngữ mô tả phần cứng HDL, và cấu trúc của một chương trình VHDL tiêu biểu. Đây là nền tảng để có thể đọc hiểu các chương trình VHDL khác.

2.1Giới thiệu về FPGA:

2.1.1Tổng quan:

FPGA là viết tắt của "Field Programmable Gate Array", là vi mạch dùng cấu trúc mảng phần tử logic mà người dùng có thể lập trình được, có thể thực hiện các tính năng logic thông qua máy tính của mình với giá rẻ, và có thể xóa đi viết lại nhiều lần. Thiết bị logic lập trình được được phát minh lần đầu vào cuối thập kỷ 1970 và ngay lập tức đã trở lên phổ biến trong ngành công nghiệp bán dẫn. Ngoài khả năng lập trình đa dạng, công nghệ này còn có thời gian sản xuất nhỏ nên có khả năng cạnh tranh thương mại rất lớn. Hơn nữa, việc thiết kế với nó khá dễ dàng và nó có khả năng lập trình lại nhiều lần.

FPGA được thiết kế đầu tiên bởi Ross Freeman, người sáng lập công ty Xilinx vào năm 1984, kiến trúc mới của FPGA cho phép tính hợp số lượng tương đối lớn các phần tử bán dẫn vào 1 vi mạch so với kiến trúc trước đó là CPLD (Complex Programmable Logic Device). Điểm tương đồng của CPLD và FPGA là ở chỗ chúng đều bao gồm một số lượng tương đối lớn các phần tử logic khả trình. Tuy nhiên mật độ tích hợp thì khác nhau, mật độ cổng logic của CPLD nằm trong khoảng từ vài nghìn đến hàng chục nghìn, trong khi với FPGA thì mật độ tích hợp cỡ hàng chục nghìn cho đến vài triệu.

Điểm khác biệt nữa giữa FPGA và CPLD là  trong hầu hết chip FPGA đều có các hàm cấp cao (như bộ cộng và bộ nhân) và các bộ nhớ đã được nhúng vào. Ngoài ra, trong các FPGA đời mới còn hỗ trợ đầy đủ hoặc một phần việc cấu hình lại trong hệ thống, cho phép thay đổi thiết kế tức là có thể cập nhật hệ thống hoặc cấu hình động (dynamic reconfiguration) khi chúng đang hoạt động như là một tổ chức rất bình thường. Một vài FPGA còn có khả năng cấu hình lại cục bộ (partial re-configuration) tức là một phần của thiết bị được cấu hình trong khi các phần còn lại vẫn đang hoạt động.

2.1.2Kiến trúc chung của một FPGA:

Cấu trúc tổng thể của FPGA bao gồm:

-Các khối Logic (logic block).

-Hệ thống liên kết mạch (interconnect).

-Các phần tử tích hợp sẵn

Hình 2.1 Cấu trúc của FPGA

2.1.2.1Khối logic FPGA:

Hình 2.2 Khối logic

FPGA chứa trong nó rất nhiều khối logic có thể tái cấu hình CLB (Configurable Logic Blocks) được liên kết với nhau bằng các liên kết khả trình (Programmable Interconnect). Các khối vào ra được phân bố xung quanh chip tạo thành các liên kết với bên ngoài. Bên trong khối logic CLB có bảng LUT (Look-Up Table) và các phần tử nhớ (FlipFlop hoặc bộ chốt). LUT (Look up table) là khối logic có thể thực hiện bất kì hàm logic nào từ 4 đầu vào, kêt quả của hàm này tùy vào mục đích mà gửi ra ngoài khối logic trực tiếp hay thông qua phần tử nhớ flip-flop.

Trong tài liệu hướng dẫn của các dòng FPGA của Xilinx còn sử dụng khái niệm SLICE, 1 Slice tạo thành từ gồm 4 khối logic, số lượng các Slices thay đổi từ vài nghìn đến vài chục nghìn tùy theo loại FPGA.

Nếu nhìn cấu trúc tổng thể của mảng LUT thì ngoài 4 đầu vào kể trên còn hỗ trợ thêm 2 đầu vào bổ xung từ các khối logic phân bố trước và sau nó nâng tổng số đầu vào của LUT lên 6 chân. Cấu trúc này là nhằm tăng tốc các bộ số học logic.

2.1.2.2Hệ thống mạch liên kết:

 Mạng liên kết trong FPGA được cấu thành từ các đường kết nối theo hai phương ngang và đứng, tùy theo từng loại FPGA mà các đường kết nối được chia thành các nhóm khác nhau, ví dụ trong XC4000 của Xilinx có 3 loại kết nối: ngắn, dài và rất dài. Các đường kết nối được nối với nhau thông qua các khối chuyển mạch lập trình được (programable switch), trong một khối chuyển mạch chứa một số lượng nút chuyển lập trình được đảm bảo cho các dạng liên kết phức tạp khác nhau.

2.1.2.3Các phần tử tích hợp sẵn:

Ngoài các khối logic tùy theo các loại FPGA khác nhau mà có các phần tử tích hợp thêm khác nhau, ví dụ để thiết kế những ứng dụng SoC, trong dòng Virtex 4,5 của Xilinx có chứa nhân xử lý PowerPC, hay trong Atmel FPSLIC tích hợp nhân ARV…, hay cho những ứng dụng xử lý tín hiệu số DSP trong FPGA được tích hợp các DSP Slide là bộ nhân cộng tốc độ cao, thực hiện hàm A*B+C, ví dụ dòng Virtex của Xilinx chứa từ vài chục đến hàng trăm DSP slices với A, B, C 18-bit.

2.2Ngôn ngữ mô tả phần cứng (HDL):

Ngôn ngữ mô tả phần cứng (Hardware Description Language) là ngôn ngữ lập trình phần mềm dùng để mô hình hoạt động mong muốn của phần cứng. Có hai khía cạnh mà HDL tạo điều kiện để mô tả phần cứng: mô hình hành vi trừu tượng và mô hình cấu trúc phần cứng.

Mô hình hành vi trừu tượng. Ngôn ngữ mô tả phần cứng tạo điều kiện dễ dàng cho việc mô tả trừu tượng hành vi của phần cứng đối với các mục đích đặc tả (chỉ rõ chi tiết kỹ thuật). Hành vi này không chỉ bị chi phối bới các khía cạnh cấu trúc hoặc thiết kế của ý định phần cứng.

Mô hình cấu trúc phần cứng. Cấu trúc phần cứng có khả năng được mô hình trong ngôn ngữ mô tả phần cứng mà không cần quan tâm đến hành vi thiết kế.

Năm 1980 bộ Quốc phòng Mỹ (DOD) muốn thực hiện việc thiết kế mạch tự dẫn chứng, muốn theo đuổi một hệ phương pháp thiết kế tổng quát và có thể sử dụng lại được với các công nghệ mới. Rõ ràng đã có nhu cầu cho một ngôn ngữ lập trình chuẩn để mô tả chức năng và cấu trúc của các mạch số đối với việc thiết kế vi mạch (IC). Sau đó DOD đã tài trợ cho một dự án thuộc chương trình vi mạch có tốc độ rất cao VHSIC (very high speed integrated circuit) để tạo ra ngôn ngữ mô tả phần cứng chuẩn. Kết quả là dự án này đã tạo ra ngôn ngữ mô tả phần cứng VHSIC hay thường được gọi là VHDL (VHSIC Hardware Description Language-Ngôn ngữ miêu tả phần cứng VHSIC) như hiện nay.

 VHDL được xem như là sự kết hợp của các ngôn ngữ sau : ngôn ngữ tuần tự + ngôn ngữ đồng thời + netlist  + định thời + mô phỏng. Do đó cấu trúc VHDL cho phép thể hiện cách thức thực hiện theo kiểu song song hay tuần tự của một hệ thống số có hoặc không có timing. Nó cũng cho phép vẽ mô hình một hệ thống bằng các liên kết nối của các thành phần.

VHDL được dành cho tổng hợp mạch (synthesis) cũng như mô phỏng mạch (simulation). Dù VHDL có thể mô phỏng một cách đầy đủ, nhưng không phải tất cả các cấu trúc đều được VHDL tổng hợp.

2.2.1Cấu trúc một mô hình hệ thống sử dụng ngôn ngữ VHDL

VHDL là ngôn ngữ mô tả phần cứng do vậy mà nó có thể được sử dụng để làm mô hình của một hệ thống số. Hệ thống số có thể đơn giản là các cổng logic hay phức tạp như một hệ thống hoàn chỉnh. Các khối xây dựng nên ngôn ngữ VHDL gọi là các khối thiết kế. Có 3 khối thiết kế chính:

  • Khai báo Entity (Thực thể).
  • Khai báo Architecture (Kiến trúc).
  • Khai báo Configuration (Cấu hình).
  • Đôi khi ta sử dụng các gói (Packages) và mô hình kiểm tra hoạt động của hệ thống (Testbench).

2.2.1.1Entity (Thực thể)

Khai báo thực thể trong VHDL là phần định nghĩa các chỉ tiêu phía ngoài của một phần tử hay một hệ thống. Khai báo Entity là chỉ ra tên của Entity và liệt kê các cổng vào/ra. Các cổng là các (dây) tín hiệu mà qua đó entity giao tiếp với môi trường bên ngoài. Ví dụ, một mạch bán tổng được chỉ ra ở hình 8 :

  Khai báo Entity như sau:

              entity HALF-ADDER is

            port ( A, B : in BIT;

                 SUM, CARRY : out BIT);

end HALF-ADDER;

Bộ bán cộng này gồm có hai đầu vào là A và B; và hai đầu ra là SUM và CARRY, BIT là một kiểu cấu trúc ngôn ngữ được định nghĩa trước của FPGA

2.2.1.2Architecture (Kiến trúc)

Phần thứ 2 trong mã nguồn VHDL là khai báo Architecture. Mỗi một khai báo Entity đều phải đi kèm với ít nhất một Architecture tương ứng. Khai báo Architecture trong chương trình phải kết hợp tên của Architecture và một Entity trong chương trình đó. Phần thân Architecture có thể bao gồm các khai báo về các tín hiệu bên trong, các phần tử bên trong hệ thống, hay các hàm và thủ tục mô tả hoạt động của hệ thống. Tên của Architecture là nhãn được đặt tuỳ theo người viết chương trình. Cấu trúc bên trong của Architecture có thể được viết theo một trong  số các kiểu mẫu sau:

-Tập hợp kết nối bên trong của các thiết bị.

-Tập các câu lệnh ngẫu nhiên

-Tập các câu lệnh tuần tự.

- Kết hợp của ba dạng trên.

Các kiểu mô hình này sẽ được mô tả cụ thể như sau:

  • Kiểu kiến trúc

Kiểu này được xây dựng dựa trên một tập các thành phần (component) được kết nối. Ví dụ như bộ bán tổng được chỉ ra sau đây:

  architecture HA-STRUCTURE of HALF-ADDER is

           component XOR2

                 port (X,Y : in BIT;

N: out BIT);

            End component;

            Component AND2

                 Port (L, M : in BIT;

N : out BIT);

            End component;

            Begin

                 X1: XOR2 port map(A,B,SUM);

                 A1 : AND2 port map (A,B,CARRY);

                          End HA-STRUCTURE;      

  • Kiểu luồng dữ liệu

Trong kiểu này, luồng dữ liệu qua Entity trước tiên được biểu diễn bằng các phép gán đồng thời. Kiểu  luồng dữ liệu của bộ bán cộng được chỉ ra trong ví dụ sau:

              Architecture DATAFLOW of HALF-ADDER is

      Begin

            SUM <= A xor B after 8ns;

            CARRY <= A and B after 4ns;

      End DATAFLOW;

Trong ví dụ này kiểu luồng dữ liệu sử dụng hai phép gán tín hiệu đồng thời (hoặc gán nối tiếp). Trong phép gán cho tín hiệu thì ký hiệu gán là  “<=”. Giá trị của biểu biểu thức bên phải được gán cho tín hiệu bên phía tay trái. Một phép gán đồng thời được thực hiện chỉ khi có bất kỳ tín hiệu trong biểu thức phía phải có sự thay đổi, tức là giá trị tín hiệu thay đổi. Thông tin trễ cũng có thể được thêm vào phép gán bằng cách sử dụng mệnh đề “after” .

  • Kiểu behavior

Kiểu behavior chỉ ra cách thức hoạt động của một entity như là một tập hợp lệnh  được thực hiện theo kiểu nối tiếp bằng cách sử dụng process. Chúng không chỉ ra rõ ràng cấu trúc của entity mà chỉ ra chức năng của nó. Ví dụ sau xem xét  kiểu behavior của bộ bán tổng.

  Architecture BEHAVIOR of HALF-ADDER is

Begin

      Process (A,B)

            Variable  X,Y : BIT;

      Begin

            X:=A;

            Y:=B;

            SUM<=X xor Y;

            CARRY <= X and Y;

      End process;

End BEHAVIOR;

Một process cũng có một phần để khai báo (trước từ khóa “begin”) và một phần để trình bày (giữa từ khóa “begin” và “process”). Các lệnh bên trong phần trình bày này được thực hiện theo kiểu nối tiếp. Danh sách các tín hiệu được chỉ ra trong dấu ngoặc sau từ khóa “process” tạo thành một danh sách “nhạy”. Tức là, khi có sự thay đổi của bất kỳ  giá trị nào trong danh sách  này thì mới thực hiện các lệnh trong process. Tuy nhiên, tất cả các process trong một chương trình thì đều thực hiện đồng thời.

Khai báo biến (bắt đầu bằng từ khóa “variable”), trong ví dụ này có hai biến X và Y. Các biến được gán với ký hiệu là “:=” và giá trị của vế phải gán cho giá trị biến bên trái.

  • Kiểu hỗn tạp.

Kiểu hỗn tạp là kiểu kết hợp cả ba kiểu trên. Tức là, bên trong một architecture, chúng ta có thể sử dụng cả ba cách trình bày trên.

2.2.1.3Configuration (Cấu hình)

Khai báo Configuration dùng để lựa chọn một trong các thân Architecture có sẵn mà một Entity có hoặc để gắn các khối vào Entity. Nếu cho dạng cấu trúc, Configuration có thể được xem như liệt kê các thành phần cho khối mô hình. Cho mỗi khối thì Configuration chỉ rõ Architecture nào cho Entity từ nhiều Architecture. Khi Configuration cho tổng hợp Entity-Architecture thì được biên dịch vào thư viện và một thực thể mô phỏng được tạo ra. Ví dụ khai báo Configuration trong bộ bán tổng như sau:

Library CMOS-LIB, MY-LIB;

Configuration CONFIG of HALF-ADDER is

For HA-STRUCTURE

For  X1:XOR2

      Use entity CMOS-LIB.XOR-GATE (DATAFLOW);

End for;

For A1 : AND2

      Use configuration MY-LIB.AND-CONFIG;

End for;

End for; End CONFIG;

2.2.1.4Package (Gói)

Mục đích cơ bản của Package là gói gọn các phần nhỏ có thể được sử dụng trong nhiều thiết kế. Package là một biện pháp thường dùng để lưu dữ thông tin có thể được sử dụng trong nhiều Entity. Mối quan hệ trong Package cho phép dữ liệu có thể được tham chiếu bởi những Entity khác. Vì thế dữ liệu có thể được chia sẻ.

Một Package gồm hai phần: Phần khai báo và phần thân (Body). Phần khai báo định nghĩa giao diện cho Package, bằng một cách tương tự như định nghĩa của Entity. Thân của Package chỉ rõ sự biến đổi quan hệ trong Package giống như trong Architecture.

VHDL là không giống như cách thực thi chương trình một cách tuần tự như chương trình của PC, các lệnh của VHDL được thực hiện một cách đồng thời. Vì lí do này, người ta thường gọi là “mã VHDL” chứ không gọi là “chương trình VHDL”. Trong VHDL, chỉ các lệnh nằm trong PROCESS, FUNCTION hoặc PROCEDURE mới được thực thi một cách tuần tự.

Như đã đề cập ở trên, một trong những ưu điểm của VHDL là nó cho phép tổng hợp một mạch hay một hệ thống trong một thiết bị khả trình (như PLD hoặc FPGA) hoặc trong một chip ASIC. Các bước thực hiện một project được chỉ ra trong hình 1.3.

Hình 2.3 Sơ đồ thiết kế FPGA

Thiết kế được bắt đầu bằng việc viết mã VHDL và lưu vào file có đuôi “.vhd” có cùng tên với tên của ENTITY. Bước đầu tiên trong quá trình tổng hợp là biên dịch. Biên dịch là quá trình chuyển từ ngôn ngữ VHDL bậc cao (mô tả mạch ở mức RTL – mức chuyển thanh ghi) sang dạng danh sách kết nối (netlist) ở mức gate. Bước thứ hai là tối ưu, được thực hiện trên danh sách kết nối mức gate để đạt được sự tối ưu về tốc độ hoặc tối ưu về diện tích sắp đặt. Ở giai đoạn này, thiết kế có thể được mô phỏng. Cuối cùng một phần mềm Place-và-route sẽ tạo ra sự sắp đặt (layout) vật lý cho một thiết bị PLD/FPGA hoặc sẽ tạo ra mặt nạ (mask) cho chip ASIC.

2.2.2Mô hình kiểm tra hoạt động (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 đã qua 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 2.4 Mô hình kiểm tra hoạt động

Trong đó: DUT: (device under test) mô hình VHDL cần kiểm tra

                  Observer: khối quan sát kết quả

 Data source: nguồn dữ liệu (khối tạo ra các tín hiệu kích thích)

2.2.3Các phát biểu thông dụng trong chương trình VHDL

Các phát biểu tuần tự nằm trong phát biểu quá trình:

              IF                                 EXIT

              CASE                          ASSERT

              LOOP                         WAIT

Ở đây, ta chỉ đề cập đến các phát biểu thông dụng chính là IF và CASE

2.2.3.1Phát biểu IF…THEN .

Mô tả của phát biểu IF như sau:

if_statement ::=

IF condition THEN

sequence_of_statements

{ELSIF condition THEN

sequence_of_statements}

                 [ELSE

sequence_of_statements]

END IF;

Đây là biểu thức đánh giá điều kiện bằng giá trị TRUE hoặc FALSE. Nếu điều kiện có giá trị là TRUE thì chuỗi phát biều sau THEN sẽ được thực thi, sau đó nhảy đến phát biểu kế tiếp sau END IF. Nếu giá trị của điều kiện là FALSE thì biểu thức sẽ thực thi chuỗi phát biểu của mệnh đề ELSE.

Phát biểu có thể chứa nhiều phần phát biểu ELSIF nhưng chỉ có một phát biểu ELSE. Nhiều hơn một phát biểu tuần tự có thể hiện hữu giữa mỗi phần phát biểu.

2.2.3.2Phát biểu WHEN…CASE.

Phát biểu CASE được sử dụng mỗi khi giá trị của một biểu thức đơn có thể đươc sử dụng để chọn giữa một số các hành động. Dưới đây là dạng của phát biểu CASE:

case_statement ::=

CASE expression IS

case_statement_alternative

{case_statement_alternative}

END CASE;

case_statement_alternative ::=

WHEN choices =>

sequence_of_statements

sequence_of_statements ::=

{sequential_statement}

choices ::=

choice{| choice}

choice ::=

SIMPLE_expression|

discrete_range|

ELEMENT_simple_name|

OTHERS

Một phát biểu CASE gồm có từ khoá CASE được theo sau bởi một biểu thức và từ khoá IS. Biểu thức hoặc trả về một giá trị tương thích với một trong các CHOICES trong phần phát biểu WHEN hoặc tương thích với mệnh đề OTHERS. Nếu biểu thức tuơng thích với phần CHOICE của mệnh đề WHEN choices=>, sequence_of_statements theo sau được thực thi. Sau khi các phát biểu này được thực thi, điều khiển được chuyển đến phát biểu theo sau mệnh đề END CASE.

Hoặc mệnh đề CHOICES phải liệt kê mọi giá trị có thể có của kiểu được trả về bởi biểu thức hoặc lựa chọn sau cùng phải được chứa một mệnh đề OTHERS.

Ta khảo sát một ví dụ dưới đây để làm rõ vấn đề hơn.

CASE instruction IS

WHEN load_accum =>

accum <= data;

WHEN store_accum =>

data_out <= accum;

WHEN load|store =>

process_IO(addr);

WHEN OTHERS =>

process_error(instruction);

END CASE;

Phát biểu CASE sẽ thực thi phát biểu thích hợp phụ thuộc vào giá trị của instruction. Nếu giá trị của instruction là một trong các chọn lựa được liệt kê trong các mệnh đề WHEN, phát biểu theo sau các mệnh đề WHEN được thực thi. Ngược lại, phát biểu theo sau mệnh đề OTHERS được thực thi. Trong thí dụ này khi giá trị của instruction là load_accum, phát biểu gán thứ nhất đước thực thi. Nếu giá trị của instruction là load hoặc store, thủ thục process_IO được gọi.

Nếu giá trị của instruction ở ngoài tầm của các chọn lựa đã cho, mệnh đè OTHERS tương thích với biểu thức và phát biểu theo sau mệnh đề OTHERS được thực thi. Đây là một lỗi nếu mệnh đề OTHERS không hiện hữu và các chọn lựa được cho không bao trùm mọi giá trị có thể có cho kiểu của biểu thức.

CHƯƠNG 3              GIỚI THIỆU KIT UP2 CỦA ALTERA VÀ PHẦN MỀM QUARTUS

Nội dung chương

3.1      Board thí nghiệm UP2: 19

3.1.1       Giới thiệu: 19

3.1.2       Cấu trúc thiết bị: 20

3.2      Giới thiệu phần mềm Quartus: 27

3.2.1       Cách tạo 1 project mới: 27

3.2.2       Gán chân thiết bị: 29

3.2.3       Mô phỏng: 30

 

Chương này mô tả từng chi tiết trên board UP2, và hướng dẫn cách sử dụng phần mềm Quartus.

3.1Board thí nghiệm UP2:

3.1.1Giới thiệu:

Sản phẩm UP (University Program) được thiết kế để đáp ứng nhu cầu của các trường đại học về việc dạy cách thiết kế mạch logic số với các công cụ phát triển và thiết bị logic lập trình được (PLD). Các sản phẩm UP2 bao gồm:

  • Phần mềm MAX+PLUS II.
  • Bo mạch giáo dục UP:

- Thiết bị EPF10K70 240 chân được thiết kế theo hình vuông.

- Thiết bị EPM7128S với 84 chân.

  • Cáp nạp song song Byte Blaster MV.

Thiết bị EPF10K70

Dựa trên nền công nghệ SRAM. Thiết bị bao gồm 3744 thành phần logic (LE) và có 9 khối mảng nhúng (EAB). Mỗi thành phần logic bao gồm 4 bảng tra LUT, 1 flip flop lập trình được, và 1 đường tín hiệu cho các chức năng mang và truyền dữ liệu. Mỗi khối EAB cung cấp 2048 bit nhớ để tạo các chức năng RAM, ROM, và FIFO (first in fisrt out). Khối mảng nhúng EAB có thể thực thi các chức năng logic chẳng hạn như bộ nhân, vi điều khiển, trạng thái máy, và xử lý tín hiệu số. Với 70000 cổng tiêu biểu, thiết bị EPF10K70 lý tưởng cho các ứng dụng từ cơ bản đén nâng cao, bao gồm kiến trúc máy tính, truyền thông và xử lý tín hiệu số (DSP).

Thiết bị EPM7128

Thuộc họ MAX7000S, sử dụng các thành phần bộ nhớ ghi, xóa chỉ đọc EEPROM. Thiết bị này nằm trên 1 socket bằng nhựa 84 chân, và có 128 macrocell. Mỗi macrocell có 1 cổng AND lập trình được, và 1 cổng OR cố định, cùng với 1 thanh ghi hoạt động với nguồn xung clock độc lập. Với dung lượng là 2500 cổng logic, và kiểu kiến trúc đơn giản, thiết bị EPM7128 thích hợp để giới thiệu cách thiết kế cho người mới học, và cũng là thiết bị mà em sử dụng trong phần I – giới thiệu về lập trình FPGA này.

3.1.2Cấu trúc thiết bị:

Hình 3.1 Sơ đồ khối của board thí nghiệm UP

1. Nguồn DC_IN thô: 7- 9 V, 350mA

2. Ổn áp trên board: LM340T : 5V

3. Thạch anh: 25.175 MHz

4. Cổng JTAG_IN:

Đầu cắm cái 10 chân của cáp nạp Byte BlasterMV kết nối với header cái 10 chân JTAG_IN. Board UP2 cung cấp nguồn và mass cho cáp nạp. Dữ liệu được dịch vào thiết bị qua chân TDI và dịch ra khỏi thiết bị bằng chân TDO. Dưới đây là tên các chân của JTAG_IN khi cáp nạp Byte Blaster hoạt động ở chế độ Joint Test Action Group.

Hình 3.2 Sơ đồ chân JTAG

5. Jumper:

Board UP2 có 4 jumper 3 chân (TDI, TDO, DEVICE, BOARD) dùng để thiết lập chức năng của JTAG:

Hình 3.3 Sơ đồ Jumper

Hình 3.4 Chức năng Jumper

Trong quá trình cấu hình, LED màu xanh CONF_D sẽ tắt và LED TCK sẽ chớp nháy để báo hiệu là dữ liệu đang được truyền tải. Sau khi thiết bị đã được cấu hình thành công, LED CONF_D sẽ sáng.

6. Thiết bị EPM7128S:

  • Nằm trên socket 84 chân PLCC.
  • Những chân tín hiệu được truy cập nhờ các header.
  • Kết nối chuỗi JTAG qua cáp ByteBlaster MV.
  • Có 2 nút nhấn chuyển đổi nhất thời.
  • 2 công tắc DIP.
  • 16 LED đơn.
  • 2 led 7 đoạn.
  • Thạch anh 25.175 MHz.
  • Port mở rộng với 42 chân I/O và các chân CLR, OE1, OE2, GCLK2.
  • Các chân của EPM7128 không được kết nối thẳng vào các swich và LED, mà được kết nối vào các header cái. Ta sử dụng bus để kết nối các header và switches.

Hình 3.5 Số thứ tự các chân trên các header

7. Thiết bị FLEX 10K:

  • Được cấu hình bằng JTAG qua cáp ByteBlaster MV.
  • Kết nối với 2 nút nhấn chuyển đổi nhất thời
  • Có 1 DIP switch
  • 2 LED 7 đoạn được kết nối sẵn
  • Kết nối sẵn với cổng VGA và mouse
  • Có 3 port mở rộng, với 42 chân IO trên mỗi port

8. Nút nhấn PB1 và PB2:

Tích cực mức thấp, sử dụng điện trở kéo lên 10k, kết nối với header bằng bus.

9. Switch SW1 và SW2:

Mỗi switch bao gồm 8 công tắc cung cấp tín hiệu logic. Những công tắc này sử dụng điện trở kéo lên 10K.

Khi switch mở: ngõ ra ở mức 1 và ngược lại.

10. Các led đơn từ D1 đến D16:

Board mạch UP 2 có 16 LED đơn được kéo lên bằng điện trở 330 Ohm. LED sẽ  sáng khi ở header cái kết nối với LED có mức logic 0.

Hình 3.6 Vị trí LED

11. LED 7 đoạn:

Được kết nối trực tiếp vào các chân IO của EPM7128S. Các đoạn sẽ sáng khi chân kết nối ở mức 0.

Hình 3.7 LED 7 đoạn

Hình 3.8 Sơ đồ kết nối chân của Led 7 đoạn

12. Port mở rộng:

Là một hàng đôi dùng để truy cập các chân tín hiệu I/O và các tín hiệu chung trên thiết bị EPM7128S, nguồn và mass.

Hình 3.9 Port mở rộng

Hình 3.10 Bảng tín hiệu và sự kết nối các chân của EPM7128S vào mỗi chân

3.2Giới thiệu phần mềm Quartus:

3.2.1Cách tạo 1 project mới:

- Khởi động Quartus II 6.0.

- Chọn File à New project wizard, cửa sổ hiện ra như hình:

- Chương trình sẽ yêu cầu chọn folder chứa project, đặt tên file. Sau khi đã hoàn tất, chọn Next. Cửa sổ hiện ra như sau:

- Đây là cửa sổ cho phép chọn design file để đi kèm với project. Có thể bỏ qua giai đoạn này bằng cách tiếp tục nhấn Next.

- Chương trình yêu cầu chọn họ FPGA, trên kit UP2 của Altera là chip EPM7128LC84-7 thuộc dòng MAX7000S và EPF10K70RC240 thuộc dòng FLEX10K. Ở đây ta chọn EPM7128, có số Macrocell là 128.

- Tiếp theo là phần chọn công cụ EDA dùng để mô phỏng và phân tích, ở đây ta mô phỏng trực tiếp trên Quartus nên có thể bỏ qua phần này. Chọn Finish để bắt đầu viết chương trình cho Project.

- Trong cửa sổ làm việc của Quartus, để tạo 1 file design mới, ta chọn File à New:

- Trong hộp thoại hiện ra, chọn VHDL file. Sau khi thực hiện xong việc lập trình, file VHDL sẽ được lưu lại dưới dạng <file name>.vhd.

- Cửa sổ làm việc của Quartus, trong hình là 1 chương trình VHDL tiêu biểu:

Sau khi viết xong chương trình, để biên dịch và kiểm tra lỗi, ta chọn Process à Compiler Tool. Chương trình sẽ tự động biên dịch và kiểm tra lỗi. Nếu không có lỗi được phát hiện, chương trình sẽ xuất ra file .pof hoặc .sof tùy thuộc vào loại thiết bị ta chọn lúc khai báo New Project.

3.2.2Gán chân thiết bị:

Để có thể nạp chương trình vào FPGA, ngoài các file design, ta còn phải tạo 1 file khai báo chân thiết bị tương ứng với các port in, out sử dụng trong chương trình.

- Đầu tiên ta mở phần hỗ trợ gán chân Pin Planner nằm trong assignments.

- Cửa sổ hiện ra sơ đồ chân của thiết bị ta chọn trong New Project Wizard:

Thông thường, trên 1 thiết bị FPGA, ngoài các chân tự chọn, có 1 số chân có chức năng đặc biệt theo thiết kế của nhà sản xuất, ta không thể thay đổi chức năng của các chân này được, tham khảo datasheet của linh kiện để biết rõ chi tiết. Trong hình, chân 83 của EPM7128 là chân nối trực tiếp với nguồn xung clock 27 MHz.

- Sau khi đã hoàn tất việc gán chân, vào Assignments à Export Assignments để xuất ra file .qsf:

.........................................................

 

 

PHỤ LỤC A – CODE VHDL CÁC BÀI THÍ NGHIỆM

 

Bài tập 5: Điều khiển 2 hàng LED đơn bằng nút nhấn

 

LIBRARY IEEE;

USE IEEE.std_logic_1164.ALL;

USE IEEE.std_logic_arith.ALL;

USE IEEE.std_logic_unsigned.ALL;

LIBRARY work;

entity dkled2 is

     port (    pb,clk     :    in   std_logic;

                out_led1   :    out  std_logic_vector(3 downto 0);

                out_led2   :    out  std_logic_vector(3 downto 0)

                );

                    

end dkled2;

architecture hung of dkled2 is

     signal     reg             :    std_logic_vector(3 downto 0);

     signal     shift1          :    std_logic_vector(3 downto 0);

     signal     shift2          :    std_logic_vector(3 downto 0);

     signal     pb_db           :    std_logic;

     signal     sig             :    std_logic;

     signal     clock_100Hz     :    std_logic;

     signal     count_clk       :    std_logic_vector(23 downto 0);

     signal     clock_1_5_hz    :    std_logic;

begin

     process(clk)

           begin

                if   clk'event and clk = '1' then

                     count_clk  <=   count_clk  + 1;

                end if;

     end process;

     clock_100Hz <= count_clk(17);

     clock_1_5_hz <= count_clk(23);

     process(clock_100Hz)

           begin

                if clock_100Hz'event and clock_100Hz = '1' then

                     reg(2 downto 0) <= reg(3 downto 1);

                     reg(3) <= not(pb);

                     if   reg(3 downto 0) =    "0000" then    

                           pb_db <=   '1';

                     else

                           pb_db <=  '0';

                           sig        <=  not(sig);

                     end if;

                end if;

     end process;

    

     process(clock_100hz,clock_1_5_hz)

           begin

               

           if   clock_1_5_hz'event and clock_1_5_hz = '1' then

                if   sig = '0'  then

                     shift2 <= not(shift2(0)) & shift2(3 downto 1);

                     shift1 <= "0000";

                    

                else

                     shift1 <= not(shift1(0)) & shift1(3 downto 1);

                     shift2 <= "0000";

                end if;

           end if;

     out_led1 <= shift1;

     out_led2 <= shift2;

     end process;

  

End hung;

Bài tập 7: Điều khiển 2 LED 7 đoạn bằng nút nhấn

LIBRARY IEEE;

USE IEEE.std_logic_1164.ALL;

USE IEEE.std_logic_arith.ALL;

USE IEEE.std_logic_unsigned.ALL;

LIBRARY work;

entity dkled3 is

     port (    pb,clk          : in std_logic;

                out_digit1_reg  : out std_logic_vector(7 downto 0);

                out_digit2_reg  : out std_logic_vector(7 downto 0));

end dkled3;

architecture hung of dkled3 is

     signal     count_digit     :    integer:=0;

     signal     shift      :    std_logic_vector(3 downto 0);

     signal     pb_db      :    std_logic;

     signal     sig        :    std_logic;

     signal     clock_100Hz     :    std_logic;

     signal     count_clk  :    std_logic_vector(23 downto 0);

     signal     clock_1_5_hz :  std_logic;

begin

     process(clk)

           begin

                if   clk'event and clk = '1' then

                     count_clk  <=   count_clk  + 1;

                end if;

     end process;

     clock_100Hz <= count_clk(17);

     clock_1_5_hz <= count_clk(23);

     process(clock_100Hz)

           begin

                if clock_100Hz'event and clock_100Hz = '1' then

                     shift(2 downto 0) <= shift(3 downto 1);

                     shift(3) <= not(pb);

                     if   shift(3 downto 0)    =    "0000" then    

                           pb_db <=   '1';

                     else

                           pb_db <=  '0';

                     end if;

                end if;

     end process;

     process(pb_db)

           begin

                if pb_db = '0' then

                     sig <= not(sig);

                end if;

     end process;

     process(clock_100hz,clock_1_5_hz)

           begin

                if   clock_1_5_hz'event and clock_1_5_hz = '1' then

                     if   sig = '1' then

                           if   (count_digit    > 15) then

                                count_digit     <= 0;

                           else

                                count_digit     <= count_digit + 1;

                           end if;

                     elsif (count_digit    < 0) then

                                count_digit     <= 15;

                           else

                                count_digit     <= count_digit - 1;

                     end if;

                end if;

     end process;

     process(clk)

           begin

                case count_digit is

                     when 0 =>

                           out_digit1_reg <= x"C0";

                           out_digit2_reg <= x"C0";

                     when 1 =>

                           out_digit1_reg <= x"C0";

                           out_digit2_reg <= x"F9";

                     when 2 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10100100";

                     when 3 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10110000";  

                     when 4 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10011001";

                     when 5 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10010010";

                     when 6 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10000010";

                     when 7 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "11111000";  

                     when 8 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10000000";

                     when 9 =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "10010000";

                     when 10 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "11000000";

                     when 11 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "11111001";  

                     when 12 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "10100100";

                     when 13 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "10110000";

                     when 14 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "10011001";

                     when 15 =>

                           out_digit1_reg <= "11111001";

                           out_digit2_reg <= "10010010";  

                     when others =>

                           out_digit1_reg <= "11000000";

                           out_digit2_reg <= "11000000";       

                End case;           

     End process;

End hung;

Bài tập giao tiếp Mouse:

Module device-host: mouse gửi 3 byte dữ liệu về

LIBRARY IEEE;

USE IEEE.std_logic_1164.ALL;

USE IEEE.std_logic_arith.ALL;

USE IEEE.std_logic_unsigned.ALL;

LIBRARY work;

entity device_host is

     port (    clk, reset           :    in   std_logic;

                     rx_en      :    in   std_logic;

                     ps2c, ps2d :    in   std_logic;

                     rx_done         :    out std_logic;

                     dout       :    out  std_logic_vector(7 downto 0)

Close