当前位置: 首页 > news >正文

自定义AXI_PWM_v1.0——ZYNQ学习笔记15

自定义IP

实现从PS段配置输出频率,输出占空比,输出使能配置

配置界面Clk Hz为AXI总线参考时钟

模块底层代码

module breath_pwm
#(parameter CLK_HZ = 100_000_000      // 输入时钟频率
)
(input  wire        sys_clk,         // 100 MHzinput  wire        sys_rst_n,       // 低电平复位input  wire [13:0] set_freq_duty,   // 0-10000 对应 0%-100%input  wire        set_freq_en,     // 使能,为 0 时 PWM 输出 0input  wire [24:0] set_freq,        // 目标频率,单位 Hzoutput reg         PWM
);//------------------------------------------------------------------
// 1. 计算一个 PWM 周期所需的时钟周期数
//------------------------------------------------------------------
reg  [31:0] period_cnt_max;         // = CLK_HZ / set_freq
wire [31:0] next_period_cnt_max =(set_freq == 0) ? 32'hFFFF_FFFF : (CLK_HZ / set_freq);
always @(posedge sys_clk or negedge sys_rst_n)if (!sys_rst_n) beginperiod_cnt_max <= 32'hFFFF_FFFF;endelse if (set_freq_en) beginperiod_cnt_max <= next_period_cnt_max;end
//------------------------------------------------------------------
// 2. 计算高电平持续时间(高电平时钟周期数)
//------------------------------------------------------------------
wire [31:0] high_cnt =((period_cnt_max * set_freq_duty) + 15'd5000) / 16'd10000; // 四舍五入
//------------------------------------------------------------------
// 3. PWM 周期计数器 & 输出逻辑
//------------------------------------------------------------------
reg [31:0] period_cnt;
always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) beginperiod_cnt <= 32'd0;PWM        <= 1'b0;endelse if (!set_freq_en) beginperiod_cnt <= 32'd0;PWM        <= 1'b0;endelse beginif (period_cnt >= period_cnt_max - 32'd1) beginperiod_cnt <= 32'd0;endelse beginperiod_cnt <= period_cnt + 32'd1;PWM <= (period_cnt < high_cnt) ? 1'b1 : 1'b0;endend
endendmodule

顶层AXI接口封装

测试工程

#include "AXI_PWM.h"
#include "xparameters.h"
#include "stdio.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_printf.h"#define	PWM_BASEADDR XPAR_AXI_PWM_0_S0_AXI_BASEADDR		//AXI_PWM IP 基地址//AXI_PWM IP 寄存器偏移地址
#define AXI_PWM_REG0 AXI_PWM_S0_AXI_SLV_REG0_OFFSET		//[13:0]:PWM输出占空比,10000映射到100.00
#define AXI_PWM_REG1 AXI_PWM_S0_AXI_SLV_REG1_OFFSET		//[0 :0]:PWM输出使能位
#define AXI_PWM_REG2 AXI_PWM_S0_AXI_SLV_REG2_OFFSET		//[25:0]:PWM输出频率(Hz)
#define AXI_PWM_REG3 AXI_PWM_S0_AXI_SLV_REG3_OFFSET		//[x :x]:NCint main(){xil_printf("AXI_IP_PWM!!\r\n");AXI_PWM_mWriteReg(PWM_BASEADDR, AXI_PWM_REG0, 0x04D2);		//50.00%	0x1388->5000		0x04D2->1234AXI_PWM_mWriteReg(PWM_BASEADDR, AXI_PWM_REG2, 0x04D2);		//100khz	0x186A0->100_000while(1){//打开输出使能AXI_PWM_mWriteReg(PWM_BASEADDR, AXI_PWM_REG1, 1);xil_printf("PWM ON\r\n");sleep(1);//关闭	输出使能
//		AXI_PWM_mWriteReg(PWM_BASEADDR, AXI_PWM_REG1, 0);
//		xil_printf("PWM OFF\r\n");
//		sleep(1);}}

IP获取链接

通过网盘分享的文件:AXI_PWM_v1.0.zip
链接: https://pan.baidu.com/s/1ENpRrl0rJ-y4QVsz3ky9JA?pwd=5875 提取码: 5875

(PS:需要替换makefile文件)

http://www.dtcms.com/a/360412.html

相关文章:

  • Ultra Low Power Transceiver for Wireless Body Area Networks中文版
  • Makefile语句解析:头文件目录自动发现与包含标志生成
  • Day 01(01): Hadoop与大数据基石
  • RPC个人笔记(包含动态代理)
  • Qwen2.5-VL代码初步解读
  • 一个从7zip中分离出来的高压缩比文本压缩工具ppmd
  • 使用PowerShell监听本地端口
  • 多线程案例、线程池
  • QT6(QStandardItemModel和QTableView及自定义代理)
  • 第3章 乱码的前世今生-字符集和比较规则
  • 部署在windows的docker中的dify知识库存储位置
  • 常见线程池的创建方式及应用场景
  • Cookie、Session 和 JWT
  • 【K8s-Day 22】深入解析 Kubernetes Deployment:现代应用部署的基石与滚动更新的艺术
  • 服装管理软件与工厂计件系统精选
  • 【OpenGL】LearnOpenGL学习笔记18 - Uniform缓冲对象UBO
  • [每周一更]-(第158期):构建高性能数据库:MySQL 与 PostgreSQL 系统化问题管理与优化指南
  • XPlayer播放器APP:安卓平台上的全能视频播放器
  • 网络代理协议深度对比
  • Linux/UNIX系统编程手册笔记:系统和进程信息、文件I/O缓冲、系统编程概念以及文件属性
  • Multi-Head RAG: Solving Multi-Aspect Problems with LLMs
  • ST-2110概述
  • MySQL专题Day(1)————事务
  • postman 用于接口测试,举例
  • Linux shell 脚本基础 003
  • centos7安装jdk17
  • c++程序员日常超实用工具(长期记录更新)
  • PS自由变换
  • 【人工智能99问】LLaMA中的RoPE是什么?(35/99)
  • 学习Python中Selenium模块的基本用法(12:操作Cookie)