原創(chuàng)聲明:
本原創(chuàng)教程由芯驛電子科技(上海)有限公司(ALINX)創(chuàng)作,版權(quán)歸本公司所有,如需轉(zhuǎn)載,需授權(quán)并注明出處。
適用于板卡型號(hào):
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
實(shí)驗(yàn)Vivado工程目錄為“custom_pwm_ip /vivado”。
實(shí)驗(yàn)vitis工程目錄為“custom_pwm_ip /vitis”。
Xilinx官方為大家提供了很多IP核,在Vivado的IP Catalog中可以查看這些IP核,用戶在構(gòu)建自己的系統(tǒng)中,不可能只使用Xilinx官方的免費(fèi)IP核,很多時(shí)候需要?jiǎng)?chuàng)建屬于自己的用戶IP核,創(chuàng)建自己的IP核有很多好處,例如系統(tǒng)設(shè)計(jì)定制化;設(shè)計(jì)復(fù)用,可以在在IP核中加入license, 有償提供給別人使用;簡(jiǎn)化系統(tǒng)設(shè)計(jì)和縮短設(shè)計(jì)時(shí)間。用ZYNQ系統(tǒng)設(shè)計(jì)IP核,最常用的就是使用AXI總線將PS同PL部分的IP核連接起來(lái)。本實(shí)驗(yàn)將為大家介紹如何在Vivado中構(gòu)建AXI總線類型的IP核,此IP核用來(lái)產(chǎn)生一個(gè)PWM,用這個(gè)控制開(kāi)發(fā)板上的LED,做一個(gè)呼吸燈的效果。
FPGA工程師工作內(nèi)容
以下為FPGA工程師負(fù)責(zé)內(nèi)容。
1. PWM介紹
我們經(jīng)常使用PWM來(lái)控制LED,蜂鳴器等,通過(guò)調(diào)節(jié)脈沖的占空比來(lái)調(diào)節(jié)LED的亮度。
在其他開(kāi)發(fā)板中我們使用過(guò)的一個(gè)pwm模塊如下:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Copyright(c)2017,ALINX(shanghai)TechnologyCo.,Ltd////Allrightsreserved////////Thissourcefilemaybeusedanddistributedwithoutrestrictionprovided////thatthiscopyrightstatementisnotremovedfromthefileandthatany////derivativeworkcontainstheoriginalcopyrightnoticeandtheassociated////disclaimer.//////////////////////////////////////////////////////////////////////////////////////////================================================================================//Description:pwmmodel//pwmoutperiod=frequency(pwm_out)*(2**N)/frequency(clk);////================================================================================//RevisionHistory://DateByRevisionChangeDescription//--------------------------------------------------------------------------------//2017/5/3meisq1.0Original//********************************************************************************/`timescale1ns/1psmoduleax_pwm#( parameterN=32//pwmbitwidth )(inputclk,inputrst,input[N-1:0]period,input[N-1:0]duty,outputpwm_out);reg[N-1:0]period_r;reg[N-1:0]duty_r;reg[N-1:0]period_cnt;regpwm_r;assignpwm_out=pwm_r;always@(posedgeclkorposedgerst)beginif(rst==1)begin period_r<={?N?{1'b0}}; ????????duty_r?<={?N?{1'b0}};endelsebegin ????????period_r?<=?period; ????????duty_r???<=?duty;endendalways@(posedge?clk?orposedge?rst)beginif(rst==1) ????????period_cnt?<={?N?{1'b0}};else ????????period_cnt?<=?period_cnt?+?period_r;endalways@(posedge?clk?orposedge?rst)beginif(rst==1)begin ????????pwm_r?<=1'b0;endelsebeginif(period_cnt?>=duty_r) pwm_r<=1'b1;else ????????????pwm_r?<=1'b0;endendendmodule
可以看到這個(gè)PWM模塊需要2個(gè)參數(shù)“period”、“duty”來(lái)控制頻率和占空比,”period”為步進(jìn)值,也就是計(jì)數(shù)器每個(gè)周期要加的值。Duty為占空比的值。我們需要設(shè)計(jì)一些寄存器來(lái)控制這些參數(shù),這里需要使用AXI總線,PS通過(guò)AXI總線來(lái)讀寫寄存器。
2. Vivado工程建立
用”ps_hello”工程另存為一個(gè)名為“custom_pwm_ip”工程
2.1 創(chuàng)建自定義IP
1)點(diǎn)擊菜單“Tools->Create and Package IP...”
2)選擇“Next”
3)選擇創(chuàng)建一個(gè)新的AXI4設(shè)備
4)名稱填寫“ax_pwm”,描述填寫“alinx pwm”,然后選擇一個(gè)合適的位置用來(lái)放IP
5)下面參數(shù)可以指定接口類型、寄存器數(shù)量等,這里不需要修改,使用AXI Lite Slave接口,4個(gè)寄存器。
6)點(diǎn)擊“Finish”完成IP的創(chuàng)建
7)在“IP Catalog”中可以看到剛才創(chuàng)建的IP
8)這個(gè)時(shí)候的IP只有簡(jiǎn)單的寄存器讀寫功能,我們需要修改IP,選擇IP,右鍵“Edit in IP Packager”
9)這是彈出一個(gè)對(duì)話框,可以填寫工程名稱和路徑,這里默認(rèn),點(diǎn)擊“OK”
10)Vivado打開(kāi)了一個(gè)新的工程
11)添加PWM功能的核心代碼
12)添加代碼時(shí)選擇復(fù)制代碼到IP目錄
13)修改“ax_pwm_v1_0.v”,添加一個(gè)pwm輸出端口
14)修改“ax_pwm_v1_0.v”,在例化“ax_pwm_V1_0_S00_AXI”,中添加pwm端口的例化
15)修改“ax_pwm_v1_0_s00_AXI.v”文件,添加pwm端口,這個(gè)文件是實(shí)現(xiàn)AXI4 Lite Slave的核心代碼
16)修改“ax_pwm_v1_0_s00_AXI.v”文件,例化pwm核心功能代碼,將寄存器slv_reg0和slv_reg1用于pwm模塊的參數(shù)控制。
17)雙擊“component.xml”文件
18)在“File Groups”選項(xiàng)中點(diǎn)擊“Merge changers from File Groups Wizard”
19)在“Customization Parameters”選項(xiàng)中點(diǎn)擊“Merge changes form Customization Parameters Wizard”
20)點(diǎn)擊“Re-Package IP”完成IP的修改
2.2 添加自定義IP到工程
1)搜索“pwm”,添加“ax_pwm_v1.0”
2)點(diǎn)擊“Run Connection Automation”
3)導(dǎo)出pwm端口
4)保存設(shè)計(jì),并Generate Output Products
5)添加xdc文件分配管腳,把pwm_0輸出端口分配給LED1,做一個(gè)呼吸燈,編譯生成bit文件,導(dǎo)出硬件
軟件工程師工作內(nèi)容
以下為軟件工程師負(fù)責(zé)內(nèi)容。
3. Vitis軟件編寫調(diào)試
1)啟動(dòng)Vitis,新建APP,模板選擇“Hello World”
2)在bsp里找到“xparameters.h”文件,這個(gè)非常重要的文件,里面找到了自定IP的寄存器基地址,可以找到自定義IP的基地址。
3)有個(gè)寄存器讀寫宏和自定義IP的基地址,我們開(kāi)始編寫代碼,測(cè)試自定義IP,我們先通過(guò)寫寄存器AX_PWM_S00_AXI_SLV_REG0_OFFSET,控制PWM輸出頻率,然后通過(guò)寫寄存器AX_PWM_S00_AXI_SLV_REG1_OFFSET控制PWM輸出的占空比。
#include#include"platform.h"#include"xil_printf.h"#include"ax_pwm.h"#include"xil_io.h"#include"xparameters.h"#include"sleep.h"unsignedintduty;intmain(){ init_platform(); print("HelloWorld\n\r"); //pwmoutperiod=frequency(pwm_out)*(2^N)/frequency(clk); AX_PWM_mWriteReg(XPAR_AX_PWM_0_S00_AXI_BASEADDR,AX_PWM_S00_AXI_SLV_REG0_OFFSET,17179);//200hz //duty=(2^N)*(1-(dutycycle))-1 while(1){ for(duty=0x8fffffff;duty<0xffffffff;?duty?=?duty?+100000){ AX_PWM_mWriteReg(XPAR_AX_PWM_0_S00_AXI_BASEADDR,?AX_PWM_S00_AXI_SLV_REG1_OFFSET,?duty); usleep(100); } } ????cleanup_platform();return0;}
4)通過(guò)運(yùn)行代碼,我們可以看到PLLED1呈現(xiàn)出一個(gè)呼吸燈的效果。
5)通過(guò)debug,我們來(lái)查看一下寄存器
6)進(jìn)入debug狀態(tài),按“F6”可以單步運(yùn)行。
7)通過(guò)菜單可以查看“Memory”窗口
8)添加一個(gè)監(jiān)視地址“0x80000000”
9)單步運(yùn)行,觀察變化
4. 實(shí)驗(yàn)總結(jié)
通過(guò)本實(shí)驗(yàn)我們掌握了更多的Vitis調(diào)試技巧,掌握了ARM + FPGA開(kāi)發(fā)的核心內(nèi)容,就是ARM和FPGA數(shù)據(jù)交互。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21777瀏覽量
604770 -
Xilinx
+關(guān)注
關(guān)注
71文章
2169瀏覽量
121811 -
IP
+關(guān)注
關(guān)注
5文章
1715瀏覽量
149737 -
Zynq
+關(guān)注
關(guān)注
10文章
610瀏覽量
47231 -
MPSoC
+關(guān)注
關(guān)注
0文章
199瀏覽量
24302
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論