余佩
陕西长岭电子科技有限责任公司产品开发部
摘 要:Zynq7000系列基于Xilinx全可编程的可扩展处理平台结构是一种SoC芯片,集成了Cortex-A9双核ARM和FPGA。Xilinx公司为大家提供许多的IP核,在Vivado的IP Catalog中可以查看,有时这些IP核复杂,或者不能完全满足用户需求,因此Xilinx公司为用户提供用户可以创建属于自己的IP核,系统化定制,简化设计。本文讲述了Zynq7000系列芯片如何在Vivado中建立AXI总线类型的IP核,实现自定义IP核,并试验。
关键词:Z7 自定义IP AXI总线
1 引言
Zynq-7000系列芯都有完整的ARM处理子系统,其包含了双核的CortexTM-A9处理器,整个处理器的搭建都以处理器为中心,整个处理器子系统中集成了内存控制器和大量的外设,使CortexTM-A9的核在Zynq-7000中完全独立于可编程逻辑单元,即Zynq-7000系列芯片包含ARM的PS部分,和FPGA部分(PL),其中PS集成了两个Cortex?-A9处理器,AMBA?互连,内部存储器,外部存储器接口和外设。返些外设主要包括USB总线接口,以太网接口,SD/SDIO接口,I2C总线接口,CAN总线接口,UART接口,GPIO等。PS和PL部分可以协同工作,也可以独立工作。
为方便用户开发使用,xilinx公司提供了许多IP核,有时候这些接口时序复杂,不利于实际应用,因此,xilinx公司还提供了自定义IP的方法来满足用户的个性需求,同时提供了典型的接口ip供用户使用。利用自定义IP的方法实现PS-PL通信接口是使用Xilinx提供的IP封装工具,将用户代码封装成为标准AXI总线形式模块,将模块以图形化的方式加入顶层文件中并进行AXI总线的自动连接,这种方式为用户提供了系统化、个性化的服务。
2 建立新的系统工程
本文使用黑金开发板介绍自定义IP的方法,黑金开发板使用的芯片为Xilinx公司的xc7z020clg400-2。具体方法如下:
1)在Vivado开发环境里新建了一个名称为test_IP工程,并生成一个名为system的Block Diagram文件,再在该原理图中添加ZYNQ7 Processing System内核系统。
2)双击Diagram界面里的ZYNQ Processing System,打开ZYNQ系统的配置界面。
其中Page Navigator界面下有8个子项,分布为Zynq Block Design, PS-PL Configuration, Peripheral I/O Pins, MIO Configration, Clock Configuration, DDR Configuration, SMC Timing Calculation, Interrupts。这些页面选项对应的是ZYNQ的不同同硬件模块的配置,其中PS_PL页面提供了PS到PL的相关接口配置信息以及PS部分一些配置信息;Peripheral I/O Pins页面主要是对一些通用外设接口的配置;MIO Configruation页面主要是对MIO已经EMIO的分配控制;Clock Configruation页面主要是对PS端时钟资源的配置和管理;DDR Configration页面主要是对DDR控制器一些参数的配置;Interrupts页面主要是对中断进行配置管理。
2.1) 点击Peripheral I/O Pins选项。
在AX7020开发板上, MIO48和MIO49是连接到UART芯片上,是作为串口通信使用的。因此这里配置成UART1的功能,点击MIO48,49对应的UART1, 方框的颜色会发成绿色。如此MIO48,49的管脚功能就固定了,只能作为UART的功能。其中MIO48为串口发送,MIO49为串口接收。
2.2)点击PS-PL Configuration选项。
在Gemeral目录下,可以看到UART1的波特率115200,因此选择115200,可以根据需要更改。 因为本实验中没有用到PL部分外设,所以就没有PL的外设需要挂到AXI的总线上,也就部需要AXI GP0的Master总线了,因此这里把FCLK_RESET0_N和M AXI GP0 interface的选顷去掉。
2.4) 点击Clock Configuration顷。
这个界面会显示ZYNQ系统的一些时钟,比如输入时钟是33.33333Mhz, 与开収板上癿PS癿系统时钟是一样是。CPU的工作时钟是666.666666Mhz, DDR的工作时钟是533.333333Mhz,这些时钟频率默认。
由于本实验中没有用到PL部分外设,所以可以把PL的FCLK_CLK0前面的选项去掉,不会产生FCLK_CLK0。
2.5) 打开DDR Configration选项。
这个界面上是选择DDR芯片的名称和一些参数。此界面在Memory Part选项中需要选择跟开发板上DDR3型号一样的名称,AX7020开发板选择MT41J256M16 RE-125。
配置完成点击OK退到Vivado的开发环境。
3 自定义IP方法
1) 创建自定义IP。
1.1)点击菜单Tools->Create and Package IP;
1.2)点击next,选择Create a new AXI4 peripheral选项;
1.3)显示IP的名字,版本和描述等信息。这里可以修改了IP的名字即test_IP和存放位置;
1.4)显示AXI总线接口名字,接口是Slave, 数据宽度是32位,IP内部的寄存器数量为4个。默认选项,点击Next;
1.5)点击Finish完成。
2)添加自定义IP核的功能。
2.1)打开IP Catalog界面,右键选中test_IP_ip_v1.0, 然后选择Edit in IP Packager选项;
2.2) 点击OK, 软件会自动打开另外一个Vivado窗口对用户自定义的IP核进行编辑;
2.3)双击顶层文件test_IP_ip_v1_0.v打开,在“users to add ports here”位置添加管脚端口定义,如下:
output wire SX_PRF,
output wire SX_TR,
input wire sys_clk,;
2.4) 在顶层文件test_IP_ip_v1_0.v的程序对管脚进行例化,如下:
.SX_PRF(SX_PRF),
.SX_TR(SX_TR),
.sys_clk(sys_clk),;
2.5) 在双击打开rtc_ip_v1_0_s00_AXI.v文件,在以下癿位置添加的管脚端口定义如下:
output wire SX_PRF,
output wire SX_TR,
input wire sys_clk,;
2.6)在“Add user logic here”位置添加实现产生TR和PRF信号的代码如下:
reg[18:0] timer_cnt;
reg SX_PRF1;
reg SX_TR1;
always@(posedge sys_clk)
if(slv_reg0==32'd1)
begin
if(timer_cnt >= 19'd265000)
timer_cnt<= 1'd0;
timer_cnt = timer_cnt + 1'd1;
case(timer_cnt)
19'd0: begin SX_PRF1<=1'b1;SX_TR1<=1'b1;end
19'd1000: begin SX_PRF1<=1'b0;SX_TR1<=1'b0;end
19'd7500: begin SX_PRF1<=1'b1;end
19'd8500: begin SX_PRF1<=1'b0;end
19'd40000: begin SX_PRF1<=1'b1;end
19'd41000: begin SX_PRF1<=1'b0;end
19'd265000: begin SX_PRF1<=1'b1;SX_TR1<=1'b1;end
default:begin SX_PRF1 <= SX_PRF1; SX_TR1 <= SX_TR1; end
endcase
end
else
begin
SX_PRF1<= 0;
SX_TR1<= 0;
timer_cnt <= 0;
end
assign SX_TR=SX_TR1;
assign SX_PRF=SX_PRF1;
2.7) 点击Save All Files,编译文件;
2.8)双击IP-XACT下的component.xml文件,返回到Package IP-test_IP_ip窗口,点击Port and Interfaces顷,点击Merge changes from Ports and Interface Wizard。
2.9) 再对前面没有打钩d File Groups点击Merge changes from File Groups Wizard来更新文件和驱动。 选择Review and Package选项,然后点击Re-Package IP结束IP核的设置。关闭IP核的Vivado工程,回到系统工程界面。
4 添加约束文件
1)在Diagram窗口,右键点击空白处,选择Add IP,选择test_IP_ip_v1.0双击添加。
2)点击Run Connection Automation选项, 选中All Automation,使系统自动连接端口,点击Run Block Automation选项。 选中timer_cnt,reg SX_PRF,reg SX_TR这三个管脚,右键选择Make External。
3)在Source窗口中选中system.bd,右键打开选择Generate Output Projects和Create HDL Wrapper选项
4)在xdc文件中添加管脚约束,如下:
set_property IOSTANDARD LVCMOS33 [get_ports SX_PRF]
set_property IOSTANDARD LVCMOS33 [get_ports SX_TR]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
set_property PACKAGE_PIN U18 [get_ports sys_clk]
set_property PACKAGE_PIN R14 [get_ports SX_TR]
set_property PACKAGE_PIN P14 [get_ports SX_PRF]
5) 点击Generate bitstream生成比特流文件。
5 硬件导入SDK
1) 导出硬件的方法是选择菜单File->Export->Export Hardware,把bit文件也一起导出。硬件导出后,选择菜单File->Launch SDK,启动SDK开发环境。
2)在SDK环境里重新新建一个名为ip_test 工程和BSP库工程,顷目使用helloworldd 工程模板。
3)修改ip_test工程的helloworld.c如下。
#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
void print(char *str);
int main()
{
int i,j;
init_platform();
while(1)
{
for(i=0;i<1000;i++)
for(j=0;j<10000;j++);
Xil_Out32(XPAR_SX11_IP_0_S00_AXI_BASEADDR,0);
for(i=0;i<1000;i++)
for(j=0;j<10000;j++);
Xil_Out32(XPAR_SX11_IP_0_S00_AXI_BASEADDR,1);
print("Hello World\n\r");
}
cleanup_platform();
return 0;
}
6 总结
本文介绍了xilinx公司自定义IP的方法,以及使用自定义IP进行开发的方法,其操作简便,实用性高,可满足用户的个性化要求,封装好的IP核在后续的开发工程中可以直接调用,增强程序的可读性,简化开发过程。
参考文献
[1] xilinx,Serial RapidIO Gen2 Endpoint v4.0 LogiCORE IP Product Guide,2015
[2] TI,SRIO Programming and Performance Data on Keystone DSP,2011