Giáo trình Vi mạch số lập trình

Họ vi mạch FPLA (Field Programmable Logic Array)

Họ vi mạch FPLA đầu tiên được công ty Signetics giới thiệu vào

năm 1975. Cấu trúc của FPLA là một mảng AND – OR đơn giản, được

trình bày ở hình 2. 3. Mảng AND – OR có thể lập trình để thực hiện 4 hàm

logic bất kì với hai biến ngõ vào. Mỗi biến ngõ vào được đưa qua cổng

đệm để tạo hai mức logic 0 và 1. Mỗi mức logic này được nối với ngõ vào

cổng AND thông qua một cầu chì lập trình. Tất cả 4 cầu chì được giữ

nguyên.

Nếu tất cả cầu chì đều thông, ví dụ như cổng ANDK thì biểu thức

ngõ ra cho cổng sẽ là:

K = A AND A AND B AND B = AABB

Từ kết quả trên cho thấy ngõ ra của cổng AND luôn ở mức thấp,

điều này không có lợi. Tuy nhiên nếu ta lập trình cho 4 cầu chì trên, ví dụ

ta chọn A x B, lúc này giá trị của 2 biến này sẽ không có trong biểu thức.

Biểu thức ngõ ra cổng AND K là: K= A.B

Nguyên tắc ở đây là lựa chọn những giá trị để lập trình, khi một

cầu chì được chọn nghĩa là giá trị của nó sẽ không có mặt trong biểu thức.

Lưu ý mảng OR trong mạch ở hình 2.3 mỗi ngõ ra cổng AND được

nối tới 1 ngõ vào cổng OR thông qua một cầu chì và một Diode. Xét biểu

thức F1 giả sử các cầu chì đều thông, ta có :

F1 = K + L+ M + N

Với K, L, M, N là những tích số của AXB, F1 là tổng các tích so của

hai biến A và B. Bây giờ ta sẽ lập trình bằng cách làm đứt các cầu chì thì

các số hạng ứng với những cầu chì bị đứt sẽ không có mặt trong biểu thức.

Bằng cách lập trình các cầu chì ở mảng AND – OR (nghĩa là loại bỏ giá trị

giá trị của nó trong biểu thức) FPLA có thể tạo ra các hàm logic khác nhau

theo mạch thiết kế chỉ với hai biến ngõ vào. Lưu ý những Diode trong

mảng OR được dùng để bảo vệ ngắn mạch.

Sơ đồ mạch trong hình 2.4 là một ví dụ đơn giản của họ vi mạch

mảng logic lập trình trường. Nếu vi mạch do công ty chế tạo đã được lập

trình bằng công đoạn mặt nạ với công nghệ lưỡng cực thì chương trtình cố

định không thay đổi được. Do đó vi mạch này được gọi là PLA. Nếu vi

mạch được sản xuất để người sử dụng có thể lập trình thì gọi là FPLA.

Giáo trình Vi mạch số lập trình trang 1

Trang 1

Giáo trình Vi mạch số lập trình trang 2

Trang 2

Giáo trình Vi mạch số lập trình trang 3

Trang 3

Giáo trình Vi mạch số lập trình trang 4

Trang 4

Giáo trình Vi mạch số lập trình trang 5

Trang 5

Giáo trình Vi mạch số lập trình trang 6

Trang 6

Giáo trình Vi mạch số lập trình trang 7

Trang 7

Giáo trình Vi mạch số lập trình trang 8

Trang 8

Giáo trình Vi mạch số lập trình trang 9

Trang 9

Giáo trình Vi mạch số lập trình trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 321 trang duykhanh 19380
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình Vi mạch số lập trình", để 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 Vi mạch số lập trình

Giáo trình Vi mạch số lập trình
n bộ phần mô phỏng từ 0 đến 200ns 
Bước 3: Nhấp chọn Edit > Insert > Insert Node or Bus để mở cửa sổ nhập 
các đầu vào ra . Nhấp chọn nút Node Finder đặt phần Filter là Pin : all. 
Nhấp chọn List để tìm các đầu vào và ra rùi nhầp nút >> để chuyển các 
chân ở ô bên trái sang bên phải chon OK > OK 
 301
Bước 4 Đặt các giá trị cho đầuvào 
Bước 5 : Tiến hành mô phỏng 
Nhấp chọn File > Save sau đó nhấp chọn processing > Start Simulation để 
thực hiện mô phỏng và xem kết quả mô phỏng 
 302
5.2.9. Điều khiển LCD trên CPLD KIT 
- CPLD Challenge Kit có hỗ trợ màn hình LCD phục vụ cho việc hiển thị 
thông tin trong các ứng dụng trên CPLD. 
- Điều khiển LCD có thể thao tác ở chế độ 4 bit hoặc 8 bit. Ở chế độ 4 bit 
dữ liệu được ghi vào LCD thông qua 2 thao tác ghi 4 bit trên các chân DB4 
đến DB7. Bốn bít cao trong byte dữ liệu được ghi trước sau đó đến bốn bít 
thấp. Ở chế độ ghi 8 bit thì dữ liệu được ghi trên cả 8 chân DB0 đến DB7 
của LCD. 
 Sơ Đồ CPLD điều khiển LCD thông qua giao tiếp 8 bit. 
 303
 Bảng các lệnh điều khiển việc hiển thị: 
Giới thiệu chương trình hiển thị LCD giao tiếp 8 bit: 
- Sơ đồ khối chương trình hiển thị lên LCD: Chương trình sẽ điều khiển 
hiển thị chuỗi “FPGA” trên màn hình LCD. 
- Có ba bước chính được dùng để hiển thị ký tự trên LCD. 
 Bước khởi tạo: 
1. Đợi khoảng 15ms hoặc lâu hơn, đây là thời gian để FPGA hoàn thành 
việc cấu hình trước khi tiến hành việc hiển thị trên LCD. 
2. Ghi SF_D [7:0] = 0x38, set LCD_E lên mức cao trong 12 chu kỳ clock. 
3. Đợi 4,1ms hoặc lâu hơn, tương đương với 205,000 xung clock tại tần số 
50MHZ. 
4. Ghi SF_D [7:0] = 0x38, set LCD_E lên mức cao trong 12 chu kỳ clock. 
 304
5. Đợi 100us hoặc lâu hơn, tương đương với 5000 xung clock tại tần số 
50MHZ. 
6. Ghi SF_D [7:0] = 0x38, set LCD_E lên mức cao trong 12 chu kỳ clock. 
7. Đợi 40us hoặc lâu hơn, tương đương với 2000 xung clock tại tần số 
50MHZ. 
 Bước cấu hình: 
1. Function Set command: ghi vào SF_D[7:0] = 0x38. 
2. Đợi 40us, tương đương với 2000 xung clock (50MHZ). 
3. Set Display command: ghi vào SF_D[7:0] = 0x0C. 
4. Đợi 40us, tương đương với 2000 xung clock (50MHZ). 
5. Clear Display command: ghi vào SF_D[7:0] = 0x01. 
6. Đợi 40us, tương đương với 2000 xung clock (50MHZ). 
7. Entry Set command: ghi vào SF_D[7:0] = 0x06. 
8. Đợi 1.64ms, tương đương với 82000 xung clock (50MHZ). 
 Giữa các bước cấu hình: Function Set, Set Display, Clear Display, Entry 
Set đều phải đợi ít nhất là 40us, vì đây là thời gian tối thiểu để LCD nhận 
dữ liệu hợp lệ trước khi dữ liệu mới được ghi vào. 
 Bước hiển thị: 
1. Set DD-Ram Address command: ghi vào SF_D[7:0] = 0x80. 
2. Lần lượt ghi vào SF_D các giá trị mã ASCII hiển thị cho các chữ 
C,P,L,D. 
library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
entity lcd is 
 port( 
 clk, reset : in bit; 
 SF_D : out bit_vector(7 downto 0); 
 LCD_E, LCD_RS, LCD_RW : out bit 
 ); 
end lcd; 
-- an nut re set de chay 
architecture behavior of lcd is 
type tx_sequence is (setup, hold, fortyus, done); 
signal tx_state : tx_sequence := done; 
signal tx_byte : bit_vector(7 downto 0); 
signal tx_init : bit := '0'; 
type init_sequence is (idle, fifteenms, one, two, three, four, five, six, done); 
signal init_state : init_sequence := idle; 
signal init_init, init_done : bit := '0'; 
signal i : integer range 0 to 750000 := 0; 
signal i2 : integer range 0 to 2000 := 0; 
 305
signal i3 : integer range 0 to 82000 := 0; 
signal SF_D0, SF_D1 : bit_vector(7 downto 0); 
signal LCD_E0, LCD_E1 : bit; 
signal mux : bit; 
type display_state is (init, function_set, set_display, clr_display, entry_set, 
pause, set_addr, char_f, char_p, char_g, char_a, done); 
signal cur_state : display_state := init; 
begin 
 LCD_RW <= '0'; --write only 
 with cur_state select 
 tx_init <= '0' when init | pause | done, 
 '1' when others; 
 with cur_state select 
 mux <= '1' when init, 
 '0' when others; 
 with cur_state select 
 init_init <= '1' when init, 
 '0' when others; 
 with cur_state select 
 LCD_RS <= '0' when 
function_set|entry_set|set_display|clr_display|set_addr, 
 '1' when others; 
 with cur_state select 
 --FPJA 
 tx_byte <= "00111000" when function_set, 
 "00001100" when set_display, 
 "00000001" when clr_display, 
 "00000110" when entry_set, 
 "10000000" when set_addr, 
 "01000011" when char_f,--c 
 "01010000" when char_p,--p 
 "01001100" when char_g,--l 
 "01000100" when char_a,--d 
 "00000000" when others; 
 display: process(clk, reset) 
 begin 
 306
 if(reset='1') then 
 cur_state <= function_set; 
 elsif(clk='1' and clk'event) then 
 case cur_state is 
 when init => 
 if(init_done = '1') then 
 cur_state <= function_set; 
 else 
 cur_state <= init; 
 end if; 
--every other state but pause uses the transmit state machine 
 when function_set => 
 if(i2 = 2000) then 
 cur_state <= set_display; 
 else 
 cur_state <= function_set; 
 end if; 
 when set_display => 
 if(i2 = 2000) then 
 cur_state <= clr_display; 
 else 
 cur_state <= set_display; 
 end if; 
 when clr_display => 
 i3 <= 0; 
 if(i2 = 2000) then 
 cur_state <= entry_set; 
 else 
 cur_state <= clr_display; 
 end if; 
 when entry_set => 
 if(i2 = 2000) then 
 cur_state <= pause; 
 else 
 cur_state <= entry_set; 
 end if; 
 when pause => 
 if(i3 = 82000) then 
 cur_state <= set_addr; 
 307
 i3 <= 0; 
 else 
 cur_state <= pause; 
 i3 <= i3 + 1; 
 end if; 
 when set_addr => 
 if(i2 = 2000) then 
 cur_state <= char_f; 
 else 
 cur_state <= set_addr; 
 end if; 
 when char_f => 
 if(i2 = 2000) then 
 cur_state <= char_p; 
 else 
 cur_state <= char_f; 
 end if; 
 when char_p => 
 if(i2 = 2000) then 
 cur_state <= char_g; 
 else 
 cur_state <= char_p; 
 end if; 
 when char_g => 
 if(i2 = 2000) then 
 cur_state <= char_a; 
 else 
 cur_state <= char_g; 
 end if; 
 when char_a => 
 if(i2 = 2000) then 
 cur_state <= done; 
 else 
 cur_state <= char_a; 
 end if; 
 when done => 
 cur_state <= done; 
 308
 end case; 
 end if; 
 end process display; 
 with mux select 
 SF_D <= SF_D0 when '0', --transmit 
 SF_D1 when others; --initialize 
 with mux select 
 LCD_E <= LCD_E0 when '0', --transmit 
 LCD_E1 when others; --initialize 
 --specified by datasheet 
 transmit : process(clk, reset, tx_init) 
 begin 
 if(reset='1') then 
 tx_state <= done; 
 elsif(clk='1' and clk'event) then 
 case tx_state is 
 when setup => --40ns 
 LCD_E0 <= '0'; 
 SF_D0 <= tx_byte; 
 if(i2 = 2) then 
 tx_state <= hold; 
 i2 <= 0; 
 else 
 tx_state <= setup; 
 i2 <= i2 + 1; 
 end if; 
 when hold => --230ns 
 LCD_E0 <= '1'; 
 SF_D0 <= tx_byte; 
 if(i2 = 12) then 
 tx_state <= fortyus; 
 i2 <= 0; 
 else 
 tx_state <= hold; 
 i2 <= i2 + 1; 
 end if; 
 when fortyus => 
 LCD_E0 <= '0'; 
 if(i2 = 2000) then 
 tx_state <= done; 
 309
 i2 <= 0; 
 else 
 tx_state <= fortyus; 
 i2 <= i2 + 1; 
 end if; 
 when done => 
 LCD_E0 <= '0'; 
 if(tx_init = '1') then 
 tx_state <=setup; 
 i2 <= 0; 
 else 
 tx_state <= done; 
 i2 <= 0; 
 end if; 
 end case; 
 end if; 
 end process transmit; 
 --specified by datasheet 
power_on_initialize: process(clk, reset, init_init) --power on initialization 
sequence 
 begin 
 if(reset='1') then 
 init_state <= idle; 
 init_done <= '0'; 
 elsif(clk='1' and clk'event) then 
 case init_state is 
 when idle => 
 init_done <= '0'; 
 if(init_init = '1') then 
 init_state <= fifteenms; 
 i <= 0; 
 else 
 init_state <= idle; 
 i <= i + 1; 
 end if; 
 when fifteenms => 
 init_done <= '0'; 
 if(i = 750000) then 
 init_state <= one; 
 i <= 0; 
 310
 else 
 init_state <= fifteenms; 
 i <= i + 1; 
 end if; 
 when one => 
 SF_D1 <= "00111000"; 
 LCD_E1 <= '1'; 
 init_done <= '0'; 
 if(i = 11) then 
 init_state<=two; 
 i <= 0; 
 else 
 init_state<=one; 
 i <= i + 1; 
 end if; 
 when two => 
 LCD_E1 <= '0'; 
 init_done <= '0'; 
 if(i = 205000) then 
 init_state<=three; 
 i <= 0; 
 else 
 init_state<=two; 
 i <= i + 1; 
 end if; 
 when three => 
 SF_D1 <= "00111000"; 
 LCD_E1 <= '1'; 
 init_done <= '0'; 
 if(i = 11) then 
 init_state<=four; 
 i <= 0; 
 else 
 init_state<=three; 
 i <= i + 1; 
 end if; 
 when four => 
 LCD_E1 <= '0'; 
 init_done <= '0'; 
 if(i = 5000) then 
 311
 init_state<=five; 
 i <= 0; 
 else 
 init_state<=four; 
 i <= i + 1; 
 end if; 
 when five => 
 SF_D1 <= "00111000"; 
 LCD_E1 <= '1'; 
 init_done <= '0'; 
 if(i = 11) then 
 init_state<=six; 
 i <= 0; 
 else 
 init_state<=five; 
 i <= i + 1; 
 end if; 
 when six => 
 LCD_E1 <= '0'; 
 init_done <= '0'; 
 if(i = 2000) then 
 init_state<=done; 
 i <= 0; 
 else 
 init_state<=six; 
 i <= i + 1; 
 end if; 
 when done => 
 init_state <= done; 
 init_done <= '1'; 
 end case; 
 end if; 
 end process power_on_initialize; 
end behavior; 
Phần 1 : Tạo mới một dự án 
Bước 1: Khởi động phần mềm Quartus II và kích đúp chuột vào Create a 
New Project để mở cửa sổ tạo mới dự án. Chú ý là dự án cần có tên giống 
 312
với tên mà ta đã khai báo trên code. Ở ví dụ 1 ta chọn tên lcd làm tên dự án 
, nhấp chọn Next . 
Bước 2: Trong cửa sổ Family – Device settings chúng ta chọn loại chip , là 
chip MAX7000S/EPM7128SLC84-15 mà chúng ta sử dụng trong bài. 
Nhấp chọn Next để chuyển sang cửa sổ chọn kế tiếp, quan sát bảng tổng kết 
vừa thiếp lập và nhấp chọn finish để quay trở về màn hình chính 
 313
Phần 2: Nhập thiết kế dung mã VHDL 
Bước 1: Trên màn hình chính ta chọn mục File > New, trong cửa sổ New 
chọn VHDL File và nhấp chọn OK. Sau khi nhấp chọn OK cửa sổ soạn thảo 
sẽ hiện ra . Nhập mã VHDL như 
 314
Bước 2: Chọn File > Save As để mở cửa sổ Save As Trong phần Save as 
type chọn VHDL File. Trong phần File name Nhập lcd . Nhấp chọn Save 
Phần 3: Thêm các tệp thiết kế vào một dự án . 
Bước 1: Chọn mục Assignments > Settings > File / ta có cách 2 là chọn 
Project > Add/Remove File trong Project 
Bước 2: Nhấp chọn nút . Bên cạnh phần File name để có cửa sổ chọn tệp 
vào . Nhấp chọn tệp lcd.vhd 
Chọn Open . Tệp đã chọn sẽ hiện tên lên phần File name. Nhấp chọn Add 
và Ok để đưa tệp này vào dự án. 
Phần 4: Biên dịch mã VHDL 
Bước 1: Nhấp chọn mục Processing > Start Complication. Biên dịch thành 
công “ Hay không thành công” sẽ được thông báo trên hộp thoại bung ra 
sau khi quá trìng biên dịch kết thúc . Xác nhận bằng cách nhấp nút OK 
Bước 2: Khi biên dịch hoàn thành , một báo cáo biên dịch được đưa ra . 
Nhấp chọn Processing > Complication Report để xem thong tin về lỗi sai 
cần sửa. 
 315
Phần 6: Gán chân 
Bước 1: Nhấp chọn Assignments > Assignment Editor. Trong Category 
chọn pin. Nhấp đúp vào > cột To nhấp chọn từ A trải xuống tiếp 
đến nhấp đúp vào > ở cột location và chọn chân hình7 
 316
Bước 2: sau khi hoàn thành việc gán chân, ta nhấp chọn File > Save và 
biên dịch lạ 
Phần 7 Mô phỏng mạch thiết kế 
Bước 1; Mở cửa sổ Waveform Editor Bằng cách nhấp File > New. Trong 
cửa sổ chọn dạng tệp , chọn Vector Waveform file và nhấp chọn Ok. Cửa sổ 
Waveform File sẽ hiện ra trên giao diện chính. Lưu tệp này với tên lcd.vwf 
Bước 2: Nhấp chọn Edit > End Time và nhập vào 200 ns trong hộp thoại . 
Điều này cho phép thời gian mô phỏng từ 0 đến 200ns và nhấp chọn View 
> Fit in Window để nhìn thấy toàn bộ phần mô phỏng từ 0 đến 200ns 
 317
Bước 3: Nhấp chọn Edit > Insert > Insert Node or Bus để mở cửa sổ nhập 
các đầu vào ra . Nhấp chọn nút Node Finder đặt phần Filter là Pin : all. 
Nhấp chọn List để tìm các đầu vào và ra rùi nhầp nút >> để chuyển các 
chân ở ô bên trái sang bên phải chon OK > OK 
Bước 4 Đặt các giá trị cho đầuvào 
 318
Bước 5 : Tiến hành mô phỏng 
Nhấp chọn File > Save sau đó nhấp chọn processing > Start Simulation để 
thực hiện mô phỏng và xem kết quả mô phỏng 
 319
B. Thực hành 
1. Vật tư - Thiết bị - Dụng cụ cho 1 ca thực tập 
TT Tên Số lượng 
1 
Máy vi tính cài đặt đầy đủ các phần 
mềm hỗ trợ có cấu hình tối thiểu: 
(Mainboard của Gigabyte, CPU 
Core i3 hoặc i7, Ram 2GB trở lên, 
HDD 250GB trở lên, Card màn hình 
512MB trở lên, LCD 19") 
16 
2 Digital Oscilloscope 09 
3 Chíp EPM7128 và bộ nạp 09 
4 Thiết bị thí nghiệm PLD 09 
2. Quy trình thực hiện: 
- Bước 1: Sử dụng ngôn ngữ VHDL và phần mềm Quartus II Thiết kế vi 
mạch số lập trình theo yêu cầu của các bài toán. 
- Bước 2: Kiểm tra chương trình thiết kế mạch logic 
- Bước 3: Mô phỏng thiết kế thông qua bảng trạng thái mức logic 
input/output, hoặc sử dụng giản đồ thời gian. 
- Bước 4: Lựa chọn cầu hình cho vi mạch và nạp chương trình 
- Bước 5: Kiểm tra kết quả: 
3. Chia nhóm: 2 sinh viên/máy 
4. Các dạng sai hỏng thường gặp, nguyên nhân – Biện pháp khắc phục 
TT Sai hỏng Nguyên nhân Khắc phục 
1 
Chương trình báo 
lỗi 
Sai cú pháp lệnh 
Kiểm tra lỗi trên Output 
Window và sửa chữa 
2 
Không nhận diện 
được thiết bị 
Chưa cài đặt 
Drive cho thiết 
bị 
Cài đặt driver cho thiết bị 
3 
Không nạp được 
chương trình 
Chọn chưa đúng 
thông số thiết bị 
Kiểm tra thông số trên 
phần mềm nạp chương 
trình 
 320
C. Đánh giá kết quả : (tính theo thang điểm 10) 
Mục tiêu Nội dung Điểm chuẩn 
Kiến thức 
- Trình bày được cấu trúc logic của họ 
CPLD thông dụng; 
- Trình bày được các tính năng cần thiết 
của thiết bị để khai thác và sử dụng thiết 
bị hiệu quả theo yêu cầu kỹ thuật; 
2 
Kỹ năng 
- Sử dụng thành thạo ngôn ngữ VHDL, 
phần mềm Quartus II cho vi mạch CPLD 
EMP7128; 
- Sử dụng thành thạo kit thí nghiệm 
CPLD sử dụng vi mạch EMP7128; 
5 
Thái độ 
- Rèn luyện tính tỉ mỉ, chính xác, an toàn 
và vệ sinh công nghiệp 
3 
 321
TÀI LIỆU THAM KHẢO 
1. Đề cương môđun/môn học nghề Sửa chữa thiết bị điện tử công nghiệp „ 
Dự án Giáo dục kỹ thuật và Dạy nghề (VTEP), Tổng cục Dạy Nghề, Hà 
Nội, 2003 
2. Kỹ thuật điện tử số - Đặng văn Chuyết - NXB KHKT 2003 
3. Kỹ thuật điều khiển- NXB Lao Động 2004 
4. Mạch điện tử- NXB Lao Động 2002 
5. Mạch điện tử trong công nghiệp - Nguyễn Tấn Phước - NXBKhoa học kỹ 
thuật 2004 
6. Baugruppen de Mikroelektronik III - Pflaum Verlag Muenchen. 
7. Xilinx - ABEL Design Software Refernce Mannual - Data I/O 
Corp..1993 
8. D. Vanden Bout, ‘ Xilinx FPGA Student Manua” - Prentice Hall, 
Englewoods Cliff, NJ, 1997 
9. Bài giảng VHDL – Nguyễn Trọng Hải, Đại học KTCN thành phố 
Hồ Chí Minh 
10. FPGA CPLD and ASIC from Altera – www.Altera.com 

File đính kèm:

  • pdfgiao_trinh_vi_mach_so_lap_trinh.pdf