热门标签 | 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系统截获数据包后,会通过协议栈,按照TCPIP层次进行解析,那我们如何 ... [详细]
  • 开发笔记:OpenCV基础图形绘制
    本文由编程笔记#小编为大家整理,主要介绍了OpenCV基础---图形绘制相关的知识,希望对你有一定的参考价值。图形绘制OpenCV提供了直线,矩形,圆 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 最近因为在准备面试,所以看了不少面试题。每个都仔细分析,争取不留死角并解决自己的所有疑惑,同时也提高编程水平。今天偶然发现对for循环语句的头部执行顺序还有一点小疑惑,虽然经常使用,但往 ... [详细]
  • Java反序列化漏洞(ysoserial工具使用、shiro反序列化利用)
    Java反序列化机制Java通过writeObject序列化将对象保存为二进制数据流,通过readObject反序列化将序列化后的二进制重新反序列化为Java对象& ... [详细]
  • 【Linux系统编程:基础IO 下】dup2 实现输出重定向、输入重定向、追加重定向 | 理解磁盘 | 理解文件系统中inode的概念 | 软硬链接
    写在前面这里先接着《基础IO上》中的缓冲区的内容作些补充,这里主要补充dup2接口。✔测试用例一:#include#inclu ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
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社区 版权所有