使用vivado進行zedboard的OLED測試(創建IP核)

OLED即有機發光二極管。在Zedboard開發板上實現OLED模塊顯示功能,通過PL部分的EMIO接口實現OLED所需的SPI接口,在PS中編寫驅動程序,實現OLED顯示功能。
OLED原理圖如下
這裏寫圖片描述

zedboard控制OLED的主要方法是:自己設計一個IP核,把OLED對應的6個控制引腳進行邏輯設計和約束,IP核通過AXI總線,把OLED對應的6個控制引腳和PS聯繫起來。通過PS編寫相應的驅動程序,即可實現對OLED的控制。
OLED系統設計圖如下:
這裏寫圖片描述


環境:win7 64 vivado 2014.1
開發板:zedboard version d xc7z020clg484-1
串口軟件:SecureCRT
目標:使用vivado進行zedboard的OLED測試。目的還是介紹vivado軟硬件協同開發流程。
說明:原文有些地方比較模糊,新手易出錯,故彙總了幾個文檔,整理出的。原文鏈接:
1. http://xilinx.eetrend.com/blog/7899#comment-2461 Vivado+Zedboard之OLED驅動
2. http://xilinx.eetop.cn/viewnews-2469 綜合、實現、管腳分配、時鐘設置、燒寫
3. http://blog.chinaaet.com/cuter521/p/30962# 一步步艱難搞定OLED
4. http://blog.csdn.net/kobesdu/article/details/46988781 zedboard中OLED源代碼
5. http://blog.chinaaet.com/yyiyy/p/39029# GPIO控制OLED

oled的驅動程序http://download.csdn.net/detail/shangguanyunlan/9686950
整個工程:http://download.csdn.net/detail/shangguanyunlan/9686980
本文將分爲以下步驟:
1. 使用Vivado IDE創建一個工程,並創建IP核
2. 在Vivado中,創建block,添加約束xdc,validate、generate,最後導入到SDK中
3. 在SDK中新建工程,添加文件,編譯。下載到ZedBoard上進行調試
4. 總結

1.使用Vivado IDE創建一個工程,並創建IP核
1)創建vivado工程,命名爲oled,設置目錄
這裏寫圖片描述
2)選擇RTL,勾選複選框,此次不指定文件。
這裏寫圖片描述
3)選擇zedboard開發板,完成工程創建。
這裏寫圖片描述
4)Tools->create & package
這裏寫圖片描述
5)選擇AXI4方式
這裏寫圖片描述
6)設置名稱,以及其他參數。下面繼續next,保持默認參數,修改也可以,看需要
這裏寫圖片描述
7)選擇edit IP。finish。(以上爲vivado創建AXI IP的流程
這裏寫圖片描述
8)此時已經建立了一個臨時的工程,在完成後會自行刪除
9)修改文件,創建端口和用戶邏輯。雙擊oled_ip_v1_0.v文件,添加
output wire [5:0] OLED,
這裏寫圖片描述
添加 .OLED(OLED),如下:
這裏寫圖片描述

10)雙擊oled_ip_v1_0_S00_AXI.v文件,添加
output reg [5:0] OLED,
這裏寫圖片描述
always @(*)
begin
OLED <= slv_reg0[5:0];
end
這裏寫圖片描述

11)保存文件
12)在project manager面板中,選擇Package IP,可以看到如下選項:
IP Identification:基本信息
IP Compatibility:.支持芯片
IP file Groups:文件管理;可選擇“merge changes……”以更新文件
IP customization Parameters:
IP ports and interfaces:端口,可以更新、添加等
IP addressing and memory:地址分配
IP GUI Customization:GUI
Review and package:生成IP
這裏寫圖片描述
13)無誤後,選擇Package IP生產IP。此時軟件自動關閉。可在IP catalog的下屬文件夾中找到了定義的IP。(以上爲創建AXI IP的基本步驟
這裏寫圖片描述
這裏寫圖片描述
2.在Vivado中,創建block,添加約束xdc,validate、generate,最後導入到SDK中
14)創建一個block design,名稱默認
這裏寫圖片描述
15)添加IP:zynq,並run block automation,彈出框中選擇ok
這裏寫圖片描述
16)雙擊zynq,customize zynq:由於IP實際是使用GPIO進行傳輸的模塊,很多功能並不需要
MIO:Memory Interfaces:勾掉Quad SPI
IO peripheral:保留uart用於串口通信;保留GPIO默認
application Processor Unit:勾掉Timer 0;
這裏寫圖片描述
17)添加IP:oled_ip_0,run connection automation,彈出框中選擇ok
18)鼠標移動到oled_ip_0->OLED[5:0],右擊->make external。重新佈局,得到最後的設計圖。
這裏寫圖片描述
19)查看地址,未分配則分配。地址很重要,後面軟件設計要用到。
這裏寫圖片描述
20)validate design
這裏寫圖片描述
21)create wrapper。在design_1.bd上右擊,選擇create HDL wrapper。
22)添加約束。
注意:引腳查看硬件手冊,注意和驅動中的定義相匹配:
這裏寫圖片描述
添加約束文件,即:IO口配置(I/O Planning)/編輯約束文件(Edit Constraints Sets)
做好的模塊,在燒寫進板子之前,需要設置輸入輸出信號與板子上IO口的對應關係。
IO口設置有兩種方法,第一種是直接創建並編輯約束文件,第二種是在圖形界面進行設置。具體可參考:http://xilinx.eetop.cn/viewnews-2469(本文采取的後者)
添加的約束文件如下:
這裏寫圖片描述
23)選擇generate bitstream。提示保存則保存,彈出對話框選擇ok。完成後選擇open implement design。
24)打開design,file->export->export for SDK.勾選啓動SDK。(以上爲vivado硬件設計流程,下面轉入SDK進行軟件設計)
3. 在SDK中新建工程,添加文件,編譯。下載到ZedBoard上進行調試
25) 新建工程,選擇空模板。
這裏寫圖片描述
26)oled->src,右擊選擇import,選擇general->file system,選擇font.h、oled.h、oled.c、helloworld.c等文件。【開頭附有這幾個文件的連接,自己下載的前三個,helloworld.c文件是筆者自己寫的,見文末,不知道原文作者哪裏導入的】
oled.h中,原本“#define OLED_BASE_ADDR 0X7a800000”改爲“#define OLED_BASE_ADDR XPAR_OLED_IP_0_S00_AXI_BASEADDR”。
這樣就不用每次修改地址了,vivado中分配的地址會自動保存在xparameter.h中。
這裏寫圖片描述
27)自動編譯,出現下圖,說明編譯成功。如果有錯誤則修改之。(一般肯能使頭文件的問題,按照提示修改即可)
這裏寫圖片描述
28)連接開發板,J14用於串口通信,J17用於燒寫程序。安裝驅動的方法這裏就不介紹了,參考之前的文章。
29)上電,連接SecureCRT,選擇Xilinx Tools->Program FPGA。program,開發板上的藍燈亮說明燒寫成功。
這裏寫圖片描述
30)運行程序。oled(project)右擊選擇run as->launch on harddware(GDB)或者直接Run->run.可以看到串口打印的信息和OLED上的信息顯示
這裏寫圖片描述

4. 總結

本文主要包括IP核的創建、vivado硬件設計、SDK軟件設計,實現了對zedboard的OLED的驅動。SDK中的字庫設計、OLED驅動程序則是直接調用,最終實現了OLED的驅動。本文僅僅是將vivado+zedboard軟硬件設計流程跑通,未分析驅動程序。感興趣者可以結合SSD1306 datasheet閱讀程序。

主函數:

helloworld.c:

#include <stdio.h>
//#include "platform.h"
#include "xil_types.h"
#include "xparameters.h"
//#include "xgpiops.h"
//#include "xil_io.h"
#include "oled.h"

int main(void)
{
     //init_platform();
     print("##### Application Starts #####\n\r");
     OLED_Init();

     //press btn8 to start Demo
     OLED_ShowString(0,0, "BTN8 to start");
     OLED_Refresh_Gram();


     //OLED_Clear();

     //cleanup_platform();

     return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章