0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZYNQ系列开发板:PS控制PL产生需要的PWM波

电子设计 来源:CSDN 作者:ChuanjieZhu 2020-12-23 11:39 次阅读

这一节我们探索基于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上:

o4YBAF9uHN2AXueaAAAee8p20ys261.png


o4YBAF9uHN6AdHWMAABHkC0jICo966.png

自定义的功能就是一个寄存器控制频率(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

在顶层模块添加好用户信号,一个是端口里的,一个是调用里的:

pIYBAF9uHN-AD0k0AAA8JBRcnPY181.png


o4YBAF9uHOGAVAiuAACfxdJpB_8885.png

修改完后重新打包好。

回到原先建的工程,将这个IP添加到IP库里,然后Create Block Design,添加ZYNQ核和PWM_AXI_Lite,为了观察PWM波信号,这里又添加了一个ILA(为了简化,可以去掉),配置如下:

o4YBAF9uHOOAaN7KAAD8pWVGi9o607.png


pIYBAF9uHOWAfQOIAADMoJSJWJY039.png

连接CLK 和 FCLK_CLK0 ,连接 Probe0 和 PWM_o,最后创建的系统如下:

o4YBAF9uHOeAMBx7AAFRaOZ6LCM920.png

添加约束文件,将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文件:

pIYBAF9uHOiAGqF6AAAhWRFEXPE751.png

在xparameters.h文件里找到系统为我们的PWM IP配置的地址,待会我们要操作它的寄存器:

打开xparameters.h文件,Ctrl+F:

pIYBAF9uHOqAfXYRAAE0fLqXvXs100.png

这个基地址就是我们的寄存器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
    +关注

    关注

    1626

    文章

    21679

    浏览量

    602143
  • 寄存器
    +关注

    关注

    31

    文章

    5327

    浏览量

    120073
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5157

    浏览量

    213495
收藏 人收藏

    评论

    相关推荐

    正点原子fpga开发板不同型号

    ZYNQ-7000系列 ZYNQ-7000系列是正点原子的入门级FPGA开发板,适合初学者和教育用途。这些
    的头像 发表于 11-13 09:30 342次阅读

    正点原子和野火开发板哪个好

    1.1 正点原子 正点原子开发板通常采用Xilinx公司的ZYNQ系列FPGA芯片,这些芯片集成了ARM处理器和FPGA逻辑单元,能够实现高性能的嵌入式系统设计。正点原子开发板的硬件
    的头像 发表于 11-13 09:29 296次阅读

    【AG32开发板体验连载】雷达实现与控制

    的项目计划: 根据文档,搭建开发环境; 验证串口通信,并能够串口控制开发板; 基于内部CPLD资源完成高频脉冲产生,并能够通过ARM端实现控制
    发表于 10-26 18:11

    ZYNQ核心学习笔记

    此款开发板使用的是 Xilinx 公司的 Zynq7000 系列的芯片,型号为 XC7Z020-2CLG484I,484 个引脚的 FBGA 封装。
    的头像 发表于 10-24 18:08 489次阅读
    <b class='flag-5'>ZYNQ</b>核心<b class='flag-5'>板</b>学习笔记

    i.MX Linux开发实战指南—基于野火i.MX系列开发板

    电子发烧友网站提供《i.MX Linux开发实战指南—基于野火i.MX系列开发板.pdf》资料免费下载
    发表于 10-10 17:23 9次下载

    正点原子ZYNQ7015开发板ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!

    ! 正点原子Z15 ZYNQ开发板,搭载Xilinx Zynq7000系列芯片,核心主控芯片的型号是XC7Z015CLG485-2。
    发表于 09-14 10:12

    [XILINX] 正点原子ZYNQ7035/7045/7100开发板发布、ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2!

    7000系列芯片,核心支持Xilinx Zynq-7035、Zynq-7045和Zynq-7100三种型号。
    发表于 09-02 17:18

    复旦微PS+PL异构多核开发案例分享,基于FMQL20SM国产处理器平台

    本文主要介绍复旦微FMQL20S400M的PS + PL异构多核开发案例,开发环境如下: Windows开发环境:Windows 7 64b
    发表于 08-22 14:04

    FM20S用户手册-PS + PL异构多核案例开发手册

    PS端) + FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业评估PS端主频高达1GHz。核心CPU、ROM、R
    发表于 07-25 16:14

    FT8132Q开发板,使用外部PWM控制调速

    FT8132Q开发板,使用外部PWM控制调速在开发板上怎么设置,GUI里怎么设置,有没有例程
    发表于 07-19 15:21

    PY32系列单片机开发板 常用型号都有 支持Keil,IAR进行开发

    、IOT、传感器、电动工具、电机控制等领域。 PY32系列单片机与大部份国产通用型MCU一样,支持Keil,IAR进行开发。芯岭技术提供目前PY32系列主流单片机
    的头像 发表于 05-22 14:48 935次阅读
    PY32<b class='flag-5'>系列</b>单片机<b class='flag-5'>开发板</b> 常用型号都有 支持Keil,IAR进行<b class='flag-5'>开发</b>

    全新MCX A系列MCU FRDM开发板:开箱即用的高效体验

    想尝鲜全新的MCX A通用MCU,当然少不了开发板的支持。今天我们就向大家介绍恩智浦MCX A 系列全新一代FRDM开发板FRDM-MCXA153。
    发表于 02-29 09:12 964次阅读
    全新MCX A<b class='flag-5'>系列</b>MCU FRDM<b class='flag-5'>开发板</b>:开箱即用的高效体验

    TC275哪些模块能产生PWM

    TC275用GTM还是CCU6产生PWM,想要控制两个电机,产生12路PWM波形,用什么模块比
    发表于 02-06 06:28

    fpga开发板与linux开发板区别

    (Field-Programmable Gate Array)是一种可编程逻辑器件,它可以通过编程改变硬件逻辑电路的功能和结构。FPGA采用了可编程的门极,可以根据需要重新配置内部电路,从而实现不同的功能和逻辑关系。而Linux开发板则是一种嵌入式计算机平台,其核心是Li
    的头像 发表于 02-01 17:09 2121次阅读

    AD9681是否可被zynq-7020的pl端驱动?

    您好: 我想咨询AD9681是否可以被zynq-7020的PL端驱动(zynq7020的性能是否足够)。我们需要做卫星的探测载荷,由于卫星能源控制
    发表于 12-04 08:18