首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

深入浅出FPGA-17-xilinx_zynq7000_EPP上一个简单实验(PS+PL)

深入浅出FPGA-17-xilinx_zynq7000_EPP上一个简单实验(PS+PL)

引言前面两个实验,PL是传统的FPGA开发,PS是传统的嵌入式开发。zynq7000EPP是xilinx比较高端的FPGA开发板,XC7Z020内部集成了两个cortexa9的硬核,外部有1G的DDR3,所以单纯做FPGA太浪费了。但是单纯用PS资源,就没必要用FPGA了,所以只有将两者结合使用才能体现其价值所在。即,PS+PL。添加自己的一个IP到AXI总线上,然后通过SDK编码控制它的寄存器,这就是本小节的实验内容。17.1 实验目的1》  熟悉zynq7000 EPP资源和design suite2》  PL编码,PS编码,实现一个简单逻辑。17.2 实验环境Board :ZYNQ7000 EPPDevice:XC7Z020CLG484ACX1221Design suite:14.1 (PlanAhead+XPS+SDK)17.3   实验准备a)        会planAhead创建工程:ps_pl。b)        简单了解和使用XPS和SDK17.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个文件的路径很深,不好找,截图上面有路径,方便很多。可以根据截图找到对应位置,然后添加相应代码。也可以参考附录代码。[[wysiwyg_imageupload:618:]]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 FPGAo)        Run AS,configurep)        Run17.6  实验结果看板子,DS18这个led会由亮变灭:串口也有打印。附:文件1:rill_ip_v2_1_0.mpd:[html] view plaincopyprint?

  • ###################################################################
  • ##
  • ## 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[html] view plaincopyprint?

  • ------------------------------------------------------------------------------
  • -- 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.                                                          **
  • -- ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
  • -- ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
  • -- ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
  • -- ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
  • -- ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
  • -- ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
  • -- ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
  • -- ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
  • -- ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
  • -- ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
  • -- ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
  • -- ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
  • -- ** FOR A PARTICULAR PURPOSE.                                             **
  • -- **                                                                       **
  • -- ***************************************************************************
  • --
  • ------------------------------------------------------------------------------
  • -- Filename:          rill_ip.vhd
  • -- Version:           1.00.a
  • -- Description:       Top level design, instantiates library components and user logic.
  • -- Date:              Mon Nov 05 13:53:37 2012 (by Create and Import Peripheral Wizard)
  • -- VHDL Standard:     VHDL'93
  • ------------------------------------------------------------------------------
  • -- Naming Conventions:
  • --   active low signals:                    "*_n"
  • --   clock signals:                         "clk", "clk_div#", "clk_#x"
  • --   reset signals:                         "rst", "rst_n"
  • --   generics:                              "C_*"
  • --   user defined types:                    "*_TYPE"
  • --   state machine next state:              "*_ns"
  • --   state machine current state:           "*_cs"
  • --   combinatorial signals:                 "*_com"
  • --   pipelined or register delay signals:   "*_d#"
  • --   counter signals:                       "*cnt*"
  • --   clock enable signals:                  "*_ce"
  • --   internal version of output port:       "*_i"
  • --   device pins:                           "*_pin"
  • --   ports:                                 "- Names begin with Uppercase"
  • --   processes:                             "*_PROCESS"
  • --   component instantiations:              "<ENTITY_>I_<#|FUNC>"
  • ------------------------------------------------------------------------------
  • library ieee;
  • use ieee.std_logic_1164.all;
  • use ieee.std_logic_arith.all;
  • use ieee.std_logic_unsigned.all;
  • library proc_common_v3_00_a;
  • use proc_common_v3_00_a.proc_common_pkg.all;
  • use proc_common_v3_00_a.ipif_pkg.all;
  • library axi_lite_ipif_v1_01_a;
  • use axi_lite_ipif_v1_01_a.axi_lite_ipif;
  • library rill_ip_v1_00_a;
  • use rill_ip_v1_00_a.user_logic;
  • ------------------------------------------------------------------------------
  • -- Entity section
  • ------------------------------------------------------------------------------
  • -- Definition of Generics:
  • --   C_S_AXI_DATA_WIDTH           -- AXI4LITE slave: Data width
  • --   C_S_AXI_ADDR_WIDTH           -- AXI4LITE slave: Address Width
  • --   C_S_AXI_MIN_SIZE             -- AXI4LITE slave: Min Size
  • --   C_USE_WSTRB                  -- AXI4LITE slave: Write Strobe
  • --   C_DPHASE_TIMEOUT             -- AXI4LITE slave: Data Phase Timeout
  • --   C_BASEADDR                   -- AXI4LITE slave: base address
  • --   C_HIGHADDR                   -- AXI4LITE slave: high address
  • --   C_FAMILY                     -- FPGA Family
  • --   C_NUM_REG                    -- Number of software accessible registers
  • --   C_NUM_MEM                    -- Number of address-ranges
  • --   C_SLV_AWIDTH                 -- Slave interface address bus width
  • --   C_SLV_DWIDTH                 -- Slave interface data bus width
  • --
  • -- Definition of Ports:
  • --   S_AXI_ACLK                   -- AXI4LITE slave: Clock
  • --   S_AXI_ARESETN                -- AXI4LITE slave: Reset
  • --   S_AXI_AWADDR                 -- AXI4LITE slave: Write address
  • --   S_AXI_AWVALID                -- AXI4LITE slave: Write address valid
  • --   S_AXI_WDATA                  -- AXI4LITE slave: Write data
  • --   S_AXI_WSTRB                  -- AXI4LITE slave: Write strobe
  • --   S_AXI_WVALID                 -- AXI4LITE slave: Write data valid
  • --   S_AXI_BREADY                 -- AXI4LITE slave: Response ready
  • --   S_AXI_ARADDR                 -- AXI4LITE slave: Read address
  • --   S_AXI_ARVALID                -- AXI4LITE slave: Read address valid
  • --   S_AXI_RREADY                 -- AXI4LITE slave: Read data ready
  • --   S_AXI_ARREADY                -- AXI4LITE slave: read addres ready
  • --   S_AXI_RDATA                  -- AXI4LITE slave: Read data
  • --   S_AXI_RRESP                  -- AXI4LITE slave: Read data response
  • --   S_AXI_RVALID                 -- AXI4LITE slave: Read data valid
  • --   S_AXI_WREADY                 -- AXI4LITE slave: Write data ready
  • --   S_AXI_BRESP                  -- AXI4LITE slave: Response
  • --   S_AXI_BVALID                 -- AXI4LITE slave: Resonse valid
  • --   S_AXI_AWREADY                -- AXI4LITE slave: Wrte address ready
  • ------------------------------------------------------------------------------
  • entity rill_ip is
  •   generic
  •   (
  •     -- ADD USER GENERICS BELOW THIS LINE ---------------
  •     --USER generics added here
  •     -- ADD USER GENERICS ABOVE THIS LINE ---------------
  •     -- DO NOT EDIT BELOW THIS LINE ---------------------
  •     -- Bus protocol parameters, do not add to or delete
  •     C_S_AXI_DATA_WIDTH             : integer              := 32;
  •     C_S_AXI_ADDR_WIDTH             : integer              := 32;
  •     C_S_AXI_MIN_SIZE               : std_logic_vector     := X"000001FF";
  •     C_USE_WSTRB                    : integer              := 0;
  •     C_DPHASE_TIMEOUT               : integer              := 8;
  •     C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";
  •     C_HIGHADDR                     : std_logic_vector     := X"00000000";
  •     C_FAMILY                       : string               := "virtex6";
  •     C_NUM_REG                      : integer              := 1;
  •     C_NUM_MEM                      : integer              := 1;
  •     C_SLV_AWIDTH                   : integer              := 32;
  •     C_SLV_DWIDTH                   : integer              := 32
  •     -- DO NOT EDIT ABOVE THIS LINE ---------------------
  •   );
  •   port
  •   (
  •     -- ADD USER PORTS BELOW THIS LINE ------------------
  •     --USER ports added here
  •     led : OUT std_logic;
  •     -- ADD USER PORTS ABOVE THIS LINE ------------------
  •     -- DO NOT EDIT BELOW THIS LINE ---------------------
  •     -- Bus protocol ports, do not add to or delete
  •     S_AXI_ACLK                     : in  std_logic;
  •     S_AXI_ARESETN                  : in  std_logic;
  •     S_AXI_AWADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
  •     S_AXI_AWVALID                  : in  std_logic;
  •     S_AXI_WDATA                    : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
  •     S_AXI_WSTRB                    : in  std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
  •     S_AXI_WVALID                   : in  std_logic;
  •     S_AXI_BREADY                   : in  std_logic;
  •     S_AXI_ARADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
  •     S_AXI_ARVALID                  : in  std_logic;
  •     S_AXI_RREADY                   : in  std_logic;
  •     S_AXI_ARREADY                  : out std_logic;
  •     S_AXI_RDATA                    : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
  •     S_AXI_RRESP                    : out std_logic_vector(1 downto 0);
  •     S_AXI_RVALID                   : out std_logic;
  •     S_AXI_WREADY                   : out std_logic;
  •     S_AXI_BRESP                    : out std_logic_vector(1 downto 0);
  •     S_AXI_BVALID                   : out std_logic;
  •     S_AXI_AWREADY                  : out std_logic
  •     -- DO NOT EDIT ABOVE THIS LINE ---------------------
  •   );
  •   attribute MAX_FANOUT : string;
  •   attribute SIGIS : string;
  •   attribute MAX_FANOUT of S_AXI_ACLK       : signal is "10000";
  •   attribute MAX_FANOUT of S_AXI_ARESETN       : signal is "10000";
  •   attribute SIGIS of S_AXI_ACLK       : signal is "Clk";
  •   attribute SIGIS of S_AXI_ARESETN       : signal is "Rst";
  • end entity rill_ip;
  • ------------------------------------------------------------------------------
  • -- Architecture section
  • ------------------------------------------------------------------------------
  • architecture IMP of rill_ip is
  •   constant USER_SLV_DWIDTH                : integer              := C_S_AXI_DATA_WIDTH;
  •   constant IPIF_SLV_DWIDTH                : integer              := C_S_AXI_DATA_WIDTH;
  •   constant ZERO_ADDR_PAD                  : std_logic_vector(0 to 31) := (others => '0');
  •   constant USER_SLV_BASEADDR              : std_logic_vector     := C_BASEADDR;
  •   constant USER_SLV_HIGHADDR              : std_logic_vector     := C_HIGHADDR;
  •   constant IPIF_ARD_ADDR_RANGE_ARRAY      : SLV64_ARRAY_TYPE     :=
  •     (
  •       ZERO_ADDR_PAD & USER_SLV_BASEADDR,  -- user logic slave space base address
  •       ZERO_ADDR_PAD & USER_SLV_HIGHADDR   -- user logic slave space high address
  •     );
  •   constant USER_SLV_NUM_REG               : integer              := 1;
  •   constant USER_NUM_REG                   : integer              := USER_SLV_NUM_REG;
  •   constant TOTAL_IPIF_CE                  : integer              := USER_NUM_REG;
  •   constant IPIF_ARD_NUM_CE_ARRAY          : INTEGER_ARRAY_TYPE   :=
  •     (
  •       0  => (USER_SLV_NUM_REG)            -- number of ce for user logic slave space
  •     );
  •   ------------------------------------------
  •   -- Index for CS/CE
  •   ------------------------------------------
  •   constant USER_SLV_CS_INDEX              : integer              := 0;
  •   constant USER_SLV_CE_INDEX              : integer              := calc_start_ce_index(IPIF_ARD_NUM_CE_ARRAY, USER_SLV_CS_INDEX);
  •   constant USER_CE_INDEX                  : integer              := USER_SLV_CE_INDEX;
  •   ------------------------------------------
  •   -- IP Interconnect (IPIC) signal declarations
  •   ------------------------------------------
  •   signal ipif_Bus2IP_Clk                : std_logic;
  •   signal ipif_Bus2IP_Resetn             : std_logic;
  •   signal ipif_Bus2IP_Addr               : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
  •   signal ipif_Bus2IP_RNW                : std_logic;
  •   signal ipif_Bus2IP_BE                 : std_logic_vector(IPIF_SLV_DWIDTH/8-1 downto 0);
  •   signal ipif_Bus2IP_CS                 : std_logic_vector((IPIF_ARD_ADDR_RANGE_ARRAY'LENGTH)/2-1 downto 0);
  •   signal ipif_Bus2IP_RdCE               : std_logic_vector(calc_num_ce(IPIF_ARD_NUM_CE_ARRAY)-1 downto 0);
  •   signal ipif_Bus2IP_WrCE               : std_logic_vector(calc_num_ce(IPIF_ARD_NUM_CE_ARRAY)-1 downto 0);
  •   signal ipif_Bus2IP_Data               : std_logic_vector(IPIF_SLV_DWIDTH-1 downto 0);
  •   signal ipif_IP2Bus_WrAck              : std_logic;
  •   signal ipif_IP2Bus_RdAck              : std_logic;
  •   signal ipif_IP2Bus_Error              : std_logic;
  •   signal ipif_IP2Bus_Data               : std_logic_vector(IPIF_SLV_DWIDTH-1 downto 0);
  •   signal user_Bus2IP_RdCE               : std_logic_vector(USER_NUM_REG-1 downto 0);
  •   signal user_Bus2IP_WrCE               : std_logic_vector(USER_NUM_REG-1 downto 0);
  •   signal user_IP2Bus_Data               : std_logic_vector(USER_SLV_DWIDTH-1 downto 0);
  •   signal user_IP2Bus_RdAck              : std_logic;
  •   signal user_IP2Bus_WrAck              : std_logic;
  •   signal user_IP2Bus_Error              : std_logic;
  • begin
  •   ------------------------------------------
  •   -- instantiate axi_lite_ipif
  •   ------------------------------------------
  •   AXI_LITE_IPIF_I : entity axi_lite_ipif_v1_01_a.axi_lite_ipif
  •     generic map
  •     (
  •       C_S_AXI_DATA_WIDTH             => IPIF_SLV_DWIDTH,
  •       C_S_AXI_ADDR_WIDTH             => C_S_AXI_ADDR_WIDTH,
  •       C_S_AXI_MIN_SIZE               => C_S_AXI_MIN_SIZE,
  •       C_USE_WSTRB                    => C_USE_WSTRB,
  •       C_DPHASE_TIMEOUT               => C_DPHASE_TIMEOUT,
  •       C_ARD_ADDR_RANGE_ARRAY         => IPIF_ARD_ADDR_RANGE_ARRAY,
  •       C_ARD_NUM_CE_ARRAY             => IPIF_ARD_NUM_CE_ARRAY,
  •       C_FAMILY                       => C_FAMILY
  •     )
  •     port map
  •     (
  •       S_AXI_ACLK                     => S_AXI_ACLK,
  •       S_AXI_ARESETN                  => S_AXI_ARESETN,
  •       S_AXI_AWADDR                   => S_AXI_AWADDR,
  •       S_AXI_AWVALID                  => S_AXI_AWVALID,
  •       S_AXI_WDATA                    => S_AXI_WDATA,
  •       S_AXI_WSTRB                    => S_AXI_WSTRB,
  •       S_AXI_WVALID                   => S_AXI_WVALID,
  •       S_AXI_BREADY                   => S_AXI_BREADY,
  •       S_AXI_ARADDR                   => S_AXI_ARADDR,
  •       S_AXI_ARVALID                  => S_AXI_ARVALID,
  •       S_AXI_RREADY                   => S_AXI_RREADY,
  •       S_AXI_ARREADY                  => S_AXI_ARREADY,
  •       S_AXI_RDATA                    => S_AXI_RDATA,
  •       S_AXI_RRESP                    => S_AXI_RRESP,
  •       S_AXI_RVALID                   => S_AXI_RVALID,
  •       S_AXI_WREADY                   => S_AXI_WREADY,
  •       S_AXI_BRESP                    => S_AXI_BRESP,
  •       S_AXI_BVALID                   => S_AXI_BVALID,
  •       S_AXI_AWREADY                  => S_AXI_AWREADY,
  •       Bus2IP_Clk                     => ipif_Bus2IP_Clk,
  •       Bus2IP_Resetn                  => ipif_Bus2IP_Resetn,
  •       Bus2IP_Addr                    => ipif_Bus2IP_Addr,
  •       Bus2IP_RNW                     => ipif_Bus2IP_RNW,
  •       Bus2IP_BE                      => ipif_Bus2IP_BE,
  •       Bus2IP_CS                      => ipif_Bus2IP_CS,
  •       Bus2IP_RdCE                    => ipif_Bus2IP_RdCE,
  •       Bus2IP_WrCE                    => ipif_Bus2IP_WrCE,
  •       Bus2IP_Data                    => ipif_Bus2IP_Data,
  •       IP2Bus_WrAck                   => ipif_IP2Bus_WrAck,
  •       IP2Bus_RdAck                   => ipif_IP2Bus_RdAck,
  •       IP2Bus_Error                   => ipif_IP2Bus_Error,
  •       IP2Bus_Data                    => ipif_IP2Bus_Data
  •     );
  •   ------------------------------------------
  •   -- instantiate User Logic
  •   ------------------------------------------
  •   USER_LOGIC_I : entity rill_ip_v1_00_a.user_logic
  •     generic map
  •     (
  •       -- MAP USER GENERICS BELOW THIS LINE ---------------
  •       --USER generics mapped here
  •       -- MAP USER GENERICS ABOVE THIS LINE ---------------
  •       C_NUM_REG                      => USER_NUM_REG,
  •       C_SLV_DWIDTH                   => USER_SLV_DWIDTH
  •     )
  •     port map
  •     (
  •       -- MAP USER PORTS BELOW THIS LINE ------------------
  •       --USER ports mapped here
  •       led => led,
  •       -- MAP USER PORTS ABOVE THIS LINE ------------------
  •       Bus2IP_Clk                     => ipif_Bus2IP_Clk,
  •       Bus2IP_Resetn                  => ipif_Bus2IP_Resetn,
  •       Bus2IP_Data                    => ipif_Bus2IP_Data,
  •       Bus2IP_BE                      => ipif_Bus2IP_BE,
  •       Bus2IP_RdCE                    => user_Bus2IP_RdCE,
  •       Bus2IP_WrCE                    => user_Bus2IP_WrCE,
  •       IP2Bus_Data                    => user_IP2Bus_Data,
  •       IP2Bus_RdAck                   => user_IP2Bus_RdAck,
  •       IP2Bus_WrAck                   => user_IP2Bus_WrAck,
  •       IP2Bus_Error                   => user_IP2Bus_Error
  •     );
  •   ------------------------------------------
  •   -- connect internal signals
  •   ------------------------------------------
  •   ipif_IP2Bus_Data <= user_IP2Bus_Data;
  •   ipif_IP2Bus_WrAck <= user_IP2Bus_WrAck;
  •   ipif_IP2Bus_RdAck <= user_IP2Bus_RdAck;
  •   ipif_IP2Bus_Error <= user_IP2Bus_Error;
  •   user_Bus2IP_RdCE <= ipif_Bus2IP_RdCE(USER_NUM_REG-1 downto 0);
  •   user_Bus2IP_WrCE <= ipif_Bus2IP_WrCE(USER_NUM_REG-1 downto 0);
  • end IMP;

文件3:user_logic.vhd[html] view plaincopyprint?

  • ------------------------------------------------------------------------------
  • -- user_logic.vhd - entity/architecture pair
  • ------------------------------------------------------------------------------
  • --
  • -- ***************************************************************************
  • -- ** Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.            **
  • -- **                                                                       **
  • -- ** Xilinx, Inc.                                                          **
  • -- ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
  • -- ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
  • -- ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
  • -- ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
  • -- ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
  • -- ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
  • -- ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
  • -- ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
  • -- ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
  • -- ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
  • -- ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
  • -- ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
  • -- ** FOR A PARTICULAR PURPOSE.                                             **
  • -- **                                                                       **
  • -- ***************************************************************************
  • --
  • ------------------------------------------------------------------------------
  • -- Filename:          user_logic.vhd
  • -- Version:           1.00.a
  • -- Description:       User logic.
  • -- Date:              Mon Nov 05 13:53:37 2012 (by Create and Import Peripheral Wizard)
  • -- VHDL Standard:     VHDL'93
  • ------------------------------------------------------------------------------
  • -- Naming Conventions:
  • --   active low signals:                    "*_n"
  • --   clock signals:                         "clk", "clk_div#", "clk_#x"
  • --   reset signals:                         "rst", "rst_n"
  • --   generics:                              "C_*"
  • --   user defined types:                    "*_TYPE"
  • --   state machine next state:              "*_ns"
  • --   state machine current state:           "*_cs"
  • --   combinatorial signals:                 "*_com"
  • --   pipelined or register delay signals:   "*_d#"
  • --   counter signals:                       "*cnt*"
  • --   clock enable signals:                  "*_ce"
  • --   internal version of output port:       "*_i"
  • --   device pins:                           "*_pin"
  • --   ports:                                 "- Names begin with Uppercase"
  • --   processes:                             "*_PROCESS"
  • --   component instantiations:              "<ENTITY_>I_<#|FUNC>"
  • ------------------------------------------------------------------------------
  • -- DO NOT EDIT BELOW THIS LINE --------------------
  • library ieee;
  • use ieee.std_logic_1164.all;
  • use ieee.std_logic_arith.all;
  • use ieee.std_logic_unsigned.all;
  • library proc_common_v3_00_a;
  • use proc_common_v3_00_a.proc_common_pkg.all;
  • -- DO NOT EDIT ABOVE THIS LINE --------------------
  • --USER libraries added here
  • ------------------------------------------------------------------------------
  • -- Entity section
  • ------------------------------------------------------------------------------
  • -- Definition of Generics:
  • --   C_NUM_REG                    -- Number of software accessible registers
  • --   C_SLV_DWIDTH                 -- Slave interface data bus width
  • --
  • -- Definition of Ports:
  • --   Bus2IP_Clk                   -- Bus to IP clock
  • --   Bus2IP_Resetn                -- Bus to IP reset
  • --   Bus2IP_Data                  -- Bus to IP data bus
  • --   Bus2IP_BE                    -- Bus to IP byte enables
  • --   Bus2IP_RdCE                  -- Bus to IP read chip enable
  • --   Bus2IP_WrCE                  -- Bus to IP write chip enable
  • --   IP2Bus_Data                  -- IP to Bus data bus
  • --   IP2Bus_RdAck                 -- IP to Bus read transfer acknowledgement
  • --   IP2Bus_WrAck                 -- IP to Bus write transfer acknowledgement
  • --   IP2Bus_Error                 -- IP to Bus error response
  • ------------------------------------------------------------------------------
  • entity user_logic is
  •   generic
  •   (
  •     -- ADD USER GENERICS BELOW THIS LINE ---------------
  •     --USER generics added here
  •     -- ADD USER GENERICS ABOVE THIS LINE ---------------
  •     -- DO NOT EDIT BELOW THIS LINE ---------------------
  •     -- Bus protocol parameters, do not add to or delete
  •     C_NUM_REG                      : integer              := 1;
  •     C_SLV_DWIDTH                   : integer              := 32
  •     -- DO NOT EDIT ABOVE THIS LINE ---------------------
  •   );
  •   port
  •   (
  •     -- ADD USER PORTS BELOW THIS LINE ------------------
  •     --USER ports added here
  •     led : out std_logic;
  •     -- ADD USER PORTS ABOVE THIS LINE ------------------
  •     -- DO NOT EDIT BELOW THIS LINE ---------------------
  •     -- Bus protocol ports, do not add to or delete
  •     Bus2IP_Clk                     : in  std_logic;
  •     Bus2IP_Resetn                  : in  std_logic;
  •     Bus2IP_Data                    : in  std_logic_vector(C_SLV_DWIDTH-1 downto 0);
  •     Bus2IP_BE                      : in  std_logic_vector(C_SLV_DWIDTH/8-1 downto 0);
  •     Bus2IP_RdCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
  •     Bus2IP_WrCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
  •     IP2Bus_Data                    : out std_logic_vector(C_SLV_DWIDTH-1 downto 0);
  •     IP2Bus_RdAck                   : out std_logic;
  •     IP2Bus_WrAck                   : out std_logic;
  •     IP2Bus_Error                   : out std_logic
  •     -- DO NOT EDIT ABOVE THIS LINE ---------------------
  •   );
  •   attribute MAX_FANOUT : string;
  •   attribute SIGIS : string;
  •   attribute SIGIS of Bus2IP_Clk    : signal is "CLK";
  •   attribute SIGIS of Bus2IP_Resetn : signal is "RST";
  • end entity user_logic;
  • ------------------------------------------------------------------------------
  • -- Architecture section
  • ------------------------------------------------------------------------------
  • architecture IMP of user_logic is
  •   --USER signal declarations added here, as needed for user logic
  •   signal led_i : std_logic;
  •   ------------------------------------------
  •   -- Signals for user logic slave model s/w accessible register example
  •   ------------------------------------------
  •   signal slv_reg0                       : std_logic_vector(C_SLV_DWIDTH-1 downto 0);
  •   signal slv_reg_write_sel              : std_logic_vector(0 to 0);
  •   signal slv_reg_read_sel               : std_logic_vector(0 to 0);
  •   signal slv_ip2bus_data                : std_logic_vector(C_SLV_DWIDTH-1 downto 0);
  •   signal slv_read_ack                   : std_logic;
  •   signal slv_write_ack                  : std_logic;
  • begin
  •   --USER logic implementation added here
  •   led_PROC : process (Bus2IP_Clk) is
  •   begin
  •     if Bus2IP_WrCE(0) = '1' then
  •         led_i <= '1';
  •     else
  •         led_i <= '0';
  •     end if;
  •   end process led_PROC;
  •   led <= led_i;
  •   ------------------------------------------
  •   -- Example code to read/write user logic slave model s/w accessible registers
  •   --
  •   -- Note:
  •   -- The example code presented here is to show you one way of reading/writing
  •   -- software accessible registers implemented in the user logic slave model.
  •   -- Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
  •   -- to one software accessible register by the top level template. For example,
  •   -- if you have four 32 bit software accessible registers in the user logic,
  •   -- you are basically operating on the following memory mapped registers:
  •   --
  •   --    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
  •   --                     "1000"   C_BASEADDR + 0x0
  •   --                     "0100"   C_BASEADDR + 0x4
  •   --                     "0010"   C_BASEADDR + 0x8
  •   --                     "0001"   C_BASEADDR + 0xC
  •   --
  •   ------------------------------------------
  •   slv_reg_write_sel <= Bus2IP_WrCE(0 downto 0);
  •   slv_reg_read_sel  <= Bus2IP_RdCE(0 downto 0);
  •   slv_write_ack     <= Bus2IP_WrCE(0);
  •   slv_read_ack      <= Bus2IP_RdCE(0);
  •   -- implement slave model software accessible register(s)
  •   SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk ) is
  •   begin
  •     if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
  •       if Bus2IP_Resetn = '0' then
  •         slv_reg0 <= (others => '0');
  •       else
  •         case slv_reg_write_sel is
  •           when "1" =>
  •             for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop
  •               if ( Bus2IP_BE(byte_index) = '1' ) then
  •                 slv_reg0(byte_index*8+7 downto byte_index*8) <= Bus2IP_Data(byte_index*8+7 downto byte_index*8);
  •               end if;
  •             end loop;
  •           when others => null;
  •         end case;
  •       end if;
  •     end if;
  •   end process SLAVE_REG_WRITE_PROC;
  •   -- implement slave model software accessible register(s) read mux
  •   SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0 ) is
  •   begin
  •     case slv_reg_read_sel is
  •       when "1" => slv_ip2bus_data <= slv_reg0;
  •       when others => slv_ip2bus_data <= (others => '0');
  •     end case;
  •   end process SLAVE_REG_READ_PROC;
  •   ------------------------------------------
  •   -- Example code to drive IP to Bus signals
  •   ------------------------------------------
  •   IP2Bus_Data  <= slv_ip2bus_data when slv_read_ack = '1' else
  •                   (others => '0');
  •   IP2Bus_WrAck <= slv_write_ack;
  •   IP2Bus_RdAck <= slv_read_ack;
  •   IP2Bus_Error <= '0';
  • end IMP;

文件4:UCF文件[html] view plaincopyprint?

  • NET rill_ip_0_led_pin IOSTANDARD=LVCMOS25 | LOC=V7;

文件5:SDK编码[html] view plaincopyprint?

  • /*
  • * Copyright (c) 2009 Xilinx, Inc.  All rights reserved.
  • *
  • * Xilinx, Inc.
  • * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
  • * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
  • * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
  • * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
  • * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
  • * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
  • * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
  • * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
  • * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
  • * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
  • * AND FITNESS FOR A PARTICULAR PURPOSE.
  • *
  • */
  • /*
  • * helloworld.c: simple test application
  • */
  • #include <stdio.h>
  • #include "platform.h"
  • #include "../../hello_world_bsp_0/ps7_cortexa9_0/include/xgpiops_hw.h"
  • #include "../../hello_world_bsp_0/ps7_cortexa9_0/include/xparameters.h"
  • #define LED_BASE_ADDR XPAR_RILL_IP_0_BASEADDR
  • void my_process(void);
  • int main()
  • {
  •     init_platform();
  •     my_process();
  •     cleanup_platform();
  •     return 0;
  • }
  • void my_process(void)
  • {
  •     int ret = 0;
  •     printf("my_process start...");
  •     ret = XGpioPs_ReadReg(LED_BASE_ADDR, 0);
  •     printf("read0 :%d\n\n",ret);
  •     XGpioPs_WriteReg(LED_BASE_ADDR, 0, 0);
  •     ret = XGpioPs_ReadReg(LED_BASE_ADDR, 0);
  •     printf("read1 :%d\n\n",ret);
  •     XGpioPs_WriteReg(LED_BASE_ADDR, 0, 1);
  •     ret = XGpioPs_ReadReg(LED_BASE_ADDR, 0);
  •     printf("read2 :%d\n\n",ret);
  • }
  • /************ EOF *************/

总结这三个实验包含了高端FPGA的主要的三种开发方式。也是典型的使用方式。这三个小实验搞明白了的话,就算入门了吧。再进一步的话,只不过是逻辑复杂些,代码量多一些。这就需要其他方面的知识和技能了。来源:rill_zhen的专栏
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表