原創(chuàng)聲明:
本原創(chuàng)教程由芯驛電子科技(上海)有限公司(ALINX)創(chuàng)作,版權(quán)歸本公司所有,如需轉(zhuǎn)載,需授權(quán)并注明出處。
適用于板卡型號:
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG
實驗Vivado工程目錄為“custom_pwm_ip /vivado”。
實驗vitis工程目錄為“custom_pwm_ip /vitis”。
Xilinx官方為大家提供了很多IP核,在Vivado的IP Catalog中可以查看這些IP核,用戶在構(gòu)建自己的系統(tǒng)中,不可能只使用Xilinx官方的免費IP核,很多時候需要創(chuàng)建屬于自己的用戶IP核,創(chuàng)建自己的IP核有很多好處,例如系統(tǒng)設(shè)計定制化;設(shè)計復(fù)用,可以在在IP核中加入license, 有償提供給別人使用;簡化系統(tǒng)設(shè)計和縮短設(shè)計時間。用ZYNQ系統(tǒng)設(shè)計IP核,最常用的就是使用AXI總線將PS同PL部分的IP核連接起來。本實驗將為大家介紹如何在Vivado中構(gòu)建AXI總線類型的IP核,此IP核用來產(chǎn)生一個PWM,用這個控制開發(fā)板上的LED,做一個呼吸燈的效果。
FPGA工程師工作內(nèi)容
以下為FPGA工程師負責(zé)內(nèi)容。
1. PWM介紹
我們經(jīng)常使用PWM來控制LED,蜂鳴器等,通過調(diào)節(jié)脈沖的占空比來調(diào)節(jié)LED的亮度。
在其他開發(fā)板中我們使用過的一個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
可以看到這個PWM模塊需要2個參數(shù)“period”、“duty”來控制頻率和占空比,”period”為步進值,也就是計數(shù)器每個周期要加的值。Duty為占空比的值。我們需要設(shè)計一些寄存器來控制這些參數(shù),這里需要使用AXI總線,PS通過AXI總線來讀寫寄存器。
![o4YBAGAKNOWAMIpZAAAi-fLhhz8189.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOWAMIpZAAAi-fLhhz8189.jpg)
2. Vivado工程建立
用”ps_hello”工程另存為一個名為“custom_pwm_ip”工程
2.1 創(chuàng)建自定義IP
1)點擊菜單“Tools->Create and Package IP...”
![pIYBAGAKNOWAYRWiAABIfv9cBdQ374.jpg](https://file.elecfans.com//web1/M00/DC/33/pIYBAGAKNOWAYRWiAABIfv9cBdQ374.jpg)
2)選擇“Next”
![o4YBAGAKNOaAd6lfAAB2EXt0RTg212.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOaAd6lfAAB2EXt0RTg212.jpg)
3)選擇創(chuàng)建一個新的AXI4設(shè)備
![pIYBAGAKNOeAUu1-AAB6oP_Qa0A344.jpg](https://file.elecfans.com//web1/M00/DC/33/pIYBAGAKNOeAUu1-AAB6oP_Qa0A344.jpg)
4)名稱填寫“ax_pwm”,描述填寫“alinx pwm”,然后選擇一個合適的位置用來放IP
![o4YBAGAKNOiAbEQmAABagsezIr0688.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOiAbEQmAABagsezIr0688.jpg)
5)下面參數(shù)可以指定接口類型、寄存器數(shù)量等,這里不需要修改,使用AXI Lite Slave接口,4個寄存器。
![pIYBAGAKNOiAAdpBAABj7UBQhxY405.jpg](https://file.elecfans.com//web1/M00/DC/33/pIYBAGAKNOiAAdpBAABj7UBQhxY405.jpg)
6)點擊“Finish”完成IP的創(chuàng)建
![pIYBAGAKNOmANiB3AACJJceyGfg743.jpg](https://file.elecfans.com//web1/M00/DC/33/pIYBAGAKNOmANiB3AACJJceyGfg743.jpg)
7)在“IP Catalog”中可以看到剛才創(chuàng)建的IP
![o4YBAGAKNOqAXt_1AABfnsJvQ5s292.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOqAXt_1AABfnsJvQ5s292.jpg)
8)這個時候的IP只有簡單的寄存器讀寫功能,我們需要修改IP,選擇IP,右鍵“Edit in IP Packager”
![pIYBAGAKNOuABb-XAAB5wL2-2-0474.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNOuABb-XAAB5wL2-2-0474.jpg)
9)這是彈出一個對話框,可以填寫工程名稱和路徑,這里默認,點擊“OK”
![o4YBAGAKNOuAEtetAAA17-JaJbI828.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOuAEtetAAA17-JaJbI828.jpg)
10)Vivado打開了一個新的工程
![o4YBAGAKNOyACrsZAACwZlnFUKU430.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNOyACrsZAACwZlnFUKU430.jpg)
11)添加PWM功能的核心代碼
![pIYBAGAKNO2AEJd1AAB56r7YR5g428.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNO2AEJd1AAB56r7YR5g428.jpg)
12)添加代碼時選擇復(fù)制代碼到IP目錄
![o4YBAGAKNO2AP6e3AABhBRYK7xc945.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNO2AP6e3AABhBRYK7xc945.jpg)
13)修改“ax_pwm_v1_0.v”,添加一個pwm輸出端口
![pIYBAGAKNO-AFDbbAACY2vDAPcs658.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNO-AFDbbAACY2vDAPcs658.jpg)
14)修改“ax_pwm_v1_0.v”,在例化“ax_pwm_V1_0_S00_AXI”,中添加pwm端口的例化
![o4YBAGAKNPCAND1fAACXrElhvdk323.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPCAND1fAACXrElhvdk323.jpg)
15)修改“ax_pwm_v1_0_s00_AXI.v”文件,添加pwm端口,這個文件是實現(xiàn)AXI4 Lite Slave的核心代碼
![pIYBAGAKNPGAfVKeAAC1P18MXRQ939.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPGAfVKeAAC1P18MXRQ939.jpg)
16)修改“ax_pwm_v1_0_s00_AXI.v”文件,例化pwm核心功能代碼,將寄存器slv_reg0和slv_reg1用于pwm模塊的參數(shù)控制。
![o4YBAGAKNPKARUiNAACZ2BvS7TY765.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPKARUiNAACZ2BvS7TY765.jpg)
17)雙擊“component.xml”文件
![pIYBAGAKNPOAMPOlAACG_4F_9Ds374.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPOAMPOlAACG_4F_9Ds374.jpg)
18)在“File Groups”選項中點擊“Merge changers from File Groups Wizard”
![o4YBAGAKNPSAHXLoAABnifJeYpM486.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPSAHXLoAABnifJeYpM486.jpg)
19)在“Customization Parameters”選項中點擊“Merge changes form Customization Parameters Wizard”
![pIYBAGAKNPSAdXnJAABkMLBuJyw511.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPSAdXnJAABkMLBuJyw511.jpg)
20)點擊“Re-Package IP”完成IP的修改
![o4YBAGAKNPWACkNEAABp4M9aDek479.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPWACkNEAABp4M9aDek479.jpg)
2.2 添加自定義IP到工程
1)搜索“pwm”,添加“ax_pwm_v1.0”
![pIYBAGAKNPaAfni5AACIPml-ZTs806.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPaAfni5AACIPml-ZTs806.jpg)
2)點擊“Run Connection Automation”
![o4YBAGAKNPaASDjDAABPNbNzgIc749.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPaASDjDAABPNbNzgIc749.jpg)
3)導(dǎo)出pwm端口
![pIYBAGAKNPeAZfx6AABmoU89YPw159.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPeAZfx6AABmoU89YPw159.jpg)
![pIYBAGAKNPiAbwHbAACsHwPdf2k965.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPiAbwHbAACsHwPdf2k965.jpg)
4)保存設(shè)計,并Generate Output Products
![o4YBAGAKNPiAOfeQAABZos0RoU8815.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPiAOfeQAABZos0RoU8815.jpg)
5)添加xdc文件分配管腳,把pwm_0輸出端口分配給LED1,做一個呼吸燈,編譯生成bit文件,導(dǎo)出硬件
軟件工程師工作內(nèi)容
以下為軟件工程師負責(zé)內(nèi)容。
3. Vitis軟件編寫調(diào)試
1)啟動Vitis,新建APP,模板選擇“Hello World”
![pIYBAGAKNPmAYh0uAAArgMgWQW4897.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPmAYh0uAAArgMgWQW4897.jpg)
2)在bsp里找到“xparameters.h”文件,這個非常重要的文件,里面找到了自定IP的寄存器基地址,可以找到自定義IP的基地址。
![o4YBAGAKNPmAYRlMAABJ-S02plY133.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPmAYRlMAABJ-S02plY133.jpg)
3)有個寄存器讀寫宏和自定義IP的基地址,我們開始編寫代碼,測試自定義IP,我們先通過寫寄存器AX_PWM_S00_AXI_SLV_REG0_OFFSET,控制PWM輸出頻率,然后通過寫寄存器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)通過運行代碼,我們可以看到PLLED1呈現(xiàn)出一個呼吸燈的效果。
5)通過debug,我們來查看一下寄存器
![pIYBAGAKNPqAZ3V6AADeZlioycM690.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPqAZ3V6AADeZlioycM690.jpg)
6)進入debug狀態(tài),按“F6”可以單步運行。
![o4YBAGAKNPuAB7J-AADD8tKfMNM794.jpg](https://file.elecfans.com//web1/M00/DB/B4/o4YBAGAKNPuAB7J-AADD8tKfMNM794.jpg)
7)通過菜單可以查看“Memory”窗口
![pIYBAGAKNPyAF581AAC9jX40CWg716.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNPyAF581AAC9jX40CWg716.jpg)
8)添加一個監(jiān)視地址“0x80000000”
![o4YBAGAKNP2AKX8SAAAatVNNSRc158.jpg](https://file.elecfans.com//web1/M00/DB/B5/o4YBAGAKNP2AKX8SAAAatVNNSRc158.jpg)
![pIYBAGAKNP2AFIX5AAAfM_86tfo182.jpg](https://file.elecfans.com//web1/M00/DC/34/pIYBAGAKNP2AFIX5AAAfM_86tfo182.jpg)
9)單步運行,觀察變化
![o4YBAGAKNP6AcdbWAADI0GQP9g4708.jpg](https://file.elecfans.com//web1/M00/DB/B5/o4YBAGAKNP6AcdbWAADI0GQP9g4708.jpg)
4. 實驗總結(jié)
通過本實驗我們掌握了更多的Vitis調(diào)試技巧,掌握了ARM + FPGA開發(fā)的核心內(nèi)容,就是ARM和FPGA數(shù)據(jù)交互。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21803瀏覽量
606460 -
Xilinx
+關(guān)注
關(guān)注
71文章
2172瀏覽量
122266 -
IP
+關(guān)注
關(guān)注
5文章
1723瀏覽量
150033 -
Zynq
+關(guān)注
關(guān)注
10文章
610瀏覽量
47328 -
MPSoC
+關(guān)注
關(guān)注
0文章
199瀏覽量
24336
發(fā)布評論請先 登錄
相關(guān)推薦
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
Ti推出面向Zynq UltraScale+ MPSoC的電源參考設(shè)計
![Ti推出面向<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>的電源參考設(shè)計](https://file1.elecfans.com//web2/M00/A6/B2/wKgZomUMP76ATe17AAAcbJsTcs8886.jpg)
Xilinx基于ARM的Zynq-7000和Zynq UltraScale+ MPSoC及RFSoC器件是否存在安全漏洞
Zynq UltraScale+ MPSoC存儲器接口系統(tǒng)的介紹
Zynq UltraScale+ MPSoC的發(fā)售消息
米爾科技Zynq UltraScale+ MPSoC技術(shù)參考手冊介紹
![米爾科技<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>技術(shù)參考手冊介紹](https://file.elecfans.com/web1/M00/AA/66/o4YBAF2peUWAOg6KAAMHSiNFbVQ735.png)
如何調(diào)試 Zynq UltraScale+ MPSoC VCU DDR 控制器?
![如何調(diào)試 <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b> VCU DDR 控制器?](https://file.elecfans.com/web1/M00/DC/1C/pIYBAGAJnL2APVJtAADb7Z67qGU377.png)
米爾電子zynq ultrascale+ mpsoc底板外設(shè)資源清單分享
![米爾電子<b class='flag-5'>zynq</b> <b class='flag-5'>ultrascale+</b> <b class='flag-5'>mpsoc</b>底板外設(shè)資源清單分享](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ZYNQ Ultrascale+ MPSoC系列FPGA芯片設(shè)計
Zynq UltraScale+ MPSoC中的隔離方法
![<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>中的隔離方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Zynq UltraScale+ MPSoC的隔離設(shè)計示例
![<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>的隔離設(shè)計示例](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Zynq UltraScale+ MPSoC驗證數(shù)據(jù)手冊
![<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>驗證數(shù)據(jù)手冊](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論