Top Banner
LCD demo cho microblaze 2 Sau đây là các bước thực hiện LCD demo cho microblaze. Tool : EDK 8.2 Demo trên board ML403, tuy nhiên vẫn có thể thay đổi cho board Spartan3E Starter Chú ý: Vài bước được thông qua ( để mặc định và ấn nút next) thay vì post hình đầy đủ. ---------------------------------------------------------------------- PHAN 1 : Setup hardware ---------------------------------------------------------------------- 1> Start XPS 8.2i 2> Tạo thư mục chứa project
39

L C D Demo Cho Microblaze

Oct 31, 2014

Download

Design

iuui

control LCD using FPGA by EDK
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: L C D Demo Cho Microblaze

LCD demo cho microblaze 2

Sau đây là các bước thực hiện LCD demo cho microblaze.Tool : EDK 8.2Demo trên board ML403, tuy nhiên vẫn có thể thay đổi cho board Spartan3E Starter

Chú ý: Vài bước được thông qua ( để mặc định và ấn nút next) thay vì post hình đầy đủ.----------------------------------------------------------------------PHAN 1 : Setup hardware ----------------------------------------------------------------------1> Start XPS 8.2i

2> Tạo thư mục chứa project

Page 2: L C D Demo Cho Microblaze

3> Creat new base system

4> Select Board (chú ý: một số board có nhiều revision khác nhau, nên chọn revison thích hợp)

Page 3: L C D Demo Cho Microblaze

5> Chọn món ăn tùy vào túi tiền

Page 4: L C D Demo Cho Microblaze
Page 5: L C D Demo Cho Microblaze

6> Creat Custom hardware (lcd port)

Page 6: L C D Demo Cho Microblaze
Page 7: L C D Demo Cho Microblaze
Page 8: L C D Demo Cho Microblaze
Page 9: L C D Demo Cho Microblaze
Page 10: L C D Demo Cho Microblaze

Sau khi hoàn tất các bước trên, XPS tạo ra các file có cấu trúc như sau:Phần hardware chứa trong thư mục pcores, bao gồm tên (lcd_port) gắn với version hardware chỉ định (lcd_port_v1_00_a)Phần software chứa trong thư mục drivers (sẽ được trình bày trong phần sau)

7> Edit custom hardwareSau khi thực hiện xong thao tác creat custom peipheral (dùng bus OPB), XPS tạo ra 2 file source vhdl bao gồm name.vhd và user_logic.vhd chứa trong thư mục vhdl8> Edit user_logic.vhd

Page 11: L C D Demo Cho Microblaze

goto hàng (khoảng 100) add user port theo hình sau:

XPS tạo thanh ghi "slv_reg0" cho truy xuất với customer ip core, trong trường hợp này ta gán cho port xuất lcdgoto hàng (khoảng 208-209) add code như hình sau

9> Edit lcd_port.vhdgoto hàng (khoảng 119) add user port theo hình sau:

goto hàng (khoảng 388) map port

Page 12: L C D Demo Cho Microblaze

Xong bước creat , edit customer OPB port

10> Import custom hardwareTrên tool bar : Hardware -> Creat or import peripheral

Đặt tên lcd_port

Page 13: L C D Demo Cho Microblaze

Chọn yes for overwrite

Page 14: L C D Demo Cho Microblaze

Check radio cho mục file .pao, browse đến đường dẫn thư mục hardware chứa file này

Page 15: L C D Demo Cho Microblaze
Page 16: L C D Demo Cho Microblaze
Page 17: L C D Demo Cho Microblaze
Page 18: L C D Demo Cho Microblaze
Page 19: L C D Demo Cho Microblaze

11> Add ipcore vào bus OBPTrên tab IP Catalog chọn Project Repository, click chuột phải vào lcd_port chọn add IP

Trên mục system assembly view ta thấy custom ip core lcd_port_0 được add vào, lúc này lcd_port_0 chưa thật sự được gắn vào bus OPB, ta thực hiện bước connect vào OPB theo hình sau:

Page 20: L C D Demo Cho Microblaze

Chọn nút radio của mục port , connection filters chọn all để hiển thị tất cả các đường kết nối.OPB_clk -> sys_clk_s : system clock sourcelcd_port_pin -> Make external

Sau khi kết nối lcd_port_pin với external port, mục trên cùng External Ports xuất hiện đường kết nối lcd_port_0_lcd_port_pin, rename phần tên kết nối phía bên trái để tiện cho việc assign pin constrain.

Chọn nút radio address, trong mục size (kích thước vùng nhớ cho ngoại vi) trong drop list

Page 21: L C D Demo Cho Microblaze

chọn 64K, sau đó chọn Generate Addresses, Xillin tự động tính toán các đường địa chỉ và remap lại cho toàn bộ ngoại vi.

Cuối cùng là bước assign constrain pins cho lcd_port, tùy theo kết nối của các board khác nhau ta có các khai báo gán pins khác nhau.

Tool -> Hardware -> Generate Bitstream. Đến bước này ta có thể thong thả ngồi uống Coca chờ đợi XPS hoàn tất cho phần hardware.

Page 22: L C D Demo Cho Microblaze

Phần trước giới thiệu xong phần import customer hadware, phần này giới thiệu về driver cho LCD.Sau khi import lcd_port vào bus hệ thống, XPS tự động tạo ra thư viện hỗ trợ cho việc phát triển phần mềm. Ngoài ra các file hệ thống cũng được cập nhật.

file: system.mhs

Code:

BEGIN lcd_portPARAMETER INSTANCE = lcd_port_0PARAMETER HW_VER = 1.00.aPARAMETER C_BASEADDR = 0x77400000PARAMETER C_HIGHADDR = 0x7740ffffBUS_INTERFACE SOPB = mb_opbPORT lcd_port_pin = lcd_port_0_lcd_port_pinPORT OPB_Clk = sys_clk_sEND

file: system.mss

Code:

BEGIN DRIVERPARAMETER DRIVER_NAME = lcd_portPARAMETER DRIVER_VER = 1.00.aPARAMETER HW_INSTANCE = lcd_port_0END

Driver được tạo ra trong đường dẫn : ...drivers/lcd_port_v1_00_a/src//lcd_port.c/lcd_port.h/lcd_port_selftest.c/Makefile

Page 23: L C D Demo Cho Microblaze

File lcd_port_selftest.c được tạo ra cho việc test thanh ghi reg0 (lcd_port), ta có thể tham khảo, sữa chữa tùy vào mục đích xử dụng.Các prototype cho các hàm truy xuất thanh ghi được khai báo trong lcd_port.h

Sau đây là các bước tạo project mới dùng công cụ phát triển phần mềm SDK của xilinx.

1> Trên tool bar của XPS:Chọn Software -> Lauch Platform Studio SDK

2> Trong hộp thoại Application Wizard:Chọn Creat a New SDK Application Project -> Next3> Trong mục New ProjectĐặt tên project -> Next

Page 24: L C D Demo Cho Microblaze

Lấy thông số mặc định Xilinx MicroBlaze Executable -> Next

Finish thao tác create new project

Page 25: L C D Demo Cho Microblaze

Sau khi hoàn tất các bước trên xilinx tự động tạo các thư mục và các file trong thư mục có tên project name, và một danh sách các thư viện có liên quan đến microblaze.

4> Tạo Linker Script :Trong mục Navigator, click chuột phải lcd_disp -> Gnenerate Linker Script...

Page 26: L C D Demo Cho Microblaze

Trong crop down list chọn DDRAM, dùng làm vùng nhớ data , text ...

6> Creat New Source fileClick vào biểu tượng C+ trên tool bar

Đặt tên file lcd.c

Page 27: L C D Demo Cho Microblaze

Để viết chương trình giao tiếp lcd, tức là dùng microblaze xuất tín hiệu điều khiển lên port_lcd, ngoài lcd_port còn có các ngoại vi khác. Microblaze là processor có cấu trúc tổ chức bộ nhớ Havard, Vùng Intruction và vùng IO, memory nằm riêng biệt. Các IO được truy xuất thông qua địa chỉ, mỗi IO chiếm một vùng nhớ có tầm từ C_BASEADDR - C_HIGHADDR. Các base add được cập nhật trong file system.mhs sau khi thực hiện thao tác Generate Address trong mục trình bày trên. Ta có thể tham khảo C_BASEADDR thông qua bước sau:Trong XPS -> System Essembly View -> chọn IO -> click chuột phải -> Conigure IP ...

Page 28: L C D Demo Cho Microblaze

Và địa chỉ đầu tiên 0x77400000 được dùng cho việc truy xuất thanh ghi reg0 (Do phần creat custom hardware ta chọn option cho 1 thanh ghi, trong trường hợp tạo nhiều thanh ghi, ví dụ như reg0, reg1, reg2 thì địa chỉ truy xuất các thanh ghi này sẽ lần lượt là C_BASEADDR,C_BASEADDR+0x04,C_BASEADDR +0x08...)

Page 29: L C D Demo Cho Microblaze

Hàm LCD_PORT_mWriteSlaveReg0(LCD_PORT_BASE_ADDR, (value)) được định nghĩa sẵn bởi Xilinx, ghi giá trị "value" ra lcd_port.

7> Edit lcd.cCông việc kế tiếp là soạn thảo code điểu khiển LCD, hầu hết các board FPGA đều thiết kế cho việc giao tiếp mode 4 bit. Trong phần thiết kế này dùng 1 port xuất để điểu khiển, lcd_port<6:0> <-> (E, RW,RS,D7,D6,D5,D4)

Code:

Page 30: L C D Demo Cho Microblaze

//////////////////////////////////////////////////////////////////////////////// Filename: lcd.c// Version: 1.00.a// Description: lcd_port Driver Source File// Date: 21/09/2007//////////////////////////////////////////////////////////////////////////////

/***************************** Include Files *******************************/#include "lcd_port.h"#include "string.h"/************************* Constant Definitions ****************************/#define LCD_PORT_BASE_ADDR 0x77400000/************************* Macro Definitions *******************************/#define LCD_PORT_WRITE(value)\LCD_PORT_mWriteSlaveReg0(LCD_PORT_BASE_ADDR, (value))

/**************************************************************************/* @Function name : wait_us()/* Description : wait n micro seconds/* Argument : unsigned int n/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void wait_us(unsigned int n){unsigned int i,j;for(i=1;i<=n;i++){for(j=1;j<=50;j++){}}}/**************************************************************************/* @Function name : write_lcd_reg()/* Description : write lcd command/* Argument : char value/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void write_lcd_reg(char value){char temp;temp = (value>>4)&0x0F; /* get nibble high */LCD_PORT_WRITE(temp); /* write to lcd port */wait_us(1);LCD_PORT_WRITE(temp|0x40); /* E=1 */wait_us(1);LCD_PORT_WRITE(temp); /* E=0 */wait_us(2);

temp = value&0x0F; /* get nibble low */LCD_PORT_WRITE(temp); /* write to lcd port */

Page 31: L C D Demo Cho Microblaze

wait_us(1);LCD_PORT_WRITE(temp|0x40); /* E=1 */wait_us(1);LCD_PORT_WRITE(temp); /* E=0 */wait_us(2);

}/**************************************************************************/* @Function name : write_lcd_reg()/* Description : write lcd command/* Argument : char value/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void write_lcd_data(char value){char temp;temp = (value>>4)&0x0F; /* get nibble high */temp |= 0x10; /* RS=1 */LCD_PORT_WRITE(temp); /* write to lcd port */wait_us(2);LCD_PORT_WRITE(temp|0x40); /* E=1 */wait_us(2);LCD_PORT_WRITE(temp); /* E=0 */wait_us(4);

temp = value&0x0F; /* get nibble low */temp |= 0x10; /* RS=1 */LCD_PORT_WRITE(temp); /* write to lcd port */wait_us(2);LCD_PORT_WRITE(temp|0x40); /* E=1 */wait_us(2);LCD_PORT_WRITE(temp); /* E=0 */wait_us(40);}/**************************************************************************/* @Function name : lcd_mode_init()/* Description : 4 bit mode initialization/* Argument : void/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void lcd_mode_init(void){wait_us(10000); /* waits 10ms */write_lcd_reg(0x18); /* set 8 bit mode */wait_us(5000);write_lcd_reg(0x18); /* set 8 bit mode */wait_us(500);write_lcd_reg(0x18); /* set 8 bit mode */wait_us(40);write_lcd_reg(0x08); /* set 4 bit mode */wait_us(40);

Page 32: L C D Demo Cho Microblaze

write_lcd_reg(0x28); /* set 2 lines */wait_us(40);write_lcd_reg(0x08); /* display off */wait_us(40);write_lcd_reg(0x01); /* clear display */wait_us(2000);write_lcd_reg(0x06); /* entry mode */wait_us(40);write_lcd_reg(0x0C); /* display on */wait_us(10000); /* waits 10ms */}/**************************************************************************/* @Function name : lcd_clr_disp()/* Description : clear display & cursor home/* Argument : void/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void lcd_clr_disp(void){write_lcd_reg(0x01); /* clear lcd */wait_us(2000);write_lcd_reg(0x02); /* cursor home */wait_us(2000);}/**************************************************************************/* @Function name : lcd_line_feed()/* Description : goto 2th line/* Argument : void/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void lcd_line_feed(){write_lcd_reg(0x80|0x40); /* goto line 2 */wait_us(40);}/**************************************************************************/* @Function name : lcd_print_str()/* Description : lcd print string/* Argument : char *s/* Return value : void/* Author : Kamejoko80/* Date : 21/09/2007**************************************************************************/void lcd_print_str(char *s){int i=0;while(i<strlen(s)){write_lcd_data(s[i++]);}}

Page 33: L C D Demo Cho Microblaze

8> Edit main.cChương trình chạy thử hiển thị ký tự trên LCD.

Code:

// Welcome to Xilinx Platform Studio SDK !//// This is an automatically created source file to help you get started.// To add more files, navigate to File -> New -> File// You may delete this file if you want to use only other files for your project.//int main(){print("Enter main program \r\n");

lcd_mode_init();lcd_print_str("ML403 LCD DEMO");lcd_line_feed();lcd_print_str("microblaze v5.00");

print("Exit main program \r\n");return 0;

}

Sau khi edit xong phần codeCTRL+S : Save fileCTRL+B : Build ( Hoặc click vào mục Build trên tool bar)

Sau Khi thực hiện 2 phần Hardware và Firmware, ta có thể load lên board để chạy thử. Để chạy micoblaze cần phải cấu hình thành hệ thống hoàn chỉnh, sau đó load chương trình.

Page 34: L C D Demo Cho Microblaze

1> Kết nối cable Jtag vào taget board2> Trên tool bar SDK ấn vào Icon "Program Hardware" chương trình tự động load bitstream xuống board.3> Trong mục Navigator -> chọn lcd_port -> click chuột phải -> run

Trên hộp thoại Run click "New"

Page 35: L C D Demo Cho Microblaze

Chọn tab XMD Target Connection

Sau khi ấn "Run" SDK load chương trình và microblaze bắt đầu chạy.

Page 36: L C D Demo Cho Microblaze

SDK hỗ trợ chức năng deburg chạy step by step thông qua đường JTAG.Có thể điều khiển hoạt động của microblaze thông qua cửa sổ console:Tại dấu nhắc XMD%type lệnh run -> cho microbalze chạytype lệnh stop -> cho microblaze dừng

Code:

runXMD%XMD% RUNNING>

Code:

XMD% RUNNING> stopXMD%XMD% RUNNING> Processor stopped at PC: 0x2800001c

Ta có thể dùng Terminal để hiển thị message qua đường UART

Dùng microblze hiển thị chữ trên LCD phải qua nhiều bước tạo port, viết chương trình thủ tục rườm rà, nhưng không kém phần thú vị. Việc chọn FPGA cho việc nghiên cứu hệ thống nhúng có một số lợi điểm. Trong lúc phát triển phần mềm, người lập trình có thể đụng đến cả hardware thay vì phải đọc datasheet và lập trình đơn thuần. Và như thế ta có thể nắm rõ hơn chút ít những gì mình đang làm. Người phát triển có thể custom hệ thống theo chủ ý của mình nhằm mang lại tính hiệu quả về kinh tế nhưng vẫn đảm bảo đáp ứng yêu cầu đặt ra.

Page 37: L C D Demo Cho Microblaze