zoukankan      html  css  js  c++  java
  • 利用zedboard添加自定义IP核完成简易计算器

      认识zedboard板子也有半个多月了,期间有不少杂事,学的也不是很认真,最近几天在学习如何利用AXI总线进行PS和PL部分的相互通信,利用自定义的IP核实现了简易的计算功能(只有加减),下面对实验的过程和自己的理解进行一下记录。

      首先本次试验的目的是做一个建议的计算器,通过zedboard上的sw1,sw2标识操作(01表示加法操作,10表示剪发操作),另外通过led灯进行结果的显示,通过串口进行操作数的输入,而后利用FPGA进行运算,串口输出结果。

      实验步骤:

    1. 首先在xps中进行工程的建立,导入配置文件(.xml);
    2. 而后进行自定义IP核的生成,这部分在下面进行详细记录;
    3. 将由xps完成的工程导出,进行ps端应用程序的编写

    XPS工程的建立,这部分较为简单,只用简单图示进行记录

    1. 首先建立工程,在这里听师兄讲的,我理解为建立工程时用Base System Builder的好处是不需要对基础的一些信息进行配置,这样就能省去很多开发的麻烦,更深层次的就不能体会了。。。
    2. 建立工程后选择Avnet,在Base System Builder界面将右侧不用的外设进行remove掉,而后完成对工程的建立
    3. 利用Hardware下的Create or import Peripheral建立自定义的IP核(在此我理解为这一步仅为对IP核的一些基础信息的配置,至于IP核具体实现的功能和引出的端口还需要对用户逻辑等信息进行配置),在选择寄存器的个数时,由于本工程中涉及到SW,LED和进行计算时对操作数和结果的存储,因此共需要五个寄存器

                                

        在完成此IP的基本配置信息之后,进行用户逻辑和端口号的配置

        4. 首先找到工程目录下的pcoresmy_calc_v1_v1_00_ahdlverilog的user_logic.v文件对用户逻辑进行修改,本工程中设计到的用户逻辑很简单,根据sw前两位的值判断运算方式,而后利用运算数进行运算结果在led灯上进行显示,代码如下,对加入的代码部分进行解释,并加入我的理解

    代码:

      1 //----------------------------------------------------------------------------
      2 // user_logic.v - module
      3 //----------------------------------------------------------------------------
      4 //
      5 // ***************************************************************************
      6 // ** Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.            **
      7 // **                                                                       **
      8 // ** Xilinx, Inc.                                                          **
      9 // ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
     10 // ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
     11 // ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
     12 // ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
     13 // ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
     14 // ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
     15 // ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
     16 // ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
     17 // ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
     18 // ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
     19 // ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
     20 // ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
     21 // ** FOR A PARTICULAR PURPOSE.                                             **
     22 // **                                                                       **
     23 // ***************************************************************************
     24 //
     25 //----------------------------------------------------------------------------
     26 // Filename:          user_logic.v
     27 // Version:           1.00.a
     28 // Description:       User logic module.
     29 // Date:              Fri Jul 19 15:24:36 2013 (by Create and Import Peripheral Wizard)
     30 // Verilog Standard:  Verilog-2001
     31 //----------------------------------------------------------------------------
     32 // Naming Conventions:
     33 //   active low signals:                    "*_n"
     34 //   clock signals:                         "clk", "clk_div#", "clk_#x"
     35 //   reset signals:                         "rst", "rst_n"
     36 //   generics:                              "C_*"
     37 //   user defined types:                    "*_TYPE"
     38 //   state machine next state:              "*_ns"
     39 //   state machine current state:           "*_cs"
     40 //   combinatorial signals:                 "*_com"
     41 //   pipelined or register delay signals:   "*_d#"
     42 //   counter signals:                       "*cnt*"
     43 //   clock enable signals:                  "*_ce"
     44 //   internal version of output port:       "*_i"
     45 //   device pins:                           "*_pin"
     46 //   ports:                                 "- Names begin with Uppercase"
     47 //   processes:                             "*_PROCESS"
     48 //   component instantiations:              "<ENTITY_>I_<#|FUNC>"
     49 //----------------------------------------------------------------------------
     50 
     51 `uselib lib=unisims_ver
     52 `uselib lib=proc_common_v3_00_a
     53 
     54 module user_logic
     55 (
     56   // -- ADD USER PORTS BELOW THIS LINE ---------------
     57   // --USER ports added here 
     58   SW_In,                    //The operator
     59   LED_Out,                  //Show some information
     60   // -- ADD USER PORTS ABOVE THIS LINE ---------------
     61 
     62   // -- DO NOT EDIT BELOW THIS LINE ------------------
     63   // -- Bus protocol ports, do not add to or delete 
     64   Bus2IP_Clk,                     // Bus to IP clock
     65   Bus2IP_Resetn,                  // Bus to IP reset
     66   Bus2IP_Data,                    // Bus to IP data bus
     67   Bus2IP_BE,                      // Bus to IP byte enables
     68   Bus2IP_RdCE,                    // Bus to IP read chip enable
     69   Bus2IP_WrCE,                    // Bus to IP write chip enable
     70   IP2Bus_Data,                    // IP to Bus data bus
     71   IP2Bus_RdAck,                   // IP to Bus read transfer acknowledgement
     72   IP2Bus_WrAck,                   // IP to Bus write transfer acknowledgement
     73   IP2Bus_Error                    // IP to Bus error response
     74   // -- DO NOT EDIT ABOVE THIS LINE ------------------
     75 ); // user_logic
     76 
     77 // -- ADD USER PARAMETERS BELOW THIS LINE ------------
     78 // --USER parameters added here 
     79 
     80 // -- ADD USER PARAMETERS ABOVE THIS LINE ------------
     81 
     82 // -- DO NOT EDIT BELOW THIS LINE --------------------
     83 // -- Bus protocol parameters, do not add to or delete
     84 parameter C_NUM_REG                      = 5;
     85 parameter C_SLV_DWIDTH                   = 32;
     86 // -- DO NOT EDIT ABOVE THIS LINE --------------------
     87 
     88 // -- ADD USER PORTS BELOW THIS LINE -----------------
     89 // --USER ports added here 
     90 input [7 : 0] SW_In;
     91 output [7 : 0] LED_Out;
     92 // -- ADD USER PORTS ABOVE THIS LINE -----------------
     93 
     94 // -- DO NOT EDIT BELOW THIS LINE --------------------
     95 // -- Bus protocol ports, do not add to or delete
     96 input                                     Bus2IP_Clk;
     97 input                                     Bus2IP_Resetn;
     98 input      [C_SLV_DWIDTH-1 : 0]           Bus2IP_Data;
     99 input      [C_SLV_DWIDTH/8-1 : 0]         Bus2IP_BE;
    100 input      [C_NUM_REG-1 : 0]              Bus2IP_RdCE;
    101 input      [C_NUM_REG-1 : 0]              Bus2IP_WrCE;
    102 output     [C_SLV_DWIDTH-1 : 0]           IP2Bus_Data;
    103 output                                    IP2Bus_RdAck;
    104 output                                    IP2Bus_WrAck;
    105 output                                    IP2Bus_Error;
    106 // -- DO NOT EDIT ABOVE THIS LINE --------------------
    107 
    108 //----------------------------------------------------------------------------
    109 // Implementation
    110 //----------------------------------------------------------------------------
    111 
    112   // --USER nets declarations added here, as needed for user logic  
    113   reg [7 : 0] LED_reg;
    114 
    115   // Nets for user logic slave model s/w accessible register example
    116   reg        [C_SLV_DWIDTH-1 : 0]           slv_reg0;
    117   reg        [C_SLV_DWIDTH-1 : 0]           slv_reg1;
    118   reg        [C_SLV_DWIDTH-1 : 0]           slv_reg2;
    119   reg        [C_SLV_DWIDTH-1 : 0]           slv_reg3;
    120   reg        [C_SLV_DWIDTH-1 : 0]           slv_reg4;
    121   wire       [4 : 0]                        slv_reg_write_sel;
    122   wire       [4 : 0]                        slv_reg_read_sel;
    123   reg        [C_SLV_DWIDTH-1 : 0]           slv_ip2bus_data;
    124   wire                                      slv_read_ack;
    125   wire                                      slv_write_ack;
    126   integer                                   byte_index, bit_index;
    127 
    128   // USER logic implementation added here
    129 
    130   // ------------------------------------------------------
    131   // Example code to read/write user logic slave model s/w accessible registers
    132   // 
    133   // Note:
    134   // The example code presented here is to show you one way of reading/writing
    135   // software accessible registers implemented in the user logic slave model.
    136   // Each bit of the Bus2IP_WrCE/Bus2IP_RdCE signals is configured to correspond
    137   // to one software accessible register by the top level template. For example,
    138   // if you have four 32 bit software accessible registers in the user logic,
    139   // you are basically operating on the following memory mapped registers:
    140   // 
    141   //    Bus2IP_WrCE/Bus2IP_RdCE   Memory Mapped Register
    142   //                     "1000"   C_BASEADDR + 0x0
    143   //                     "0100"   C_BASEADDR + 0x4
    144   //                     "0010"   C_BASEADDR + 0x8
    145   //                     "0001"   C_BASEADDR + 0xC
    146   // 
    147   // ------------------------------------------------------
    148 
    149   assign
    150     slv_reg_write_sel = Bus2IP_WrCE[4:0],
    151     slv_reg_read_sel  = Bus2IP_RdCE[4:0],
    152     slv_write_ack     = Bus2IP_WrCE[0] || Bus2IP_WrCE[1] || Bus2IP_WrCE[2] || Bus2IP_WrCE[3] || Bus2IP_WrCE[4],
    153     slv_read_ack      = Bus2IP_RdCE[0] || Bus2IP_RdCE[1] || Bus2IP_RdCE[2] || Bus2IP_RdCE[3] || Bus2IP_RdCE[4];
    154 
    155   // implement slave model register(s)
    156   always @( posedge Bus2IP_Clk )
    157     begin
    158 
    159       if ( Bus2IP_Resetn == 1'b0 )
    160         begin
    161           //slv_reg0 <= 0;
    162           //slv_reg1 <= 0;
    163           slv_reg2 <= 0;
    164           slv_reg3 <= 0;
    165          // slv_reg4 <= 0;
    166         end
    167       else
    168         case ( slv_reg_write_sel )
    169          /* 5'b10000 :
    170             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
    171               if ( Bus2IP_BE[byte_index] == 1 )
    172                 slv_reg0[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];       */
    173           5'b01000 :
    174             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
    175               if ( Bus2IP_BE[byte_index] == 1 )
    176                 slv_reg1[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
    177           5'b00100 :
    178             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
    179               if ( Bus2IP_BE[byte_index] == 1 )
    180                 slv_reg2[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
    181           5'b00010 :
    182             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
    183               if ( Bus2IP_BE[byte_index] == 1 )
    184                 slv_reg3[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];
    185          /* 5'b00001 :
    186             for ( byte_index = 0; byte_index <= (C_SLV_DWIDTH/8)-1; byte_index = byte_index+1 )
    187               if ( Bus2IP_BE[byte_index] == 1 )
    188                 slv_reg4[(byte_index*8) +: 8] <= Bus2IP_Data[(byte_index*8) +: 8];     */
    189           default : begin
    190             slv_reg0 <= slv_reg0;
    191             slv_reg1 <= slv_reg1;
    192             slv_reg2 <= slv_reg2;
    193             slv_reg3 <= slv_reg3;
    194             slv_reg4 <= slv_reg4;
    195                     end
    196         endcase
    197 
    198     end // SLAVE_REG_WRITE_PROC
    199 
    200   // implement slave model register read mux
    201   always @( slv_reg_read_sel or slv_reg0 or slv_reg1 or slv_reg2 or slv_reg3 or slv_reg4 )
    202     begin 
    203 
    204       case ( slv_reg_read_sel )
    205         5'b10000 : slv_ip2bus_data <= slv_reg0;
    206         5'b01000 : slv_ip2bus_data <= slv_reg1;
    207         5'b00100 : slv_ip2bus_data <= slv_reg2;
    208         5'b00010 : slv_ip2bus_data <= slv_reg3;
    209         5'b00001 : slv_ip2bus_data <= slv_reg4;
    210         default : slv_ip2bus_data <= 0;
    211       endcase
    212 
    213     end // SLAVE_REG_READ_PROC
    214 
    215   // ------------------------------------------------------------
    216   // Example code to drive IP to Bus signals
    217   // ------------------------------------------------------------
    218 
    219   always @(posedge Bus2IP_Clk)
    220   begin
    221   slv_reg0[7 : 0] <= SW_In[7 : 0];
    222   LED_reg <= slv_reg1[7 : 0];
    223   end
    224   
    225   always @(posedge Bus2IP_Clk)
    226   begin
    227     case(slv_reg0[1 : 0])
    228     2'b01 : slv_reg4 <= slv_reg2 + slv_reg3;
    229     2'b10 : slv_reg4 <= slv_reg2 - slv_reg3;
    230     default : slv_reg4 <= 0;
    231     endcase
    232   end
    233 
    234 assign IP2Bus_Data = (slv_read_ack == 1'b1) ? slv_ip2bus_data :  0 ;
    235   assign IP2Bus_WrAck = slv_write_ack;
    236   assign IP2Bus_RdAck = slv_read_ack;
    237   assign IP2Bus_Error = 0;
    238   
    239   assign LED_Out = LED_reg;
    240 
    241 endmodule
    View Code

      其中代码slv_reg0~slv_reg4为IP核中申请的5个寄存器,在这里可以根据自己的需要对这个5个寄存器的作用进行分配,在这里完全是按照自己的意愿分配,本程序中,我将slv_reg0用来存储sw的值,slv_reg1用来表示led的信息,slv_reg2和slv_reg3用来进行操作数的存储,slv_reg4用来存储运算结果。

    注意,由于在模块中sw为input故他的值不是从总线上进行读取的,slv_reg4存储运算结果,其值也不需要进行存储,故需要对源程序中的一些信息进行注释,即对case下的第一和最后一个选项进行注释,这个地方需要进行自己的判断

    另外用户逻辑的加入在代码:

     1 always @(posedge Bus2IP_Clk)
     2   begin
     3   slv_reg0[7 : 0] <= SW_In[7 : 0];
     4   LED_reg <= slv_reg1[7 : 0];
     5   end
     6   
     7   always @(posedge Bus2IP_Clk)
     8   begin
     9     case(slv_reg0[1 : 0])
    10     2'b01 : slv_reg4 <= slv_reg2 + slv_reg3;
    11     2'b10 : slv_reg4 <= slv_reg2 - slv_reg3;
    12     default : slv_reg4 <= 0;
    13     endcase
    14   end
    View Code

    可以看出本工程中的逻辑比较简单,就是根据sw的值进行操作数的加减运算。

    在完成用户逻辑后,还需要对IP核的端口进行配置,与IPIF相连接(我是这么理解的,可能会不对)

    在目录pcoresmy_calc_v1_v1_00_ahdlvhdl下对文件my_calc_v1.vhd进行更改,代码如下:

      1 ------------------------------------------------------------------------------
      2 -- my_calc_v1.vhd - entity/architecture pair
      3 ------------------------------------------------------------------------------
      4 -- IMPORTANT:
      5 -- DO NOT MODIFY THIS FILE EXCEPT IN THE DESIGNATED SECTIONS.
      6 --
      7 -- SEARCH FOR --USER TO DETERMINE WHERE CHANGES ARE ALLOWED.
      8 --
      9 -- TYPICALLY, THE ONLY ACCEPTABLE CHANGES INVOLVE ADDING NEW
     10 -- PORTS AND GENERICS THAT GET PASSED THROUGH TO THE INSTANTIATION
     11 -- OF THE USER_LOGIC ENTITY.
     12 ------------------------------------------------------------------------------
     13 --
     14 -- ***************************************************************************
     15 -- ** Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.            **
     16 -- **                                                                       **
     17 -- ** Xilinx, Inc.                                                          **
     18 -- ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"         **
     19 -- ** AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND       **
     20 -- ** SOLUTIONS FOR XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE,        **
     21 -- ** OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE,        **
     22 -- ** APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION           **
     23 -- ** THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,     **
     24 -- ** AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE      **
     25 -- ** FOR YOUR IMPLEMENTATION.  XILINX EXPRESSLY DISCLAIMS ANY              **
     26 -- ** WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE               **
     27 -- ** IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR        **
     28 -- ** REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF       **
     29 -- ** INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS       **
     30 -- ** FOR A PARTICULAR PURPOSE.                                             **
     31 -- **                                                                       **
     32 -- ***************************************************************************
     33 --
     34 ------------------------------------------------------------------------------
     35 -- Filename:          my_calc_v1.vhd
     36 -- Version:           1.00.a
     37 -- Description:       Top level design, instantiates library components and user logic.
     38 -- Date:              Fri Jul 19 15:24:36 2013 (by Create and Import Peripheral Wizard)
     39 -- VHDL Standard:     VHDL'93
     40 ------------------------------------------------------------------------------
     41 -- Naming Conventions:
     42 --   active low signals:                    "*_n"
     43 --   clock signals:                         "clk", "clk_div#", "clk_#x"
     44 --   reset signals:                         "rst", "rst_n"
     45 --   generics:                              "C_*"
     46 --   user defined types:                    "*_TYPE"
     47 --   state machine next state:              "*_ns"
     48 --   state machine current state:           "*_cs"
     49 --   combinatorial signals:                 "*_com"
     50 --   pipelined or register delay signals:   "*_d#"
     51 --   counter signals:                       "*cnt*"
     52 --   clock enable signals:                  "*_ce"
     53 --   internal version of output port:       "*_i"
     54 --   device pins:                           "*_pin"
     55 --   ports:                                 "- Names begin with Uppercase"
     56 --   processes:                             "*_PROCESS"
     57 --   component instantiations:              "<ENTITY_>I_<#|FUNC>"
     58 ------------------------------------------------------------------------------
     59 
     60 library ieee;
     61 use ieee.std_logic_1164.all;
     62 use ieee.std_logic_arith.all;
     63 use ieee.std_logic_unsigned.all;
     64 
     65 library proc_common_v3_00_a;
     66 use proc_common_v3_00_a.proc_common_pkg.all;
     67 use proc_common_v3_00_a.ipif_pkg.all;
     68 
     69 library axi_lite_ipif_v1_01_a;
     70 use axi_lite_ipif_v1_01_a.axi_lite_ipif;
     71 
     72 ------------------------------------------------------------------------------
     73 -- Entity section
     74 ------------------------------------------------------------------------------
     75 -- Definition of Generics:
     76 --   C_S_AXI_DATA_WIDTH           -- AXI4LITE slave: Data width
     77 --   C_S_AXI_ADDR_WIDTH           -- AXI4LITE slave: Address Width
     78 --   C_S_AXI_MIN_SIZE             -- AXI4LITE slave: Min Size
     79 --   C_USE_WSTRB                  -- AXI4LITE slave: Write Strobe
     80 --   C_DPHASE_TIMEOUT             -- AXI4LITE slave: Data Phase Timeout
     81 --   C_BASEADDR                   -- AXI4LITE slave: base address
     82 --   C_HIGHADDR                   -- AXI4LITE slave: high address
     83 --   C_FAMILY                     -- FPGA Family
     84 --   C_NUM_REG                    -- Number of software accessible registers
     85 --   C_NUM_MEM                    -- Number of address-ranges
     86 --   C_SLV_AWIDTH                 -- Slave interface address bus width
     87 --   C_SLV_DWIDTH                 -- Slave interface data bus width
     88 --
     89 -- Definition of Ports:
     90 --   S_AXI_ACLK                   -- AXI4LITE slave: Clock 
     91 --   S_AXI_ARESETN                -- AXI4LITE slave: Reset
     92 --   S_AXI_AWADDR                 -- AXI4LITE slave: Write address
     93 --   S_AXI_AWVALID                -- AXI4LITE slave: Write address valid
     94 --   S_AXI_WDATA                  -- AXI4LITE slave: Write data
     95 --   S_AXI_WSTRB                  -- AXI4LITE slave: Write strobe
     96 --   S_AXI_WVALID                 -- AXI4LITE slave: Write data valid
     97 --   S_AXI_BREADY                 -- AXI4LITE slave: Response ready
     98 --   S_AXI_ARADDR                 -- AXI4LITE slave: Read address
     99 --   S_AXI_ARVALID                -- AXI4LITE slave: Read address valid
    100 --   S_AXI_RREADY                 -- AXI4LITE slave: Read data ready
    101 --   S_AXI_ARREADY                -- AXI4LITE slave: read addres ready
    102 --   S_AXI_RDATA                  -- AXI4LITE slave: Read data
    103 --   S_AXI_RRESP                  -- AXI4LITE slave: Read data response
    104 --   S_AXI_RVALID                 -- AXI4LITE slave: Read data valid
    105 --   S_AXI_WREADY                 -- AXI4LITE slave: Write data ready
    106 --   S_AXI_BRESP                  -- AXI4LITE slave: Response
    107 --   S_AXI_BVALID                 -- AXI4LITE slave: Resonse valid
    108 --   S_AXI_AWREADY                -- AXI4LITE slave: Wrte address ready
    109 ------------------------------------------------------------------------------
    110 
    111 entity my_calc_v1 is
    112   generic
    113   (
    114     -- ADD USER GENERICS BELOW THIS LINE ---------------
    115     --USER generics added here
    116     -- ADD USER GENERICS ABOVE THIS LINE ---------------
    117 
    118     -- DO NOT EDIT BELOW THIS LINE ---------------------
    119     -- Bus protocol parameters, do not add to or delete
    120     C_S_AXI_DATA_WIDTH             : integer              := 32;
    121     C_S_AXI_ADDR_WIDTH             : integer              := 32;
    122     C_S_AXI_MIN_SIZE               : std_logic_vector     := X"000001FF";
    123     C_USE_WSTRB                    : integer              := 0;
    124     C_DPHASE_TIMEOUT               : integer              := 8;
    125     C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";
    126     C_HIGHADDR                     : std_logic_vector     := X"00000000";
    127     C_FAMILY                       : string               := "virtex6";
    128     C_NUM_REG                      : integer              := 1;
    129     C_NUM_MEM                      : integer              := 1;
    130     C_SLV_AWIDTH                   : integer              := 32;
    131     C_SLV_DWIDTH                   : integer              := 32
    132     -- DO NOT EDIT ABOVE THIS LINE ---------------------
    133   );
    134   port
    135   (
    136     -- ADD USER PORTS BELOW THIS LINE ------------------
    137     --USER ports added here
    138     -- ADD USER PORTS ABOVE THIS LINE ------------------
    139         GPIO_LED_Out                 : out std_logic_vector(7 downto 0);
    140       GPIO_SW_In                   : in  std_logic_vector(7 downto 0);
    141     -- DO NOT EDIT BELOW THIS LINE ---------------------
    142     -- Bus protocol ports, do not add to or delete
    143     S_AXI_ACLK                     : in  std_logic;
    144     S_AXI_ARESETN                  : in  std_logic;
    145     S_AXI_AWADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    146     S_AXI_AWVALID                  : in  std_logic;
    147     S_AXI_WDATA                    : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    148     S_AXI_WSTRB                    : in  std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
    149     S_AXI_WVALID                   : in  std_logic;
    150     S_AXI_BREADY                   : in  std_logic;
    151     S_AXI_ARADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    152     S_AXI_ARVALID                  : in  std_logic;
    153     S_AXI_RREADY                   : in  std_logic;
    154     S_AXI_ARREADY                  : out std_logic;
    155     S_AXI_RDATA                    : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    156     S_AXI_RRESP                    : out std_logic_vector(1 downto 0);
    157     S_AXI_RVALID                   : out std_logic;
    158     S_AXI_WREADY                   : out std_logic;
    159     S_AXI_BRESP                    : out std_logic_vector(1 downto 0);
    160     S_AXI_BVALID                   : out std_logic;
    161     S_AXI_AWREADY                  : out std_logic
    162     -- DO NOT EDIT ABOVE THIS LINE ---------------------
    163   );
    164 
    165   attribute MAX_FANOUT : string;
    166   attribute SIGIS : string;
    167   attribute MAX_FANOUT of S_AXI_ACLK       : signal is "10000";
    168   attribute MAX_FANOUT of S_AXI_ARESETN       : signal is "10000";
    169   attribute SIGIS of S_AXI_ACLK       : signal is "Clk";
    170   attribute SIGIS of S_AXI_ARESETN       : signal is "Rst";
    171 end entity my_calc_v1;
    172 
    173 ------------------------------------------------------------------------------
    174 -- Architecture section
    175 ------------------------------------------------------------------------------
    176 
    177 architecture IMP of my_calc_v1 is
    178 
    179   constant USER_SLV_DWIDTH                : integer              := C_S_AXI_DATA_WIDTH;
    180 
    181   constant IPIF_SLV_DWIDTH                : integer              := C_S_AXI_DATA_WIDTH;
    182 
    183   constant ZERO_ADDR_PAD                  : std_logic_vector(0 to 31) := (others => '0');
    184   constant USER_SLV_BASEADDR              : std_logic_vector     := C_BASEADDR;
    185   constant USER_SLV_HIGHADDR              : std_logic_vector     := C_HIGHADDR;
    186 
    187   constant IPIF_ARD_ADDR_RANGE_ARRAY      : SLV64_ARRAY_TYPE     := 
    188     (
    189       ZERO_ADDR_PAD & USER_SLV_BASEADDR,  -- user logic slave space base address
    190       ZERO_ADDR_PAD & USER_SLV_HIGHADDR   -- user logic slave space high address
    191     );
    192 
    193   constant USER_SLV_NUM_REG               : integer              := 5;
    194   constant USER_NUM_REG                   : integer              := USER_SLV_NUM_REG;
    195   constant TOTAL_IPIF_CE                  : integer              := USER_NUM_REG;
    196 
    197   constant IPIF_ARD_NUM_CE_ARRAY          : INTEGER_ARRAY_TYPE   := 
    198     (
    199       0  => (USER_SLV_NUM_REG)            -- number of ce for user logic slave space
    200     );
    201 
    202   ------------------------------------------
    203   -- Index for CS/CE
    204   ------------------------------------------
    205   constant USER_SLV_CS_INDEX              : integer              := 0;
    206   constant USER_SLV_CE_INDEX              : integer              := calc_start_ce_index(IPIF_ARD_NUM_CE_ARRAY, USER_SLV_CS_INDEX);
    207 
    208   constant USER_CE_INDEX                  : integer              := USER_SLV_CE_INDEX;
    209 
    210   ------------------------------------------
    211   -- IP Interconnect (IPIC) signal declarations
    212   ------------------------------------------
    213   signal ipif_Bus2IP_Clk                : std_logic;
    214   signal ipif_Bus2IP_Resetn             : std_logic;
    215   signal ipif_Bus2IP_Addr               : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    216   signal ipif_Bus2IP_RNW                : std_logic;
    217   signal ipif_Bus2IP_BE                 : std_logic_vector(IPIF_SLV_DWIDTH/8-1 downto 0);
    218   signal ipif_Bus2IP_CS                 : std_logic_vector((IPIF_ARD_ADDR_RANGE_ARRAY'LENGTH)/2-1 downto 0);
    219   signal ipif_Bus2IP_RdCE               : std_logic_vector(calc_num_ce(IPIF_ARD_NUM_CE_ARRAY)-1 downto 0);
    220   signal ipif_Bus2IP_WrCE               : std_logic_vector(calc_num_ce(IPIF_ARD_NUM_CE_ARRAY)-1 downto 0);
    221   signal ipif_Bus2IP_Data               : std_logic_vector(IPIF_SLV_DWIDTH-1 downto 0);
    222   signal ipif_IP2Bus_WrAck              : std_logic;
    223   signal ipif_IP2Bus_RdAck              : std_logic;
    224   signal ipif_IP2Bus_Error              : std_logic;
    225   signal ipif_IP2Bus_Data               : std_logic_vector(IPIF_SLV_DWIDTH-1 downto 0);
    226   signal user_Bus2IP_RdCE               : std_logic_vector(USER_NUM_REG-1 downto 0);
    227   signal user_Bus2IP_WrCE               : std_logic_vector(USER_NUM_REG-1 downto 0);
    228   signal user_IP2Bus_Data               : std_logic_vector(USER_SLV_DWIDTH-1 downto 0);
    229   signal user_IP2Bus_RdAck              : std_logic;
    230   signal user_IP2Bus_WrAck              : std_logic;
    231   signal user_IP2Bus_Error              : std_logic;
    232 
    233   ------------------------------------------
    234   -- Component declaration for verilog user logic
    235   ------------------------------------------
    236   component user_logic is
    237     generic
    238     (
    239       -- ADD USER GENERICS BELOW THIS LINE ---------------
    240       --USER generics added here
    241       -- ADD USER GENERICS ABOVE THIS LINE ---------------
    242 
    243       -- DO NOT EDIT BELOW THIS LINE ---------------------
    244       -- Bus protocol parameters, do not add to or delete
    245       C_NUM_REG                      : integer              := 5;
    246       C_SLV_DWIDTH                   : integer              := 32
    247       -- DO NOT EDIT ABOVE THIS LINE ---------------------
    248     );
    249     port
    250     (
    251       -- ADD USER PORTS BELOW THIS LINE ------------------
    252       --USER ports added here
    253       -- ADD USER PORTS ABOVE THIS LINE ------------------
    254       LED_Out                        :out std_logic_vector(7 downto 0);
    255            SW_In                            :in std_logic_vector(7 downto 0);
    256       -- DO NOT EDIT BELOW THIS LINE ---------------------
    257       -- Bus protocol ports, do not add to or delete
    258       Bus2IP_Clk                     : in  std_logic;
    259       Bus2IP_Resetn                  : in  std_logic;
    260       Bus2IP_Data                    : in  std_logic_vector(C_SLV_DWIDTH-1 downto 0);
    261       Bus2IP_BE                      : in  std_logic_vector(C_SLV_DWIDTH/8-1 downto 0);
    262       Bus2IP_RdCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
    263       Bus2IP_WrCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
    264       IP2Bus_Data                    : out std_logic_vector(C_SLV_DWIDTH-1 downto 0);
    265       IP2Bus_RdAck                   : out std_logic;
    266       IP2Bus_WrAck                   : out std_logic;
    267       IP2Bus_Error                   : out std_logic
    268       -- DO NOT EDIT ABOVE THIS LINE ---------------------
    269     );
    270   end component user_logic;
    271 
    272 begin
    273 
    274   ------------------------------------------
    275   -- instantiate axi_lite_ipif
    276   ------------------------------------------
    277   AXI_LITE_IPIF_I : entity axi_lite_ipif_v1_01_a.axi_lite_ipif
    278     generic map
    279     (
    280       C_S_AXI_DATA_WIDTH             => IPIF_SLV_DWIDTH,
    281       C_S_AXI_ADDR_WIDTH             => C_S_AXI_ADDR_WIDTH,
    282       C_S_AXI_MIN_SIZE               => C_S_AXI_MIN_SIZE,
    283       C_USE_WSTRB                    => C_USE_WSTRB,
    284       C_DPHASE_TIMEOUT               => C_DPHASE_TIMEOUT,
    285       C_ARD_ADDR_RANGE_ARRAY         => IPIF_ARD_ADDR_RANGE_ARRAY,
    286       C_ARD_NUM_CE_ARRAY             => IPIF_ARD_NUM_CE_ARRAY,
    287       C_FAMILY                       => C_FAMILY
    288     )
    289     port map
    290     (
    291       S_AXI_ACLK                     => S_AXI_ACLK,
    292       S_AXI_ARESETN                  => S_AXI_ARESETN,
    293       S_AXI_AWADDR                   => S_AXI_AWADDR,
    294       S_AXI_AWVALID                  => S_AXI_AWVALID,
    295       S_AXI_WDATA                    => S_AXI_WDATA,
    296       S_AXI_WSTRB                    => S_AXI_WSTRB,
    297       S_AXI_WVALID                   => S_AXI_WVALID,
    298       S_AXI_BREADY                   => S_AXI_BREADY,
    299       S_AXI_ARADDR                   => S_AXI_ARADDR,
    300       S_AXI_ARVALID                  => S_AXI_ARVALID,
    301       S_AXI_RREADY                   => S_AXI_RREADY,
    302       S_AXI_ARREADY                  => S_AXI_ARREADY,
    303       S_AXI_RDATA                    => S_AXI_RDATA,
    304       S_AXI_RRESP                    => S_AXI_RRESP,
    305       S_AXI_RVALID                   => S_AXI_RVALID,
    306       S_AXI_WREADY                   => S_AXI_WREADY,
    307       S_AXI_BRESP                    => S_AXI_BRESP,
    308       S_AXI_BVALID                   => S_AXI_BVALID,
    309       S_AXI_AWREADY                  => S_AXI_AWREADY,
    310       Bus2IP_Clk                     => ipif_Bus2IP_Clk,
    311       Bus2IP_Resetn                  => ipif_Bus2IP_Resetn,
    312       Bus2IP_Addr                    => ipif_Bus2IP_Addr,
    313       Bus2IP_RNW                     => ipif_Bus2IP_RNW,
    314       Bus2IP_BE                      => ipif_Bus2IP_BE,
    315       Bus2IP_CS                      => ipif_Bus2IP_CS,
    316       Bus2IP_RdCE                    => ipif_Bus2IP_RdCE,
    317       Bus2IP_WrCE                    => ipif_Bus2IP_WrCE,
    318       Bus2IP_Data                    => ipif_Bus2IP_Data,
    319       IP2Bus_WrAck                   => ipif_IP2Bus_WrAck,
    320       IP2Bus_RdAck                   => ipif_IP2Bus_RdAck,
    321       IP2Bus_Error                   => ipif_IP2Bus_Error,
    322       IP2Bus_Data                    => ipif_IP2Bus_Data
    323     );
    324 
    325   ------------------------------------------
    326   -- instantiate User Logic
    327   ------------------------------------------
    328   USER_LOGIC_I : component user_logic
    329     generic map
    330     (
    331       -- MAP USER GENERICS BELOW THIS LINE ---------------
    332       --USER generics mapped here
    333       -- MAP USER GENERICS ABOVE THIS LINE ---------------
    334 
    335       C_NUM_REG                      => USER_NUM_REG,
    336       C_SLV_DWIDTH                   => USER_SLV_DWIDTH
    337     )
    338     port map
    339     (
    340       -- MAP USER PORTS BELOW THIS LINE ------------------
    341       --USER ports mapped here
    342       LED_Out                        => GPIO_LED_Out,
    343 
    344       SW_In                          => GPIO_SW_In,
    345       -- MAP USER PORTS ABOVE THIS LINE ------------------
    346 
    347       Bus2IP_Clk                     => ipif_Bus2IP_Clk,
    348       Bus2IP_Resetn                  => ipif_Bus2IP_Resetn,
    349       Bus2IP_Data                    => ipif_Bus2IP_Data,
    350       Bus2IP_BE                      => ipif_Bus2IP_BE,
    351       Bus2IP_RdCE                    => user_Bus2IP_RdCE,
    352       Bus2IP_WrCE                    => user_Bus2IP_WrCE,
    353       IP2Bus_Data                    => user_IP2Bus_Data,
    354       IP2Bus_RdAck                   => user_IP2Bus_RdAck,
    355       IP2Bus_WrAck                   => user_IP2Bus_WrAck,
    356       IP2Bus_Error                   => user_IP2Bus_Error
    357     );
    358 
    359   ------------------------------------------
    360   -- connect internal signals
    361   ------------------------------------------
    362   ipif_IP2Bus_Data <= user_IP2Bus_Data;
    363   ipif_IP2Bus_WrAck <= user_IP2Bus_WrAck;
    364   ipif_IP2Bus_RdAck <= user_IP2Bus_RdAck;
    365   ipif_IP2Bus_Error <= user_IP2Bus_Error;
    366 
    367   user_Bus2IP_RdCE <= ipif_Bus2IP_RdCE(USER_NUM_REG-1 downto 0);
    368   user_Bus2IP_WrCE <= ipif_Bus2IP_WrCE(USER_NUM_REG-1 downto 0);
    369 
    370 end IMP;
    View Code

      这个里面的一些部分比较难理解,我只是按照我的想法进行解释,不一定正确

      我理解的这个文件是对IP核这个实体进行的配置,其中包括的部分分别是,实体的信息,包括实体包含的寄存器,寄存器位宽,实体的对外端口等,其代码为:

     1 entity my_calc_v1 is
     2   generic
     3   (
     4     -- ADD USER GENERICS BELOW THIS LINE ---------------
     5     --USER generics added here
     6     -- ADD USER GENERICS ABOVE THIS LINE ---------------
     7 
     8     -- DO NOT EDIT BELOW THIS LINE ---------------------
     9     -- Bus protocol parameters, do not add to or delete
    10     C_S_AXI_DATA_WIDTH             : integer              := 32;
    11     C_S_AXI_ADDR_WIDTH             : integer              := 32;
    12     C_S_AXI_MIN_SIZE               : std_logic_vector     := X"000001FF";
    13     C_USE_WSTRB                    : integer              := 0;
    14     C_DPHASE_TIMEOUT               : integer              := 8;
    15     C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";
    16     C_HIGHADDR                     : std_logic_vector     := X"00000000";
    17     C_FAMILY                       : string               := "virtex6";
    18     C_NUM_REG                      : integer              := 1;
    19     C_NUM_MEM                      : integer              := 1;
    20     C_SLV_AWIDTH                   : integer              := 32;
    21     C_SLV_DWIDTH                   : integer              := 32
    22     -- DO NOT EDIT ABOVE THIS LINE ---------------------
    23   );
    24   port
    25   (
    26     -- ADD USER PORTS BELOW THIS LINE ------------------
    27     --USER ports added here
    28     -- ADD USER PORTS ABOVE THIS LINE ------------------
    29         GPIO_LED_Out                 : out std_logic_vector(7 downto 0);
    30       GPIO_SW_In                   : in  std_logic_vector(7 downto 0);
    31     -- DO NOT EDIT BELOW THIS LINE ---------------------
    32     -- Bus protocol ports, do not add to or delete
    33     S_AXI_ACLK                     : in  std_logic;
    34     S_AXI_ARESETN                  : in  std_logic;
    35     S_AXI_AWADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    36     S_AXI_AWVALID                  : in  std_logic;
    37     S_AXI_WDATA                    : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    38     S_AXI_WSTRB                    : in  std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0);
    39     S_AXI_WVALID                   : in  std_logic;
    40     S_AXI_BREADY                   : in  std_logic;
    41     S_AXI_ARADDR                   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    42     S_AXI_ARVALID                  : in  std_logic;
    43     S_AXI_RREADY                   : in  std_logic;
    44     S_AXI_ARREADY                  : out std_logic;
    45     S_AXI_RDATA                    : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    46     S_AXI_RRESP                    : out std_logic_vector(1 downto 0);
    47     S_AXI_RVALID                   : out std_logic;
    48     S_AXI_WREADY                   : out std_logic;
    49     S_AXI_BRESP                    : out std_logic_vector(1 downto 0);
    50     S_AXI_BVALID                   : out std_logic;
    51     S_AXI_AWREADY                  : out std_logic
    52     -- DO NOT EDIT ABOVE THIS LINE ---------------------
    53   );
    View Code

    在这里需要对实体添加自定义的对外接口,SW和LED

    下面就是对IP核的实现进行描述,包括IP核的架构(也是图形界面配置的一部分)包含的用户逻辑和用户逻辑到对外端口的映射关系

     1 component user_logic is
     2     generic
     3     (
     4       -- ADD USER GENERICS BELOW THIS LINE ---------------
     5       --USER generics added here
     6       -- ADD USER GENERICS ABOVE THIS LINE ---------------
     7 
     8       -- DO NOT EDIT BELOW THIS LINE ---------------------
     9       -- Bus protocol parameters, do not add to or delete
    10       C_NUM_REG                      : integer              := 5;
    11       C_SLV_DWIDTH                   : integer              := 32
    12       -- DO NOT EDIT ABOVE THIS LINE ---------------------
    13     );
    14     port
    15     (
    16       -- ADD USER PORTS BELOW THIS LINE ------------------
    17       --USER ports added here
    18       -- ADD USER PORTS ABOVE THIS LINE ------------------
    19       LED_Out                        :out std_logic_vector(7 downto 0);
    20            SW_In                            :in std_logic_vector(7 downto 0);
    21       -- DO NOT EDIT BELOW THIS LINE ---------------------
    22       -- Bus protocol ports, do not add to or delete
    23       Bus2IP_Clk                     : in  std_logic;
    24       Bus2IP_Resetn                  : in  std_logic;
    25       Bus2IP_Data                    : in  std_logic_vector(C_SLV_DWIDTH-1 downto 0);
    26       Bus2IP_BE                      : in  std_logic_vector(C_SLV_DWIDTH/8-1 downto 0);
    27       Bus2IP_RdCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
    28       Bus2IP_WrCE                    : in  std_logic_vector(C_NUM_REG-1 downto 0);
    29       IP2Bus_Data                    : out std_logic_vector(C_SLV_DWIDTH-1 downto 0);
    30       IP2Bus_RdAck                   : out std_logic;
    31       IP2Bus_WrAck                   : out std_logic;
    32       IP2Bus_Error                   : out std_logic
    33       -- DO NOT EDIT ABOVE THIS LINE ---------------------
    34     );
    35   end component user_logic;
    View Code

    这部分用户逻辑的描述,需要再其中加入自己添加的部分,由于在用户逻辑中添加了SW和LED的输入输出,因此在这部分中需要进行添加

    最后是用户逻辑中的端口到IP核对外端口的映射,在map中进行了体现,代码如下

     1  USER_LOGIC_I : component user_logic
     2     generic map
     3     (
     4       -- MAP USER GENERICS BELOW THIS LINE ---------------
     5       --USER generics mapped here
     6       -- MAP USER GENERICS ABOVE THIS LINE ---------------
     7 
     8       C_NUM_REG                      => USER_NUM_REG,
     9       C_SLV_DWIDTH                   => USER_SLV_DWIDTH
    10     )
    11     port map
    12     (
    13       -- MAP USER PORTS BELOW THIS LINE ------------------
    14       --USER ports mapped here
    15       LED_Out                        => GPIO_LED_Out,
    16 
    17       SW_In                          => GPIO_SW_In,
    18       -- MAP USER PORTS ABOVE THIS LINE ------------------
    19 
    20       Bus2IP_Clk                     => ipif_Bus2IP_Clk,
    21       Bus2IP_Resetn                  => ipif_Bus2IP_Resetn,
    22       Bus2IP_Data                    => ipif_Bus2IP_Data,
    23       Bus2IP_BE                      => ipif_Bus2IP_BE,
    24       Bus2IP_RdCE                    => user_Bus2IP_RdCE,
    25       Bus2IP_WrCE                    => user_Bus2IP_WrCE,
    26       IP2Bus_Data                    => user_IP2Bus_Data,
    27       IP2Bus_RdAck                   => user_IP2Bus_RdAck,
    28       IP2Bus_WrAck                   => user_IP2Bus_WrAck,
    29       IP2Bus_Error                   => user_IP2Bus_Error
    30     );
    View Code

      在完成以上代码的书写后,就基本完成了IP的控制,下面就是将IP核添加到工程中去,在此双击用户的IP核即可添加,在添加完成后,会在Bus Interface中发现此IP核,而后在port中进行配置,在port的配置过程中我理解为,此部分为经过IPIF包装后IP核的对外端口,通过这些对外端口可以进行一些外设的连接,而后此IP核映射到PS端,当作一个外设进行同意编址,PS端可以直接对地址进行操作,就可以控制外设(如sw和led)

    将GPIO_LED_Out和GPIO_SW_In配置为External Ports,这样我理解是利用External Ports就可以对外设进行连接,外设看到的端口名称为my_calc_v1_0_GPIO_LED_Out_pin,和my_calc_v1_0_GPIO_SW_In_pin。

    进行完端口的配置后,就可以进行约束文件的建立,将端口映射到FPGA的具体引脚上,约束文件如下:

     1 #
     2 # pin constraints
     3 #
     4 #
     5 NET "my_calc_v1_0_GPIO_LED_Out_pin[0]" LOC = T22;
     6 NET "my_calc_v1_0_GPIO_LED_Out_pin[1]" LOC = T21;
     7 NET "my_calc_v1_0_GPIO_LED_Out_pin[2]" LOC = U22;
     8 NET "my_calc_v1_0_GPIO_LED_Out_pin[3]" LOC = U21;
     9 NET "my_calc_v1_0_GPIO_LED_Out_pin[4]" LOC = V22;
    10 NET "my_calc_v1_0_GPIO_LED_Out_pin[5]" LOC = W22;
    11 NET "my_calc_v1_0_GPIO_LED_Out_pin[6]" LOC = U19;
    12 NET "my_calc_v1_0_GPIO_LED_Out_pin[7]" LOC = U14;
    13 
    14 NET "my_calc_v1_0_GPIO_LED_Out_pin[0]" IOSTANDARD = LVCMOS33;
    15 NET "my_calc_v1_0_GPIO_LED_Out_pin[1]" IOSTANDARD = LVCMOS33;
    16 NET "my_calc_v1_0_GPIO_LED_Out_pin[2]" IOSTANDARD = LVCMOS33;
    17 NET "my_calc_v1_0_GPIO_LED_Out_pin[3]" IOSTANDARD = LVCMOS33;
    18 NET "my_calc_v1_0_GPIO_LED_Out_pin[4]" IOSTANDARD = LVCMOS33;
    19 NET "my_calc_v1_0_GPIO_LED_Out_pin[5]" IOSTANDARD = LVCMOS33;
    20 NET "my_calc_v1_0_GPIO_LED_Out_pin[6]" IOSTANDARD = LVCMOS33;
    21 NET "my_calc_v1_0_GPIO_LED_Out_pin[7]" IOSTANDARD = LVCMOS33;
    22 
    23 NET "my_calc_v1_0_GPIO_SW_In_pin[0]" LOC = F22;
    24 NET "my_calc_v1_0_GPIO_SW_In_pin[1]" LOC = G22;
    25 NET "my_calc_v1_0_GPIO_SW_In_pin[2]" LOC = H22;
    26 NET "my_calc_v1_0_GPIO_SW_In_pin[3]" LOC = F21;
    27 NET "my_calc_v1_0_GPIO_SW_In_pin[4]" LOC = H19;
    28 NET "my_calc_v1_0_GPIO_SW_In_pin[5]" LOC = H18;
    29 NET "my_calc_v1_0_GPIO_SW_In_pin[6]" LOC = H17;
    30 NET "my_calc_v1_0_GPIO_SW_In_pin[7]" LOC = M15;
    31 
    32 
    33 NET "my_calc_v1_0_GPIO_SW_In_pin[0]" IOSTANDARD = LVCMOS33;
    34 NET "my_calc_v1_0_GPIO_SW_In_pin[1]" IOSTANDARD = LVCMOS33;
    35 NET "my_calc_v1_0_GPIO_SW_In_pin[2]" IOSTANDARD = LVCMOS33;
    36 NET "my_calc_v1_0_GPIO_SW_In_pin[3]" IOSTANDARD = LVCMOS33;
    37 NET "my_calc_v1_0_GPIO_SW_In_pin[4]" IOSTANDARD = LVCMOS33;
    38 NET "my_calc_v1_0_GPIO_SW_In_pin[5]" IOSTANDARD = LVCMOS33;
    39 NET "my_calc_v1_0_GPIO_SW_In_pin[6]" IOSTANDARD = LVCMOS33;
    40 NET "my_calc_v1_0_GPIO_SW_In_pin[7]" IOSTANDARD = LVCMOS33;
    41 # additional constraints
    42 #
    View Code

      完成后,XPS端的配置就完成,点击Generate BitStream生成bit文件,成功后导出的SDK

      在进入SDK后,我们可以在system.xml文件中可以看到建立的IP核搭建的PL部分被当作外设映射到PS端,映射地址为0x78c00000

    在此后我们只需要根据C语言的知识,对此地址端进行编程即可,下面逻辑就不再展开叙述,具体代码如下,写的比较乱

     1 /*
     2  * Copyright (c) 2009 Xilinx, Inc.  All rights reserved.
     3  *
     4  * Xilinx, Inc.
     5  * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
     6  * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
     7  * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
     8  * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
     9  * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
    10  * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
    11  * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
    12  * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
    13  * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
    14  * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
    15  * AND FITNESS FOR A PARTICULAR PURPOSE.
    16  *
    17  */
    18 
    19 /*
    20  * helloworld.c: simple test application
    21  */
    22 
    23 #include <stdio.h>
    24 #include "platform.h"
    25 #define  SW    (* (volatile unsigned int *) 0x78C00000) //
    26 #define  LED   (* (volatile unsigned int *) 0x78C00004) //
    27 #define  ADD1  (* (volatile unsigned int *) 0x78C00008) // 第一个寄存器地址---加数一
    28 #define  ADD2  (* (volatile unsigned int *) 0x78C0000C) // 第二个寄存器地址---加数二
    29 #define  SUM  (* (volatile unsigned int *) 0x78C00010) // 第三个寄存器地址---和
    30 
    31 //void print(char *str);
    32 
    33 int main()
    34 {
    35     init_platform();
    36 
    37     printf("Hello World
    
    ");
    38     printf("Please input the first operator:
    
    ");
    39     scanf("%d", &ADD1);
    40     printf("Please second the first operator:
    
    ");
    41     scanf("%d", &ADD2);
    42     if(SW == 0x01)
    43     {
    44         printf("The result of ADD1 + ADD2 = %d
    
    ", SUM);
    45     }
    46     else if(SW == 0x02)
    47     {
    48         printf("The result of ADD1 - ADD2 = %d
    
    ", SUM);
    49     }
    50     LED = SUM;
    51 
    52     return 0;
    53 }
    View Code

    完成代码的编写后进行板子的配置,并进行程序的下载,结果运行良好,第一个自己动手做的工程终于完成了,好长时间了不容易啊

    天道酬勤,加油吧!!马不扬鞭自奋蹄!!

      

  • 相关阅读:
    erl_0012 timer:tc 测试模块函数调用运行耗时
    erl_0011 erlang 定时器相关
    erl0010
    erl0009
    erl0008
    erl0007
    erl0006
    erl0005
    开开心心过生活、踏踏实实做技术
    Android-理解Intent
  • 原文地址:https://www.cnblogs.com/GOFpag/p/Zedboard_IP.html
Copyright © 2011-2022 走看看