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

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

3天内不再提示

【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十章自定义IP实验

FPGA技术专栏 来源:芯驿电子科技 作者:芯驿电子科技 2021-02-01 10:13 次阅读

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(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总线来读写寄存器。

o4YBAGAKNOWAMIpZAAAi-fLhhz8189.jpg

2. Vivado工程建立

用”ps_hello”工程另存为一个名为“custom_pwm_ip”工程

2.1 创建自定义IP

1)点击菜单“Tools->Create and Package IP...”

pIYBAGAKNOWAYRWiAABIfv9cBdQ374.jpg

2)选择“Next”

o4YBAGAKNOaAd6lfAAB2EXt0RTg212.jpg

3)选择创建一个新的AXI4设备

pIYBAGAKNOeAUu1-AAB6oP_Qa0A344.jpg

4)名称填写“ax_pwm”,描述填写“alinx pwm”,然后选择一个合适的位置用来放IP

o4YBAGAKNOiAbEQmAABagsezIr0688.jpg

5)下面参数可以指定接口类型、寄存器数量等,这里不需要修改,使用AXI Lite Slave接口,4个寄存器。

pIYBAGAKNOiAAdpBAABj7UBQhxY405.jpg

6)点击“Finish”完成IP的创建

pIYBAGAKNOmANiB3AACJJceyGfg743.jpg

7)在“IP Catalog”中可以看到刚才创建的IP

o4YBAGAKNOqAXt_1AABfnsJvQ5s292.jpg

8)这个时候的IP只有简单的寄存器读写功能,我们需要修改IP,选择IP,右键“Edit in IP Packager”

pIYBAGAKNOuABb-XAAB5wL2-2-0474.jpg

9)这是弹出一个对话框,可以填写工程名称和路径,这里默认,点击“OK”

o4YBAGAKNOuAEtetAAA17-JaJbI828.jpg

10)Vivado打开了一个新的工程

o4YBAGAKNOyACrsZAACwZlnFUKU430.jpg

11)添加PWM功能的核心代码

pIYBAGAKNO2AEJd1AAB56r7YR5g428.jpg

12)添加代码时选择复制代码到IP目录

o4YBAGAKNO2AP6e3AABhBRYK7xc945.jpg

13)修改“ax_pwm_v1_0.v”,添加一个pwm输出端口

pIYBAGAKNO-AFDbbAACY2vDAPcs658.jpg

14)修改“ax_pwm_v1_0.v”,在例化“ax_pwm_V1_0_S00_AXI”,中添加pwm端口的例化

o4YBAGAKNPCAND1fAACXrElhvdk323.jpg

15)修改“ax_pwm_v1_0_s00_AXI.v”文件,添加pwm端口,这个文件是实现AXI4 Lite Slave的核心代码

pIYBAGAKNPGAfVKeAAC1P18MXRQ939.jpg

16)修改“ax_pwm_v1_0_s00_AXI.v”文件,例化pwm核心功能代码,将寄存器slv_reg0和slv_reg1用于pwm模块的参数控制。

o4YBAGAKNPKARUiNAACZ2BvS7TY765.jpg

17)双击“component.xml”文件

pIYBAGAKNPOAMPOlAACG_4F_9Ds374.jpg

18)在“File Groups”选项中点击“Merge changers from File Groups Wizard”

o4YBAGAKNPSAHXLoAABnifJeYpM486.jpg

19)在“Customization Parameters”选项中点击“Merge changes form Customization Parameters Wizard”

pIYBAGAKNPSAdXnJAABkMLBuJyw511.jpg

20)点击“Re-Package IP”完成IP的修改

o4YBAGAKNPWACkNEAABp4M9aDek479.jpg

2.2 添加自定义IP到工程

1)搜索“pwm”,添加“ax_pwm_v1.0”

pIYBAGAKNPaAfni5AACIPml-ZTs806.jpg

2)点击“Run Connection Automation”

o4YBAGAKNPaASDjDAABPNbNzgIc749.jpg

3)导出pwm端口

pIYBAGAKNPeAZfx6AABmoU89YPw159.jpgpIYBAGAKNPiAbwHbAACsHwPdf2k965.jpg

4)保存设计,并Generate Output Products

o4YBAGAKNPiAOfeQAABZos0RoU8815.jpg

5)添加xdc文件分配管脚,把pwm_0输出端口分配给LED1,做一个呼吸灯,编译生成bit文件,导出硬件

软件工程师工作内容

以下为软件工程师负责内容。

3. Vitis软件编写调试

1)启动Vitis,新建APP,模板选择“Hello World”

pIYBAGAKNPmAYh0uAAArgMgWQW4897.jpg

2)在bsp里找到“xparameters.h”文件,这个非常重要的文件,里面找到了自定IP的寄存器基地址,可以找到自定义IP的基地址。

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呈现出一个呼吸灯的效果。

5)通过debug,我们来查看一下寄存器

pIYBAGAKNPqAZ3V6AADeZlioycM690.jpg

6)进入debug状态,按“F6”可以单步运行。

o4YBAGAKNPuAB7J-AADD8tKfMNM794.jpg

7)通过菜单可以查看“Memory”窗口

pIYBAGAKNPyAF581AAC9jX40CWg716.jpg

8)添加一个监视地址“0x80000000”

o4YBAGAKNP2AKX8SAAAatVNNSRc158.jpgpIYBAGAKNP2AFIX5AAAfM_86tfo182.jpg

9)单步运行,观察变化

o4YBAGAKNP6AcdbWAADI0GQP9g4708.jpg

4. 实验总结

通过本实验我们掌握了更多的Vitis调试技巧,掌握了ARM + FPGA开发的核心内容,就是ARM和FPGA数据交互。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21729

    浏览量

    602972
  • Xilinx
    +关注

    关注

    71

    文章

    2167

    浏览量

    121293
  • IP
    IP
    +关注

    关注

    5

    文章

    1701

    浏览量

    149500
  • Zynq
    +关注

    关注

    10

    文章

    609

    浏览量

    47174
  • MPSoC
    +关注

    关注

    0

    文章

    198

    浏览量

    24271
收藏 人收藏

    评论

    相关推荐

    如何利用ZYNQ MPSoC玩DOOM?

    赛灵思和 DornerWorks 的系统软件团队在赛灵思的 Zynq® Ultrascale+MPSoC 上启动 Xen Project 管理程序时,我们发现可通过运行当年叱诧一时的流行电子游戏
    发表于 10-09 06:21

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

      如何调试Zynq UltraScale+ MPSoC VCU DDR控制器  Zynq UltraScale+
    发表于 01-07 16:02

    如何调试Zynq UltraScale+ MPSoC VCU DDR控制器

    如何调试 Zynq UltraScale+ MPSoC VCU DDR 控制器?
    发表于 01-22 06:29

    ZYNQ Ultrascale+ MPSOC FPGA教程

    ZYNQ Ultrascale+ MPSOC FPGA教程
    发表于 02-02 07:53

    Ti推出面向Zynq UltraScale+ MPSoC的电源参考设计

    本篇文章将与大家讨论的是Xilinx Zynq UltraScale+ MPSoC的电源解决方案参考设计。
    发表于 03-14 02:24 3701次阅读
    Ti推出面向<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>的电源参考设计

    Xilinx基于ARM的Zynq-7000和Zynq UltraScale+ MPSoC及RFSoC器件是否存在安全漏洞

    本文试图搞清楚在 Xilinx 基于 ARM 的 Zynq-7000、Zynq UltraScale+ MPSoCZynq
    发表于 06-28 15:53 2670次阅读

    Zynq UltraScale+ MPSoC存储器接口系统的介绍

    该视频重点介绍了UltraScale +产品系列的第一个成员Zynq®UltraScale+MPSoC,并展示了使用可编程逻辑中的DDR4 SDRAM
    的头像 发表于 11-29 06:36 3319次阅读

    Zynq UltraScale+ MPSoC的发售消息

    Zynq®UltraScale+MPSoC,现已开始发售。视频向您重点介绍了Xilinx UltraScale +产品组合的第一位成员
    的头像 发表于 11-27 06:47 3594次阅读

    米尔科技Zynq UltraScale+ MPSoC技术参考手册介绍

    Zynq UltraScale+ MPSoC是Xilinx推出的第二代多处理SoC系统,在第一代Zynq-7000的基础上做了全面升级,在单芯片上融合了功能强大的处理器系统(PS)和用
    的头像 发表于 11-18 11:03 3191次阅读
    米尔科技<b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>技术参考手册介绍

    如何调试 Zynq UltraScale+ MPSoC VCU DDR 控制器?

    Zynq UltraScale+ MPSoC VCU DDR 控制器是一款专用 DDR 控制器,只支持在 Zynq UltraScale+
    发表于 02-23 06:00 15次下载
    如何调试 <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b> VCU DDR 控制器?

    米尔电子zynq ultrascale+ mpsoc底板外设资源清单分享

    米尔电子推出的国内首款zynq ultrascale+ mpsoc平台核心板(及开发板):MYC-CZU3EG吸引了人工智能、工业控制、嵌入式视觉、ADAS、算法加速、云计算、有线/无线通信等
    发表于 01-07 15:20 3次下载
    米尔电子<b class='flag-5'>zynq</b> <b class='flag-5'>ultrascale+</b> <b class='flag-5'>mpsoc</b>底板外设资源清单分享

    ZYNQ Ultrascale+ MPSoC系列FPGA芯片设计

    基于 Xilinx 公司ZYNQ Ultrascale+ MPSoC系列 FPGA 芯片设计,应用于工厂自动化、机器视觉、工业质检等工业领域
    发表于 11-02 14:35 1579次阅读

    Zynq UltraScale+ MPSoC中的隔离方法

    电子发烧友网站提供《Zynq UltraScale+ MPSoC中的隔离方法.pdf》资料免费下载
    发表于 09-13 17:11 1次下载
    <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>中的隔离方法

    Zynq UltraScale+ MPSoC的隔离设计示例

    电子发烧友网站提供《Zynq UltraScale+ MPSoC的隔离设计示例.pdf》资料免费下载
    发表于 09-13 11:28 3次下载
    <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>的隔离设计示例

    Zynq UltraScale+ MPSoC验证数据手册

    电子发烧友网站提供《Zynq UltraScale+ MPSoC验证数据手册.pdf》资料免费下载
    发表于 09-15 10:13 0次下载
    <b class='flag-5'>Zynq</b> <b class='flag-5'>UltraScale+</b> <b class='flag-5'>MPSoC</b>验证数据手册