Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD

Các CPLDs rất thích hợp trong việc diễn tả các cổng logic phức

tạp với tốc độ làm việc lớn hơn 200 Mhz ( tương đương 5 ns ).

Khuôn mẫu thời gian cho CPLD rất dễ tính toán, bởi thế trước khi

bắt đầu thiết kế bạn có thể tính toán các tốc độ từ đầu vào đến đầu ra

của mình dựa trên khuôn mẫu này. CPLDs đưa ra cách đơn giản

nhất để thực hiện một thiết kế, một thiết kế có thể được mô tả bởi

các sơ đồ nguyên lý hoặc nhập vào một HDL ( Hardware

Description Language - Ngôn ngữ mô tả phần cứng). Đơn giản khi

sử dụng các công cụ phát triển để tối ưu hoá, nạp và mô phỏng thiết

kế. Các công cụ thiết kế sẽ tạo ra một file mà file này (chính là một

file chương trình) được dùng để đưa thêm các chuẩn logic vào trong

một chip CPLD cùng với chức năng mong muốn. Chính vì vậy nó

cung cấp một chuẩn phần cứng mà cho phép các quá trình xử lý, gỡ

rối có thể thực hiện ngay từ khi bắt đầu công việc thiết kế. Giả sử

nếu bạn cần có một một sự thay đổi về thiết kế, bạn có thể đưa sự

thay đổi thiết kế đó vào trong công cụ phát triển CPLD và thực thi

trên nó, sau đó bạn có thể kiểm tra được tức thì ngay sau đó bằng

một phần mềm mô phỏng.

 

pdf 272 trang kimcuc 10640
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD

Giáo trình Thiết kế thiết bị điện tử lập trình sử dụng công nghệ FPGA và CPLD
1 
Lời giới thiệu 
Khai thác, nghiên cứu cơ bản công nghệ mới là b−ớc không thể 
thiếu trong việc cải tiến, nâng cao, cũng nh− chế tạo mới các trang 
thiết bị quân sự và dân sự nhằm đáp ứng việc hiện đại hoá công 
nghiệp hoá của đất n−ớc. Cùng với sự phát triển v−ợt bậc của 
nghành công nghệ thông tin, các công nghệ mới về các mạch tích 
hợp vi điện tử, các mạch tổ hợp logic lập trình đ−ợc ra đời đã làm 
cho các sản phẩm quân sự cũng nh− dân sự ngày càng hoàn thiện và 
−u việt hơn. Để tiến một b−ớc xa hơn trong việc cải tiến, chế tạo khí 
tài quân sự nhằm đáp ứng chiến tranh điện tử hiện đại với tốc độ xử 
lý cực kỳ cao, đòi hỏi phải có công nghệ tiên tiến phù hợp với tình 
hình chung của thế giới. 
Trên cơ sở phát triển từ các chíp PLA, hiện nay công nghệ na nô 
đã đ−ợc đ−a vào để chế tạo các mạch tích hợp lập trình đ−ợc FPGA 
và CPLD, nó đã làm cho mạch tích hợp logic lên đến hàng chục 
triệu cổng, tốc độ đồng hồ lên đến 500 MHz. ứng dụng công nghệ 
mới vào trong thiết kế chế tạo các thiết bị điện tử lập trình PLIC là 
một b−ớc cần thiết cho t−ơng lai với một n−ớc đang phát triển nh− 
Việt Nam. Để đáp ứng đ−ợc tính bảo mật trong quân sự cũng nh− 
tính phản ứng nhanh trong chiến tranh hiện đại cùng với nhu cầu 
chuyên dụng hoá, tối −u hoá (thời gian, không gian, giá thành), 
tính chủ động trong công việc... ngày càng đòi hỏi khắt khe. Việc 
đ−a ra công nghệ mới trong lĩnh vực chế tạo mạch điện tử để đáp 
ứng những yêu cầu trên là hoàn toàn cấp thiết mang tính thực tế cao. 
2 
Công nghệ FPGA (Field Programmable Gate Array) và CPLD 
(Complex Programmable Logic Device) đã đ−ợc các hãng lớn tập 
trung nghiên cứu và chế tạo, điển hình là Xilinx và Altera. Để làm 
chủ công nghệ mới và tổ chức thiết kế sản xuất công nghệ FPGA 
của Xilinx cho phép chúng ta tự thiết kế những vi mạch riêng, những 
bộ xử lý số riêng dành cho ứng dụng của chúng ta. Đặc biệt trong 
lĩnh vực xử lý tín hiệu số, các mạch tích hợp dùng để nhận dạng âm 
thanh, hình ảnh, cảm biến ... với tính mềm dẻo cao và giá thành 
thấp. 
Mặc dù công nghệ FPGA đã xuất hiện từ năm 1985, xong đối 
với n−ớc ta thì nó vẫn còn rất mới. Do vậy tìm hiểu, làm chủ về công 
nghệ FPGA là việc làm hoàn toàn cần thiết. Nó không chỉ có ý 
nghĩa đối với các lĩnh vực Điện tử - Viễn thông, công nghệ thông 
tin... mà nó có ý nghĩa đặc biệt quan trọng trong lĩnh vực an ninh 
quốc phòng. 
Xuất phát từ thực tế đòi hỏi cấp bách đó, bộ môn Tự động và 
Kỹ thuật tính – Khoa Kỹ thuật điều khiển – Học Viện Kỹ thuật quân 
sự đã cho xuất bản cuốn sách “Thiết kế thiết bị điện tử lập trình sử 
dụng công nghệ FPGA và CPLD”, tài liệu này nằm trong loạt các tài 
liệu đã đ−ợc bộ môn ấn hành, bao gồm Cấu trúc máy tính, Cờu trúc 
và lập trình cho các hệ xử lý tín hiệu số, cấu trúc và lập trình hệ vi 
điều khiển. 
Tài liệu giới thiệu ph−ơng pháp thiết kế CPLD, FPGA cũng nh− 
ngôn ngữ lập trình, từ đó đi sâu nghiên cứu các giải pháp có liên 
quan cũng nh− các công cụ hỗ trợ thiết kế, sau đó áp dụng để thiết 
3 
kế, tích hợp vào loại CPLD và FPGA cụ thể . Tài liệu đ−ợc chia 
thành 4 ch−ơng: 
- Ch−ơng 1: Giới thiệu tổng quan tổ chức phần cứng của 
ASIC. Giới thiệu tổng quan tổ chức các họ thiết bị cũng nh− cấu 
trúc của chúng (tài liệu giới thiệu cấu trúc ASIC của hãng Xilinx). 
- Ch−ơng 2: Giải pháp và tổ chức phần mềm đảm bảo. Giới 
thiệu các phần mềm hỗ trợ thiết kế, ngôn ngữ lập trình. 
- Ch−ơng 3: Ngôn ngữ lập trình VHDL 
- Ch−ơng 4: Thiết kế ứng dụng cơ bản. Ch−ơng này đ−ợc thực 
hiện với việc tích hợp các mạch điện tử trên cơ sở sử dụng ngôn ngữ 
VHDL, để thiết kế bộ điều khiển động cơ b−ớc trên hai họ thiết bị 
CPLD và FPGA. 
Cuốn sách đ−ợc dùng làm giáo trình giảng dạy bậc đại học và 
sau đại học chuyên ngành điện, điện tử hoặc làm tài liệu tham khảo 
cho các nghiên cứu sinh và cho những ai quan tâm đến cấu trúc và 
lập trình ASIC. 
 Cuốn sách đ−ợc biên soạn bởi PGS. TS. Nguyễn Tăng 
C−ờng và TS. Phan Quốc Thắng, ThS. Phạm Tuấn Hải, KS Lê Trọng 
Nghĩa, do PGS. TS. Nguyễn Tăng C−ờng chủ biên. 
Nhân dịp này, tập thể tác giả xin bày tỏ lời cám ơn chân thành 
nhất đến những ng−ời đã có nhiều đóng góp trong quá trình hoàn 
thành tài liệu, đến các anh chị em Bộ môn Tự động và Kỹ thuật tính 
thuộc Khoa Kỹ thuật Điều khiển, Học viện Kỹ thuật Quân sự, đặc 
biệt phải kể đến sự hỗ trợ hiệu quả của TS. Đỗ Đình Nghĩa. 
Do kinh nghiệm và thời gian hạn chế, tài liệu này chắc chắn 
không thể tránh khỏi những thiếu sót. Rất mong nhận đ−ợc các ý 
kiến đóng góp và xây dựng của bạn đọc gần xa. ý kiến đóng góp xin 
4 
gửi về địa chỉ: Bộ môn Tự động và Kỹ thuật tính, Khoa Kỹ thuật 
Điều khiển, Học viện Kỹ thuật Quân sự, 100 Hoàng Quốc Việt, Hà 
nội; Điện thoại (04)7542281, email: tcuong@hn.vnn.vn. 
Hà Nội, Ngày 1 tháng 10 năm 
2005 
 Tập thể tác giả 
5 
Ch−ơng 1 : Giới thiệu tổng quan 
 tổ chức phần cứng của FPGA vμ CPLD 
1.1 Giới thiệu công nghệ và giải pháp của Xilinx 
Vào cuối những năm 70, các bảng mạch đ−ợc thiết kế sẵn cùng 
với các thiết bị chuẩn logic đ−ợc −a chuộng và thịnh hành . Sau đó 
một số câu hỏi đ−ợc đ−a ra rằng " Điều gì sẽ xảy ra nếu chúng ta 
đ−a cho những ng−ời thiết kế khả năng thực hiện kết nối giữa các 
thiết bị chuẩn logic khác nhau trong một thiết bị lớn hơn ? ". Điều 
này cho phép những ng−ời thiết kế tích hợp đ−ợc nhiều thiết bị 
chuẩn logic hơn vào trong một thiết bị. Để có đ−ợc sự linh hoạt 
trong thiết kế, Ron Cline ng−ời của hãng SigneticsTM đã đ−a ra ý 
t−ởng bao gồm hai sơ đồ cho phép ng−ời thiết kế có thể lập trình 
đ−ợc. 
Hai sơ đồ này cung cấp bất kỳ tổ hợp logic nào của các cổng 
"AND" và "OR" mà chúng có thể đ−ợc dùng chung với một số giới 
hạn cổng "AND " thông qua các cổng "OR". Cấu trúc này đã trở nên 
rất mềm dẻo, nh−ng tại thời điểm đó lớp đệm hình học 10 àm đã tạo 
ra sự giữ chậm giữa đầu vào và đầu ra rất lớn, chính điều này đã làm 
6 
cho thiết bị hoạt động t−ơng đối chậm. Và cấu trúc này đ−ợc gọi là 
cấu trúc của PLA (Programmable Logic Array). 
Hình 1.1. Cấu trúc của PLA (Programmable Logic Array) 
Hãng MMI (Sau đó bị mua bởi hãng AMD TM) đã hợp tác với 
hãng SigneticsTM và là nơi cung cấp nguồn tài liệu thứ hai cho hệ 
thống mảng logic lập trình PLA (Programmable Logic Array). 
Nh−ng sau khi sản xuất, cấu trúc này đã bị thay đổi và trở thành cấu 
trúc logic mảng lập trình đ−ợc PAL (Programmable Array Logic), 
bởi việc cố định một mảng và chỉ cho phép lập trình trên một mảng 
còn lại. Cấu trúc PAL mới này rất khác với cấu trúc của PLA ở chỗ 
là một mảng lập trình đ−ợc bị gắn cố định - mảng các cổng OR . 
Tuy nhiên, cấu trúc PAL (Programmable Array Logic) này cũng có 
lợi là thời gian giữ chậm đ−ờng truyền từ đầu vào đến đầu ra ngắn 
hơn và phần mềm ít phức tạp hơn. Tuy nhiên chúng không mềm dẻo 
bằng cấu trúc PLA (Programmable Logic Array) . Các cấu trúc khác 
cũng đ−ợc đ−a ra, chẳng hạn nh− PLD (Programmable Logic 
Device) - thiết bị logic lập trình đ−ợc. Loại thiết bị này th−ờng đ−ợc 
gọi là thiết bị logic lập trình đ−ợc đơn giản SPLD ( Simple 
7 
Programmable Logic Device) và tên này đ−ợc gọi chung cho tất cả 
các thiết bị logic lập trình đ−ợc nh− : PALs, CPLDs, FPGAs. Cấu 
trúc của PAL (Programmable Array Logic) . 
Hình 1.2. Cấu trúc của PAL (Programmable Array Logic) 
Cấu trúc này có các mắt l−ới của các đ−ờng nối theo chiều 
ngang và chiều đứng. Tại mỗi điểm giao nhau, chúng đ−ợc nối với 
nhau bằng một cầu trì. Với sự trợ giúp của các công cụ phần mềm, 
ng−ời thiết kế có thể lựa chọn mối nối, mối nào không đ−ợc nối thì 
cầu trì tại điểm đó sẽ bị huỷ đi (Bị nung nóng và thổi đứt). Điều này 
đ−ợc thực hiện bởi một bộ nạp ch−ơng trình. 
Theo hình 1.2 các chân đầu vào đ−ợc nối vào các đ−ờng theo 
chiều đứng, các đ−ờng nằm ngang đ−ợc nối với các cổng AND - 
OR, lần l−ợt các đ−ờng này đ−ợc nối với các Flip-Flop chuyên dụng 
(Chẳng hạn nh− Flip-Flop loại D, T, RS). Các PLDs (Programmable 
Logic Device) trong một IC đóng gói đơn có số cổng nhiều hơn 50 
lần các thiết bị logic chuyên biệt. Điều này nó đã thể hiện một sự 
tiến bộ rõ rệt, đấy là ch−a đề cập đến một số thiết bị cần phải đ−ợc 
giản l−ợc hoá để có độ tin cậy cao hơn các thiết bị chuẩn logic . 
Công nghệ PLD đã phát triển từ những ngày còn rất sớm, chẳng 
8 
hạn nh− công ty Xilinx, họ đã đ−a ra sản phẩm CMOS với nguồn 
tiêu thụ siêu thấp dựa trên công nghệ bộ nhớ flash. Các PLD flash 
cho phép khả năng lập trình và xoá bằng điện cho thiết bị nhiều lần 
đã trở nên thích hợp hơn so với các chíp thế hệ cũ, các loại chip mà 
với thời gian xoá ch−ơng trình hơn 20 phút bằng tia cực tím . 
1.1.1. Complex Programmable Logic Devices (CPLDs) 
Tạm dịch là các thiết bị logic cho phép lập trình phức hợp, họ 
thiết bị này là kết quả của việc tăng mật độ của họ SPLDs 
(Programmable Logic Device) lên nhiều lần. Khái niệm này đ−ợc 
hiểu nh− sau : tăng một số khối PLD hoặc các macrocell (xin đ−ợc 
để nguyên nghĩa và giải thích ở phần cấu trúc của CPLD) ở trong 
một thiết bị đơn cùng với các đ−ờng nối liền đa năng giữa chúng. 
Các đ−ờng nối của các đơn vị logic đơn có thể đ−ợc thực thi ở trong 
một khối đơn ( a single block ). Nhiều logic phức tạp yêu cầu cần 
nhiều khối và sử dụng các đ−ờng nối đa năng giữa chúng để tạo nên 
các kết nối phức tạp hơn. 
Hình 1.3. Cấu trúc của CPLD 
9 
Các CPLDs rất thích hợp trong việc diễn tả các cổng logic phức 
tạp với tốc độ làm việc lớn hơn 200 Mhz ( t−ơng đ−ơng 5 ns ). 
Khuôn mẫu thời gian cho CPLD rất dễ tính toán, bởi thế tr−ớc khi 
bắt đầu thiết kế bạn có thể tính toán các tốc độ từ đầu vào đến đầu ra 
của mình dựa trên khuôn mẫu này. CPLDs đ−a ra cách đơn giản 
nhất để thực hiện một thiết kế, một thiết kế có thể đ−ợc mô tả bởi 
các sơ đồ nguyên lý hoặc nhập vào một HDL ( Hardware 
Description Language - Ngôn ngữ mô tả phần cứng). Đơn giản khi 
sử dụng các công cụ phát triển để tối −u hoá, nạp và mô phỏng thiết 
kế. Các công cụ thiết kế sẽ tạo ra một file mà file này (chính là một 
file ch−ơng trình) đ−ợc dùng để đ−a thêm các chuẩn logic vào trong 
một chip CPLD cùng với chức năng mong muốn. Chính vì vậy nó 
cung cấp một chuẩn phần cứng mà cho phép các quá trình xử lý, gỡ 
rối có thể thực hiện ngay từ khi bắt đầu công việc thiết kế. Giả sử 
nếu bạn cần có một một sự thay đổi về thiết kế, bạn có thể đ−a sự 
thay đổi thiết kế đó vào trong công cụ phát triển CPLD và thực thi 
trên nó, sau đó bạn có thể kiểm tra đ−ợc tức thì ngay sau đó bằng 
một phần mềm mô phỏng. CPLD có mức tích hợp rất cao (có nghĩa 
là một số l−ợng lớn các cổng trên một diện tích) và đ−ợc đóng gói 
trong một khuôn dạng rất nhỏ. Điều này đã đ−a ra một giải pháp 
tuyệt vời cho những ng−ời thiết kế cần sản phẩm của mình đ−ợc 
đóng gói nhỏ gọn với diện tích bo mạch bị giới hạn về không gian. 
Họ Xilinx CoolRunner CPLDs luôn có mặt trong các đóng gói cùng 
với các chip đời mới. Chẳng hạn nh− chip CP56 CPLD có khoảng 
cách các chân là 0,5 mm và với kích th−ớc bao nhỏ không đáng kể 
10 
6x6mm và điều này cho phép đ−a ra một sản phẩm nhỏ gọn cùng 
với mức độ tiêu thụ nguồn thấp . 
1.1.2. Field Programmable Gate Arrays ( FPGAs) 
Mảng cổng cho phép lập trình đ−ợc. Năm 1985, công ty Xilinx 
đã đ−a ra một ý t−ởng mới : Đó là sự kết hợp giữa những điều khiển 
ng−ời dùng, thời gian đ−a sản phẩm PLD (Programmable Logic 
Device) ra thị tr−ờng cùng với mật độ tích hợp, giá của các ma trận 
cổng. Điều này đã cho ra đời thiết bị FPGA và cho đến nay Xilinx 
vẫn là nhà phân phối số 1 trên toàn thế giới về họ thiết bị này. Một 
FPGA có cấu trúc của các Logic Cell hoặc các Module và các 
đ−ờng nối (Xem hình 1.4), các đ−ờng nối này nằm d−ới sự điều 
khiển của ng−ời thiết kế. Có nghĩa là bạn có thể thiết kế, lập trình và 
thay đổi mạch của bạn bất cứ khi nào bạn muốn . Với họ FPGA 
ngày nay khả năng tích hợp của nó đã v−ợt qua giới hạn 10 triệu 
cổng ( Họ Xilinx VirtexTM- II và VirtexTM- 4 FPGA hiện đang giữ kỷ 
lục).Với sự giới thiệu của họ sản phẩm Spartan FPGA hiện nay, 
Xilinx có thể cạnh tranh về ma trận cổng ở mọi khía cạnh nh− giá 
cả, số l−ợng cổng, số l−ợng vào ra cũng nh− hiệu quả về giá thành. 
Giả sử lấy Spartan - IIE FPGA với số l−ợng 300.000 cổng làm chuẩn 
của giá thành, nó có thể cho phép thay thế các sản phẩm ứng dụng 
theo chuẩn chuyên dụng. 
Có hai loại FPGA cơ bản : Loại SRAM (Static Random Access 
Memory) có thể lập trình lại nhiều lần và loại OTP (One - Time 
Programmable) lập trình một lần. 
11 
Hình 1.4. Cấu trúc của FPGA 
 Hai loại này khác nhau ở chỗ thực hiện của các logic cell và kỹ 
thuật tạo sự kết nối giữa chúng trong thiết bị. Loại hay đ−ợc dùng 
hơn cả là loại SRAM, vì nó có thể lập trình đ−ợc nhiều lần. Thực tế 
thì SRAM FPGA đ−ợc nạp cấu hình lại mỗi khi bật nguồn, bởi vì 
FPGA loại này thực chất là một chíp nhớ theo ý muốn. Có một câu 
hỏi đặt ra là " Tại sao lại cần một chip PROM nối tiếp hoặc bộ nhớ 
hệ thống? " cùng với mỗi SRAM FPGA . Xem cấu trúc của hai loại 
với hình vẽ 1.5 và 1.6: 
12 
Hình 1.5. Cấu trúc SRAM FPGA ( SRAM Logic Cell) 
- Loại SRAM có thể lập trình lại : 
 + SRAM xác định các đ−ờng kết nối. 
 + SRAM xác định đơn vị logic trong bảng LUT ( Look Up 
Table ) 
( Mỗi một LUT là một bộ tạo chức năng hay bộ tạo hàm với N 
đầu vào và một đầu ra, có thể thực hiện bất cứ chức năng logic nào 
với N đầu vào của nó. N th−ờng nằm giữa 2 và 6, thông th−ờng các 
LUT có 4 đầu vào ). 
Hình 1.6 . Cấu trúc của OTP FPGA (OTP Logic Cell) 
- Loại OTP cho phép lập trình một lần : 
 + Các đ−ờng nối không đ−ợc phép nối nh− dạng cầu chì ( Nối 
cố định ). 
 + Logic là các cổng truyền thống . 
Trong SRAM Logic Cell, thay vì các cổng thông th−ờng, một 
LUT ( bộ tạo hàm ) sẽ xác định các đầu ra dựa vào giá trị cuả các 
đầu vào. Nh− hình 1.5 ta thấy sáu tổ hợp khác nhau của bốn bít vào 
13 
xác định các giá trị của đầu ra, các bit này cũng đ−ợc dùng để thực 
thi các kết nối. Trong OTP FPGAs sử dụng kết nối 
giữa các đ−ờng theo dạng nối ng−ợc ( Có nghĩa ng−ợc với cầu trì, sự 
kết nối đ−ợc tạo ra và không bị nóng chảy trong suốt thời gian nạp 
ch−ơng trình), nhằm tạo ra các kết nối cố định trong chip. Hơn nữa, 
OTP FPGA không cần SPROM nào khác, điều đó có nghĩa là nạp 
cấu hình vào thẳng FPGA. Tuy nhiên mỗi lần thay đổi một thiết kế 
bạn phải vứt bỏ đi một chip. Loại OTP Logic Cell có cấu trúc t−ơng 
tự nh− họ PLD (Programmable Logic Device), bao gồm các cổng và 
flip - flop chuyên dụng nh− Flip-Flop loại D , T , hay RS . 
1.2. Giới thiệu các họ thiết bị của Xilinx 
Xilinx chia sản phẩm của mình ra rất nhiều họ nh−ng tài liệu sẽ 
tập trung chính vào việc giới thiệu hai loại FPGA và CPLD cơ bản, 
xem hình vẽ (Hình2.1). Đó là lọai thiết bị CoolRunner - XPLA3 
CPLD, và Spartan 3 FPGA. 
14 
Hình1.7. Sơ l−ợc các họ thiết bị của Xilinx 
1.2.1. Họ Platform FPGAs 
Hình 1.7 cho ta thấy đ−ợc tổng quan các họ sản phẩm chính cuả 
Xilinx. ở đây xin chỉ giới thiệu tổng quan và đ−a ra các địa chỉ cần 
tra cứu về chi tiết kỹ thuật của chúng trên trang Web của hãng 
Xilinx. 
Họ Virtex FPGAs : Sản phẩm Virtex-II là hiện thân đầu tiên 
của Platform FPGA. Nó đã tạo ra một điểm dấu mới trong sự thực 
thi, cộng thêm hàng loạt các tính năng mới của thiết bị mà từ tr−ớc 
ch−a có. Đây là thời kỳ mà Xilinx mở rộng tầm chiến l−ợc của mình 
bằng việc kết hợp với các hãng IBM, ... = HI; 
 uart_STB_I <= HI; 
 uart_ACK_O <= uart_STB_I; 
 end if; 
-- pin_led <= '0'; 
 else 
-- charBuf <= "00000000"; 
 uart_STB_I <= LO; 
 uart_ACK_O <= uart_STB_I; 
 pin_led <= '0'; 
 end if; 
 end if; 
end process; 
19 
------------------------------------------
------------ 
process (Pushbtn,charBuf,CLK) 
Begin 
 if Pushbtn = '1' then 
 Start <= '1' ; 
 Cnt_Dir <= '1'; 
 Inc <= '1'; 
 elsif CLK'event and CLK = '1' then 
 case charBuf is 
 when x"53" => -- 
Start 
 Start <= '0'; 
 when x"42" => -- Stop 
 Start <= '1'; 
 when x"4C" => -- 
Left 
 Cnt_Dir <= '1'; 
 when x"52" => -- Right 
 Cnt_Dir <= '0'; 
 when x"55" => -
- Up 
 Inc <= '0'; 
 when x"44" => -- 
Down 
 Inc <='1' ; 
 when others => 
 Start <= '1'; 
 Cnt_Dir <= '1' ; 
 Inc <= '1'; 
 end case; 
 end if; 
end Process; 
end arch; 
--------------------------------- 
20 
UART.vhd-------------------------------- 
------------------------------------------
------------------- 
-- Title : UART 
--- 
-- Project : UART --- 
-- Clock : 50MHz Using Clock of Board 
XC3s200 --- 
-- Author : Pham Tuan Hai_Lop Dieu 
Khien K15 --- 
------------------------------------------
------------------- 
------------------------------------------
------------------- 
library ieee; 
 use ieee.std_logic_1164.all; 
entity UART is 
 generic(BRDIVISOR: INTEGER range 0 to 
65535 := 130); 
 port ( 
 CLK_I : in std_logic; 
 RST_I : in std_logic; 
 ADR_I : in std_logic_vector(1 downto 
0); 
 DAT_I : in std_logic_vector(7 downto 
0); 
 DAT_O : out std_logic_vector(7 downto 
0); 
 WE_I : in std_logic; 
 STB_I : in std_logic; 
 ACK_O : out std_logic; 
-- process signals 
-- Transmit interrupt: indicate waiting 
for Byte 
 IntTx_O : out std_logic; 
 IntRx_O : out std_logic; 
21 
 BR_Clk_I : in std_logic; 
 TxD_PAD_O: out std_logic; 
 RxD_PAD_I: in std_logic); 
end UART; 
-- Architecture for UART for synthesis 
architecture Behaviour of UART is 
------------------------------------------
------------------ 
component Counter 
 generic(COUNT: INTEGER range 0 to 
65535); 
port ( 
 Clk : in std_logic; -- Clock 
 Reset : in std_logic; -- Reset 
input 
 CE : in std_logic; -- Chip 
Enable 
 O : out std_logic); -- Output 
end component; 
------------------------------------------
------------------ 
component Rx 
port ( 
 Clk : in std_logic; 
 Reset : in std_logic; 
 Enable : in std_logic; 
-- Async Read Received Byte . ReadA =1 
then no thing to do, ReadA=0 => read 
 ReadA : in Std_logic; 
 RxD : in std_logic; 
 RxAv : out std_logic; 
 DataO : out std_logic_vector(7 
downto 0)); 
end component; 
------------------------------------------
------------------ 
22 
component Tx 
port ( 
 Clk : in std_logic; 
 Reset : in std_logic; 
 Enable : in std_logic; 
-- Asynchronous Load signal =1 then 
transfer Data in input to Buffer, BufL=1 
 LoadA : in std_logic; 
 TxD : out std_logic; 
 Busy : out std_logic; 
 DataI : in std_logic_vector(7 
downto 0)); -- Byte to transmit 
end component; 
------------------------------------------
------------------ 
-- Signals of uart 
 signal RxData : std_logic_vector(7 
downto 0); 
 signal TxData : std_logic_vector(7 
downto 0); 
 signal SReg : std_logic_vector(7 
downto 0); 
 signal EnabRx : std_logic; -- Enable RX 
unit 
 signal EnabTx : std_logic; -- Enable TX 
unit 
-- Data Received =1 Buffer contains a 
received byte ,=0 Buffer empty or idle 
 signal RxAv : std_logic; 
-- Transmiter Busy =1 is Busy , =0 Accept 
a byte to transmit 
 signal TxBusy : std_logic; 
 signal ReadA : std_logic; -- Async 
Read receive buffer 
 signal LoadA : std_logic; -- Async 
Load transmit buffer 
23 
 signal Sig0 : std_logic; -- gnd 
signal 
 signal Sig1 : std_logic; -- vcc 
signal 
------------------------------------------
------------------ 
BEGIN 
 sig0 <= '0'; 
 sig1 <= '1'; 
------------------------------------------
------------------------------------- 
Uart_Rxrate : Counter 
 generic map (COUNT => BRDIVISOR) 
 port map (BR_CLK_I, sig0, sig1, EnabRx); 
------------------------------------------
------------------------------------ 
Uart_Txrate : Counter 
 generic map (COUNT => 8) 
 port map (BR_CLK_I, Sig0, EnabRx, 
EnabTx); 
------------------------------------------
------------------------------------- 
Uart_Tx : Tx 
 port map (BR_CLK_I, RST_I, EnabTX, 
LoadA, TxD_PAD_O, TxBusy, TxData); 
Uart_Rx : Rx 
 port map (BR_CLK_I, RST_I, EnabRX, 
ReadA, RxD_PAD_I, RxAv, RxData); 
------------------------------------------
------------------------------------- 
 IntTx_O <= not TxBusy; 
-- Flag signal TxBusy=1 Transmiter is 
Busy ,or IntTx_0 = 0 is Busy 
 IntRx_O <= RxAv; 
-- RxAv =1 one Byte Received 
-- RxAv =0 Receiver Buffer empty 
24 
 SReg(0) <= not TxBusy; 
 SReg(1) <= RxAv; 
 SReg(7 downto 2) <= "000000"; 
------------------------------------------
------------------------------------- 
-- Clocked on rising edge. Synchronous 
Reset RST_I 
------------------------------------------
------------------------------------- 
WBctrl : process(CLK_I, RST_I, STB_I, 
WE_I, ADR_I) 
 variable StatM : std_logic_vector(4 
downto 0); 
begin 
 if Rising_Edge(CLK_I) then -- 
System Clock rising 
 if (RST_I = '1') then -- if 
no Reset 
 ReadA <= '0'; -- ReadA 
Signal =0 
 LoadA <= '0'; -- LoadA 
Signal =0 
 else -- When reset = 0 
occured 
 -- Write Byte to Tx 
 if (STB_I = '1' and WE_I = '1' and 
ADR_I = "00") then 
 -- Get input connect to TxData input 
signal of Transmiter 
 TxData <= DAT_I; 
 -- Async transmit buffer Load signal , 
load data into Transmiter 
 LoadA <= '1'; 
 else LoadA <= '0'; 
 end if; 
 -- Read Byte from Rx 
25 
 if (STB_I = '1' and WE_I = '0' and 
ADR_I = "00") then 
 -- DAT_O <= RxData; -- Out Data to Bus 
 -- Async receive buffer Read signal 
connects to ReadA input of Receiver 
 ReadA <= '1'; -- Signal is used 
to read buffer, ReadA=1 => Read 
 else ReadA <= '0'; 
 end if; 
 end if; 
 end if; 
end process; 
------------------------------------------
------------------------------------- 
ACK_O <= STB_I; 
DAT_O <= 
 RxData when ADR_I = "00" else -- Read 
Byte from Rx 
 SReg when ADR_I = "01" else -- Read 
Status Reg 
 "00000000"; 
end Behaviour; 
-------------------------------------- 
Rx.vhd----------------------------- 
------------------------------------------
------------------- 
-- Title : UART --- 
-- Project : UART --- 
-- Clock : 50MHz --
- 
-- Author : Pham Tuan Hai 
--- 
------------------------------------------
------------------- 
library ieee; 
 use ieee.std_logic_1164.all; 
26 
entity Rx is 
port ( 
Clk : in std_logic; 
Reset : in std_logic; 
Enable : in std_logic; 
ReadA : in Std_logic; 
RxD : in std_logic; 
 RxAv : out std_logic; 
 DataO : out std_logic_vector(7 
downto 0)); 
end Rx; 
------------------------------------------
------------------------------------- 
architecture Behaviour of Rx is 
 signal RReg : std_logic_vector(7 downto 
0); 
 signal RRegL: std_logic; 
begin 
------------------------- RxAv process----
------------------------ 
RxAvProc : process(RRegL,Reset,ReadA) 
 begin 
 if ReadA = '1' or Reset = '1' then 
 RxAv <= '0'; 
 elsif Rising_Edge(RRegL) then 
 RxAv <= '1'; 
 end if; 
 end process; 
----------------------- Rx Process--------
------------------------- 
 RxProc : 
process(Clk,Reset,Enable,RxD,RReg) 
 variable BitPos : INTEGER range 0 to 10; 
 variable SampleCnt : INTEGER range 0 to 
3; 
27 
 begin 
 if Reset = '1' then 
 RRegL <= '0'; 
 BitPos := 0; 
 elsif Rising_Edge(Clk) then 
 if Enable = '1' then 
 case BitPos is 
 when 0 => 
 RRegL <= '0'; 
 if RxD = '0' then 
 SampleCnt := 0; 
 BitPos := 1; 
 end if; 
 when 10 => 
 BitPos := 0; 
 RRegL <= '1'; 
 DataO <= RReg; 
 when others => 
 if (SampleCnt = 1 and 
BitPos >= 2) then 
 RReg(BitPos-2)<=RxD ; 
 end if; 
 if SampleCnt = 3 then 
 BitPos := BitPos + 1; 
 end if; 
 end case; 
 -- 
 if SampleCnt = 3 then 
 SampleCnt := 0; 
 else 
 sampleCnt := SampleCnt + 1; 
 end if; 
 -- 
 end if; 
 end if; 
 end process; 
28 
end Behaviour; 
------------------------------------ 
Tx.vhd-------------------------------- 
------------------------------------------
------------------- 
-- Title : UART --
- 
-- Project : UART --- 
-- Clock : 50MHz --
- 
-- Author : Pham Tuan Hai 
--- 
------------------------------------------
------------------- 
------------------------------------------
------------------- 
library ieee; 
use ieee.std_logic_1164.all; 
entity Tx is 
 port ( 
 Clk : in std_logic; 
 Reset : in std_logic; 
 Enable : in std_logic; 
 LoadA : in std_logic; 
 TxD : out std_logic; 
 Busy : out std_logic; 
 DataI : in std_logic_vector(7 
downto 0)); 
end Tx; 
------------------------------------------
--------------------------- 
architecture Behaviour of Tx is 
------------------------------------------
--------------------------- 
component synchroniser 
 port ( 
29 
 C1 : in std_logic; 
 C : in std_logic; 
 O : out Std_logic); 
end component; 
 signal TBuff : std_logic_vector(7 downto 
0); 
 signal TReg : std_logic_vector(7 downto 
0); 
 signal TBufL : std_logic; 
 signal LoadS : std_logic; 
------------------------------------------
-------------------------------------begin 
-- Begin of Architech 
-- Synchronise Load on Clk 
SyncLoad : Synchroniser port map (LoadA, 
Clk, LoadS); 
 Busy <= LoadS or TBufL; 
-- Tx process 
------------------------------------------
----------------------- 
TxProc : process(Clk, Reset, Enable, 
DataI, TBuff, TReg, TBufL) 
 variable BitPos : INTEGER range 0 to 10; 
begin 
 if Reset = '1' then 
 TBufL <= '0'; 
 BitPos := 0; 
 TxD <= '1'; 
 elsif Rising_Edge(Clk) then 
 if LoadS = '1' then 
 TBuff <= DataI; 
 TBufL <= '1'; 
 end if; 
 if Enable = '1' then 
 case BitPos is 
30 
 when 0 => 
 TxD <= '1'; 
 if TBufL = '1' then 
 TReg <= TBuff; 
 TBufL <= '0'; 
 BitPos := 1; 
 end if; 
 when 1 => 
 TxD <= '0'; 
 BitPos := 2; 
 when others => 
 TxD <= TReg(BitPos-2); -- 
Serialisation of TReg 
 BitPos := BitPos + 1; 
 end case; 
 if BitPos = 10 then -- 
bit8. next is stop bit 
 BitPos := 0; 
 end if; 
 end if; 
 end if; 
end process; 
end Behaviour; 
------------------------------- 
COUNTER.vhd----------------------------- 
------------------------------------------
------------------- 
-- Title : UART 
--- 
-- Project : UART --- 
-- Clock : 50MHz --
- 
-- Author : Pham Tuan Hai 
--- 
------------------------------------------
------------------- 
31 
------------------------------------------
------------------- 
library IEEE,STD; 
use IEEE.std_logic_1164.all; 
entity Counter is 
 generic(Count: INTEGER range 0 to 
65535); -- Count revolution 
 port ( 
 Clk : in std_logic; -- Clock 
 Reset : in std_logic; -- Reset 
input 
 CE : in std_logic; -- Chip 
Enable 
 O : out std_logic); -- Output 
end Counter; 
------------------------------------------
---------------------- 
------------------------------------------
---------------------- 
architecture Behaviour of Counter is 
begin 
 counter : process(Clk,Reset) 
 -- Variable Cnt is using temple count 
variable 
 variable Cnt : INTEGER range 0 to 
Count-1; 
 begin 
 if Reset = '1' then 
 Cnt := Count - 1; 
 O <= '0'; 
 elsif Rising_Edge(Clk) then 
 if CE = '1' then 
 -- 
 if Cnt = 0 then 
 O <= '1'; 
32 
 Cnt := Count - 1; 
 else 
 O <= '0'; 
 Cnt := Cnt - 1; 
 end if; 
 -- 
 else O <= '0'; 
 end if; 
 end if; 
 end process; 
end Behaviour; 
-------------------------- 
Synchroniser.vhd------------------ 
------------------------------------------
------------------- 
-- Title : UART --- 
-- Project : UART --- 
-- Clock : 50MHz --- 
-- Author : Pham Tuan Hai 
--- 
------------------------------------------
------------------- 
------------------------------------------
------------------- 
library IEEE,STD; 
use IEEE.std_logic_1164.all; 
entity synchroniser is 
 port ( 
 C1: in std_logic; -- Asynchronous 
signal 
 C : in std_logic; -- Clock 
 O : out std_logic); -- Synchronised 
signal 
end synchroniser; 
------------------------------------------
33 
------------------------- 
architecture Behaviour of synchroniser is 
 signal C1A : std_logic; 
 signal C1S : std_logic; 
 signal R : std_logic; 
begin 
 RiseC1A : process(C1,R) 
 begin 
 if Rising_Edge(C1) then 
 C1A <= '1'; 
 end if; 
 if (R = '1') then 
 C1A <= '0'; 
 end if; 
 end process; 
------------------------------------------
------------------------- 
 SyncP : process(C,R) 
 begin 
 if Rising_Edge(C) then 
 if (C1A = '1') then 
 C1S <= '1'; 
 else C1S <= '0'; 
 end if; 
 if (C1S = '1') then 
 R <= '1'; 
 else R <= '0'; 
 end if; 
 end if; 
 if (R = '1') then 
 C1S <= '0'; 
 end if; 
 end process; 
 O <= C1S; 
34 
end Behaviour; 
35 
Tμi liệu tham khảo 
1. Nguyễn Tăng C−ờng, Phan Quốc Thắng, Vũ Hữu Nghị 
(2002), Cấu trúc 
 máy tính, Học viện kỹ thuật quân sự, Hà Nội. 
2. Nguyễn Tăng C−ờng, Phan Quốc Thắng, Trần Văn Hợp 
(2002), Cấu trúc 
 các hệ xử lý tín hiệu số, Học viện kỹ thuật quân sự, Hà 
Nội 
3. Nguyễn Tăng C−ờng, Phan Quốc Thắng (2003), Cấu trúc và 
lập trình họ 
 vi điều khiển 8051, Học viện kỹ thuật quân sự, Hà Nội.
4. Văn Thế Minh (1998), Kỹ thuật vi xử lý, NXB Giáo dục, Hà 
Nội 
5. Đỗ Xuân Tiến (1991), Kỹ thuật vi xử lý, Học viện kỹ thuật 
quân sự, Hà 
 Nội. 
6. David Harris (1955) Structural Design With Verilog Harvey 
Mudd 
 College. 
7. Donnamaie E. White (2002), Logic Design for Array-Based 
Circuits, 
 Original Hardcover – Still, London. 
8. Don Davis (Winter 2002), “Architectural Synthesis: 
Unleashing the 
36 
 Power of FPGA System-Level Design”, Xcell Journal, 
(Issue 44), 
 pages 30–34, Xilinx, United States of America. 
9. Giovanni De Micheli, Rajesh K. Gupta (3/1997), 
“Hardware/Software 
 Co-Design”, Proceedings of the IEEE, (Vol. 85, No 3), 
 pages 349 – 64. 
10. Daniel Tabak (1995), Advanced Microprocesors, McGraw-
Hill, United 
 States of America. 
11. Donnamaie E. White (2002), Logic Design for Array-Based 
Circuits, 
 Original Hardcover – Still, London. 
12. Don Davis (Winter 2002), “Architectural Synthesis: 
Unleashing the 
 Power of FPGA System-Level Design”, (Issue 44), 
pages 30 – 34, 
13. Michael John Sebastian Smith (1997), Application-Specific 
Integrated 
 Circuits, Hardcover (www.Amazon.com), United 
States of 
 America. 
14. Peter J.Ashenden (1990), The VHDL CooKBook, University 
of Adelaide, 
37 
 South Australia. 
15. Roger Lipsett & Carl Schaefer (1989), VHDL: Hardware 
Description 
 and Design, Kluwer Academic Publishers, United 
States of 
 America. 
16. Nguồn tham khảo từ Internet 
  xlnx/xil_ans_brower.jsp 
xlnx/xweb/xil_publications_index.jsp 

File đính kèm:

  • pdfgiao_trinh_thiet_ke_thiet_bi_dien_tu_lap_trinh_su_dung_cong.pdf