热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义_自定义AXIIP核(转)

本文由编程笔记#小编为大家整理,主要介绍了自定义AXI-IP核(转)相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了自定义AXI-IP核(转)相关的知识,希望对你有一定的参考价值。



目的:

自定义一个IP核,通过AXI总线与ARM系统连接

 

环境:

Win7 32bit

Vivado2014.4.1

Xilinx sdk2014.4

开发板:

Zc702

 

第一步:

         新建一个自定义的HDL模块,本实验新建一个16位加法器,保存为test.v,代码如下

module test(

  input [15:0] a,

  input [15:0] b,

  input clk,

  output reg [15:0] sum

   );

 [email protected](posedge clk)

 begin

  sum  <= a +b ;

 end

endmodule

 

第二步:

         新建一个IP核,打开vivado,在tools中选中新建IP核

 

 技术分享图片

点击Next,

技术分享图片

 

选中新建AXI外设选项,

技术分享图片

 

填好信息,点击next,

技术分享图片

 

填好参数,这里就用默认的即可,

技术分享图片

 

然后点击finish。

 

之后会打开一个这个新建的IP核工程,查看

技术分享图片

 

新建的时候是没有test.v加入到工程的,双击myip_v1_0_AXI_inst-myip_v1_0_S00_AXI.v

 技术分享图片

 

上面这段代码,主要就是定义了使用的参数,也是我们在新建IP核预先设置的参数,数据宽32位,地址宽4位;

 

在参数设置之后,这段注释就是让用户可以添加需要的端口了,在本次实验中是不需要添加的;

 技术分享图片

 

 

 

看接下来的程序:

技术分享图片

 

 

系统默认的第一个输入端口S_AXI_ACLK为时钟,然后S_AXI_ARESETN是复位;

接下来S_AXI_AWADDR是写地址,后面暂略,

从注释就可以看到是安全级别的选项,这个是AXI的标准后续再谈;

还有一个端口S_AXI_WDATA就是写入的数据;

 

部分端口这里就不说明了,可以直接看注释,直接看马上用到的几个端口:

技术分享图片

S_AXI_ARADDR是读IP核的地址,S_AXI_RDATA是被读的寄存器;

 

接下来看

技术分享图片

 

新建的时候会看到4个slv_reg寄存器,实验中又添加了一个

reg [C_S_AXI_DATA_WIDTH-1:0]    slv_reg4;

又添加了一条:

wire   [C_S_AXI_DATA_WIDTH-1:0] sumout;

主要是为了把test.v这个模块添加进来;

 

这几个寄存器在

 

 技术分享图片

这几条代码显示,在往自定义的IP核内写数据是会将数据写到刚才定义的几个寄存器内的,当然这些寄存器用户都是可以自己改的,这个实验就不更改了;

那么,用户是往哪一个地址写数据呢?那么看这里:

技术分享图片

 

根据上面的定义,

 

ADDR_LSB=2,OPT_MEM_ADDR_BITS =1;

也就是往地址段axi_awaddr[3:2]部分写的话就会将数据写入这4个寄存器,同理在读数据的时候也是,具体看代码即可。

 

前面看到是用户写数据及其IP核接收到的数据寄存器,下面是IP核的输出数据,也就是用户在读IP核时被读的寄存器:

技术分享图片

 

这里在实验中,做了一些更改,将slv_reg0,变为了slv_reg4;

 

最后在用户逻辑部分,添加例化的模块。

 技术分享图片

然后

技术分享图片

到这界面之后,查看左侧的检查选项是否都已经打勾,没打勾的话选中哪一个选项做一些简单确认即可完成,最后打包IP核,保存为zip的格式。

 

将IP核工程关闭,新建一个系统文件或者打开一个example工程,在工程内添加新建的ip核,当然需要将新建的ip核包含在工程内,如图:

 

 技术分享图片

在工程内添加自己的IP之后,自动分配一下地址:

 

 技术分享图片

然后确认无误,,生成bitstream。

稍等片刻之后,没有报错,然后export hardware,之后再launch SDk,

 

 技术分享图片

打开SDK后,需要新建一个application,

 

用最简单的helloworld工程样板即可,然后修改代码:

#include 

#include "platform.h"

#include "xbasic_types.h"

#include "xparameters.h"

#include "xil_io.h"

 

Xuint32*baseaddr_p=(Xuint32*)XPAR_MYIP_0_S00_AXI_BASEADDR;

 

int main()

{

   init_platform();

 

   print("Hello World
");

   print("My_IP Test.....
");

   //*(baseaddr_p+0)=0x00020003;

   Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR,0x11111111);

   Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR+0x4,0x2);

   Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR+0x8,0x990);

   Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR+0xc,0x100);

   u32r0,r1,r2,r3;

   r0=Xil_In32(XPAR_MYIP_0_S00_AXI_BASEADDR);

   r1=Xil_In32(XPAR_MYIP_0_S00_AXI_BASEADDR+0x4);

   r2=Xil_In32(XPAR_MYIP_0_S00_AXI_BASEADDR+0x8);

   r3=Xil_In32(XPAR_MYIP_0_S00_AXI_BASEADDR+0xc);

   xil_printf("r0=%0X r1=%0X r2=%0Xr3=%0X 
",r0,r1,r2,r3);

   cleanup_platform();

   return0;

}

 

添加的xparameters.h头文件包含了自定义的IP的系统地址:

 

 技术分享图片

编译之后,先将bit文件下载到fpga,然后run,看到

技术分享图片

 

好了,实验结束。

 

转载:http://blog.csdn.net/shushm/article/details/49536845




 


分类: Xilinx MicroBlaze



推荐阅读
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
author-avatar
琳琳小朋友m
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有