1 引言 傳統的外設操作使用I/O接口方式,在硬件工程中,需要設計與外設相連的I/O接口,在軟件工程中,需要用戶編寫I/O接口程序對外設進行初始化,設置相應的外設寄存器,這樣的工作在每次新建一個工程后,都得重復進行,因此增加了開發的成本。 利用Altera公司提供的Component Editor工具可以設計符合時序要求的外設接口,并且可以將用戶開發驅動程序與Nios II HAL(硬件抽象層)系統庫集成在一起,形成Nios II的接口組件,在系統生成的時候,對外設進行初始化設置。這樣在建立新工程時,只需將接口組件添加到系統就可以了,對組件的訪問也變得輕松,使得代碼可重復利用。 Nios II HAL系統庫是一個輕量級實時環境,提供一個組件驅動接口,使得程序與底層硬件通信。HAL API(應用程序接口)與ANSI C標準庫集成在一起,允許用戶通過類C庫函數訪問設備和文件,例如printf()、fopen()和fwrite()等,這樣其他開發者無需知道底層硬件結構就可以對組件進行操作。 2 硬件設計 在SOPC Builder中打開Component Editor,在HDL Files標簽下添加硬件描述語言編寫的文件,將其設定為頂層模塊,該文件描述了組件與Avalon總線的接口以及組件與液晶屏的接口,系統自動對文件進行分析和模擬。 點擊Signals標簽,系統自動讀取硬件描述語言文件中的信號,用戶只需設置接口信號和信號類型。接口信號包括主端信號和從端信號,主端信號與Avalon總線相連,包括iDATA、iADDRESS、iWR_N和iCS_N等,信號類型依次為writedata、address、write_n和chipselect_n等,從端信號與LCD相連,包括LCD_DATA、LCD_ADDRESS、LCD_RD_N、LCD_WR_N和LCD_CS_N等,信號類型均為export。 從端信號與主端信號的連接用硬件描述語言描述: assign LCD_DATA = iDATA; assign LCD_ADDRESS = iADDRESS; assign LCD_RD_N = 1; assign LCD_WR_N = iWR_N; assign LCD_CS_N = iCS_N; 由于始終對液晶屏進行寫操作,不進行讀操作,所以信號LCD_RD_N置1。 點擊Interfaces標簽,將接口設置為從類型,地址選擇Registers類型,Avalon Slave Timing可以設置接口的時序,如圖1所示。 圖1 液晶屏寫時序 點擊SW Files標簽,添加系統所需要的文件,包括兩個頭文件,一個C文件,選擇文件類型,將它們包含在不同的文件夾下,這樣就可以通過標準的C語言函數來訪問組件了。 最后一步點擊Component Wizard,為組件取名,點擊Finish完成設計。 3 軟件設計 組件生成后,組件文件夾的結構如圖2所示。 圖2 液晶屏接口組件 lcd_3224\inc文件夾下包含_regs.h文件,該文件定義硬件接口,例如: #define IOWR_ LCD_DATA(base, data) IOWR(base, 0, data) 寫參數有三個,base為組件的基地址,0表示地址偏移量,data為要寫入的數據,重新定義后在源代碼中可以使用自定義的名字對組件進行操作。 lcd_3224\hdl文件夾下包含.v文件,該文件描述組件的接口信號。 lcd_3224\HAL\inc文件夾下包含.h文件,該文件描述組件的結構、函數聲明和驅動程序與標準C函數的接口等,示例如下: #include "sys/alt_dev.h" //包含定義組件結構的頭文件 typedef struct alt_LCD_dev alt_LCD_dev; //定義組件結構 struct alt_LCD_dev { alt_dev dev; int base; }; …… void alt_lcd_init(alt_LCD_dev * dev); //聲明初始化函數 int? alt_lcd_write(alt_fd * fd, const char* ptr, int len); //聲明寫函數 …… #define ALTERA_AVALON_LCD_INSTANCE(name, device) static alt_LCD_dev device = { { ALT_LLIST_ENTRY, NAME##_NAME, NULL, /* open */ //fopen可以訪問lcd NULL, /* close */ NULL, /* read */ alt_lcd_write, //fprintf將調用寫函數訪問液晶屏 NULL, /* lseek */ NULL, /* fstat */ NULL, /* ioctl */ }, name##_BASE } lcd_3224\HAL\src文件夾下包含源代碼,mk文件是自動生成的,源代碼主要包括初始化程序、.h文件所聲明的alt_lcd_write和一些子程序,例如: static void lcd_write_data(alt_LCD_dev * dev, unsigned char data) //子程序 { unsigned int base = dev->base; //基地址由SOPC Builder自動生成 IOWR_ LCD_DATA(base, data); //訪問底層硬件 } 初始化程序和寫函數調用這些子程序完成對組件的初始化和各種操作。 4 應用 根據液晶屏的功能及所使用的開發板,應用系統的硬件結構框圖如圖3所示。 圖3 硬件結構框圖 在SOPC Builder中添加組件生成硬件系統,將結果下載到開發板。打開Nios II IDE創建軟件工程,進行軟件的編寫,其中部分程序如下: #include int main(void) { FILE * fd; fd = fopen(/dev/lcd”, “w”); //lcd為SOPC Builder中的名字 if(fd) { fprintf(fd, “parameter”); //調用alt_lcd_write fclose(fd); } …… return 0; } 通過標準C函數訪問液晶屏,程序編寫簡單,可以顯示各種圖像及字符。如果還有特殊要求,用戶可以繼續在驅動程序中添加需要的功能。 5 總結 本文詳細介紹了液晶屏接口組件的設計方法,核心部分是硬件描述語言文件的編寫、時序的設計以及驅動程序的編寫。調試成功后,可以把組件文件夾放到系統組件文件夾下,這樣就可以重復使用。對于應用程序開發者,不用了解硬件結構就可以使用標準C函數操作組件,使得開發簡便快捷,節省了時間和成本,是一種高效、靈活和低成本的開發方法。 本文作者創新點:和傳統的外設接口方式相比,接口組件的使用極大地方便了接口的硬件和軟件設計,是高效靈活的接口方式。 |