zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤一)
- 在Vivado开始界面选择
Manage IP
,新建一个名为custom_ip的文件夹专门存放IP核
- 新建一个IP,
Tools
下打开Create and Package New IP
- 在
IP Catalog
下可以看见很多官方IP,User Repository
下才是自己的IP,我之前跟着视频做了一遍,直接用得别人呼吸灯的代码但是因为按键复位高电平和别人板子不一样没办法运行 ,(复位信号用得是系统低电平复位)懒得直接修改原先IP再更新到工程里,就直接新建一个IP看能否成功。下面有些图中名字为breathe_led_ip,不要惊慌,这时上一个IP的名字,流程是一样的。
- 第一步先next,第二步选择
Create a new AXI4 Peripheral
创建AXI4接口的IP,第三步在Name
下修改IP名字为breath_led_ip
- 配置AXI接口,将名字修改为
S0_AXI
,少量数据Interface Type
选择Lite
,作为从接口Interface Mode
选择Slave
,寄存器数量最少为4个。
- 将IP添加进工程,右键点击IP选择
Edit in IP Packager
- 点击OK打开一个新的临时工程,你可以在里面编辑IP。总共生成两个模块,
breath_led_ip_v1_0
是顶层模块,breath_led_ip_v1_0_S0_AXI_inst
是例化的模块。
- 在
Design Sources
下创建breath_led文件
- 选择文件放得位置,
custom_ip->ip_repo
下的breath_led_ip_1.0->hdl
,然后点击Finish->OK->Yes
- 把下面这份代码复制进breath_led,和最初在FPGA上实现的代码相比,增加了
set_en
set_freq_step
和sw_ctrl
这三个输入端口信号,sw_ctrl呼吸灯开关控制信号,sw_ctrl=1时打开呼吸灯开关。set_en呼吸灯频率使能信号,set_freq_step呼吸灯频率变化步长,set_en=1时set_freq_step有效。呼吸灯变化步长越大,变化频率越快。呼吸灯占空比一直在每个周期里不断变化,循环增加或减少的过程。
module breath_led(input sys_clk, // 时钟信号input sys_rst, // 复位信号input sw_ctrl, // 呼吸灯开关控制信号 1:亮 0:灭input set_en, // 设置呼吸灯频率设置使能信号input [9:0] set_freq_step, // 设置呼吸灯频率变化步长output wire led);// parameter defineparameter START_FREQ_STEP = 10'd100; // 设置频率步长初始值// reg definereg [16:0] period_cnt; // 周期计数器reg [9:0] freq_step; // 呼吸灯频率间隔步长reg [16:0] duty_cycle; // 设置高电平占空比的计数点reg inc_dec_flag; // 用于表示高电平占空比的计数值,是递增还是递减// 为1时表示占空比递减,为0时表示占空比递增// wire definewire led_t;// 将周期信号计数值与占空比计数值进行比较,以输出驱动led的PWM信号assign led_t = (period_cnt <= duty_cycle) ? 1'b1 : 1'b0;assign led = led_t & sw_ctrl;// 周期信号计数器在0-100_000之间计数always @(posedge sys_clk) beginif(sys_rst == 1'b1)period_cnt <= 17'd0;else if(!sw_ctrl)period_cnt <= 17'd0;else if(period_cnt == 17'd100_000)period_cnt <= 17'd0;elseperiod_cnt <= period_cnt + 17'd1;end// 设置频率间隔 1-1000always @(posedge sys_clk) beginif(sys_rst == 1'b1)freq_step <= START_FREQ_STEP;else if(set_en) beginif(set_freq_step == 0)freq_step <= 10'd1;else if(set_freq_step >= 10'd1_000)freq_step <= 10'd1_000;elsefreq_step <= set_freq_step;endend// 设置高电平占空比的数always @(posedge sys_clk) beginif(sys_rst == 1'b1) beginduty_cycle <= 17'd0;inc_dec_flag <= 1'b0;endelse if(!sw_ctrl) begin // 呼吸灯开关关闭时,信号清零duty_cycle <= 17'd0;inc_dec_flag <= 1'b0;end// 每次计数完一个周期,就调节占空比计数值else if(period_cnt == 17'd100_000) beginif(inc_dec_flag) begin // 占空比递减if(duty_cycle == 17'd0)inc_dec_flag <= 1'b0;else if(duty_cycle < freq_step)duty_cycle <= 17'd0;endelse begin // 占空比递增if(duty_cycle >= 17'd100_000)inc_dec_flag <= 1'b1;elseduty_cycle <= duty_cycle + freq_step;endendelse // 未计数完一个周期,占空比保持不变duty_cycle <= duty_cycle;end
endmodule
- 发现上述代码是有问题的,修改如下
module breath_led(input sys_clk, // 时钟信号input sys_rst_n, // 复位信号input sw_ctrl, // 呼吸灯开关控制信号 1:亮 0:灭input set_en, // 设置呼吸灯频率设置使能信号input [9:0] set_freq_step, // 设置呼吸灯频率变化步长output wire led);// parameter defineparameter START_FREQ_STEP = 10'd100; // 设置频率步长初始值// reg definereg [16:0] period_cnt; // 周期计数器reg [9:0] freq_step; // 呼吸灯频率间隔步长reg [16:0] duty_cycle; // 设置高电平占空比的计数点reg inc_dec_flag; // 用于表示高电平占空比的计数值,是递增还是递减// 为1时表示占空比递减,为0时表示占空比递增// wire definewire led_t;// 将周期信号计数值与占空比计数值进行比较,以输出驱动led的PWM信号assign led_t = (period_cnt <= duty_cycle) ? 1'b1 : 1'b0;assign led = led_t & sw_ctrl;// 周期信号计数器在0-100_000之间计数always @(posedge sys_clk) beginif(sys_rst_n == 1'b0)period_cnt <= 17'd0;else if(!sw_ctrl)period_cnt <= 17'd0;else if(period_cnt == 17'd100_000)period_cnt <= 17'd0;elseperiod_cnt <= period_cnt + 17'd1;end// 设置频率间隔 1-1000always @(posedge sys_clk) beginif(sys_rst_n == 1'b0)freq_step <= START_FREQ_STEP;else if(set_en) beginif(set_freq_step == 0)freq_step <= 10'd1;else if(set_freq_step >= 10'd1_000)freq_step <= 10'd1_000;elsefreq_step <= set_freq_step;endend// 设置高电平占空比的数always @(posedge sys_clk) beginif(sys_rst_n == 1'b0) beginduty_cycle <= 17'd0;inc_dec_flag <= 1'b0;endelse if(!sw_ctrl) begin // 呼吸灯开关关闭时,信号清零duty_cycle <= 17'd0;inc_dec_flag <= 1'b0;end// 每次计数完一个周期,就调节占空比计数值else if(period_cnt == 17'd100_000) beginif(inc_dec_flag) begin // 占空比递减if(duty_cycle == 17'd0)inc_dec_flag <= 1'b0;// else if(duty_cycle < freq_step)// duty_cycle <= 17'd0;elseduty_cycle <= duty_cycle - freq_step;endelse begin // 占空比递增if(duty_cycle >= 17'd100_000)inc_dec_flag <= 1'b1;elseduty_cycle <= duty_cycle + freq_step;endendelse // 未计数完一个周期,占空比保持不变duty_cycle <= duty_cycle;end
endmodule
- 在
breath_led_ip_v1_0_S0_AXI_inst
第400行添加例化的模块,需要对参数进行例化。时钟选择AXI全局的时钟,复位是低电平复位。set_en
set_freq_step
和sw_ctrl
是4个32位寄存器slv_reg进行控制,set_en是一位信号可以选择slv_reg0的最低位进行控制。
breath_led
#(.START_FREQ_STEP(START_FREQ_STEP)
)
u_breath_led(.sys_clk(S_AXI_ACLK), // 时钟信号.sys_rst_n(S_AXI_ARESETN), // 复位信号.sw_ctrl(slv_reg0[0]), // 呼吸灯开关控制信号 1:亮 0:灭.set_en(slv_reg1[31]), // 设置呼吸灯频率设置使能信号.set_freq_step(slv_reg1[9:0]), // 设置呼吸灯频率变化步长.led(led));
- 第七行添加参数的定义
- 第18行增加用户端口
- 在
breath_led_ip_v1_0
中添加例化和端口声明
- 对项目进行综合
run synthesis
看是否有错误
对模块进行进一步的封装,打开IP核封装界面
Package IP
(这个界面关闭了可以点击component.xml打开)。
适用范围添加zynq系列
File Groups下此时未看到自定义的breath_led代码,还未更新进来。
Customization Parameters
下点击Merge自动合并,然后展开隐藏参数可以看见START_FREQ_STEP
点击隐藏参数下的START_FREQ_STEP对他进行修改,
Visible in Customization GUI
✔就可以在GUI界面里看见。Format修改为lo ng。指定范围Specify Range
✔修改类型为Range of integers
整型,最小值为1最大值为1000。默认值修改为100.
修改完成可以看见隐藏参数文件夹不见了
File Groups
需要再点下Merge可以看见呼吸灯模块
Ports and Interfaces
下查看端口
Addressing and Memory
进行存储映射可以不用管他
Customeization GUI
可以看见定义的IP
Repackage IP
完成IP封装
封装完成可以点Yes关闭这个工程,没有弹出这个窗口可以手动关闭
定义完IP核后可以创建新工程
File->Project->New
,点击IP Catalog
并没有出现自己定义的IP
点击Settings将IP关联进来点➕添加路径
选择
ip_repo
下的breath_led_ip_1.0
出现呼吸灯的IP,点击OK
想要修改呼吸灯IP,右击这个IP即可,下一步在Diagram里进行修改block design文件
zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤一)相关推荐
- zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤三配置SDK)
新建一个工程,模板选择空,在板级支持包可以看见breath_led的三个文件,可以根据这个对呼吸灯模块进行配置 新建main.c,首先把呼吸灯开关打开,通过接口对呼吸灯做一个配置,打开 breath_ ...
- zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤二配置block design)
点➕添加breath_led_ip,可以直接搜索,双击进行查看 点击Run Connection Automation让软件自动连接 点下刷新按钮修改一下布局 引出led的管脚修改为led Gener ...
- 米联客 ZYNQ/SOC 精品教程 S02-CH19 利用BRAM进行PS与PL间数据交互
软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...
- 米联客 ZYNQ/SOC 精品教程 S02-CH20 利用EMIF进行PS与PL间数据交互
软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...
- zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)
axi_gpio是PL端gpio(FPGA资源搭建的软核),ps7_gpio是ps端gpio(硬核).打开Documentation的示例Examples,可知第二个是关于中断的示例.导入示例impo ...
- ZYNQ开发系列——使用AXI4LITE接口进行PS和PL交互
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--使用AXI4LITE接口进行PS和PL交互 前言 PS端AXI接口 AXI4LITE slave模块的设计 后记 ...
- ZYNQ开发系列——为PS和PL的交互做准备
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--为PS和PL的交互做准备 我们使用ZYNQ的片子,肯定存在PS和PL交互的情况.一般来说大部分应用都是以PS为主机 ...
- zynq开发系列3:GPIO连接MIO通过按键控制LED灯亮起
按键和LED由MIO连接,在PS端用按键控制LED,按键按下时发出信号,LED接收到信号后亮起 可以参考上一节实验 zynq开发系列2:GPIO连接MIO控制LED闪烁 的流程和代码,在vivado操 ...
- ZYNQ开发系列——hw_platform包和BSP包中的一些理解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ZYNQ开发系列--hw_platform包和BSP包中的一些理解 前言 hw_platform BSP包 前言 前面我们完成了PS输 ...
最新文章
- Swift 圆环进度条
- java中的深浅拷贝
- PostgreSQL数据库、表空间、角色及用户
- 2014-2-28 思杨的语言能力
- WPF使用Canvas绘制可变矩形
- openlayers3 根据经纬度 自动画框_用这软件,让你的电脑自动搞黄色
- 1.5编程基础之循环控制 26 统计满足条件的4位数个数 python
- 【华为云技术分享】【我的物联网成长记20】物联网智慧路灯应用代码解析(下)
- 苹果电脑如何读写ntfs格式磁盘
- 数据结构笔记(十七)--矩阵的压缩存储
- android jni示例_Android切换按钮,开关示例
- git解决 remote: Permission to wuheng1991/site-manager.git denied to XXX
- vue 中使用海康威视视频插件
- STC89C52RC单片机程序烧录方法
- kNN_hand_writing(机器学习)
- SpringCloud微服务网关技术——Gateway网关的使用
- 阿里云---云开发平台的创建与部署
- 企业如何从0到1落地BI项目
- 【每日一题见微知著】二分法——找单身狗(bushi)
- MATLAB小技巧(20)矩阵分析--主成分回归
热门文章
- 2020最常用的8个代码编辑器推荐
- 魔百盒配置服务器信息,移动魔百盒网络设置方法
- vue的介绍及基本使用(详细,好理解,示例代码)
- unity 导入gltf_基于gltf的GPU蒙皮动画(一)
- linux 安装simg2img,linux可执行文件执行时提示No such file or directory(docker环境中运行的ubuntu镜像)...
- LeetCode 11盛水最多的容器
- LAV Filter 源代码分析 1: 总体结构
- RTMPDump源代码分析 0: 主要函数调用分析
- java 合并对象中属性_Java2个对象形集合按某一个属性合并
- arcgis中img 批量转换tif_在ArcGIS中Python使用及批量裁剪示技巧讲解 !