利用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. 首先找到工程目录下的pcores\my_calc_v1_v1_00_a\hdl\verilog的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相连接(我是这么理解的,可能会不对)

在目录pcores\my_calc_v1_v1_00_a\hdl\vhdl下对文件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\n\r");
38     printf("Please input the first operator:\n\r");
39     scanf("%d", &ADD1);
40     printf("Please second the first operator:\n\r");
41     scanf("%d", &ADD2);
42     if(SW == 0x01)
43     {
44         printf("The result of ADD1 + ADD2 = %d\n\r", SUM);
45     }
46     else if(SW == 0x02)
47     {
48         printf("The result of ADD1 - ADD2 = %d\n\r", SUM);
49     }
50     LED = SUM;
51 
52     return 0;
53 }
View Code

 

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

 

 

 

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

  

posted @ 2013-07-19 21:55  菜鸟也搞FPGA  阅读(1160)  评论(2编辑  收藏  举报