0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PYNQ设计案例:基于HDL语言+Vivado的自定义IP核创建

电子设计 来源:csdn 作者:Mculover666 2020-12-21 16:34 次阅读

作者:Mculover666

1.实验目的
用HDL语言+Vivado创建一个挂载在AXI总线上的自定义IP核

2.实验步骤
2.1.创建一个新的项目

o4YBAF9uGgCADIelAAJlay_b3Qw323.png

2.2.调用Create and Package IP Wizard,创建一个新的AXI-Lite从机ip
选择Tools->Create and Package IP

pIYBAF9uGgKASbfbAAD3qOhQ-mo572.png


pIYBAF9uGgOACYlFAAEP3sBhhKY959.png


o4YBAF9uGgWAelgPAADHR7795JU281.png


pIYBAF9uGgaAUjJzAACuOU10eNc373.png


o4YBAF9uGgiAOz47AAD7KUHYQZ0630.png

编辑创建的IP

pIYBAF9uGgqAKhpAAACYAF3d7N8903.png

led_controller_v1_0.v — 实例化了所有的AXI-Lite接口,在这种情况下,只有一个接口存在
led_controller_v1_0_S00_AXI.v — 包含了处理PL外设与PS端软件的AXI4-Lite接口功能
打开led_controller_v1_0_S00_AXI.v文件,找到Users to add ports here,然后在其后添加需要的端口

o4YBAF9uGguAavAaAAAhqCU2Fz4889.png

然后在文件最后,找到Add user logic here,然后在其后添加逻辑功能代码:

pIYBAF9uGgyAEJf4AAAY8K9tieo954.png

保存文件,打开led_controller_v1_0.v文件,找到Users to add ports here,添加端口:

o4YBAF9uGg2ARlV4AAAcwl_kIWI845.png

在顶层文件中例化刚刚我们添加的端口,保存文件:

pIYBAF9uGg6AC0ScAAB2O130XMY473.png

更新IP核

o4YBAF9uGhCAZspEAAETQo9yEEk360.png

打包IP核

pIYBAF9uGhKAV4fgAADNBw9CXBQ050.png


o4YBAF9uGhOAHqXnAAEvGUtLrLc481.png


o4YBAF9uGhWAUfg8AADRsS8YSpc020.png

然后关闭这个工程即可,ip核创建成功。

2.3.添加ip核到Block Design中进行设计
创建Block Design:

pIYBAF9uGhaAZHkwAABaBq83HYc677.png

点击Add IP,搜索led,添加led_controllerIP:

o4YBAF9uGheAWz04AABoHaQv0bY451.png

因为LEDs_out要连接板载LED,所以点击引脚,按下ctrl+t导出引脚:

pIYBAF9uGhmALO0YAABoNojLZ98982.png

添加Zynq ps核,自动连线:

o4YBAF9uGh2ACrrdAAVenZx4Qms666.png

按下F6验证设计:

o4YBAF9uGh6AA20UAAAbkd8Lw4Q900.png

创建Block Design 的HDL文件:

pIYBAF9uGiCAKwrpAACZvR9vMV8798.png

添加LED引脚约束文件:

pIYBAF9uGiGADAf5AACcB3HTxsI801.png


o4YBAF9uGiOAablpAACaoO_nVtA476.png


o4YBAF9uGiSACpNiAABWxtAfcEs558.png


##LEDs
set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[0] }]; #IO_L6N_T0_VREF_34 Sch=LEDs_out_0[0]
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[1] }]; #IO_L6P_T0_34 Sch=LEDs_out_0[1]
set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[2] }]; #IO_L21N_T3_DQS_AD14N_35 Sch=LEDs_out_0[2]
set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { LEDs_out_0[3] }]; #IO_L23P_T3_35 Sch=LEDs_out_0[3]

2.4.生成Bitstream,打开实现设计,导出硬件文件,运行SDK

o4YBAF9uGiaAYtkWAAID64ZX0s8871.png

2.5.创建一个空的应用工程
File->New->Application Project,选择创建一个空工程:

2.6.添加驱动库
光标选中led_test_bsp之后再进行下面的操作!!!

选择Xilinx->Repositories:

o4YBAF9uGiiAE2_kAACREjQlJaw286.png

添加ip核所在目录,添加完了之后SDK会自动扫描所添加的目录,然后重新编译工程来添加新的驱动文件:

检查一下库有没有被分派到LED_Controller外设,打开system.mss文件,可以看到外设驱动中存在led_controller_0:

o4YBAF9uGimABPAsAAEksenE7Zc394.png

点击最上面modify this BSP's Setting检查驱动设置:

o4YBAF9uGiuAeT2oAADtbxwG73c144.png

至此,led_controlerip核的硬件设计完毕,BSP驱动添加完毕,可以开始写应用测试程序了。

2.7.编写应用代码
先在src文件夹下创建一个C文件:

pIYBAF9uGi2AESu3AAGB4IpOhVA911.png

/**
* @file led_test.c
* @brief led_controler ip test
* @author mculover666
* @date 2018/11/10
* */
#include "xparameters.h"
#include "xil_io.h" //led_controller.h中用到了Xil_Out32
#include "led_controller.h"
#include "xil_printf.h"

#define LED_BASE_ADDR XPAR_LED_CONTROLLER_0_S00_AXI_BASEADDR
#define LED_REG0 0

#define DELAY 50000000

int main()
{
int temp = 0;
int led_value = 0;
int i = 0;

xil_printf("led_controller ip test/r/n");
xil_printf("----------------------/r/n");

while(1)
{
/* write reg0 */
LED_CONTROLLER_mWriteReg(LED_BASE_ADDR,LED_REG0,led_value);

/* read reg0 */
temp = LED_CONTROLLER_mReadReg (LED_BASE_ADDR,LED_REG0);

/* show value */
xil_printf("led = %d",led_value);
xil_printf("/ttemp = %d/r/n",temp);

if(led_value led_value++;
else
led_value = 0;

for(i=0;i

}
}

2.9.配置运行,观察结果

pIYBAF9uGi-AHJUrAAHUxdwDsmU560.png


pIYBAF9uGjCASbXcAABXlbF0ZC4860.png

3.实验总结
这个实验做了很长时间,最后看着灯思考了很长时间:

从实验的角度来说说:用HDL创建一个挂载在AXI总线上的ip核去控制LED,然后在存储器映射下这个ip核的四个寄存器会有自己的地址,CPU靠这个地址来访问寄存器,为了操作简单,一般会有一个基地址,其余寄存器是相对这个基地址的偏移,所以控制代码只需要读写寄存器就可以了;

嵌入式原理的角度来说,其实设计都是基于寄存器的,硬件靠寄存器的数据来工作,寄存器挂载在总线上,所以寄存器会有一个地址(寄存器映射),我们通过指针就可以访问内存空间中这个地址处的数据;

从嵌入式发展的角度来说,通常寄存器地址映射都是由厂商出厂时候映射好的,我们只需要查看芯片参考手册去编程,现在整个硬件可以自己设计,寄存器地址映射只是在一个固定的区间段内(AXI 从机地址1G),变的更加灵活了,也说明了整个数字系统的设计正在由板上设计转入片上设计,原来由一块板子才能搞定的任务,现在只需要一个芯片即可~

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19008

    浏览量

    302968
  • vhdl
    +关注

    关注

    30

    文章

    816

    浏览量

    128073
  • Vivado
    +关注

    关注

    19

    文章

    807

    浏览量

    66312
收藏 人收藏

    评论

    相关推荐

    使用MATLAB Simulink和HDL编码器创建自定义IP--AWB

    自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生成 HDL 文件,这些文件可以作为
    的头像 发表于 11-13 09:27 1091次阅读
    使用MATLAB Simulink和<b class='flag-5'>HDL</b>编码器<b class='flag-5'>创建</b><b class='flag-5'>自定义</b><b class='flag-5'>IP</b>--AWB

    nios 自定义ip问题求助

    sopc builder中添加自定义ip,编写自定义ip的时候, avalon接口信号:clk、rst
    发表于 11-26 11:11

    xilinx vivado 怎么封装包含一个ip自定义ip

    我写了一个缓存模块,里面包含有一个BlockRAM的IP,现在想把这个缓存模块封装成我的一个自定义ip,但是封装完成之后仿真的时候会报错 ,我的步骤是这样的:1.写一个.v文件,里面
    发表于 12-11 10:25

    使用VIVADO IDE设计的最有效方法是什么?

    设计是纯粹的IP构建。这意味着用户必须为所有HDL模块制作自定义IP并将其打包为IP。这可能导致管理大量
    发表于 03-29 09:14

    玩转Zynq连载24——用户自定义IP的移植

    /s/1XTQtP5LZAedkCwQtllAEyw提取码:ld9c1概述这里我们以led_controller_ip工程所创建的用户自定义LED闪烁IP
    发表于 09-15 09:55

    玩转Zynq连载25——[ex04] 基于Zynq PL的自定义IP集成

    ,添加到VivadoIP Catalog中,然后和标准IP一样,在Vivado工程中配置添加这个IP
    发表于 09-20 11:35

    莱迪思半导体推出全新的模块化IP,能为客户提供创建自定义视频桥接解决方案所需模块

    莱迪思半导体公司推出7款全新的模块化IP,支持屡获殊荣的CrossLink FPGA产品系列,可为消费电子、工业和汽车应用提供更高的设计灵活性。这些模块化IP为客户提供
    发表于 07-22 12:09 796次阅读

    如何使用Vivado功能创建AXI外设

    了解如何使用Vivado创建和封装IP功能创建可添加自定义逻辑的AXI外设,以创建
    的头像 发表于 11-29 06:48 7097次阅读
    如何使用<b class='flag-5'>Vivado</b>功能<b class='flag-5'>创建</b>AXI外设

    自定义sobel滤波IPIP接口遵守AXI Stream协议

    自定义sobel滤波IP IP接口遵守AXI Stream协议
    的头像 发表于 08-06 06:04 3878次阅读

    使用VIvado封装自定IP并使用IP创建工程

    在FPGA实际的开发中,官方提供的IP并不是适用于所有的情况,需要根据实际修改,或者是在自己设计的IP时,需要再次调用时,我们可以将之前的设计封装成自定义IP,然后在之后的设计中继续使
    的头像 发表于 04-21 08:58 5593次阅读

    如何在Vivado中更改自定义的Interface

    因为 BD 中连线太多,所以想自定义下 interface 简化连线,定义好了一个 interface,但当准备在自定义 IP 中指定它时,发现我把一个信号的方向搞错了,应该
    的头像 发表于 08-02 09:49 2840次阅读
    如何在<b class='flag-5'>Vivado</b>中更改<b class='flag-5'>自定义</b>的Interface

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 03-15 19:39 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 07-06 18:50 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    Vivado设计套件用户指南:创建和打包自定义IP

    电子发烧友网站提供《Vivado设计套件用户指南:创建和打包自定义IP.pdf》资料免费下载
    发表于 09-13 14:54 0次下载
    <b class='flag-5'>Vivado</b>设计套件用户指南:<b class='flag-5'>创建</b>和打包<b class='flag-5'>自定义</b><b class='flag-5'>IP</b>

    Vivado Design Suite用户指南:创建和打包自定义IP

    电子发烧友网站提供《Vivado Design Suite用户指南:创建和打包自定义IP.pdf》资料免费下载
    发表于 09-13 11:34 0次下载
    <b class='flag-5'>Vivado</b> Design Suite用户指南:<b class='flag-5'>创建</b>和打包<b class='flag-5'>自定义</b><b class='flag-5'>IP</b>