vivado修改ip配置_【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

本文通过一个实际案例详细介绍了如何在ZYNQ平台上设计一个自定义AXI总线IP,以实现PWM控制呼吸灯。作者首先讲解了PWM IP的设计原理和逻辑实现,接着阐述了硬件系统的搭建过程,包括AXI总线IP的创建和封装。在软件编程与调试环节,作者展示了如何通过CPU读写数据控制PWM IP。整个流程覆盖了从逻辑设计到硬件调试的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创 没落骑士 明德扬FPGA科教 3月14日

一、前言

  在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能。要想使自定义IP核被CPU访问,就必须带有总线接口。ZYNQ采用AXI BUS实现PS和PL之间的数据交互。本文以PWM为例设计了自定义AXI总线IP,来演示如何灵活运用ARM+FPGA的架构。

功能定义:

在上一篇ZYNQ入门实例博文讲解的系统中添加自定义IP核,其输出驱动LED灯实现呼吸灯效果。并且软件通过配置寄存器方式对其进行使能、打开/关闭配置以及选择占空比变化步长。另外,可以按键操作完成占空比变化步长的增减。

平台:米联客 MIZ702N (ZYNQ-7020)

软件:VIVADO+SDK 2017

注:自定义IP逻辑设计采用明德扬至简设计法

二、PWM IP设计

PWM无非就是通过控制周期脉冲信号的占空比,也就是改变高电平在一段固定周期内的持续时间来达到控制目的。脉冲周期需要一个计数器来定时,占空比由低变高和由高变低两种模式同样需要一个计数器来指示,因此这里使用两个嵌套的计数器cnt_cyc和cnt_mode。cnt_mode的加一条件除了要等待cnt_cyc计数完成,还要考虑占空比的变化。

我们可以使用下降沿位置表示占空比,位置越靠近周期值占空比越高。在模式0中下降沿位置按照步长增大直至大于等于周期值,模式1中下降沿位置则按照步长递减直到小于步长。使用两个信号up_stage和down_stage分别指示模式0和模式1。至于步长值,在配置有效时被更新,否则使用默认值。模块最终的输出信号在周期计数器小于下降沿位置为1,反之为零。

 VIVADO综合、布局布线比较慢,且软硬件级联调试费时费力,所以仿真是极其重要的。编写一个简单的testbench,定义update_freq_step task更新步长。这里使用System Verilog语法有一定的好处。首先单驱动信号可以统一定义为logic变量类型,其次等待时长能指定单位。

设计较简单,直接使用VIVADO仿真器观察波形即可:

ad177c1b854978903e3ddbeb92eb41e9.png

可以看到输出信号led的占空比在不断起伏变化,当更新freq_step为50后变化更为减慢。

ddffec6a325209c5c3258acccb810969.png

配置前相邻两个neg_loc数值差与更新后分别是100和50。以上证明逻辑功能无误。

三、硬件系统搭建

设计完PWM功能模块还没有完,需要再包一层总线Wrapper才能被CPU访问。

创建AXI总线IP

fae39e86a14bd99d453a901c61133d70.png

在封装器中编辑。

0104da1e10b2eadc059cd7bdd1b46f49.png

最终IP结构如图:

e9dcad67786128d872008fbc1ed53e97.png

具体操作不过多讲述,直接以代码呈现:

最后重新封装

9cf1a8eec074a202a87f59d159a48cf0.png

接下来搭建硬件IP子系统。

fc06f999ac69ae9ef9d018f72add7370.png

和之前相比只是添加了pwm_led_ip_0,并连接在AXI Interconnect的另一个Master接口上。使用SystemILA抓取总线信号以备后续观察。还是同样的操作流程:生成输出文件,生成HDL Wrapper,添加管脚约束文件,综合,实现,生成比特流并导出硬件,启动SDK软件环境。

四、软件编程与调试

其实CPU控制自定义IP的方式就是读写数据,写就是对指针赋值,读就是返回指针所指向地址中的数据,分别使用Xil_Out32()和Xil_In32()实现。创建pwm_led_ip.h文件,进行地址宏定义并编写配置函数。为了更好地实现软件库的封装和扩展,创建environment.h文件来include不同的库以及宏定义、全局变量定义。

  软件代码如下:

其他文件与上一篇ZYNQ入门实例博文相同。Run程序后多次按下按键,从串口terminal可以看出系统初始化成功,进入按键中断回调函数。开发板上呼吸灯频率也随着按键按下在变化。

d54c6831893a8ad296f7956b7b84914f.png

最后打开VIVADO硬件管理器,观察AXI总线波形:

5beb131d37ab24f49861ea703b8b26d0.png

按下步长值增加按键后,会有四次写数据操作,正好对应pwm_led_setFreqStep function中的四次Xil_Out32调用。每次写后一个时钟周期写响应通道BVALID拉高一个时钟周期证明写正确。

bcc2897010fc1806b5e71f558781f09e.png

再来观察用于确认写入无误的读操作对应总线波形:

c4a4390b921d6c66a70ed9273025caa7.png

读取数据为40,与写入一致。到此功能定义、设计规划、硬件逻辑设计仿真、IP封装、子系统搭建、软件设计、板级调试的流程全部走完。

注:代码未贴出,如果需要,可以找明德扬老师获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值