添加自定义IP核基本步骤
一、 使用工具和参考链接:
PlanAheadXPSSDKISE
d/blog/3987
d/blog/4009
二、自定义IP流程简图如下:
三、功能简介:
本次生成的IP核只是用来控制一个LED灯根据sdk工程中对寄存器赋值来亮和灭。
四、步骤:
1、 使用PlanAhead创建新工程,打开PlanAhead14.4,创建新工程,输入工程名称,点击Next
system的头文件
注:14.1版本存在问题,在windows系统下使用PlanAhead14.1会出现错误,建议升级至14.4
2、 选择RTL Project,在Do not specify sources at this time 处打钩,暂时不添加源文件。之后,选择所使用的FPGA型号。之后会有工程的简单summary,点finish完成。
3、 在工程左侧到Add sources,添加xps工程。
然后点击红线框所示,弹出窗口,按下图所示进行设置。
Next之后,弹出窗口,如下图所示,
单击红线框按钮,弹出如下图所示窗口,命名其为system。然后确定!如下图所示。点击Finish。弹出如图所示的窗口,选择yes,(此时创建BSP
4、 创建xps工程。默认选择PLB System,点击ok。根据自己的情况设置硬件工程,本例子中设置为单核系统,只选择了最基本的ddrbram和串口三个。在出现整个硬件summary之后点击finish完成设置。
5、 添加自定义IP核,在Hardware中选择Create or Import Peripheral添加IP核。如下面四个
图所示,选择默认选项,在之后添加IP核名称,不能和PlanAhead以及xps工程名相同
如下面四个图所示,之后选择PLB总线,会提示所需要的功能,包括软件reset,用户寄存器(一般都需要这个),FIFO(看需求),内存空间,中断。本例子中只需要寄存器即可,如右上图。
之后选择默认即可,然后是添加寄存器数量,根据自己的需要添加,本例子中需要存储led灯状态,因此需要一个寄存器。这里面的寄存器都是32bit
如下图所示,之后添加所需要的PLB总线信号,基本保持默认即可。Next之后保持默认。
在之后的选项中,如下图所示,第一个是用户逻辑语言选择,如果用vhdl则不用打钩,如果需要改成Verilog则打钩。第二个和第三个均打钩,让ise自动生成PLB的硬件接口和SDK中要用到的头文件。完成IP核的设置。
6、 编辑IP核的硬件逻辑。生成IP之后,可以在xps工程中看到添加的IP核,如下图所示,然后开始编辑它,打开目录
* \sample\sample.srcs\sources_1\edk\system\pcores\led_v1_00_a\devl\projnav
*是工程的路径。打开.xise工程文件。我们会在ise工程中用到led.vhduser_logic.v两个文件,如右图所示。在user_logic.v中,先添加需要用到的端口led1(注,端口名不能和IP核名称相同!),并定义端口的属性,如下图所示。

如下图所示,系统已经写好一个例程,来给出怎么读取和输入数据。之后就可以根据自己的需要编写相应的硬件逻辑。
编写完成后,上面右图为编写完成后。需要在led.vdl文件中配置端口。打开此文件,如下图左图所示,添加端口的名称。
 
在修改完这三处后,运行仿真,确认没有错误后,可以查看RTL 原理图,确认端口是否添加。然后保存退出,回到xps工程中。在工程中重新扫描,如下图所示。
右键点击左侧生成的IPLED,选择View MPD,如果port中没有LED端口,则手动添加代码:PORT LED = "", DIR = O,并保存。之后添加IP核至xps工程中。
如下面三个图所示,将IP挂在到PLB总线上,之后将LED的端口设置为外接端口,并命名,这个名字要记下来。然后为LED这个IP核分配地址。
之后可以退出xps工程,回到PlanAhead中。

7、 如下图所示,右键点击system,创建Top HDL文件。然后为端口添加ucf文件约束,为此端口分配硬件管脚。接着使用Add Sources添加约束文件,选择Add or Create Constraints添加约束,完成保存即可生成bit流文件。
 
在工程中,生成硬件的bit流文件,即可导入至SDK中使用了。
之后,将工程导入SDK,在弹出的窗口中,Launch SDK打钩。OK
在SDK中创建New Application Project,选择Memory Tests。Finish。
8、
将硬件信息和头文件导入SDK(这部分网上教程没有,需注意)
生成的bit流文件在 *\sample\sample.runs\impl_1\download.bit 这个文件即为硬件信息的输出文件,将此文件复制到
*\sample\sample.sdk\SDK\SDK_Export\system_hw_platform。而IP核的头文件在
*\sample\sample.srcs\sources_1\edk\system\drivers\led_v1_00_a\src下面,将这四个文件复制到 *\sample\sample.sdk\SDK\SDK_Export\testled\src

#include <stdio.h>
#include "xparameters.h"
#include "xil_types.h"
#include "xstatus.h"
#include "xil_testmem.h"
#include "platform.h"
#include "memory_config.h"
#include "led.h"
#define BASE_ADDR 0x20000000
int main()
{
unsigned int i;
init_platform();
//读取SW的状态,这个函数是XILINX为我们编写的驱动,包含在头文件led.h
i = LED_mReadReg(BASE_ADDR,0);
xil_printf("sw state is %x",i);
//0x01写入LED
LED_mWriteReg(BASE_ADDR,0x00000000,0x01);
cleanup_platform();
return 0;
}
提供一段参考程序,其他可以调试使用。这段程序中,需要想将BASE_ADDR该为IP核的基地址,之后可以通过控制偏移量访问不同的寄存器。需要注意在ISE工程中,寄存器是从高位开始存储,地址是从小端开始。
至此,将先Program FPGA,将硬件信息下载至开发板中。然后再调试程序即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。