【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果原创没落骑士 明德扬 FPGA 科教 3 月 14 日一 前言 在实时性要求较高的场合中 CPU 软件执行的方式显然不能满足需求 这时需要硬件逻辑实现部分功能

欢迎大家来到IT世界,在知识的湖畔探索吧!

原创 没落骑士 明德扬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,反之为零。

<PWM IP逻辑代码>

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

<testbench代码>

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果



欢迎大家来到IT世界,在知识的湖畔探索吧!

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

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

三、硬件系统搭建

  

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

创建AXI总线IP

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

在封装器中编辑。

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

最终IP结构如图:

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

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

<AXI IP顶层和Slave逻辑代码>

  

最后重新封装

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

和之前相比只是添加了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可以看出系统初始化成功,进入按键中断回调函数。开发板上呼吸灯频率也随着按键按下在变化。

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

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

【至简案例】ZYNQ自定义AXI总线IP应用 ——PWM实现呼吸灯效果

  

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/122696.html

(0)
上一篇 1小时前
下一篇 43分钟前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信