目的:

自定义一个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

);

always@(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 <stdio.h>

#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\n\r");

print("My_IP Test.....\n\r");

//*(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  \n\r",r0,r1,r2,r3);

cleanup_platform();

return0;

}

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

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

好了,实验结束。

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

 

自定义AXI-IP核(转)的更多相关文章

  1. vivado设计四:自定义IP核测试

    在vivado设计三中:http://blog.chinaaet.com/detail/37177已经建立了vivado工程和封装好了自定义IP核. 那么接下来,我们对这个自定义IP核进行测试了:我们 ...

  2. 基于AXI4总线卷积FPGA加速IP核的尝试

    本文先总结不同AXI IP核的实现的方法,性能的对比,性能差异的分析,可能改进的方面.使用的硬件平台是Zedboard. 不同的AXI总线卷积加速模块的概况 这次实现并逐渐优化了三个版本的卷积加速模块 ...

  3. 自定义AXI总线形式SPI接口IP核,点亮OLED

    一.前言 最近花费很多精力在算法仿真和实现上,外设接口的调试略有生疏.本文以FPGA控制OLED中的SPI接口为例,重新夯实下基础.重点内容为SPI时序的RTL设计以及AXI-Lite总线分析.当然做 ...

  4. AXI-Lite总线及其自定义IP核使用分析总结

    ZYNQ的优势在于通过高效的接口总线组成了ARM+FPGA的架构.我认为两者是互为底层的,当进行算法验证时,ARM端现有的硬件控制器和库函数可以很方便地连接外设,而不像FPGA设计那样完全写出接口时序 ...

  5. ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果

    一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...

  6. xilinx AXI相关IP核学习

    xilinx AXI相关IP核学习 1.阅读PG044 (1)AXI4‐Stream to Video Out Top‐Level Signaling Interface (2)AXI4‐Stream ...

  7. Vivado 调用自定义IP核

    关于Vivado如何创建自定义IP核有大量的参考文章,这里就不多加阐述了,本文目的主要是解决如何在新建工程中引用其它工程已经自定义封装好的IP核,从而实现自定义IP核的灵活复用. 举个例子,我们的目标 ...

  8. vivado设计三:一步一步生成自己的自定义IP核

    开发环境:xp  vivado2013.4 基于AXI-Lite的用户自定义IP核设计 这里以用户自定义led_ip为例: 1.建立工程 和设计一过程一样,见vivado设计一http://blog. ...

  9. 从Xilinx FFT IP核到OFDM

    笔者在校的科研任务,需要用FPGA搭建OFDM通信系统,而OFDM的核心即是IFFT和FFT运算,因此本文通过Xilinx FFT IP核的使用总结给大家开个头,详细内容可查看官方文档PG109.关于 ...

  10. 浅析Xilinx 三速以太网MAC IP核

    之前在使用Altera的三速以太网MAC IP的基础上,完成了UDP协议数据传输.此次为了将设计移植到xilinx FPGA上,需要用到xilinx的三速以太网MAC IP核,当然也可以自己用HDL编 ...

随机推荐

  1. Using Option Files

    Most MySQL programs can read startup option files(sometimes called configuration files). Option file ...

  2. 创建.ignore文件

    方法一:1. 在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录.如:(cd /d/git/project) 2. 输入 touch .gitig ...

  3. 有序广播和标准广播 --Android开发

    一.标准广播和有序广播也很容易理解的. 标准广播: (1)通过sendBroadcast()方法发送 (2)通过异步方式发送,广播接收者的执行顺序是不明确的 有序广播: (1)通过sendOrderB ...

  4. android------基础面试题

    1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...

  5. test example

    #coding=utf-8 import os import caffe import numpy as np root='/home/xxx/caffe/' #根目录 deploy=root + ' ...

  6. 利用adb安装apk

    下载adb 网上资源很多,资源自寻. 配置环境变量 先加变量,后加入path.网上很多,不赘述. 安装apk 打开cmd,确保adb已经连接设备 adb install -r <拖动文件至cmd ...

  7. vue.js中 v-show在刷新页面时,会闪一下,如何解决?

    因为浏览器是html从上到下执行,先执行Dom元素,然后执行javaScript元素,v-show实在javaScript中控制,当走到javaScript时,Dom元素已经开始走动,所以如果网慢的话 ...

  8. Red and Black HDU - 1312

    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...

  9. 6月17 练习ThinkPHP的增删改查

    利用ThinkPHP连接数据库的增删改查的例题:用到的数据库表名Info表,Nation表 数据显示页面:MainController.class.php中的ShowInfo方法 //例题 //显示所 ...

  10. JavaScript基础(四)

    十六.client.offset.scroll系列 1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta ...