作者:Mculover666
1.實(shí)驗(yàn)?zāi)康?br /> 用HDL語(yǔ)言+Vivado創(chuàng)建一個(gè)掛載在AXI總線上的自定義IP核
2.實(shí)驗(yàn)步驟
2.1.創(chuàng)建一個(gè)新的項(xiàng)目
2.2.調(diào)用Create and Package IP Wizard,創(chuàng)建一個(gè)新的AXI-Lite從機(jī)ip
選擇Tools->Create and Package IP
編輯創(chuàng)建的IP
led_controller_v1_0.v — 實(shí)例化了所有的AXI-Lite接口,在這種情況下,只有一個(gè)接口存在
led_controller_v1_0_S00_AXI.v — 包含了處理PL外設(shè)與PS端軟件的AXI4-Lite接口功能
打開(kāi)led_controller_v1_0_S00_AXI.v文件,找到Users to add ports here,然后在其后添加需要的端口:
保存文件,打開(kāi)led_controller_v1_0.v文件,找到Users to add ports here,添加端口:
在頂層文件中例化剛剛我們添加的端口,保存文件:
更新IP核
打包IP核
然后關(guān)閉這個(gè)工程即可,ip核創(chuàng)建成功。
2.3.添加ip核到Block Design中進(jìn)行設(shè)計(jì)
創(chuàng)建Block Design:
點(diǎn)擊Add IP,搜索led,添加led_controllerIP:
因?yàn)長(zhǎng)EDs_out要連接板載LED,所以點(diǎn)擊引腳,按下ctrl+t導(dǎo)出引腳:
添加Zynq ps核,自動(dòng)連線:
按下F6驗(yàn)證設(shè)計(jì):
創(chuàng)建Block Design 的HDL文件:
添加LED引腳約束文件:
##LEDs
set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[0] }]; #IO_L6N_T0_VREF_34 Sch=LEDs_out_0[0]
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[1] }]; #IO_L6P_T0_34 Sch=LEDs_out_0[1]
set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[2] }]; #IO_L21N_T3_DQS_AD14N_35 Sch=LEDs_out_0[2]
set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[3] }]; #IO_L23P_T3_35 Sch=LEDs_out_0[3]
2.4.生成Bitstream,打開(kāi)實(shí)現(xiàn)設(shè)計(jì),導(dǎo)出硬件文件,運(yùn)行SDK
2.5.創(chuàng)建一個(gè)空的應(yīng)用工程
File->New->Application Project,選擇創(chuàng)建一個(gè)空工程:
2.6.添加驅(qū)動(dòng)庫(kù)
光標(biāo)選中l(wèi)ed_test_bsp之后再進(jìn)行下面的操作?。?!
選擇Xilinx->Repositories:
添加ip核所在目錄,添加完了之后SDK會(huì)自動(dòng)掃描所添加的目錄,然后重新編譯工程來(lái)添加新的驅(qū)動(dòng)文件:
檢查一下庫(kù)有沒(méi)有被分派到LED_Controller外設(shè),打開(kāi)system.mss文件,可以看到外設(shè)驅(qū)動(dòng)中存在led_controller_0:
至此,led_controlerip核的硬件設(shè)計(jì)完畢,BSP驅(qū)動(dòng)添加完畢,可以開(kāi)始寫應(yīng)用測(cè)試程序了。
2.7.編寫應(yīng)用代碼
先在src文件夾下創(chuàng)建一個(gè)C文件:
/**
* @file led_test.c
* @brief led_controler ip test
* @author mculover666
* @date 2018/11/10
* */
#include "xparameters.h"
#include "xil_io.h" //led_controller.h中用到了Xil_Out32
#include "led_controller.h"
#include "xil_printf.h"
#define LED_BASE_ADDR XPAR_LED_CONTROLLER_0_S00_AXI_BASEADDR
#define LED_REG0 0
#define DELAY 50000000
int main()
{
int temp = 0;
int led_value = 0;
int i = 0;
xil_printf("led_controller ip test/r/n");
xil_printf("----------------------/r/n");
while(1)
{
/* write reg0 */
LED_CONTROLLER_mWriteReg(LED_BASE_ADDR,LED_REG0,led_value);
/* read reg0 */
temp = LED_CONTROLLER_mReadReg (LED_BASE_ADDR,LED_REG0);
/* show value */
xil_printf("led = %d",led_value);
xil_printf("/ttemp = %d/r/n",temp);
if(led_value led_value++;
else
led_value = 0;
for(i=0;i
}
}
2.9.配置運(yùn)行,觀察結(jié)果
3.實(shí)驗(yàn)總結(jié)
這個(gè)實(shí)驗(yàn)做了很長(zhǎng)時(shí)間,最后看著燈思考了很長(zhǎng)時(shí)間:
從實(shí)驗(yàn)的角度來(lái)說(shuō)說(shuō):用HDL創(chuàng)建一個(gè)掛載在AXI總線上的ip核去控制LED,然后在存儲(chǔ)器映射下這個(gè)ip核的四個(gè)寄存器會(huì)有自己的地址,CPU靠這個(gè)地址來(lái)訪問(wèn)寄存器,為了操作簡(jiǎn)單,一般會(huì)有一個(gè)基地址,其余寄存器是相對(duì)這個(gè)基地址的偏移,所以控制代碼只需要讀寫寄存器就可以了;
從嵌入式原理的角度來(lái)說(shuō),其實(shí)設(shè)計(jì)都是基于寄存器的,硬件靠寄存器的數(shù)據(jù)來(lái)工作,寄存器掛載在總線上,所以寄存器會(huì)有一個(gè)地址(寄存器映射),我們通過(guò)指針就可以訪問(wèn)內(nèi)存空間中這個(gè)地址處的數(shù)據(jù);
從嵌入式發(fā)展的角度來(lái)說(shuō),通常寄存器地址映射都是由廠商出廠時(shí)候映射好的,我們只需要查看芯片參考手冊(cè)去編程,現(xiàn)在整個(gè)硬件可以自己設(shè)計(jì),寄存器地址映射只是在一個(gè)固定的區(qū)間段內(nèi)(AXI 從機(jī)地址1G),變的更加靈活了,也說(shuō)明了整個(gè)數(shù)字系統(tǒng)的設(shè)計(jì)正在由板上設(shè)計(jì)轉(zhuǎn)入片上設(shè)計(jì),原來(lái)由一塊板子才能搞定的任務(wù),現(xiàn)在只需要一個(gè)芯片即可~
編輯:hfy
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304793 -
vhdl
+關(guān)注
關(guān)注
30文章
817瀏覽量
128119 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66470
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論