FPGA之NIOS系統LCD1602核及自定義LCD液晶IP核
前言
在前期文章中提到了LCD1602一些基本知識,包括控制,顯示,時序。那如何在NIOS系統創建LCD1602的IP核?
由於在Qsys中提供了Optrex 16207 LCD Controller Core(下文統稱1602控制核),因此我們只需調用,然後集成到我們的NIOS系統中即可,而且屬於字符型輸出設備,支持printf(),即我們可以直接輸出我們想要的內容。
那麼LCD1602控制核是如何進行工作的呢?
當把LCD1602控制核加入系統編譯成功時,文件夾下會出現LCD16207.V的文件,我們來分析官方提供的文件是怎樣進行描述的?
由上圖端口定義得出以下總體結構
由上圖可以看出LCD1602外設連接到LCD1602控制核上有11個信號:(信號命名根據.v文件)
LCD_E------輸出使能
LCD_RS------數據/命令選擇(輸出)
LCD_RW------讀或寫選擇(輸出)
LCD_data------8位數據總線(雙向DB0~DB7)
第一步:
我們首先需要控制輸出使能LCD_E信號,根據Avalon-mm總線規則,可以看出有讀寫使能信號,而對於LCD1602來說,只有當LCD_E爲下降沿時,指令或數據纔有效,不論是對總線是什麼操作,因此可以將讀寫使能賦值給LCD_E輸出使能。
第二步;
我們需要理解LCD_RS和LCD_RW對於外設來講是兩個寄存器,而這兩個寄存器是需要地址來進行訪問的,因此第二步需要將LCD_RS和LCD_RW賦一個地址。
第三步:
此時我們需要知道LCD1602外設數據如何去與CPU進行交互?因爲數據總線是雙向的,因此三態門必不可少,其中readdata其實是總線上的接口,LCD_data賦值即可,也可對外來數據LCD_data進行異步信號同步處理。
而且Altera爲Nios II處理器提供了HAL系統庫驅動程序,使你能夠使用ANSIC標準庫功能訪問LCD控制器, Altera提供的驅動程序集成到了Nios II系統的HAL系統庫中。
即LCD1602控制器附以下軟件文件。 這些文件定義了與硬件的底層接口,並提供了HAL驅動程序。
•altera_avalon_lcd_16207_regs.h-該文件定義內核的寄存器映射,提供用於訪問底層硬件的符號常量。
•altera_avalon_lcd_16207.h,altera_avalon_lcd_16207.c-這些文件實現了HAL系統庫的LCD控制器設備驅動程序。
綜上可知,其實LCD1602控制核是個很簡單的IP核,那我們如何在最小系統中去設計其他液晶的IP核呢?
自定義LCD液晶IP核
由LCD1602控制核須知自定義IP的接口有哪些?
1.全局時鐘(Clk)和復位(Rst_n)信號必不可少。
2.Avalon-mm slave總線接口(接口信號根據實際外設接口來選擇)
1)地址總線(avs_address)
2)片選信號(avs_chipselect /avs_chipselect_n)
3)寫請求(avs_write /avs_write_n)
4)寫數據(avs_writedata(8/16/32位 位寬))
5)讀請求(avs_read /avs_read_n)
6)讀數據(avs_readdata(8/16/32位 位寬))
7)等待信號(avs_waitrequest / avs_waitrequest_n)
8)讀數據有效信號(avs_data_valid)
3.導出信號
導出到NIOS 系統層,分配到IO,或者連接到Qsys系統以外的邏輯。
下圖是接口8080時序控制的液晶IP核。
那這時我們發現液晶信號的busy忙信號及RST復位信號未在導出信號之列,因爲這兩個信號在最小NIOS系統中可以單獨用PIO核來進行讀取控制。
5.7寸液晶導出的信號控制邏輯與LCD1602控制核一致。
當我們將該5.7寸文件編譯通過後,就開始對我們的IP核進行封裝。
自定義IP核封裝
步驟一:點擊下圖位置打開自定義IP封裝嚮導。
步驟二:如下圖所示填好基本信息,最好將該元件納入分組中,以便後期管理。
步驟三:將我們寫好的.v文件添加進來分析,這裏注意,因爲這個IP核只有一個文件,因此頂層文件就是LCD,如果自定義IP核涉及多個文件,那麼一定要注意頂層文件是哪一個。
步驟四:這裏就體現信號規範命名的好處,接口和信號類型就顯示正確,如果不正確,我們手動改變接口類型,注意信號類型如片選有低有效和高有效,不能與設計文件相違背,再例如我們導出的信號類型是.export,因此選擇new_conduit接口。
步驟五:先移除掉無信號接口,在對每個接口進行配置,注意總線上的讀寫時序與接口8080一致,保證無錯誤即可生成.hw.tcl文件