新闻详情

新闻详情

首页 / 资讯中心 / 详情

【正点原子ZYNQ领航者7020】自定义IP核

发布时间:2026/9/16 7:43:09来源:尧图网络
【正点原子ZYNQ领航者7020】自定义IP核
文章目录前言1.创建自定义IP核工程2.创建Vivado工程3.Vitis软件设计4.下载验证5.如何修改自定义的IP核前言无仅作记录不具有参考价值。1.创建自定义IP核工程这里的名字可以和图中不同 这里取的是breath_led_ip_test因为之前已经有个我自己建立的breath_led_ipIP核这里只是为了展示IP核的建立过程verilog代码还是使用的是breath_led_ip_test的名字vitis代码中用的是breath_led_ip的名字后面会有一个使用breath_led_ipIP核的工程打包zip给你们下载这里要关注的是建立过程在D:\ldy\VivadoIPs\custom_ip\ip_repo\breath_led_ip_test_1.0\hdl中添加breath_led.v文件并导入到工程中修改前的breath_led.v:modulebreath_led(input sys_clk,input sys_rst_n,output reg led);parameter CNT_2US_MAX100;reg[6:0]cnt_2us;reg[9:0]cnt_2ms;reg[9:0]cnt_2s;reg led_flag;always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2us0;elseif(cnt_2usCNT_2US_MAX-1)cnt_2uscnt_2us1;elsecnt_2us0;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2ms0;elseif(cnt_2usCNT_2US_MAX-1cnt_2ms1000-1)cnt_2mscnt_2ms1;elseif(cnt_2usCNT_2US_MAX-1cnt_2ms1000-1)cnt_2ms0;elsecnt_2mscnt_2ms;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2s0;elseif(cnt_2usCNT_2US_MAX-1cnt_2ms1000-1cnt_2s1000-1)cnt_2scnt_2s1;elseif(cnt_2usCNT_2US_MAX-1cnt_2ms1000-1cnt_2s1000-1)cnt_2s0;elsecnt_2scnt_2s;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)led_flag1;elseif(cnt_2usCNT_2US_MAX-1cnt_2ms1000-1cnt_2s1000-1)led_flag!led_flag;elseled_flagled_flag;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)led0;elseif(led_flag)beginif(cnt_2mscnt_2s)led1;elseled0;endelsebeginif(cnt_2mscnt_2s)led1;elseled0;end end// ila_0 u_lia_0 (// .clk(sys_clk), // input wire clk// .probe0(sys_rst_n), // input wire [0:0] probe0// .probe1(led), // input wire [0:0] probe1// .probe2(cnt_2us), // input wire [6:0] probe2// .probe3(cnt_2ms), // input wire [9:0] probe3// .probe4(cnt_2s), // input wire [9:0] probe4// .probe5(led_flag) // input wire [0:0] probe5// );endmodule然后开始修改breath_led.v:在这里添加要引出的端口添加参数的过程就是一层一层的向外扩展修改后的breath_led.v:modulebreath_led(input sys_clk,input sys_rst_n,input sw_ctrl,//呼吸灯开关控制 1打开呼吸灯 0关闭呼吸灯input set_freq_en,//呼吸灯频率使能信号input[9:0]set_freq_step,//呼吸灯频率步进挡位1-1000output led);parameter START_FREQ_STEP10d100;reg[9:0]freq_step100;reg[9:0]cnt_2us;reg[9:0]cnt_2ms;reg[9:0]cnt_2s;reg led_flag;//亮度递增/递减的标志 0递增 1递减regled_t;assign ledled_tsw_ctrl;//寄存set_freq_step的值并将范围限定在1-1000always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)freq_stepSTART_FREQ_STEP;elseif(set_freq_en)beginif(set_freq_step10d0)freq_step10d1;elseif(set_freq_step1000)freq_step10d1000;elsefreq_stepset_freq_step;end end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2us0;elseif(cnt_2usfreq_step-1)cnt_2uscnt_2us1;elsecnt_2us0;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2ms0;elseif(cnt_2usfreq_step-1cnt_2ms1000-1)cnt_2mscnt_2ms1;elseif(cnt_2usfreq_step-1cnt_2ms1000-1)cnt_2ms0;elsecnt_2mscnt_2ms;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt_2s0;elseif(cnt_2usfreq_step-1cnt_2ms1000-1cnt_2s1000-1)cnt_2scnt_2s1;elseif(cnt_2usfreq_step-1cnt_2ms1000-1cnt_2s1000-1)cnt_2s0;elsecnt_2scnt_2s;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)led_flag1;elseif(cnt_2usfreq_step-1cnt_2ms1000-1cnt_2s1000-1)led_flag!led_flag;elseled_flagled_flag;end always (posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)led_t0;elseif(led_flag)beginif(cnt_2mscnt_2s)led_t1;elseled_t0;endelsebeginif(cnt_2mscnt_2s)led_t1;elseled_t0;end end// ila_0 u_lia_0 (// .clk(sys_clk), // input wire clk// .probe0(sys_rst_n), // input wire [0:0] probe0// .probe1(led), // input wire [0:0] probe1// .probe2(cnt_2us), // input wire [6:0] probe2// .probe3(cnt_2ms), // input wire [9:0] probe3// .probe4(cnt_2s), // input wire [9:0] probe4// .probe5(led_flag) // input wire [0:0] probe5// );endmodule修改完毕之后开始综合按下之后vivado工程会自动关闭接下来是最重要的一步↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓在D:\ldy\VivadoIPs\custom_ip\ip_repo\breath_led_ip_1.0\drivers\breath_led_ip_v1_0\src路径仅供参考中替换Makefile若不替换编译时会报错且很难补救一定一定要确保更换确实完成了之后再进行下面步骤。替换后的Makefile内部代码为DRIVER_LIB_VERSION1.0COMPILERARCHIVERCPcp COMPILER_FLAGSEXTRA_COMPILER_FLAGSLIBlibxil.a CC_FLAGS$(COMPILER_FLAGS)ECC_FLAGS$(EXTRA_COMPILER_FLAGS)RELEASEDIR../../../lib/INCLUDEDIR../../../include/INCLUDES-I./.-I$(INCLUDEDIR)SRCFILES:$(wildcard*.c)OBJECTS$(addprefix $(RELEASEDIR),$(addsuffix.o,$(basename $(wildcard*.c))))libs:$(OBJECTS)DEPFILES:$(SRCFILES:%.c$(RELEASEDIR)%.d)include $(wildcard $(DEPFILES))include $(wildcard../../../../dep.mk)$(RELEASEDIR)%.o:%.c ${COMPILER}$(CC_FLAGS)$(ECC_FLAGS)$(INCLUDES)$(DEPENDENCY_FLAGS)$-o $.PHONY:include include:$(addprefix $(INCLUDEDIR),$(wildcard*.h))$(INCLUDEDIR)%.h:%.h $(CP)$$ clean:rm-rf ${OBJECTS}rm-rf $(DEPFILES)2.创建Vivado工程创建工程略添加自定义的IP核若不添加block design中会找不到选择ip_repo选择刚刚或者之前创建的IP核加入并配置zynq块DDR3uartbank电压过程略搜索并加入IP核选中led引脚并引出改名创建pin.xdc文件在pin.xdc中添加以下代码#核心板 set_property-dict{PACKAGE_PIN J16 IOSTANDARD LVCMOS33}[get_ports pl_led]3.Vitis软件设计打开vitis并创建工程过程略在breath_led_test.h中可以找到操控寄存器函数在breath_led_test_selftest.c中有待会会用到的头文件选择这些头文件并复制新建breath_led_test_ip_user文件夹并创建左下红框处的文件在main.c,main.h,breath_led_ip_user.c,breath_led_ip_user.h中添加以下代码main.c:#includemain.h#includebreath_led_ip_user.hintmain(void){intfreq_flag0;//定义频率的标志位用户循环切换呼吸灯的频率intled_state;u32 data_in;xil_printf(* LED User IP Test\n\r);breath_led_set_freq(5);while(1){if(freq_flag0){breath_led_set_freq(50);freq_flag1;}else{breath_led_set_freq(500);freq_flag0;}//获取LED当前开关状态led_statebreath_led_readControlSw();if(led_state0){//打开呼吸灯开关breath_led_control(1);xil_printf(* Breath LED ON *\n\r);sleep(8);}else{//关闭呼吸灯开关breath_led_control(0);xil_printf(* Breath LED OFF *\n\r);sleep(1);}data_inbreath_led_readReg2();xil_printf(data_in %d\n\r,data_in);}}main.h:#ifndef__MAIN_H__#define__MAIN_H__#includebreath_led_ip.h#includexparameters.h#includestdio.h#includexil_io.h#includesleep.h#endifbreath_led_set_freq.c:#includebreath_led_ip_user.hvoidbreath_led_control(u32 led_state){u32 reg0_state;reg0_stateBREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);if(led_state){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,reg0_state|(u32)0x1);}else{BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,reg0_state~((u32)0x1));}}voidbreath_led_freq_set_EnableOrDisable(u32 sw){u32 reg1_state;reg1_stateBREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG1);BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,(reg1_state~(131))|(u32)(sw1));}voidbreath_led_set_freq(u32 freq){u32 reg1_state;reg1_stateBREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG1);BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,(reg1_state~(0x3ff))|freq);}u32breath_led_readControlSw(void){u32 led_state;led_stateBREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0)0x1;returnled_state;}u32breath_led_readReg2(void){u32 data_in;data_inBREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG2);returndata_in;}breath_led_set_freq.h:#ifndef__BREATH_LED_IP_USER__#define__BREATH_LED_IP_USER__#includemain.h#defineLED_IP_BASEADDRXPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR//LED IP基地址#defineLED_IP_REG0BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET//LED IP寄存器0的偏移地址#defineLED_IP_REG1BREATH_LED_IP_S0_AXI_SLV_REG1_OFFSET//LED IP寄存器1的偏移地址#defineLED_IP_REG2BREATH_LED_IP_S0_AXI_SLV_REG2_OFFSET//LED IP寄存器2的偏移地址voidbreath_led_control(u32 led_state);voidbreath_led_freq_set_EnableOrDisable(u32 sw);voidbreath_led_set_freq(u32 freq);u32breath_led_readControlSw(void);u32breath_led_readReg2(void);#endif4.下载验证略。工程文件分享:user_led.zip使用时记得将ip_repo里面的IP核添加进vivado中扩展训练user_led.7z5.如何修改自定义的IP核以下在扩展训练的工程中进行
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

PLC工程能力生成地图:从语法学习到产线实战的五阶跃迁 2026/9/16 8:28:34

PLC工程能力生成地图:从语法学习到产线实战的五阶跃迁

1. 这不是培训失效,是能力转化断层的真实写照“为什么PLC编程培训班学完还是不会干活?”——这句话在自动化工程师群、工厂技术主管茶水间、甚至招聘HR的面试复盘会上,已经不是吐槽,而是共识性诊断。我带过27期西门子S7-1200实操班…

阅读更多 →
ESP32蓝牙Beacon测距实战:从RSSI波动到1米精度 2026/9/16 8:28:34

ESP32蓝牙Beacon测距实战:从RSSI波动到1米精度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AWS CLI 深入解析:使用 `codebuild batch-get-projects` 批量查询 CodeBuild 构建项目详情 2026/9/16 8:28:34

AWS CLI 深入解析:使用 `codebuild batch-get-projects` 批量查询 CodeBuild 构建项目详情

AWS CLI 深入解析:使用 codebuild batch-get-projects 批量查询 CodeBuild 构建项目详情 【免费下载链接】aws-cli Universal Command Line Interface for Amazon Web Services 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli aws codebuild bat…

阅读更多 →
【Rust入门知识点学与练】第36课:所有权——移动、借用、Copy、切片 2026/9/16 8:28:34

【Rust入门知识点学与练】第36课:所有权——移动、借用、Copy、切片

本课目标: 不再靠「试出来的」.clone() 过编译。学完你应该能看着一个签名说出「这个函数会拿走我的东西」,并在写代码前先决定好谁拥有谁。 本课是 Rust 的分水岭。前面是语法,从这里开始才是 Rust。建议一次只读一半,中间一定要…

阅读更多 →
aws cloudwatch disable-insight-rules 详解:批量停用 Contributor Insights 规则 2026/9/16 8:28:34

aws cloudwatch disable-insight-rules 详解:批量停用 Contributor Insights 规则

aws cloudwatch disable-insight-rules 详解:批量停用 Contributor Insights 规则 【免费下载链接】aws-cli Universal Command Line Interface for Amazon Web Services 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli 导读 本文围绕 AWS CLI …

阅读更多 →
基于RAG的PHP微信AI客服系统:源码实践与部署解析 2026/9/16 8:25:30

基于RAG的PHP微信AI客服系统:源码实践与部署解析

最近把一套PHP原创微信AI客服系统的源码完整梳理了一遍,顺手用在了几个客户的项目里,效果超出预期。微信生态里做客服系统并不新鲜,但把AI能力尤其是大模型语义理解融入其中,让机器人真正能扛住全天候的咨询压力,这条路…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞