原創聲明:
本原創教程由芯驛電子科技(上海)有限公司(ALINX)創作,版權歸本公司所有,如需轉載,需授權并注明出處。
適用于板卡型號:
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核,用戶在構建自己的系統中,不可能只使用Xilinx官方的免費IP核,很多時候需要創建屬于自己的用戶IP核,創建自己的IP核有很多好處,例如系統設計定制化;設計復用,可以在在IP核中加入license, 有償提供給別人使用;簡化系統設計和縮短設計時間。用ZYNQ系統設計IP核,最常用的就是使用AXI總線將PS同PL部分的IP核連接起來。本實驗將為大家介紹如何在Vivado中構建AXI總線類型的IP核,此IP核用來產生一個PWM,用這個控制開發板上的LED,做一個呼吸燈的效果。
FPGA工程師工作內容
以下為FPGA工程師負責內容。
1. PWM介紹
我們經常使用PWM來控制LED,蜂鳴器等,通過調節脈沖的占空比來調節LED的亮度。
在其他開發板中我們使用過的一個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個參數“period”、“duty”來控制頻率和占空比,”period”為步進值,也就是計數器每個周期要加的值。Duty為占空比的值。我們需要設計一些寄存器來控制這些參數,這里需要使用AXI總線,PS通過AXI總線來讀寫寄存器。
2. Vivado工程建立
用”ps_hello”工程另存為一個名為“custom_pwm_ip”工程
2.1 創建自定義IP
1)點擊菜單“Tools->Create and Package IP...”
2)選擇“Next”
3)選擇創建一個新的AXI4設備
4)名稱填寫“ax_pwm”,描述填寫“alinx pwm”,然后選擇一個合適的位置用來放IP
5)下面參數可以指定接口類型、寄存器數量等,這里不需要修改,使用AXI Lite Slave接口,4個寄存器。
6)點擊“Finish”完成IP的創建
7)在“IP Catalog”中可以看到剛才創建的IP
8)這個時候的IP只有簡單的寄存器讀寫功能,我們需要修改IP,選擇IP,右鍵“Edit in IP Packager”
9)這是彈出一個對話框,可以填寫工程名稱和路徑,這里默認,點擊“OK”
10)Vivado打開了一個新的工程
11)添加PWM功能的核心代碼
12)添加代碼時選擇復制代碼到IP目錄
13)修改“ax_pwm_v1_0.v”,添加一個pwm輸出端口
14)修改“ax_pwm_v1_0.v”,在例化“ax_pwm_V1_0_S00_AXI”,中添加pwm端口的例化
15)修改“ax_pwm_v1_0_s00_AXI.v”文件,添加pwm端口,這個文件是實現AXI4 Lite Slave的核心代碼
16)修改“ax_pwm_v1_0_s00_AXI.v”文件,例化pwm核心功能代碼,將寄存器slv_reg0和slv_reg1用于pwm模塊的參數控制。
17)雙擊“component.xml”文件
18)在“File Groups”選項中點擊“Merge changers from File Groups Wizard”
19)在“Customization Parameters”選項中點擊“Merge changes form Customization Parameters Wizard”
20)點擊“Re-Package IP”完成IP的修改
2.2 添加自定義IP到工程
1)搜索“pwm”,添加“ax_pwm_v1.0”
2)點擊“Run Connection Automation”
3)導出pwm端口
4)保存設計,并Generate Output Products
5)添加xdc文件分配管腳,把pwm_0輸出端口分配給LED1,做一個呼吸燈,編譯生成bit文件,導出硬件
軟件工程師工作內容
以下為軟件工程師負責內容。
3. Vitis軟件編寫調試
1)啟動Vitis,新建APP,模板選擇“Hello World”
2)在bsp里找到“xparameters.h”文件,這個非常重要的文件,里面找到了自定IP的寄存器基地址,可以找到自定義IP的基地址。
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呈現出一個呼吸燈的效果。
5)通過debug,我們來查看一下寄存器
6)進入debug狀態,按“F6”可以單步運行。
7)通過菜單可以查看“Memory”窗口
8)添加一個監視地址“0x80000000”
9)單步運行,觀察變化
4. 實驗總結
通過本實驗我們掌握了更多的Vitis調試技巧,掌握了ARM + FPGA開發的核心內容,就是ARM和FPGA數據交互。
-
FPGA
+關注
關注
1626文章
21669瀏覽量
601871 -
Xilinx
+關注
關注
71文章
2163瀏覽量
121012 -
IP
+關注
關注
5文章
1657瀏覽量
149334 -
Zynq
+關注
關注
9文章
608瀏覽量
47128 -
MPSoC
+關注
關注
0文章
198瀏覽量
24252
發布評論請先 登錄
相關推薦
評論