這一節我們探索基于AXI總線的設計,來看一看ZYNQ系列開發板的獨特優勢,PS可以控制PL產生定制化的行為,而不需要去動硬件代碼。
這次實驗是產生頻率和占空比可調的PWM(Pulse Width Modulation)信號,調用8次,產生8路PWM波,并用這些信號去控制8路LED燈,觀察實驗效果。后面會做一個比較。
用的板子是zc702。
新建一個工程,命名為PWM_AXI_Lite
創建基于AXI總線的PWM波IP
IP設計為一個寄存器負責控制頻率,一個寄存器負責控制占空比。
創建一個IP核,tools-->Create and Package ,這里需要16個寄存器,創建方法見系列(六)、系列(七),這里命名為PWM_AXI_Lite。
在IP核工程里,新建一個PWM模塊文件,這里占空比設計的比較糙,直接就用一個計數值代替功能,后面的軟件設計要注意:
module PWM(
input clk,
input rst_n,
input cnt_set,
input fre_set,
output pwm_o
);
wire[31:0] cnt_set;
wire[31:0] fre_set;
reg [31:0] fre_cnt;
always @(posedge clk) begin
if(!rst_n) begin
fre_cnt end
else begin
if(fre_cnt fre_cnt else
fre_cnt end
end
assign pwm_o=(cnt_set>fre_cnt);
endmodule
在自動產生的實例文件里,添加端口信號和自定義功能,后面要約束到LED上:
自定義的功能就是一個寄存器控制頻率(fre_set),一個寄存器控制占空比(cnt_set):
// Add user logic here
PWM PWM0(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg1),
.fre_set(slv_reg0),
.pwm_o(PWM_o[0])
);
PWM PWM1(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg3),
.fre_set(slv_reg2),
.pwm_o(PWM_o[1])
);
PWM PWM2(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg5),
.fre_set(slv_reg4),
.pwm_o(PWM_o[2])
);
PWM PWM3(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg7),
.fre_set(slv_reg6),
.pwm_o(PWM_o[3])
);
PWM PWM4(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg9),
.fre_set(slv_reg8),
.pwm_o(PWM_o[4])
);
PWM PWM5(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg11),
.fre_set(slv_reg10),
.pwm_o(PWM_o[5])
);
PWM PWM6(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg13),
.fre_set(slv_reg12),
.pwm_o(PWM_o[6])
);
PWM PWM7(
.clk(S_AXI_ACLK),
.rst_n(S_AXI_ARESETN),
.cnt_set(slv_reg15),
.fre_set(slv_reg14),
.pwm_o(PWM_o[7])
);
// User logic ends
在頂層模塊添加好用戶信號,一個是端口里的,一個是調用里的:
修改完后重新打包好。
回到原先建的工程,將這個IP添加到IP庫里,然后Create Block Design,添加ZYNQ核和PWM_AXI_Lite,為了觀察PWM波信號,這里又添加了一個ILA(為了簡化,可以去掉),配置如下:
連接CLK 和 FCLK_CLK0 ,連接 Probe0 和 PWM_o,最后創建的系統如下:
添加約束文件,將8路PWM波綁定到8個LED上:
#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {PWM_o[7]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[7]}]
set_property PACKAGE_PIN D15 [get_ports {PWM_o[6]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[6]}]
set_property PACKAGE_PIN W17 [get_ports {PWM_o[5]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[5]}]
set_property PACKAGE_PIN W5 [get_ports {PWM_o[4]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[4]}]
#GPIO PMOD2
set_property PACKAGE_PIN V7 [get_ports {PWM_o[3]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[3]}]
set_property PACKAGE_PIN W10 [get_ports {PWM_o[2]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[2]}]
set_property PACKAGE_PIN P18 [get_ports {PWM_o[1]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[1]}]
set_property PACKAGE_PIN P17 [get_ports {PWM_o[0]}]
set_property IOSTANDARD LVCMOS25 [get_ports {PWM_o[0]}]
一系列常規操作,生成比特流文件后,Lanch到SDK。
SDK部分設計
在BSP包里找到xparameter.h文件:
在xparameters.h文件里找到系統為我們的PWM IP配置的地址,待會我們要操作它的寄存器:
打開xparameters.h文件,Ctrl+F:
這個基地址就是我們的寄存器0的地址,然后我們將各路PWM波的頻率和占空比寫入:
#include
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"
int main(){
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+4,30000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+8,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+12,20000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+16,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+20,10000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+24,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+28,8000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+32,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+36,6000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+40,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+44,4000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+48,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+52,2000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+56,40000000);
Xil_Out32(XPAR_PWM_AXI_LITE_V1_0_0_BASEADDR+60,100000);
return 0;
}
板子上電,然后Program FPGA,debug as后,在vivado里會自動打開調試界面,觸發后能看到8路波形,在板子上我們可以看到LED燈依次閃爍!
總結:
這里我們達到了led依次閃爍的效果,如同系列(六)達到的效果,但是這里有本質的區別,系列(六)需要CPU一直發送指令控制LED燈,而這次試驗CPU寫入頻率和占空比后,現在8路PWM波自己工作,是PL完成的,不需要CPU發命令,CPU可以去干其他事情。這就是SOPC的優勢!
編輯:hfy
-
FPGA
+關注
關注
1632文章
21816瀏覽量
607054 -
寄存器
+關注
關注
31文章
5386瀏覽量
121514 -
PWM
+關注
關注
114文章
5206瀏覽量
215267
發布評論請先 登錄
相關推薦
用TMS2812開發板通過spi來控制ADS1299開發板的采集,波形非常紊亂是為什么?
正點原子和野火開發板哪個好
【AG32開發板體驗連載】雷達實現與控制
i.MX Linux開發實戰指南—基于野火i.MX系列開發板
正點原子ZYNQ7015開發板!ZYNQ 7000系列、雙核ARM、PCIe2.0、SFPX2,性能強悍,資料豐富!
[XILINX] 正點原子ZYNQ7035/7045/7100開發板發布、ZYNQ 7000系列、雙核ARM、PCIe2.0、SFPX2!
復旦微PS+PL異構多核開發案例分享,基于FMQL20SM國產處理器平臺
FM20S用戶手冊-PS + PL異構多核案例開發手冊
PY32系列單片機開發板 常用型號都有 支持Keil,IAR進行開發

評論