Tải bản đầy đủ (.docx) (26 trang)

Đề tài "Thiết kế bộ xử lý hình ảnh quảng cáo trên nền LED matrix sử dụng FPGA" ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (478.3 KB, 26 trang )

PVP_bk3i1_k50
MỤC LỤC :
LỜI MỞ ĐẦU
Ngày nay công nghệ vi điện tử đã trở thành một lĩnh vực phát triển và được rất nhiều các
nước trên thế giới chú trọng phát triển.Tại sao nó lại được chú trọng đến vậy,xét về phạm vi
ứng dụng ta thấy hệ Nhúng có liên quan,ảnh hưởng đến nhiều lĩnh vực trong đời sống.
Trong sinh hoạt của con người,nó làm cho cuộc sống của con người ngày càng tiện
nghi,thoải mái.sự xuất hiện hàng loạt các thiết bị phục vụ nhu cầu đời sống của con người
không chỉ tăng về số lượng mà còn tăng về tính năng,chất lượng và độ an toàn như máy giặt,tủ
lạnh,lò vi sóng…
Trong sản xuất,nó làm tăng năng suất lao động,giảm sức lao động của con người,thay con
người hoạt động ở những nơi có điều kiện hết sức khắc nhiệt…Và nó liên quan đến các ứng
dụng công nghệ cao như vũ trụ…
Với tầm quan trọng của công nghệ vi điện tử.Nó xứng đáng là lĩnh vực mang tầm chiến lược
trong sự phát triển của các nước trên thế giới.Nước ta cũng không ngoại lệ,việc xác định được
tầm quan trọng đó.Nhà nước cũng ưu tiên trong đầu tự,việc học,nghiên cứu.Nhiều cơ sở và
trung tâm nghiên cứu đã và đang hoạt động ,phát triển.
1
PVP_bk3i1_k50
Với sinh viên trường kĩ thuật thì đây là nghành học đầy tiềm năng.Nhiều cuộc thi, nhiều
công trình nghiên cứu khoa học phục vụ cho việc học và nghiên cứu đã ra đời,nhằm mục đích
phát triển sự học hỏi,sự sáng tạo,tư duy,gắn liền với thực tiễn.
Theo yêu cầu của mô học cũng như để sử dụng thành thạo công nghệ FPGA em đã quyết
định chọn để tài :
“Thiết kế bộ xử lý hình ảnh quảng cáo trên nền LED matrix sử dụng FPGA”.
Nội dung đè tài :
 Tìm hiểu về LED matrix
 Tìm hiểu về FPGA
 Tìm hiểu phần mềm hỗ trợ thiết kế xilinx ISE
 Thiết kế hệ thống
Vì đây là trong khuôn khổ bài tập lớn, nên em chỉ thiết kế trên mô hình thí nghiệm,


sử dụng ngôn ngữ VHDL để mô hình hóa hệ thống phần cứng . Em xin chân thành cám ơn
thầy LÊ HẢI SÂM đã hướng dẫn chi tiết về FPGA và phương pháp thiết kế mô hình hóa
phần cứng.
Hà Nội, ngày 30-10-2009
Sinh viên thực hiện :
Phạm Văn Phong
CHƯƠNG I ĐẶT VẤN ĐỀ VÀ NHIỆM VỤ CỦA ĐỒ ÁN
I – Đặt vấn đề
Trong thời đại ngày nay, khoa học công nghệ ngày càng phát triển và được ứng
dụng rất nhiều trong thực tế. Trong đó thì các lĩnh vực như giả trí, dịch vụ quảng cáo
khuếch trương sản phầm để thu hút sự chú ý của các doanh nghiệp cũng như cá nhân ngày
càng phát triển mạnh mẽ. Để làm cho sản phầm hoặc hình ảnh công ty thu hút sự chú ý,
quan tâm của khách hàng thì dịch vụ quảng cáo phải thật ấn tượng, choáng ngợp, bắt mắt…
Để giải quyết vấn đề này thì có rất nhiều phương án, nhưng hiện nay phương án mà được
các giới kinh doanh sử dụng hiệu quả nhất là dùng bảng led matrix. Với những xử lý hình
ảnh sống động, màu sắc ấn tượng đã là sự lựa chọn hàng đầu cho các nhà kinh doanh. Do
đó, thiết kế hệ thống bảng điện tử để phục vụ nhu cầu quảng cáo, khuếch trương hình ảnh
cửa hàng, doanh nghiệp, công ty là rất cần thiết.
II – Nhiệm vụ của đồ án
2
PVP_bk3i1_k50
Với sự lựa chọn để tài này, trước tiên em cần phải tìm hiểu chi tiết về LED matrix
cũng như các phương pháp quét LED, hiển thị xử lý hình ảnh…Sau đó tìm hiểu các phương
pháp ứng dụng FPGA để giải quyết bài toán đặt ra. Vì giới hạn của để tài chỉ thực hiện mô
phỏng và hiểu cách thức hoạt động, phương pháp lập trình sử dụng FPGA cùng với thời
gian thực hiện ít nên em chỉ giải quyết bài toán dưới dạng mô hình, hi vọng khi có thời gian
và điều kiện thì em có thể triển khai ứng dụng thực tế.
CHƯƠNG II CƠ SỞ LÝ THUYẾT
I - LED Matrix
Dựa trên nguyên tắc như quét màn hình,ta có thể thực hiện việc hiển thị ma trận đèn bằng

cách quét theo hang và quét theo cột.Mỗi Led trên ma trận Led có thể coi như một điểm
ảnh.Địa chỉ của mỗi điểm ảnh này được xác định đồng thời bởi mạch giải mã hang và giải
mã cột,điểm ảnh này sẽ được xác định nhờ dữ liệu đưa ra từ bộ đi điều khiển.
Như vậy tại mỗi thời điểm chỉ có trạng thái của một điểm ảnh xác định.Tuy nhiên khi
xác định địa chỉ và trạng thái của điểm ảnh tiếp theo thì các điểm ảnh còn lại sẽ chuyển về
trạng thái tắt.Vì thế để hiển thị được toàn bộ hình ảnh mà ta muốn thì ta phải quét ma trận
nhiều lần với tốc độ quét rất lớn,lớn hơn nhiều lần thời gian kịp tắt của đèn.Mắt người chỉ
nhận biết được tối đa 24 hình/s do đó nếu tốc độ quét lớn mắt người sẽ không nhận biết
được sự gián đoạn hay là nhấp nháy của đèn Led(đánh lừa cảm giác mắt).
Một điều cũng quan trọng ở đây là điều chỉnh độ sang của Led,thong thường Led sáng
bình thường ở điện áp 2-3V,dòng điện từ 20-30mA.Để đảm bảo Led sáng bình thường thì
yêu cầu mạch thiết kế phải đáp ứng đủ 2 điều kiện trên.
Sơ đồ khối :
Ma trận LED
bộ đệm
Giải mã


Để thực hiện được quét hang và quét cột thì ma trận Led được thiết kết như sau:
3
PVP_bk3i1_k50
2
Hàng 1
2
3
4

3
4
Cột 1 2 3 4

Trạng thái của một Led sẽ được quyết định bởi tín hiệu điện áp đi vào đồng thời cả 2 chân.để
Led sáng thì ta phải cấp điện áp phù hợp vào chân dương của Led(chân Anot),còn chân catot thì
nối đất.Đèn tắt khi ta không cấp nguồn cho Led hoặc để 2 đầu anot và catot cung ở mức điện áp.
Ta có sơ đồ mạch nguyên lý của Led 8x8:
4
PVP_bk3i1_k50
II – FPGA
Field-programmable gate array (FPGA) là vi mach dùng cấu trúc mảng phần tử logic mà
người dùng có thể lập trình được. (Chữ field ở đây muốn chỉ đến khả năng tái lập trình “bên
ngoài” của người sử dụng, không phụ thuộc vào dây chuyền sản xuất phức tạp của nhà máy
bán dẫn). Vi mạch FPGA được cấu thành từ các bộ phận:
• Các khối logic cơ bản lập trình được (logic block)
• Hệ thống mạch liên kết lập trình được
• Khối vào/ra (IO Pads)
• Phần tử thiết kế sẵn khác như DSP slice, RAM, ROM, nhân vi xử lý
FPGA cũng được xem như một loại vi mạch bán dẫn chuyên dụng ASIC, nhưng nếu so
sánh FPGA với những ASIC đặc chế hoàn toàn hay ASIC thiết kế trên thư viện logic thì
FPGA không đạt đựợc mức độ tối ưu như những loại này, và hạn chế trong khả năng thực
hiện những tác vụ đặc biệt phức tạp, tuy vậy FPGA ưu việt hơn ở chỗ có thể tái cấu trúc lại
khi đang sử dụng, công đoạn thiết kế đơn giản do vậy chi phí giảm, rút ngắn thời gian đưa
sản phẩm vào sử dụng.
Còn nếu so sánh với các dạng vi mạch bán dẫn lập trình được dùng cấu trúc mảng phần tử
logic như PLA, PAL, CPLD thì FPGA ưu việt hơn các điểm: tác vụ tái lập trình của FPGA
thực hiện đơn giản hơn; khả năng lập trình linh động hơn; và khác biệt quan trọng nhất là
kiến trúc của FPGA cho phép nó có khả năng chứa khối lượng lớn cổng logic (logic gate),
so với các vi mạch bán dẫn lập trình được có trước nó.
Thiết kế hay lập trình cho FPGA được thực hiện chủ yếu bằng các ngôn ngữ mô tả phần
cứng HDL như VHDL, Verilog, AHDL, các hãng sản xuất FPGA lớn như Xilinx, Altera
thường cung cấp các gói phần mềm và thiết bị phụ trợ cho quá trình thiết kế, cũng có một
số các hãng thứ ba cung cấp các gói phần mềm kiểu này như Synopsys, Synplify Các gói

phần mềm này có khả năng thực hiện tất cả các bước của toàn bộ quy trình thiết kế IC
chuẩn với đầu vào là mã thiết kế trên HDL (còn gọi là mã RTL).
1) Kiến trúc FPGA
Cấu trúc tổng thể của một FPGA được minh họa ở hình sau.
5
PVP_bk3i1_k50
Khối logic FPGA
Phần tử chính của FPGA là các khối logic (logic block). Khối logic được cấu thành từ LUT
và một phần tử nhớ đồng bộ flip-flop, 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.
thumb|200px|Khối chuyển mạch của FPGA 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.
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) ngôn ngữ VHDL

Thiết kế hay lập trình cho FPGA được thực hiện chủ yếu bằng các ngôn ngữ mô tả phần
cứng HDL như VHDL, Verilog, AHDL .Em quyết định chọn ngôn ngữ VHDL để lập trình
cho FPGA.
6
PVP_bk3i1_k50
VHDL (VHSIC Hardware Description Laguage) là một ngôn ngữ đ ợc dùng để mô tả
các hệ thống phn cng điện tử số. Nó đ ợc ch ơng trình quốc gia về các mạch tích hợp
tốc độ rất cao - VHSIC (Very High Speed Integrated Circuits) do chính phủ Mỹ khởi x ớng
vào đầu những năm 1980. Các công ty tham gia ch ơng trình VHSIC nhận thấy rằng họ
cần phải có một công cụ nào đó để thiết kế các giản đồ đầu vào cho các IC chuyên dụng cỡ
lớn, và họ đã đề xuất việc lập ra một ngôn ngữ mô tả phần cứng dùng để mô tả cấu trúc và
chức năng của các mạch tích hợp (còn đ ợc gọi là IC - Integrated Circuits).
Kể từ đó, VHDL ra đời và đ ợc phát triển, rồi sau đó đ ợc Hiệp hội các kỹ s Điện
và Điện tử - IEEE (Institude of Electrical and Electronic Engineers) chấp nhận coi nh là
tiêu chuẩn tại Mỹ. Phiên bản đầu tiên là Tiêu chuẩn IEEE 1076-1987 (còn đ ợc gọi là
VHDL-87). Phiên bản này đ ợc bổ sung sửa đổi năm 1993 thành IEEE 1076-1993 (còn
đ ợc gọi là VHDL-93).
* Mô tả cấu trúc
Một hệ thống điện tử số có thể đ ợc mô tả thành các khối - còn gọi là module với
các đầu vào và đầu ra. Các giá trị điện ở đầu ra có mối quan hệ với các giá trị trên các đầu
vào. Hình 2.16a biểu diễn một ví dụ nh vậy. Khối F có hai đầu vào A và B, và có một đầu
ra Y. Sử dụng ngôn ngữ VHDL để mô tả khối F, thì ta gọi khối F là một thực thể (entity)
thiết kế, và các đầu vào và đầu ra là các cổng (port). Có một cách để mô tả chức năng của
khối F, đó là chúng ta mô tả các khối con (sub-module) thành phần của nó. Mỗi một khối
con đ ợc gọi là một tập hợp (instance) của một số thực thể, và các cổng của các tập hợp đó
đ ợc nối lại bằng các đ ờng tín hiệu (signal).
Hình di mô tả khối F là một tập hợp gồm các thực thể G, H và I. Kiểu mô tả này đ ợc
gọi là mô tả cấu trúc (structural). Các thực thể G, H và I cũng đ ợc mô tả theo cấu trúc
t ơng tự nh vậy.
(a) Khối F có hai đầu vào và một đầu ra; (b) Khối F gồm có 3 thực thể G, H, I

* Mô tả hoạt động
7
PVP_bk3i1_k50
Trong nhiều tr ờng hợp, việc mô tả cấu trúc không t ơng ứng với việc mô tả hoạt
động. Ng ời ta th ờng dùng cách mô tả hoạt động theo kiểu từ d ới lên dựa vào mô tả
cấu trúc. Ví dụ, khi chúng ta thiết kế hệ thống điện tử thì không cần phảI mô tả cụ thể cấu
trúc bên trong của từng con IC mà chỉ cần mô tả theo chức năng của các khối của hệ thống
mà thôi. Tr ờng hợp này đ ợc gọi là mô tả chức năng (fuctional) hoặc mô tả hoạt động
(behavioural).
Để minh hoạ cho điều này, chúng ta giả sử rằng chức năng của thực thể F trong Hình
2.16a là một mạch OR đảo. Khi mô tả hoạt động của F ta có thể biếnđổi theo đại số
Boolean nh sau:
Y = A.+ .B
Đối với các mạch có chức năng hoạt động phức tạp hơn, thì không thể biển diễn theo
các chức năng đầu vào đ ợc. Trong các hệ thống có phản hồi ng ợc, đầu ra th ờng là các
hàm chức năng theo thời gian. Ngôn ngữ VHDL cho phép giải quyết vấn đề này bằng cách
mô tả hoạt động theo khuôn dạng ch ơng trình lập trình.
* Mô tả sự kiện rời rạc theo thời gian
Khi chức năng hoạt động và cấu trúc của khối đã đ ợc chỉ định rõ, thì ng ời ta có thể
mô phỏng khối bằng cách kích hoạt theo mô tả hoạt động của nó. Điều này có thể thực hiện
đ ợc bằng cách mô phỏng quá trình hoạt động đã đ ợc rời rạc thành các b ớc theo thời
gian. Tại một vài thời điểm mô phỏng, khối đầu vào đ ợc kích hoạt bằng cách thay đổi giá
trị trên cổng đầu vào. Khối này phản ứng lại bằng cách thực hiện mã lệnh theo mô tả hoạt
động của nó đã đ ợc gán và tạo ra các giá trị mới đ a đến đ ờng tín hiệu để gửi tới các
cổng đầu ra của nó tại các thời điểm mô phỏng tiếp theo sau. Việc này đ ợc gọi là kế
hoạch giao tác (scheluding a transaction) trên tín hiệu đó. Nếu giá trị mới khác giá trị tr ớc
đó đã có trên đ ờng tín hiệu, thì sẽ có một sự kiện (event) xảy ra, và các khối khác với các
đầu vào đã đ ợc kết nối với đ ờng tín hiệu đó có thể sẽ đ ợc kích hoạt.
Quá trình mô phỏng bắt đầu với một pha đ ợc gọi là pha khởi động (initialisatoin
phase), và sau đó các quá trình đ ợc thực hiện lặp lại hai giai đoạn trong một chu kỳ mô

phỏng (simulation cycle). Trong pha khởi động, tất cả các tín hiệu đ ợc cung cấp sẵn các
giá trị khởi động, thời gian mô phỏng đ ợc đ a về 0, và mỗi một ch ơng trình hoạt động
của một khối đ ợc kích hoạt.
Trong giai đoạn đầu tiên của chu kỳ mô phỏng, thời gian mô phỏng đ ợc nâng Quá
trình mô phỏng bắt đầu với một pha đ ợc gọi là pha khởi động (initialisatoin phase), và sau
đó các quá trình đ ợc thực hiện lặp lại hai giai đoạn trong một chu kỳ mô phỏng
(simulation cycle). Trong pha khởi động, tất cả các tín hiệu đ ợc cung cấp sẵn các giá trị
khởi động, thời gian mô phỏng đ ợc đ a về 0, và mỗi một ch ơng trình hoạt động của
một khối đ ợc kích hoạt. Trong giai đoạn đầu tiên của chu kỳ mô phỏng, thời gian mô
phỏng đ ợc nâng lên thành thời gian sớm nhất tại thời điểm mà giao tác đã đ ợc thực
8
PVP_bk3i1_k50
hiện. Tất cả các giao tác đ ợc đ a vào tại thời điểm này đều đ ợc kích hoạt, và điều này
có thể gây ra một số sự kiện nào đó.
Trong gian đoạn thứ hai của chu kỳ mô phỏng, tất cả các khối phản ứng lại đối với các
sự kiện vừa xảy ra trong giai đoạn một sẽ kích hoạt ch ơng trình hoạt động của chúng. Các
ch ơng trình đó th ờng là kế hoạch giao tác trên các tín hiệu đầu ra của chúng. Khi tất cả
các ch ơng trình kết thúc hoạt động, chu kỳ mô phỏng đ ợc lặp lại. Nếu không có thêm
giao tác nào thì quá trình mô phỏng đã hoàn thành.
Mục đích của việc mô phỏng là để biết thêm thông tin về sự thay đổi trong hệ thống tại
từng thời điểm. Việc này có thể thực hiện đ ợc giám sát bởi ch ơng trình giám sát mô
phỏng (simulation monitor). Ch ơng trình này nhằm mục đích ghi lại quá trình hoạt động
theo từng thời điểm tại các điểm để dùng vào việc phân tích về sau.
* Cú pháp và ngữ nghĩa:
Hoạt động của một module có thể đ ợc mô tả theo dạng ngôn ngữ lập trình. Trong mục
này sẽ giới thiệu về cú pháp và ngữ nghĩa của các khái báo trong ngôn ngữ VHDL.
+ Các biểu thức và toán tử
Các biểu thức trong VHDL hoàn toàn t ơng tự nh các biểu thức trong các ngôn ngữ
lập trình khác. Một biểu thức là một công thức kết hợp các đa thức với các toán tử. Các đa
thức bao gồm tên các đối số, ký hiệu bằng chữ, các hàm gọi và các dấu ngoặc của biểu thức.

Các toán tử đ ợc liệt kê trong Bảng di theo thứ tự u tiên.
u tiờn cao nht **; abs; not;
u tiờn gim dn *; /; mod; rem;
u tiờn gim dn + (sign); -(sign)
u tiờn gim dn +; -; &;
u tiờn gim dn =; /=; <; <=; >; >=;
u tiờn thp nht And; or; nand; nor; xor;
Các toán tử logic and, or, nand, nor, xor và not hoạt động trên các giá trị kiểu bit hoặc là
boolean, và trên các mảng 1 chiều của các kiểu đó. Đối với các toán hạng mảng (array), sự
hoạt động tuân theo các phần tử t ơng ứng của từng mảng, th ờng độ lớn của mảng có
cùng độ lớn với kết quả. Đối với các toán hạng bit và boolean, các toán tử and, or, nand và
nor là các toán tử ngắn mạch (short-circuit), do chúng chỉ u tiên hơn so với toán hạng
bên phải của chúng nếu toán hạng bên trái không xác định đ ợc kết quả. Do and và nand
chỉ u tiên hơn so với toán hạng bên phải nếu toán hạng bên trái là true hoặc 1, còn or
và nor chỉ u tiên hơn toán hạng bên phải nếu toán hạng bên trái là false hoặc 0.
Các toán tử quan hệ =, /=, <, <=, > và >= phải có các toán hạng ở hai đầu cùng kiểu, và
th ờng cho các kết quả theo kiểu boolean. Các toán tử bằng (= và /=) có thể có các toán
9
PVP_bk3i1_k50
hạng theo bất kỳ kiểu nào. Đối với các toán tử so sánh, hai giá trị bằng nhau nếu tất cả các
phần tử t ơng ứng của chúng bằng nhau. Các toán tử dấu (+, -), các toán tử cộng (+) và trừ
(-) có cách sử dụng của chúng trên các toán hạng dạng số. Toán tử kết nối (&) làm việc trên
các mảng một chiều thành dạng một mảng mới với nội dung của toán hạng bên phải kế tiếp
toán hạng trái. Nó có thể móc nối một phần tử đơn vào một mảng hoặc hai phần tử độc lập
để thành một mảng mới.
Các toán tử nhân (*) và chia (/) làm việc với các số nguyên, số dấu phẩy động và các
kiểu đơn vị vật lý. Các toán tử chia lấy phần nguyên (mod- modulus) và chia lấy phần d
(rem - remainder) chỉ làm việc với kiểu số nguyên. Toán tử giá trị tuyệt đối (abs) chỉ làm
việc với bất kỳ kiểu số nào. Cuối cùng toán tử mũ (**) có thể làm việc với kiểu số nguyên
và toán hạng trái của kiểu số dấu phẩy động, nh ng phải có một số nguyên ở toán hạng

phải, còn toán hạng phải mà có giá trị âm chỉ đ ợc phép nếu toán hạng trái là một số dấu
phẩy động dạng số.
+ Các khai báo tuần tự
VHDL cung cấp một công cụ hiệu quả cho việc kiểm tra trạng thái của các đối t ợng
và điều khiển luồng hoạt động của các mô hình đó là các phép gán.
Phép gán biến
Nh các ngôn ngữ lập trình khác, một biến đ ợc gán một giá trị mới bằng cách sử
dụng phép khai báo gán.
Khai báo biến trong process có phạm vi chỉ trong process đó. Biến có thể khai báo trong
ch ơng trình con. Khai báo biến bên ngoài process hoặc ch ơng trình con thì gọi là shared
variable. Các biến này có thể cập nhật và đọc nhiều process.
L u ý tín hiệu không đ ợc khai báo trong process. Các phát biểu gán tín hiệu xuất hiện
trong process đ ợc gọi là phát biểu gán tín hiệu tuần tự, kể cả phát biểu gán biến, thực hiện
tuần tự độc lập với việc xuất hiện các sự kiện trên mỗi tín hiệu trong biểu thức bên phải,
khác với việc thực thi của các phát biểu gán tín hiệu đồng thời trong phần tr ớc.
Khai báo biến (bắt đầu bằng từ variable) khai báo biến khác với tín hiệu là nó luôn
đ ợc gán giá trị ngay tức khắc và phép gán tín hiệu là := tổ hợp ký hiệu, nó đ ợc gán giá
trị sau khoảng delay ( xác định do ng ời sử dụng hoặc mặc nhiên là khoảng delta) và phép
gán điều khiển việc gán giá trị cho biến <= tổ hợp symbol.
Cú pháp là:
khai báo gán biến : đích := biểu thức;
Trong tr ờng hợp đơn giản nhất, đích của phép gán là một tên đối t ợng, và giá trị của
biểu thức đ ợc gán theo tên đối t ợng. Đối t ợng và giá trị phải có cùng một kiểu.
10
PVP_bk3i1_k50
Khai báo If (nếu)
Khai báo If cho phép lựa chọn các khai báo để kích hoạt, phụ thuộc vào một hoặc nhiều
điều kiện. Cú pháp nh sau:
khai báo if :
if điều kiện then

chuỗi các khai báo
{ elsif điều kiện then
chuỗi các khai báo
[ else
chuỗi các khai báo }
end if;
Các điều kiện là các biểu thức trả về giá trị boolean. Các điều kiện đ ợc đánh giá là
đúng khi có một giá trị đ ợc trả về true. Ng ợc lại thì mệnh đề else đ ợc thực hiện, và
khai báo của nó đ ợc kích hoạt.
Khai báo Case
Dạng của phát biểu case là:
case expression is
when choices=> sequential -statement branch 1#
when choices=> sequential -statement branch 2#
có thể có nhiều nhánh
{when others=> sequential-statement}last branch
end case;
Phát biểu case lựa chọn một trong những nhánh cho việc thực thi dựa trên giá trị của
biểu thức. Giá trị biểu thức phải thuộc kiểu trừu t ợng hoặc kiểu mảng một chiều. Sự chọn
lựa có thể đ ợc thể hiện nh giá trị đơn, vùng giá trị bởi việc sử dụng dấu | hoặc sử dụng
mệnh đề khác. Tất cả các giá trị có thể có của biểu thức phải đ ợc thể hiện trong phát biểu
case đúng 1 lần. Các mệnh đề khác có thể đ ợc sử dụng để bao quát tất cả các giá trị, và
nếu có, phải là nhánh cuối cùng trong phát biểu case.
Các khai báo vòng lặp
11
PVP_bk3i1_k50
VHDL cung cấp kiểu khai báo vòng lặp cơ bản có thể sử dụng các vòng lặp while và for
giống nh trong các ngôn ngữ lập trình khác. Một phát biểu lặp đ ợc sử dụng để lặp lại
một loạt các câu lệnh tuần tự. Cú pháp của phát biểu lặp là:
[loop-label:] iteration-scheme loop

sequential-statements
end loop [loop-lebel];
Có 3 kiểu sơ đồ lặp. Đầu tiên là sơ đồ lặp có dạng:
for identifier in range
Một thí dụ cho sơ đồ lặp này là:
FACTORAL:=1;
for NUMBER in 2 to N loop
FACTORAL :=FACTORAL*NUMBER;
end loop;
Khai báo Null (rỗng)
Khai báo null không có hiệu quả. Nó có thể đ ợc sử dụng để biểu diễn trạng thái rõ
ràng là không có hành động nào đ ợc yêu cầu trong tr ờng hợp đó. Ng ời ta th ờng sử
dụng nó trong các khai báo case, trong đó tất cả các giá trị có thể của biểu thức lựa chọn
phải đ ợc liệt kê để chọn, nh ng đối với một vài lựa chọn thì không yêu cầu hành động
nào. Ví dụ nh sau:
case controller_command is
when forward => engage_motor_forward;
when reverse => engage_motor_reverse;
when idle => null;
end case;
*Ch ơng trình con
Giống nh các ngôn ngữ lập trình khác, VHDL cung cấp công cụ thực hiện ch ơng
trình con linh hoạt d ới dạng các thủ tục và các hàm. VHDL cũng cung cấp một kiểu đóng
gói mạnh đối với tập các mô tả và các đối t ợng đ a vào các đơn vị dạng module. Các
đóng gói cũng cung cấp một tiêu chuẩn về tính trừu t ợng dữ liệu và thông tin ẩn.
12
PVP_bk3i1_k50
CHƯƠNG III THIẾT KẾ HỆ THỐNG SỬ DỤNG PHẦN MỀM XILINX ISE
I-Tổng quan phần mền Xilinx ISE
Xilinx ISE (Integrated Software Environment) là một bộ phần mềm thiết kế của Xilinx ,

cho phép ta thực hiện các hệ thống nhúng của Xilinx từ khâu thiết kế ban đầu (thông qua
VHDL, Verilog HDL, ABEL hoặc là vẽ Schematic) cho đến khâu cuối cùng là nạp thiết kế
của mình lên FPGA. Để bắt đầu một thiết kế, ta phải tạo một project mới trong ISE thông
qua công cụ quản lý ISE Project Navigator. Sau đó ISE Project Navigator sẽ quản lý tất cả
các quá trình thiết kế trong trong project đó.
Quy trình thiết kết trong ISE bao gồm các quá trình sau : Design Entry -> Synthesis ->
Implementation -> Verification -> Device Configuration.
* Design Entry : Đây là bước đầu tiên trong quá trình thiết kế của ISE. Trong suốt quá
trình design entry, ta sẽ thiết kế những file nguồn (Source File) theo những yêu cầu ban đầu
(những mô tả chức năng của hệ thống mà ta cần phải thiết kế). Ở bước này, ta sẽ dùng
những ngôn ngữ mô tả phần cứng như : VHDL, Verilog HDL, Abel hoặc dạng Schematic
để thiết kế . Chúng ta có thể dùng nhiều ngôn ngữ khác nhau trong cùng một thiết kế. Ví dụ
như : thiết kế các module chức năng bằng Verilog HDL, sau đó dùng dạng schematic (sơ đồ
khối) để thiết kế hệ thống chính.
* Synthesis : Sau khi thiết kế hệ thống và thực hiện những mô phỏng để kiểm tra chức
năng logic của hệ thống, chúng ta phải chạy synthesis để chuyển đổi những file nguồn được
viết bằng VHDL,Verilog HDL, … thành file netlist. Những file netlist này cần thiết để đưa
vào quá trình Implementation.
* Implementation : Quá trình này sẽ chuyển đổi thiết kế ở mức logic thành các file định
dạng vật lý để có thể download xuống FPGA. Sau khi chạy Synthesis, chúng ta sẽ có
những file netlist, quá trình Implementation sẽ chuyển đổi những file netlist đó thành những
file cấu hình vật lý cụ thể dựa vào linh kiện FPGA cụ thể mà ta đang sử dụng, do đó quá
trình này đòi hỏi chúng ta phải chỉ rõ linh kiện FPGA nào đang được sử dụng.
* Verification: Sau khi chạy bước Implementation, chúng ta sẽ có thể mô phỏng thiết kế
của mình một cách chính xác hơn. Vì quá trình mô phỏng ở bước Design Entry chỉ có thể
mô phỏng chức năng của mạch chứ nó chưa thể mô phỏng thời gian (timing), timing tùy
thuộc vào linh kiện vật lý cụ thể .
* Device Configuration: Đây là bước cuối cùng trong suốt quá trình thiết kế . Ở bước
này các file định dạng cấu hình sẽ được dùng để tạo ra những file bitstream để nạp xuống
chip FPGA .

13
PVP_bk3i1_k50
II -Thiết kế chương trình điều khiển LED matrix
1. Sơ đồ khối
Ma trận LED
bộ đệm
Giải mã
1.1 Bộ giải mã:
Bộ giải mã còn được gọi là bộ phân kênh, nó có n ngõ ra, số ngõ ra này phụ thuộc vào số m
bit lựa chọn ở ngõ vào. Mối quan hệ giữa n và m là
m
n 2=
. Trong bộ giải mã có thêm một
đường Enable để cho phép bộ giải mã hoạt động hay ngừng hoạt động. Khi E=0 thì tất cả
các ngõ ra đều mang giá trị 0. Khi E=1 thì bộ giải mã sẽ hoạt động, nó sẽ lựa chọn ngõ ra
nào đó để đưa dữ liệu đến tùy thuộc vào các ngõ vào lựa chọn m. Ví dụ một bộ giải mã 3
sang 8. Nếu ngõ vào địa chỉ là 101 thì thì ngõ ra
5
Y
được lựa chọn để đưa dữ liệu ra (
5
Y
lên
14
PVP_bk3i1_k50
mức cao), trong khi đó tất cả các ngõ ra còn lại đều không được lựa chọn (tích cực mức
thấp).
Một bộ giải mã thường dùng rất nhiều thành phần và chúng ta muốn tại mỗi thời điểm chỉ
có một thành phần được cho phép hoạt động mà thôi. Ví dụ trong một hệ thống nhớ lớn sử
dụng nhiều con chip nhớ, tại mỗi thời điểm chỉ có một con chip nhớ được tích cực cho phép

hoạt động mà thôi. Một ngõ ra của bộ giải mã sẽ được nối đến một ngõ vào tích cực trong
mỗi con chip. Một địa chỉ được tạo ra từ bộ giải mã sẽ làm tích cực một con chip nhớ tương
ứng. Bảng chân trị, sơ đồ mạch và ký hiệu logic của bộ giải mã 3 sang 8 được biểu diễn
trong hình dưới.
Một bộ giải mã kích cỡ lớn có thể sử dụng một vài các bộ giải mã nhỏ hơn. Ví dụ trong
hình dưới sử dụng 7 bộ giải mã 1 sang 2 để xây dựng bộ giải mã 3 sang 8.
Một bộ giải mã 3 sang 8 (a) Bảng chân trị; (b) sơ đồ mạch; (c) ký hiệu logic.
15
PVP_bk3i1_k50
Hình 2. : Một bộ giải mã 3 sang 8 được xây dựng từ 7 bộ giải mã 1 sang 2.
Đoạn mã VHDL được viết theo cấu trúc Behavioral cho bộ giải mã 3 sang 8.
Library IEEE;
Use IEEE.STD_LOGIC_1164.ALL;
ENTITY Decoder IS PORT(
E: IN std_logic;
A: IN std_logic_vector(2 DOWNTO 0);
Y: OUT std_logic_vector(7 DOWNTO 0);
END Decoder;
ARCHITECTURE Behavioral OF Decoder IS
BEGIN
PROCESS (E, A)
BEGIN
IF (E='0') THEN khong hoat dong
Y<= (OTHERS => '0') ;
ELSE decoder hoat dong
CASE A IS lua chon ngo ra
16
PVP_bk3i1_k50
WHEN "000" => Y <= "00000001"; ngo ra la Y0
WHEN "001" => Y <= "00000010"; ngo ra la Y1

WHEN "010" => Y <= "00000100"; ngo ra la Y2
WHEN "011" => Y <= "00001000"; ngo ra la Y3
WHEN "100" => Y <= "00010000"; ngo ra la Y4
WHEN "101" => Y <= "00100000"; ngo ra la Y5
WHEN "110" => Y <= "01000000"; ngo ra la Y6
WHEN "111" => Y <= "10000000"; ngo ra la Y7
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
END Behavioral;
dạng xung mô phỏng bằng xilinx ISE:
1.2 Bộ đệm
Bộ đệm ba trạng thái là bộ có ba trạng thái: 0, 1 và trạng thái thứ ba được biểu thị bằng Z.
Giá trị của Z đặc trưng cho trạng thái trở kháng cao. Bộ đệm ba trạng thái được dùng để kết
nối một vài dịch vụ trên cùng một bus. Một bus có một hay nhiều đường dây truyền tín
17
PVP_bk3i1_k50
hiệu. Nếu hai hay nhiều dịch vụ được kết nối một cách trực tiếp đến một bus mà không sử
dụng bộ đệm ba trạng thái, thì những tín hiệu này sẽ bị sai lạc trong bus đó. Trong bộ đệm
ba trạng thái có sử dụng chân E (enable) để điều khiển hoạt động của nó. Khi E=0, bộ đệm
ba trạng thái không được tích cực và ngõ ra y ở trạng thái trở kháng cao. Khi E=1, bộ đệm
được cho phép hoạt động và ngõ vào d sẽ đưa được dữ liệu của nó đến ngõ ra y.
Một mạch chỉ với một cổng logic thì không thể tạo ra trạng thái trở kháng cao được. Do đó
để cung cấp trạng thái trở kháng cao, mạch đệm ba trạng thái sử dụng hai con transistor
CMOS đặc biệt kết nối với các cổng logic như trong hình dưới. Việc có thêm hai con
transistor họ CMOS này, chúng ta cần phải có một mạch để điều khiển chúng hoạt động
liên kết với nhau để tạo thành một bộ đệm ba trạng thái. Bảng chân trị của mạch điều khiển
được cho trong hình (c).
Khi E=0, cả hai con transistor CMOS đều tắt, y ở trạng thái trở kháng cao. Khi E=1 và d=0,

nếu chúng ta muốn y=0 thì nMOS dẫn và pMOS tắt, lúc này ngõ ra y sẽ bị kéo xuống thấp;
nếu chúng ta muốn y=1 thì nMOS tắt và pMOS dẫn, lúc này ngõ ra y sẽ bị đẩy lên mức cao
do y được nối lên nguồn. Mạch có hai ngõ vào E và d nên bảng chân trị sẽ có 4 cặp giá trị
là 00, 01, 10, 11. Dựa vào các giá trị này cộng thêm cách giải thích về hoạt động của các
con transistor CMOS ta có thể hoàn thành bảng chân trị như hình 2.26(c).
Bộ đệm ba trạng thái (a) bảng chân trị; (b) ký hiệu logic; (c) bảng chân trị cho việc phân
chia điều khiển cho mạch đệm ba trạng thái; (d) sơ đồ mạch.
Đoạn mã VHDL viết theo cấu trúc Behavioral cho bộ đệm ba trạng thái.
LIBRARY Ieee;
USE IEEE.std_logic_1164.ALL;
ENTITY dem_3_trang_thai IS PORT (
E: IN std_logic;
18
PVP_bk3i1_k50
d: IN std_logic_vector(7 DOWNTO 0);
Y: OUT std_logic_vector(7 DOWNTO 0));
END dem_3_trang_thai;
ARCHITECTURE Behavioral OF dem_3_trang_thai IS
BEGIN
PROGRESS (E, d)
BEGIN
IF (E = '1') THEN
Y <= d;
ELSE
Y<= (OTHERS => 'Z');
END IF;
END PROGRESS;
END Behavioral;
dạng đồ thị mô phỏng bằng xilinx ISE :
19

PVP_bk3i1_k50
2. CODE VHDL điều khiển LED matrix :
LIBRARY ieee;
LIBRARY std_developerskit;
USE ieee.std_logic_1164.all;
USE std.textio.all;
USE IEEE.std_logic_arith.all;
USE std_developerskit.std_iopak.all;
entity tb is
end tb;
ARCHITECTURE a OF tb IS
CONSTANT DATA_WIDTH : INTEGER :=8;
CONSTANT IMAGE_WIDTH : INTEGER := 198;
CONSTANT ROW_NUMBER : INTEGER := 135;
CONSTANT CLOCK_PERIOD : TIME := 50 ns;
CONSTANT F_FACTORS_PART : INTEGER := 15; float part width, 10-E4 accuracy
CONSTANT INT_FACTORS_PART: INTEGER := 3; integer part with, from -5 to +4
range (-4.999999 to 3.999999)
CONSTANT FACTORS_WIDTH : integer := (f_factors_part + int_factors_part); full
factor width
constant crgb2ycbcr601_a11 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000010000011011111"; 0.256789
constant crgb2ycbcr601_a12 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000100000010000110"; 0.504129
constant crgb2ycbcr601_a13 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000000110010001000"; 0.0979
20
PVP_bk3i1_k50
constant crgb2ycbcr601_a21 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"111110110100000111"; -0.148223

constant crgb2ycbcr601_a22 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"111101101011000001"; -0.290992
constant crgb2ycbcr601_a23 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000011100000111000"; 0.439215
constant crgb2ycbcr601_a31 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000011100000111000"; 0.439215
constant crgb2ycbcr601_a32 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"111101000011101100"; -0.367789
constant crgb2ycbcr601_a33 : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"111111011011011100"; -0.071426
constant crgb2ycbcr601_b1x : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000000000000000000"; 0
constant crgb2ycbcr601_b2x : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000000000000000000"; 0
constant crgb2ycbcr601_b3x : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000000000000000000"; 0
constant crgb2ycbcr601_b1y : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"000010000000000000"; 16
constant crgb2ycbcr601_b2y : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"010000000000000000"; 128
constant crgb2ycbcr601_b3y : SIGNED(FACTORS_WIDTH-1 DOWNTO 0) :=
b"010000000000000000"; 128
SIGNAL clk : STD_LOGIC;
SIGNAL rstn : STD_LOGIC;
SIGNAL x1,x2,x3 : UNSIGNED(DATA_WIDTH-1 DOWNTO 0);
SIGNAL x1bv,x2bv,x3bv : BIT_VECTOR(DATA_WIDTH-1 DOWNTO 0);
SIGNAL y1,y2,y3 : UNSIGNED(DATA_WIDTH-1 DOWNTO 0);
SIGNAL y1c,y2c,y3c : SIGNED(INT_FACTORS_PART-1 DOWNTO 0);
21
PVP_bk3i1_k50

SIGNAL y1bv,y2bv,y3bv : BIT_VECTOR(DATA_WIDTH-1 DOWNTO 0);
SIGNAL DATA_ENA : STD_LOGIC;
SIGNAL DOUT_RDY : STD_LOGIC;
BEGIN
READ_DATA: PROCESS(CLK, RSTN)
FILE file_in : ASCII_TEXT IS "X.txt";
VARIABLE digits_str1 : string(1 to 3);
VARIABLE digits_str2 : string(1 to 3);
VARIABLE digits_str3 : string(1 to 3);
BEGIN
if RSTN = '0' THEN
DATA_ENA <= '0';
elsif rising_edge(clk) then
if NOT endfile(file_in) THEN
fscan (file_in, "%x %x %x", digits_str1, digits_str2, digits_str3);
if digits_str1(1) /= NUL then
x1bv <= From_HexString (digits_str1);
x2bv <= From_HexString (digits_str2);
x3bv <= From_HexString (digits_str3);
end if;
DATA_ENA <= '1';
ELSE
DATA_ENA <= '0';
END IF;
END IF;
22
PVP_bk3i1_k50
END PROCESS READ_DATA;
WRITE_RESULT: PROCESS(CLK, RSTN)
FILE file_out : ASCII_TEXT IS OUT "Y.txt";

VARIABLE digit_out1 : string(1 to 2):=(others=>'0');
VARIABLE digit_out2 : string(1 to 2):=(others=>'0');
VARIABLE digit_out3 : string(1 to 2):=(others=>'0');
VARIABLE i,k : INTEGER;
BEGIN
if RSTN = '0' THEN
i := 0;k:=1;
elsif rising_edge(clk) then
if DOUT_RDY = '1' then
if k<=ROW_NUMBER then
i:=i+1;
digit_out1 :=To_string(y1bv,"%2x");
digit_out2 :=To_string(y2bv,"%2x");
digit_out3 :=To_string(y3bv,"%2x");
fprint(file_out,"%s %s %s ", digit_out1, digit_out2, digit_out3);
end if;
if i = IMAGE_WIDTH then
i := 0; k:=k+1;
fprint(file_out,"\n");
end if;
end if;
end if;
23
PVP_bk3i1_k50
END PROCESS WRITE_RESULT;
x1 <= UNSIGNED(TO_STDLOGICVECTOR(x1bv));
x2 <= UNSIGNED(TO_STDLOGICVECTOR(x2bv));
x3 <= UNSIGNED(TO_STDLOGICVECTOR(x3bv));
y1bv<=To_Bitvector(STD_LOGIC_VECTOR(y1));
y2bv<=To_Bitvector(STD_LOGIC_VECTOR(y2));

y3bv<=To_Bitvector(STD_LOGIC_VECTOR(y3));
mult : entity work.multiplier3x3(a)
GENERIC MAP(
DATA_WIDTH,
F_FACTORS_PART,
INT_FACTORS_PART
)
PORT MAP(
clk => clk,
rstn => rstn,
data_ena => DATA_ENA,
dout_rdy => DOUT_RDY,
x1 => x1,
x2 => x2,
x3 => x3,
a11 => crgb2ycbcr601_a11,
a12 => crgb2ycbcr601_a12,
a13 => crgb2ycbcr601_a13,
a21 => crgb2ycbcr601_a21,
24
PVP_bk3i1_k50
a22 => crgb2ycbcr601_a22,
a23 => crgb2ycbcr601_a23,
a31 => crgb2ycbcr601_a31,
a32 => crgb2ycbcr601_a32,
a33 => crgb2ycbcr601_a33,
b1x => crgb2ycbcr601_b1x,
b2x => crgb2ycbcr601_b2x,
b3x => crgb2ycbcr601_b3x,
b1y => crgb2ycbcr601_b1y,

b2y => crgb2ycbcr601_b2y,
b3y => crgb2ycbcr601_b3y,
y1c => y1c,
y2c => y2c,
y3c => y3c,
y1 => y1,
y2 => y2,
y3 => y3
);
CLOCK : PROCESS
BEGIN
clk <= '1' ;
wait for CLOCK_PERIOD/2;
clk <= '0' ;
wait for CLOCK_PERIOD/2 ;
END PROCESS CLOCK;
25

×