文章目录

    • 【1】创建一个新的IP核
    • 【2】实现功能
    • 【3】编辑IP核
    • 【4】IP封装
    • 【5】创建Vivado工程

【1】创建一个新的IP核

  • 1.1 打开Vivado->点击【Tasks->Manage IP->New IP Location】->弹出窗口
  • 1.2 【Next】->设置IP属性->【Finish】->【OK】
    • 【IP Location】:E:/work/fpga/custom_ip
    • 【Part】为开发板型号,可重新指定
  • 1.3【菜单栏/Tools/Create and Package New IP…】->【Next】->选中【Create a new AXI4 Periperal】->【Next】->设置IP核细节,只需改下名->【Next】
    • 我的IP核【Name】breath_led_ip
  • 1.4 设置AXI接口【Next】->【Finish】
    • 将【Name】改为S0_AXI
  • 1.3 右键【User Repository->AXI Peripheral->breath_led_ip_v1.0】->【Edit in IP Packager】->【OK】

至此,会打开一个新的工程。

【Add Interfaces】窗口中一些参数的解释。

  • 【Interface Tpye】接口类型
    • 【Lite】简化版的 AXI4 接口,用于较少数据量的存储映射通信
    • 【Full】高性能存储映射接口,用于较多数据量的存储映射通信
    • 【Stream】用于高速数据流传输,非存储映射接口。
  • 【Interface Mode】接口模式):有 Slave(从机)和 Master(主机)两种模式可选

【2】实现功能

这步比较轻车熟路了,右键【Design Sources】->【Add Sources】->【Add or create design sources】->【Next】->【Create Files】->填入文件名和路径->【Finish】->【OK】->【Yes】

  • 【File name】breath_led
  • 【File locaion】 项目路径\ip_repo\breath_led_ip_1.0\hdl

打开【breath_led.v】文件,编辑代码如下。

module breath_led(input          sys_clk        , //系统时钟 50MHzinput          sys_rst_n      , //系统复位,低电平有效input          sw_ctrl        , //呼吸灯开关控制信号 1:亮 0:灭input          set_en         , //设置呼吸灯频率设置使能信号input   [9:0]  set_freq_step  , //设置呼吸灯频率变化步长output         led              //LED灯
);//parameter define
parameter  START_FREQ_STEP = 10'd1; //设置频率步长初始值
parameter CNT_2US_MAX = 7'd100;    
parameter CNT_2MS_MAX = 10'd1000; 
parameter CNT_2S_MAX  = 10'd1000; //reg define
reg [6:0] cnt_2us; 
reg [9:0] cnt_2ms;   
reg [9:0] cnt_2s;     
reg       inc_dec_flag; //亮度递增/递减 0:递增 1:递减
reg [9:0] freq_step   ; //呼吸灯频率间隔步长
reg       led_t       ;assign led = led_t & sw_ctrl;//设置频率间隔,频率步长值在1-10之间
always @(posedge sys_clk) beginif(!sys_rst_n)freq_step <= START_FREQ_STEP;else if(set_en) beginif(set_freq_step == 0)freq_step <= 10'd1;else if(set_freq_step >= 10'd10)freq_step <= 10'd10;else    freq_step <= set_freq_step;end        
end//cnt_2us:计数2us
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2us <= 7'b0;else if(cnt_2us == (CNT_2US_MAX - 7'b1 ))cnt_2us <= 7'b0;elsecnt_2us <= cnt_2us + 7'b1;
end//cnt_2ms:计数2ms
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2ms <= 10'b0;else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2ms <= 10'b0;else if(cnt_2us == CNT_2US_MAX - 7'b1)cnt_2ms <= cnt_2ms + 10'b1;elsecnt_2ms <= cnt_2ms;
end//cnt_2s:计数2s
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2s <= 10'b0;else if(cnt_2s >= (CNT_2S_MAX - 10'b1) && cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2s <= 10'b0;else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2s <= cnt_2s + freq_step;elsecnt_2s <= cnt_2s;         
end//inc_dec_flag为低电平,led灯由暗变亮,inc_dec_flag为高电平,led灯由亮变暗
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)inc_dec_flag <= 1'b0;else if(cnt_2s >= (CNT_2S_MAX - 10'b1) && cnt_2ms ==( CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))inc_dec_flag <= ~inc_dec_flag;elseinc_dec_flag <= inc_dec_flag;
end//led:输出信号连接到外部的led灯
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)led_t <= 1'b0;else if((inc_dec_flag == 1'b1 && cnt_2ms >= cnt_2s) || (inc_dec_flag == 1'b0 && cnt_2ms <= cnt_2s))led_t <= 1'b1;elseled_t<= 1'b0;
endendmodule

【3】编辑IP核

由于【breath_led.v】文件未被引用,故而被归入【Unreferenced】文件夹下。接下来修改其顶层代码。

  • 3.1 双击【Design Sources/breath_led_ip_v1_0】,编辑其代码。
    • 在参数设置块中添加 parameter START_FREQ_STEP = 10'd1,
    • 在输入输出块中添加 output led,
    • 在实例化模块的语句中添加 .START_FREQ_STEP(START_FREQ_STEP),
    • 在实例化初始化语句中添加 .led(led),
  • 3.2 双击【breath_led_ip_v1_0】下方的【breath_led_ip_v1_0_S0_AXI_inst】,编辑其代码
    • 在参数设置块中添加 parameter START_FREQ_STEP = 10'd1,
    • 在输入输出块中添加 output led,
    • 在代码结尾,对breath_led.v文件进行实例化,即在【endmoule】上方Add User logic here的提示下,添加
      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]), .set_en (slv_reg1[31]),.set_freq_step (slv_reg1[9:0]),.led (led)
      ); 
      

至此,我们刚刚创建的【breath_led.v】文件就会被纳入【breath_led_ip_v1_0_S0_AXI_inst】下方。

【4】IP封装

  • 4.1 【Run Synthesis】->如果提示保存,则保存->【OK】->完成后点【Cancel】

  • 4.2 双击【Design Sources->IP-XACT->component.xml】,进行IP封装

  • 4.3 进入【Compatibility】->【➕】->Add Family Explicity->勾选zynq(Zynq-7000),Life-Cycle选择Pre-Production->【OK】

  • 4.4 进入【File Groups】->【Merge Changes from Groups Wizard】

  • 4.5 进入【Customization Parameters】->Merge Changes from Customization Parameters Wizard->右键【Hidden Parameters/START_FREQ_STEP】->【Edit Parameter】,按下面的设置,设置完成后点击【OK】

    • 勾选【Visible in Customization GUI】
    • Format设为【long】
    • 勾选【Specify Range】,Type设为【Range of integers】,最小值和最大值设为1到10。
    • 【Default Value】设为1
    • 在这里插入图片描述
  • 4.6 进入【Review and Package】->【IP has been modified】->【Re-Package IP】->【Yes】

至此,该工程会被关闭,在【…\drivers\breath_led_ip_v1_0\src】路径中,会生成C语言的源文件、头文件和makefile文件。修改makefile文件,在其libs段的上方,添加

OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c)))
ASSEMBLY_OBJECTS = $(addsuffix .o, $(basename $(wildcard *.S)))

将make clean上方的代码修改为

$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} ${ASSEMBLY_OBJECTS}

修改其clean段代码为

rm -rf ${OBJECTS} ${ASSEMBLY_OBJECTS}

【5】创建Vivado工程

  • 5.1 新建一个Vivado工程,名字为【user_led】,路径与custom_ip一致,选择你用的开发板->【菜单栏/Tools/Setting】

  • 5.2 进入【IP/Repository】->【➕】->找到刚刚创建的IP核路径,文件夹【breath_led_ip_1.0】->【Select】->【OK】

  • 5.3 【Create Block Design】,名字设为system->【➕】->搜索zynq并添加->双击模块进入编辑界面->,添加 UART 控制器(MIO14 和 MIO15)、修改 DDR3 控制器配置->Run Block Automation

  • 5.4 【➕】->搜索led->添加【breath_led_ip_v1.0】->双击可修改其配置

    • 在这里插入图片描述
  • 5.5 【Run Connection Automation】自动连线->【OK】

  • 5.6 右键【breath_led_ip_0】的【led】引脚->【Make External】->将引出的led_0改为【led】

【6】调用与验证

接下来要做的就没有什么好说的了,下面只列出步骤

  • 6.1 【Generate Output Products】->【Create HDL Wrapper】
  • 6.2 【Open Elaborated Design】->【I/O Planning Layout】->led分配为J16,LVCMOS33
  • 6.2 【Generate Bitstream】->【Export Hardware】
    • 注意:如果菜单栏下方有蓝色的【ELABORATED…】,需要将其x掉。
  • 6.3 创建vitis项目
#include "stdio.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"#define  LED_IP_BASEADDR   XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR  //LED IP基地址
#define  LED_IP_REG0       BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET  //LED IP寄存器地址0
#define  LED_IP_REG1       BREATH_LED_IP_S0_AXI_SLV_REG1_OFFSET  //LED IP寄存器地址1//main函数
int main()
{int freq_flag;      //定义频率状态,用于循环改变呼吸灯的呼吸频率int led_state;      //定义LED灯的状态xil_printf("LED User IP Test!\r\n");while(1){//根据freq_flag的标志位,切换呼吸灯的频率if(freq_flag == 0){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x80000001);freq_flag = 1;}else{BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x80000004);freq_flag = 0;}//获取LED当前开关状态   1:打开  0:关闭led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//如果开关关闭,打开呼吸灯if(led_state == 0){BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 1);xil_printf("Breath LED ON\r\n");}sleep(8);//获取LED当前开关状态   1:打开  0:关闭led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//如果开关打开,关闭呼吸灯if(led_state == 1){BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 0);xil_printf("Breath LED OFF\r\n");}sleep(1);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92920.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92920.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92920.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试】高级开发面试场景题

1、如何保证MySql到ES的数据一致性? 答:ES是一个开元分布式搜索和分析引擎、它提供了全文搜索、结构化搜索分析以及这些组合的能力。 全文搜索能力:ES支持复杂的搜索能力,包括模糊匹配、短语查询、布尔查询等,并且可以快速的返回结果 实时数据分析:实时数据分析,支持对…

《 慢 SQL 分析与 SQL 优化实战指南》

&#x1f50d; 慢 SQL 分析与 SQL 优化实战指南、 &#x1f9e0;前言 在数据库性能调优中&#xff0c;慢 SQL 是性能瓶颈的常见元凶。 一次慢查询可能会拖垮整个业务线程池&#xff0c;甚至引发锁等待、雪崩效应。 对后端开发与 DBA 而言&#xff0c;快速定位并优化慢 SQL&am…

C#中如何运用JWT用户认证

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一种轻量级的身份认证机制&#xff0c;广泛应用于分布式系统中的用户认证。它通过紧凑的JSON格式存储用户身份信息&#xff0c;并使用数字签名确保信息的完整性和真实性。与传统的基于Session的认证相比&#xff0c;JWT…

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…

【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)

基于 YOLO12 与 OpenCV 的实时点击目标跟踪系统 在计算机视觉领域&#xff0c;目标检测与跟踪是两个核心任务。本文将介绍一个结合 YOLO 目标检测模型与 OpenCV 跟踪算法的实时目标跟踪系统&#xff0c;该系统允许用户通过鼠标交互选择特定目标进行持续跟踪&#xff0c;支持多…

【数据库】 MySQL 表的操作详解

在 MySQL 数据库的日常开发与维护中&#xff0c;表的操作是最基础且最常用的部分。本文将从 创建表、查看表结构、修改表 以及 删除表 等方面进行详细讲解&#xff0c;并附上对应的 SQL 语句示例&#xff0c;方便在实际项目中直接应用。一、创建表 1.1 创建表语法 CREATE TABLE…

DiT: Transformer上的扩散模型

论文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代码和工程网页&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首个基于Transformer架构的扩散模型&#xff01;它在…

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

文章目录一、二叉查找树(BST)&#xff1a;不平衡二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高由一个例子总结索引的特点基于哈希表实现的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找树升级版的BST树&#xff1a;AVL 树四、…

ESP32入门开发·VScode空白项目搭建·点亮一颗LED灯

目录 1. 环境搭建 2. 创建项目 3. 调试相关介绍 4. 代码编写 4.1 包含头文件 4.2 引脚配置 4.3 设置输出电平 4.4 延时函数 4.5 调试 1. 环境搭建 默认已经搭建好环境&#xff0c;如果未搭建好可参考&#xff1a; ESP32入门开发Windows平台下开发环境的搭建…

ONLYOFFICE AI 智能体上线!与编辑器、新的 AI 提供商等进行智能交互

ONLYOFFICE AI 插件​迎来重要更新&#xff0c;带来了新功能和更智能的交互体验。随着 AI 智能体&#xff08;现为测试版&#xff09;的上线、带来更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已经成为功能强大的文档智能助理。 关于 ONLYOFFICE ONLYOFFICE 文档是多…

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…

【IoTDB】363万点/秒写入!IoTDB凭何领跑工业时序数据库赛道?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!

一、前言 当前研究领域在基于扩散模型的文本到图像生成技术方面取得了显著进展&#xff0c;尤其在视觉条件控制方面。然而&#xff0c;现有方法&#xff08;如ControlNet&#xff09;在组合多个视觉条件时存在明显不足&#xff0c;主要表现为独立控制分支在去噪过程中容易引入…

无人机遥控器教练模式技术要点

一、技术要点1.控制权仲裁机制&#xff1a;核心功能&#xff1a;清晰定义主控权归属逻辑&#xff08;默认为学员&#xff0c;但教练随时可接管&#xff09;。切换方式&#xff1a;通常通过教练遥控器上的物理开关&#xff08;瞬时或锁定型&#xff09;或软件按钮触发。切换逻辑…

【跨服务器的数据自动化下载--安装公钥,免密下载】

跨服务器的数据自动化下载功能介绍&#xff1a;上代码&#xff1a;发现好久没写csdn了&#xff0c;说多了都是泪~~ 以后会更新一些自动化工作的脚本or 小tricks&#xff0c;欢迎交流。分享一个最近在业务上写的较为实用的自动化脚本&#xff0c;可以批量从远端服务器下载指定数…

C++-->stl: list的使用

前言list的认识list是可以在固定时间&#xff08;O&#xff08;1&#xff09;&#xff09;内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕

1. 实现功能 M4-1 接入 whisper ollama qwen3:14b 总结字幕 自动下载视频元数据如果有字幕&#xff0c;只下载字幕使用 ollama 的 qwen3:14b 对字幕内容进行总结 2.运行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取视频元数据… &#x1f4dd; 正在…

《Linux运维总结:Shell脚本高级特性之变量间接调用》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、变量间接调用 在Shell脚本中&#xff0c;变量间接调用是一种高级特性&#xff0c;它允许你通过另一个变量的值来动态地访问…

ABP VNext + Akka.NET:高并发处理与分布式计算

ABP VNext Akka.NET&#xff1a;高并发处理与分布式计算 &#x1f680; 用 Actor 模型把高并发写入“分片→串行化”&#xff0c;把锁与竞态压力转回到代码层面的可控顺序处理&#xff1b;依托 Cluster.Sharding 横向扩容&#xff0c;Persistence 宕机可恢复&#xff0c;Strea…

[激光原理与应用-250]:理论 - 几何光学 - 透镜成像的优缺点,以及如克服缺点

透镜成像是光学系统中应用最广泛的技术&#xff0c;其通过折射原理将物体信息转换为图像&#xff0c;但存在像差、环境敏感等固有缺陷。以下是透镜成像的优缺点及针对性改进方案&#xff1a;一、透镜成像的核心优点高效集光能力透镜通过曲面设计将分散光线聚焦到一点&#xff0…