0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ZYNQ系列開(kāi)發(fā)板:PS控制PL產(chǎn)生需要的PWM波

電子設(shè)計(jì) ? 來(lái)源:CSDN ? 作者:ChuanjieZhu ? 2020-12-23 11:39 ? 次閱讀

這一節(jié)我們探索基于AXI總線的設(shè)計(jì),來(lái)看一看ZYNQ系列開(kāi)發(fā)板的獨(dú)特優(yōu)勢(shì),PS可以控制PL產(chǎn)生定制化的行為,而不需要去動(dòng)硬件代碼。

這次實(shí)驗(yàn)是產(chǎn)生頻率和占空比可調(diào)的PWM(Pulse Width Modulation)信號(hào),調(diào)用8次,產(chǎn)生8路PWM波,并用這些信號(hào)去控制8路LED燈,觀察實(shí)驗(yàn)效果。后面會(huì)做一個(gè)比較。

用的板子是zc702。

新建一個(gè)工程,命名為PWM_AXI_Lite

創(chuàng)建基于AXI總線的PWM波IP

IP設(shè)計(jì)為一個(gè)寄存器負(fù)責(zé)控制頻率,一個(gè)寄存器負(fù)責(zé)控制占空比。

創(chuàng)建一個(gè)IP核,tools-->Create and Package ,這里需要16個(gè)寄存器,創(chuàng)建方法見(jiàn)系列(六)、系列(七),這里命名為PWM_AXI_Lite。

在IP核工程里,新建一個(gè)PWM模塊文件,這里占空比設(shè)計(jì)的比較糙,直接就用一個(gè)計(jì)數(shù)值代替功能,后面的軟件設(shè)計(jì)要注意:

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

在自動(dòng)產(chǎn)生的實(shí)例文件里,添加端口信號(hào)和自定義功能,后面要約束到LED上:

o4YBAF9uHN2AXueaAAAee8p20ys261.png


o4YBAF9uHN6AdHWMAABHkC0jICo966.png

自定義的功能就是一個(gè)寄存器控制頻率(fre_set),一個(gè)寄存器控制占空比(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

在頂層模塊添加好用戶信號(hào),一個(gè)是端口里的,一個(gè)是調(diào)用里的:

pIYBAF9uHN-AD0k0AAA8JBRcnPY181.png


o4YBAF9uHOGAVAiuAACfxdJpB_8885.png

修改完后重新打包好。

回到原先建的工程,將這個(gè)IP添加到IP庫(kù)里,然后Create Block Design,添加ZYNQ核和PWM_AXI_Lite,為了觀察PWM波信號(hào),這里又添加了一個(gè)ILA(為了簡(jiǎn)化,可以去掉),配置如下:

o4YBAF9uHOOAaN7KAAD8pWVGi9o607.png


pIYBAF9uHOWAfQOIAADMoJSJWJY039.png

連接CLK 和 FCLK_CLK0 ,連接 Probe0 和 PWM_o,最后創(chuàng)建的系統(tǒng)如下:

o4YBAF9uHOeAMBx7AAFRaOZ6LCM920.png

添加約束文件,將8路PWM波綁定到8個(gè)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]}]

一系列常規(guī)操作,生成比特流文件后,Lanch到SDK。

SDK部分設(shè)計(jì)
在BSP包里找到xparameter.h文件:

pIYBAF9uHOiAGqF6AAAhWRFEXPE751.png

在xparameters.h文件里找到系統(tǒng)為我們的PWM IP配置的地址,待會(huì)我們要操作它的寄存器:

打開(kāi)xparameters.h文件,Ctrl+F:

pIYBAF9uHOqAfXYRAAE0fLqXvXs100.png

這個(gè)基地址就是我們的寄存器0的地址,然后我們將各路PWM波的頻率和占空比寫(xiě)入:
#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里會(huì)自動(dòng)打開(kāi)調(diào)試界面,觸發(fā)后能看到8路波形,在板子上我們可以看到LED燈依次閃爍!

總結(jié):

這里我們達(dá)到了led依次閃爍的效果,如同系列(六)達(dá)到的效果,但是這里有本質(zhì)的區(qū)別,系列(六)需要CPU一直發(fā)送指令控制LED燈,而這次試驗(yàn)CPU寫(xiě)入頻率和占空比后,現(xiàn)在8路PWM波自己工作,是PL完成的,不需要CPU發(fā)命令,CPU可以去干其他事情。這就是SOPC的優(yōu)勢(shì)!
編輯:hfy


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21777

    瀏覽量

    604727
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120813
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5196

    瀏覽量

    214378
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    用TMS2812開(kāi)發(fā)板通過(guò)spi來(lái)控制ADS1299開(kāi)發(fā)板的采集,波形非常紊亂是為什么?

    我用的是貴公司提供的ADS1299開(kāi)發(fā)板,用信號(hào)發(fā)生器產(chǎn)生的正弦信號(hào)源作為輸入信號(hào),用TMS2812開(kāi)發(fā)板通過(guò)spi來(lái)控制ADS1299開(kāi)發(fā)板
    發(fā)表于 01-08 07:52

    ZYNQ 7035/7045開(kāi)發(fā)板原理圖

    ZYNQ 7035/7045開(kāi)發(fā)板原理圖
    發(fā)表于 12-05 13:46 ?0次下載

    正點(diǎn)原子fpga開(kāi)發(fā)板不同型號(hào)

    ZYNQ-7000系列 ZYNQ-7000系列是正點(diǎn)原子的入門(mén)級(jí)FPGA開(kāi)發(fā)板,適合初學(xué)者和教育用途。這些
    的頭像 發(fā)表于 11-13 09:30 ?1031次閱讀

    正點(diǎn)原子和野火開(kāi)發(fā)板哪個(gè)好

    1.1 正點(diǎn)原子 正點(diǎn)原子開(kāi)發(fā)板通常采用Xilinx公司的ZYNQ系列FPGA芯片,這些芯片集成了ARM處理器和FPGA邏輯單元,能夠?qū)崿F(xiàn)高性能的嵌入式系統(tǒng)設(shè)計(jì)。正點(diǎn)原子開(kāi)發(fā)板的硬件
    的頭像 發(fā)表于 11-13 09:29 ?1393次閱讀

    【AG32開(kāi)發(fā)板體驗(yàn)連載】雷達(dá)實(shí)現(xiàn)與控制

    的項(xiàng)目計(jì)劃: 根據(jù)文檔,搭建開(kāi)發(fā)環(huán)境; 驗(yàn)證串口通信,并能夠串口控制開(kāi)發(fā)板; 基于內(nèi)部CPLD資源完成高頻脈沖產(chǎn)生,并能夠通過(guò)ARM端實(shí)現(xiàn)控制
    發(fā)表于 10-26 18:11

    ZYNQ核心學(xué)習(xí)筆記

    此款開(kāi)發(fā)板使用的是 Xilinx 公司的 Zynq7000 系列的芯片,型號(hào)為 XC7Z020-2CLG484I,484 個(gè)引腳的 FBGA 封裝。
    的頭像 發(fā)表于 10-24 18:08 ?928次閱讀
    <b class='flag-5'>ZYNQ</b>核心<b class='flag-5'>板</b>學(xué)習(xí)筆記

    i.MX Linux開(kāi)發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開(kāi)發(fā)板

    電子發(fā)燒友網(wǎng)站提供《i.MX Linux開(kāi)發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開(kāi)發(fā)板.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 17:23 ?11次下載

    正點(diǎn)原子ZYNQ7015開(kāi)發(fā)板!ZYNQ 7000系列、雙核ARM、PCIe2.0、SFPX2,性能強(qiáng)悍,資料豐富!

    ! 正點(diǎn)原子Z15 ZYNQ開(kāi)發(fā)板,搭載Xilinx Zynq7000系列芯片,核心主控芯片的型號(hào)是XC7Z015CLG485-2。
    發(fā)表于 09-14 10:12

    [XILINX] 正點(diǎn)原子ZYNQ7035/7045/7100開(kāi)發(fā)板發(fā)布、ZYNQ 7000系列、雙核ARM、PCIe2.0、SFPX2!

    7000系列芯片,核心支持Xilinx Zynq-7035、Zynq-7045和Zynq-7100三種型號(hào)。
    發(fā)表于 09-02 17:18

    復(fù)旦微PS+PL異構(gòu)多核開(kāi)發(fā)案例分享,基于FMQL20SM國(guó)產(chǎn)處理器平臺(tái)

    本文主要介紹復(fù)旦微FMQL20S400M的PS + PL異構(gòu)多核開(kāi)發(fā)案例,開(kāi)發(fā)環(huán)境如下: Windows開(kāi)發(fā)環(huán)境:Windows 7 64b
    發(fā)表于 08-22 14:04

    FM20S用戶手冊(cè)-PS + PL異構(gòu)多核案例開(kāi)發(fā)手冊(cè)

    PS端) + FPGA可編程邏輯資源(PL端)異構(gòu)多核SoC處理器設(shè)計(jì)的全國(guó)產(chǎn)工業(yè)評(píng)估PS端主頻高達(dá)1GHz。核心CPU、ROM、R
    發(fā)表于 07-25 16:14

    FT8132Q開(kāi)發(fā)板,使用外部PWM控制調(diào)速

    FT8132Q開(kāi)發(fā)板,使用外部PWM控制調(diào)速在開(kāi)發(fā)板上怎么設(shè)置,GUI里怎么設(shè)置,有沒(méi)有例程
    發(fā)表于 07-19 15:21

    全新MCX A系列MCU FRDM開(kāi)發(fā)板:開(kāi)箱即用的高效體驗(yàn)

    想嘗鮮全新的MCX A通用MCU,當(dāng)然少不了開(kāi)發(fā)板的支持。今天我們就向大家介紹恩智浦MCX A 系列全新一代FRDM開(kāi)發(fā)板FRDM-MCXA153。
    發(fā)表于 02-29 09:12 ?1071次閱讀
    全新MCX A<b class='flag-5'>系列</b>MCU FRDM<b class='flag-5'>開(kāi)發(fā)板</b>:開(kāi)箱即用的高效體驗(yàn)

    TC275哪些模塊能產(chǎn)生PWM?

    TC275用GTM還是CCU6產(chǎn)生PWM,想要控制兩個(gè)電機(jī),產(chǎn)生12路PWM波形,用什么模塊比
    發(fā)表于 02-06 06:28

    fpga開(kāi)發(fā)板與linux開(kāi)發(fā)板區(qū)別

    (Field-Programmable Gate Array)是一種可編程邏輯器件,它可以通過(guò)編程改變硬件邏輯電路的功能和結(jié)構(gòu)。FPGA采用了可編程的門(mén)極,可以根據(jù)需要重新配置內(nèi)部電路,從而實(shí)現(xiàn)不同的功能和邏輯關(guān)系。而Linux開(kāi)發(fā)板則是一種嵌入式計(jì)算機(jī)平臺(tái),其核心是Li
    的頭像 發(fā)表于 02-01 17:09 ?2360次閱讀