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.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: 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:
- giao_trinh_vi_mach_so_lap_trinh.pdf