L C D Demo Cho Microblaze

805 views

Published on

control LCD using FPGA by EDK

Published in: Design, Business, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
805
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
44
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

L C D Demo Cho Microblaze

  1. 1. LCD demo cho microblaze 2<br />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 StarterChú ý: 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.2i2> Tạo thư mục chứa project<br />This image has been resized. Click this bar to view the full image. The original image is sized 654x395 and weights 75KB.<br />3> Creat new base system4> Select Board (chú ý: một số board có nhiều revision khác nhau, nên chọn revison thích hợp)5> Chọn món ăn tùy vào túi tiền <br />6> Creat Custom hardware (lcd port)<br />This image has been resized. Click this bar to view the full image. The original image is sized 678x517 and weights 107KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 681x526 and weights 102KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 680x525 and weights 122KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 680x526 and weights 168KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 679x525 and weights 152KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 680x526 and weights 141KB.<br />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)<br />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.vhdgoto hàng (khoảng 100) add user port theo hình sau:<br />This image has been resized. Click this bar to view the full image. The original image is sized 733x131 and weights 37KB.<br />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<br />This image has been resized. Click this bar to view the full image. The original image is sized 718x195 and weights 46KB.<br />9> Edit lcd_port.vhdgoto hàng (khoảng 119) add user port theo hình sau:<br />This image has been resized. Click this bar to view the full image. The original image is sized 732x131 and weights 44KB.<br />goto hàng (khoảng 388) map port<br />This image has been resized. Click this bar to view the full image. The original image is sized 669x113 and weights 29KB.<br />Xong bước creat , edit customer OPB port<br />10> Import custom hardwareTrên tool bar : Hardware -> Creat or import peripheral<br />This image has been resized. Click this bar to view the full image. The original image is sized 678x526 and weights 126KB.<br />Đặt tên lcd_port<br />This image has been resized. Click this bar to view the full image. The original image is sized 683x524 and weights 114KB.<br />Chọn yes for overwrite<br />This image has been resized. Click this bar to view the full image. The original image is sized 678x523 and weights 65KB.<br />Check radio cho mục file .pao, browse đến đường dẫn thư mục hardware chứa file này<br />This image has been resized. Click this bar to view the full image. The original image is sized 679x524 and weights 114KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 682x525 and weights 191KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 679x520 and weights 119KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 680x526 and weights 94KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 677x526 and weights 84KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 680x521 and weights 96KB.<br />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 IPTrê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: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<br />This image has been resized. Click this bar to view the full image. The original image is sized 658x217 and weights 67KB.<br />This image has been resized. Click this bar to view the full image. The original image is sized 642x143 and weights 44KB.<br />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 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.<br />This image has been resized. Click this bar to view the full image. The original image is sized 788x210 and weights 73KB.<br />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.<br />This image has been resized. Click this bar to view the full image. The original image is sized 800x370 and weights 161KB.<br />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.<br />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<br />Code:<br />BEGIN lcd_port<br />PARAMETER INSTANCE = lcd_port_0<br />PARAMETER HW_VER = 1.00.a<br />PARAMETER C_BASEADDR = 0x77400000<br />PARAMETER C_HIGHADDR = 0x7740ffff<br />BUS_INTERFACE SOPB = mb_opb<br />PORT lcd_port_pin = lcd_port_0_lcd_port_pin<br />PORT OPB_Clk = sys_clk_s<br />END<br />file: system.mss<br />Code:<br />BEGIN DRIVER<br />PARAMETER DRIVER_NAME = lcd_port<br />PARAMETER DRIVER_VER = 1.00.a<br />PARAMETER HW_INSTANCE = lcd_port_0<br />END<br />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<br />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.hSau đâ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 SDK2> 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<br />Lấy thông số mặc định Xilinx MicroBlaze Executable -> NextFinish thao tác create new project<br />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.<br />This image has been resized. Click this bar to view the full image. The original image is sized 726x423 and weights 140KB.<br />4> Tạo Linker Script :Trong mục Navigator, click chuột phải lcd_disp -> Gnenerate Linker Script...<br />This image has been resized. Click this bar to view the full image. The original image is sized 799x483 and weights 163KB.<br />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Để 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 ...<br />This image has been resized. Click this bar to view the full image. The original image is sized 629x438 and weights 69KB.<br />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...)<br />This image has been resized. Click this bar to view the full image. The original image is sized 800x461 and weights 234KB.<br />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)<br />This image has been resized. Click this bar to view the full image. The original image is sized 799x460 and weights 208KB.<br />Code:<br />//////////////////////////////////////////////////////////////////////////////<br />// Filename: lcd.c<br />// Version: 1.00.a<br />// Description: lcd_port Driver Source File<br />// Date: 21/09/2007<br />//////////////////////////////////////////////////////////////////////////////<br />/***************************** Include Files *******************************/<br />#include " lcd_port.h" <br />#include " string.h" <br />/************************* Constant Definitions ****************************/<br />#define LCD_PORT_BASE_ADDR 0x77400000<br />/************************* Macro Definitions *******************************/<br />#define LCD_PORT_WRITE(value)<br />LCD_PORT_mWriteSlaveReg0(LCD_PORT_BASE_ADDR, (value))<br />/**************************************************************************<br />/* @Function name : wait_us()<br />/* Description : wait n micro seconds<br />/* Argument : unsigned int n<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void wait_us(unsigned int n)<br />{<br />unsigned int i,j;<br />for(i=1;i<=n;i++)<br />{<br />for(j=1;j<=50;j++)<br />{<br />}<br />}<br />}<br />/**************************************************************************<br />/* @Function name : write_lcd_reg()<br />/* Description : write lcd command<br />/* Argument : char value<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void write_lcd_reg(char value)<br />{<br />char temp;<br />temp = (value>>4)&0x0F; /* get nibble high */<br />LCD_PORT_WRITE(temp); /* write to lcd port */<br />wait_us(1);<br />LCD_PORT_WRITE(temp|0x40); /* E=1 */<br />wait_us(1);<br />LCD_PORT_WRITE(temp); /* E=0 */<br />wait_us(2);<br />temp = value&0x0F; /* get nibble low */<br />LCD_PORT_WRITE(temp); /* write to lcd port */<br />wait_us(1);<br />LCD_PORT_WRITE(temp|0x40); /* E=1 */<br />wait_us(1);<br />LCD_PORT_WRITE(temp); /* E=0 */<br />wait_us(2);<br />}<br />/**************************************************************************<br />/* @Function name : write_lcd_reg()<br />/* Description : write lcd command<br />/* Argument : char value<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void write_lcd_data(char value)<br />{<br />char temp;<br />temp = (value>>4)&0x0F; /* get nibble high */<br />temp |= 0x10; /* RS=1 */<br />LCD_PORT_WRITE(temp); /* write to lcd port */<br />wait_us(2);<br />LCD_PORT_WRITE(temp|0x40); /* E=1 */<br />wait_us(2);<br />LCD_PORT_WRITE(temp); /* E=0 */<br />wait_us(4);<br />temp = value&0x0F; /* get nibble low */<br />temp |= 0x10; /* RS=1 */<br />LCD_PORT_WRITE(temp); /* write to lcd port */<br />wait_us(2);<br />LCD_PORT_WRITE(temp|0x40); /* E=1 */<br />wait_us(2);<br />LCD_PORT_WRITE(temp); /* E=0 */<br />wait_us(40);<br />}<br />/**************************************************************************<br />/* @Function name : lcd_mode_init()<br />/* Description : 4 bit mode initialization<br />/* Argument : void<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void lcd_mode_init(void)<br />{<br />wait_us(10000); /* waits 10ms */<br />write_lcd_reg(0x18); /* set 8 bit mode */<br />wait_us(5000);<br />write_lcd_reg(0x18); /* set 8 bit mode */<br />wait_us(500);<br />write_lcd_reg(0x18); /* set 8 bit mode */<br />wait_us(40);<br />write_lcd_reg(0x08); /* set 4 bit mode */<br />wait_us(40);<br />write_lcd_reg(0x28); /* set 2 lines */<br />wait_us(40);<br />write_lcd_reg(0x08); /* display off */<br />wait_us(40);<br />write_lcd_reg(0x01); /* clear display */<br />wait_us(2000);<br />write_lcd_reg(0x06); /* entry mode */<br />wait_us(40);<br />write_lcd_reg(0x0C); /* display on */<br />wait_us(10000); /* waits 10ms */<br />}<br />/**************************************************************************<br />/* @Function name : lcd_clr_disp()<br />/* Description : clear display & cursor home<br />/* Argument : void<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void lcd_clr_disp(void)<br />{<br />write_lcd_reg(0x01); /* clear lcd */<br />wait_us(2000);<br />write_lcd_reg(0x02); /* cursor home */<br />wait_us(2000);<br />}<br />/**************************************************************************<br />/* @Function name : lcd_line_feed()<br />/* Description : goto 2th line<br />/* Argument : void<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void lcd_line_feed()<br />{<br />write_lcd_reg(0x80|0x40); /* goto line 2 */<br />wait_us(40);<br />}<br />/**************************************************************************<br />/* @Function name : lcd_print_str()<br />/* Description : lcd print string<br />/* Argument : char *s<br />/* Return value : void<br />/* Author : Kamejoko80<br />/* Date : 21/09/2007<br />**************************************************************************/<br />void lcd_print_str(char *s)<br />{<br />int i=0;<br />while(i<strlen(s))<br />{<br />write_lcd_data(s[i++]);<br />}<br />}<br />8> Edit main.cChương trình chạy thử hiển thị ký tự trên LCD.<br />Code:<br />// Welcome to Xilinx Platform Studio SDK !<br />//<br />// This is an automatically created source file to help you get started.<br />// To add more files, navigate to File -> New -> File<br />// You may delete this file if you want to use only other files for your project.<br />//<br />int main()<br />{<br />print(" Enter main program " );<br />lcd_mode_init();<br />lcd_print_str(" ML403 LCD DEMO" );<br />lcd_line_feed();<br />lcd_print_str(" microblaze v5.00" );<br />print(" Exit main program " );<br />return 0;<br />}<br />Sau khi edit xong phần codeCTRL+S : Save fileCTRL+B : Build ( Hoặc click vào mục Build trên tool bar)<br />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.<br />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<br />This image has been resized. Click this bar to view the full image. The original image is sized 799x516 and weights 195KB.<br />Trên hộp thoại Run click " New" <br />This image has been resized. Click this bar to view the full image. The original image is sized 775x467 and weights 101KB.<br />Chọn tab XMD Target Connection<br />This image has been resized. Click this bar to view the full image. The original image is sized 773x525 and weights 108KB.<br />Sau khi ấn " Run" SDK load chương trình và microblaze bắt đầu chạy.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<br />Code:<br />run<br />XMD%<br />XMD% RUNNING><br />Code:<br />XMD% RUNNING> stop<br />XMD%<br />XMD% RUNNING> Processor stopped at PC: 0x2800001c<br />Ta có thể dùng Terminal để hiển thị message qua đường UARTDù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.<br />This image has been resized. Click this bar to view the full image. The original image is sized 791x403 and weights 173KB.<br />

×