引言
前面两个实验,PL是传统的FPGA开发,PS是传统的嵌入式开发。
zynq7000EPP是xilinx比较高端的FPGA开发板,XC7Z020内部集成了两个cortexa9的硬核,外部有1G的DDR3,所以单纯做FPGA太浪费了。但是单纯用PS资源,就没必要用FPGA了,所以只有将两者结合使用才能体现其价值所在。
即,PS+PL。添加自己的一个IP到AXI总线上,然后通过SDK编码控制它的寄存器,这就是本小节的实验内容。
17.1 实验目的
1》 熟悉zynq7000 EPP资源和design suite
2》 PL编码,PS编码,实现一个简单逻辑。
17.2 实验环境
Board :ZYNQ7000 EPP
Device:XC7Z020CLG484ACX1221
Design suite:14.1 (PlanAhead+XPS+SDK)
17.3 实验准备
a) 会planAhead创建工程:ps_pl。
b) 简单了解和使用XPS和SDK
17.4 实验内容
a) 添加自己一个IP:rill_ip,挂到AXI上,此IP有一个output连到外部一个LED上。
b) 在SDK编写C代码控制这个IP的寄存器来控制此设备,进而控制LED的闪烁。
17.5 实验步骤
a) 打开planAhead,创建embedded新工程,添加PS7。
b) 打开XPS->hardware,添加自己的ip:rill_ip。
c) AXI4-lite.
d) 一个32位寄存器。
e) 生成driver。
f) 修改此IP的文件:MPD文件,rill_ip.vhd,user_logic.vhd。三个文件。
File:mpd,1个地方需要修改,如图:这3个文件的路径很深,不好找,截图上面有路径,方便很多。
可以根据截图找到对应位置,然后添加相应代码。
也可以参考附录代码。
File:rill_ip.vhd: 2个地方需要修改。
File:user_logic.vhd: 3个地方需要修改。
g) 将此ip添加到XPS工程。
h) 自动映射。注意port名称,ucf文件里要用。
i) 添加UCF文件,内容:ps_pl.ucf。
j) Create TOP HDL,然后生成bitstream。
k) 导出hardware,launch SDK。
l) 在SDK里创建helloword工程。
m) SDK编码,内容:helloworld.c。读写寄存器。
n) Program FPGA
o) Run AS,configure
p) Run
17.6 实验结果
看板子,DS18这个led会由亮变灭:串口也有打印。
,
附:
文件1:rill_ip_v2_1_0.mpd:
###################################################################
##
## Name : rill_ip
## Desc : Microprocessor Peripheral Description
## : Automatically generated by PsfUtility
##
###################################################################
BEGIN rill_ip
## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION HDL = VHDL
OPTION IP_GROUP = MICROBLAZE:USER
OPTION DESC = RILL_IP
OPTION ARCH_SUPPORT_MAP = (others=DEVELOPMENT)
## Bus Interfaces
BUS_INTERFACE BUS = S_AXI, BUS_STD = AXI, BUS_TYPE = SLAVE
## Generics for VHDL or Parameters for Verilog
PARAMETER C_S_AXI_DATA_WIDTH = 32, DT = INTEGER, BUS = S_AXI, ASSIGNMENT = CONSTANT
PARAMETER C_S_AXI_ADDR_WIDTH = 32, DT = INTEGER, BUS = S_AXI, ASSIGNMENT = CONSTANT
PARAMETER C_S_AXI_MIN_SIZE = 0x000001ff, DT = std_logic_vector, BUS = S_AXI
PARAMETER C_USE_WSTRB = 0, DT = INTEGER
PARAMETER C_DPHASE_TIMEOUT = 8, DT = INTEGER
PARAMETER C_BASEADDR = 0xffffffff, DT = std_logic_vector, MIN_SIZE = 0x100, PAIR = C_HIGHADDR, ADDRESS = BASE, BUS = S_AXI
PARAMETER C_HIGHADDR = 0x00000000, DT = std_logic_vector, PAIR = C_BASEADDR, ADDRESS = HIGH, BUS = S_AXI
PARAMETER C_FAMILY = virtex6, DT = STRING
PARAMETER C_NUM_REG = 1, DT = INTEGER
PARAMETER C_NUM_MEM = 1, DT = INTEGER
PARAMETER C_SLV_AWIDTH = 32, DT = INTEGER
PARAMETER C_SLV_DWIDTH = 32, DT = INTEGER
PARAMETER C_S_AXI_PROTOCOL = AXI4LITE, TYPE = NON_HDL, ASSIGNMENT = CONSTANT, DT = STRING, BUS = S_AXI
## Ports
PORT led = "",DIR = O
PORT S_AXI_ACLK = "", DIR = I, SIGIS = CLK, BUS = S_AXI
PORT S_AXI_ARESETN = ARESETN, DIR = I, SIGIS = RST, BUS = S_AXI
PORT S_AXI_AWADDR = AWADDR, DIR = I, VEC = [(C_S_AXI_ADDR_WIDTH-1):0], ENDIAN = LITTLE, BUS = S_AXI
PORT S_AXI_AWVALID = AWVALID, DIR = I, BUS = S_AXI
PORT S_AXI_WDATA = WDATA, DIR = I, VEC = [(C_S_AXI_DATA_WIDTH-1):0], ENDIAN = LITTLE, BUS = S_AXI
PORT S_AXI_WSTRB = WSTRB, DIR = I, VEC = [((C_S_AXI_DATA_WIDTH/8)-1):0], ENDIAN = LITTLE, BUS = S_AXI
PORT S_AXI_WVALID = WVALID, DIR = I, BUS = S_AXI
PORT S_AXI_BREADY = BREADY, DIR = I, BUS = S_AXI
PORT S_AXI_ARADDR = ARADDR, DIR = I, VEC = [(C_S_AXI_ADDR_WIDTH-1):0], ENDIAN = LITTLE, BUS = S_AXI
PORT S_AXI_ARVALID = ARVALID, DIR = I, BUS = S_AXI
PORT S_AXI_RREADY = RREADY, DIR = I, BUS = S_AXI
PORT S_AXI_ARREADY = ARREADY, DIR = O, BUS = S_AXI
PORT S_AXI_RDATA = RDATA, DIR = O, VEC = [(C_S_AXI_DATA_WIDTH-1):0], ENDIAN = LITTLE, BUS = S_AXI
PORT S_AXI_RRESP = RRESP, DIR = O, VEC = [1:0], BUS = S_AXI
PORT S_AXI_RVALID = RVALID, DIR = O, BUS = S_AXI
PORT S_AXI_WREADY = WREADY, DIR = O, BUS = S_AXI
PORT S_AXI_BRESP = BRESP, DIR = O, VEC = [1:0], BUS = S_AXI
PORT S_AXI_BVALID = BVALID, DIR = O, BUS = S_AXI
PORT S_AXI_AWREADY = AWREADY, DIR = O, BUS = S_AXI
END
文件2:rill_ip.vhd
------------------------------------------------------------------------------
-- rill_ip.vhd - entity/architecture pair
------------------------------------------------------------------------------
-- IMPORTANT:
-- DO NOT MODIFY THIS FILE EXCEPT IN THE DESIGNATED SECTIONS.
--
-- SEARCH FOR --USER TO DETERMINE WHERE CHANGES ARE ALLOWED.
--
-- TYPICALLY, THE ONLY ACCEPTABLE CHANGES INVOLVE ADDING NEW
-- PORTS AND GENERICS THAT GET PASSED THROUGH TO THE INSTANTIATION
-- OF THE USER_LOGIC ENTITY.
------------------------------------------------------------------------------
--
-- ***************************************************************************
-- ** Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. **
-- ** **
-- ** Xilinx, Inc.