zoukankan      html  css  js  c++  java
  • Learn ZYNC (5)

    今天为了熟悉axiLite的自定义ip核设计,

    把LED和SW的往AXI总线输入输出定义在一个ip核中,

    BD设计如下:

    image

    ip核顶层文件(增加了LED_Out和SW_In的定义)mygpio_v1.0.v:

    	module mygpio_v1_0 #
    	(
    		// Users to add parameters here
    
    		// User parameters ends
    		// Do not modify the parameters beyond this line
    
    
    		// Parameters of Axi Slave Bus Interface S00_AXI
    		parameter integer C_S00_AXI_DATA_WIDTH	= 32,
    		parameter integer C_S00_AXI_ADDR_WIDTH	= 4
    	)
    	(
    		// Users to add ports here
    //*****************my code***********************************
            input wire [7:0] SW_In,
            output wire [7:0] LED_Out,
    		// User ports ends
    		// Do not modify the ports beyond this line
    
    
    		// Ports of Axi Slave Bus Interface S00_AXI
    		input wire  s00_axi_aclk,
    		input wire  s00_axi_aresetn,
    		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_awaddr,
    		input wire [2 : 0] s00_axi_awprot,
    		input wire  s00_axi_awvalid,
    		output wire  s00_axi_awready,
    		input wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_wdata,
    		input wire [(C_S00_AXI_DATA_WIDTH/8)-1 : 0] s00_axi_wstrb,
    		input wire  s00_axi_wvalid,
    		output wire  s00_axi_wready,
    		output wire [1 : 0] s00_axi_bresp,
    		output wire  s00_axi_bvalid,
    		input wire  s00_axi_bready,
    		input wire [C_S00_AXI_ADDR_WIDTH-1 : 0] s00_axi_araddr,
    		input wire [2 : 0] s00_axi_arprot,
    		input wire  s00_axi_arvalid,
    		output wire  s00_axi_arready,
    		output wire [C_S00_AXI_DATA_WIDTH-1 : 0] s00_axi_rdata,
    		output wire [1 : 0] s00_axi_rresp,
    		output wire  s00_axi_rvalid,
    		input wire  s00_axi_rready
    	);
    // Instantiation of Axi Bus Interface S00_AXI
    	mygpio_v1_0_S00_AXI # ( 
    		.C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH),
    		.C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
    	) mygpio_v1_0_S00_AXI_inst (
    //*****************************my code***************************
    	    .SW_In(SW_In),
    	    .LED_Out(LED_Out),
    		.S_AXI_ACLK(s00_axi_aclk),
    		.S_AXI_ARESETN(s00_axi_aresetn),
    		.S_AXI_AWADDR(s00_axi_awaddr),
    		.S_AXI_AWPROT(s00_axi_awprot),
    		.S_AXI_AWVALID(s00_axi_awvalid),
    		.S_AXI_AWREADY(s00_axi_awready),
    		.S_AXI_WDATA(s00_axi_wdata),
    		.S_AXI_WSTRB(s00_axi_wstrb),
    		.S_AXI_WVALID(s00_axi_wvalid),
    		.S_AXI_WREADY(s00_axi_wready),
    		.S_AXI_BRESP(s00_axi_bresp),
    		.S_AXI_BVALID(s00_axi_bvalid),
    		.S_AXI_BREADY(s00_axi_bready),
    		.S_AXI_ARADDR(s00_axi_araddr),
    		.S_AXI_ARPROT(s00_axi_arprot),
    		.S_AXI_ARVALID(s00_axi_arvalid),
    		.S_AXI_ARREADY(s00_axi_arready),
    		.S_AXI_RDATA(s00_axi_rdata),
    		.S_AXI_RRESP(s00_axi_rresp),
    		.S_AXI_RVALID(s00_axi_rvalid),
    		.S_AXI_RREADY(s00_axi_rready)
    	);
    
    	// Add user logic here
    
    	// User logic ends
    
    	endmodule

    ip核实现文件mygpio_v1_0_S00_AXI.v:

    	module mygpio_v1_0_S00_AXI #
    	(
    		// Users to add parameters here
    
    		// User parameters ends
    		// Do not modify the parameters beyond this line
    
    		// Width of S_AXI data bus
    		parameter integer C_S_AXI_DATA_WIDTH	= 32,
    		// Width of S_AXI address bus
    		parameter integer C_S_AXI_ADDR_WIDTH	= 4
    	)
    	(
    		// Users to add ports here
    //*********************my code ****************************************
            input wire [7:0] SW_In,
            output wire [7:0] LED_Out,
    		// User ports ends
    		// Do not modify the ports beyond this line
    
    		// Global Clock Signal
    		input wire  S_AXI_ACLK,
    		// Global Reset Signal. This Signal is Active LOW
    		input wire  S_AXI_ARESETN,
    		// Write address (issued by master, acceped by Slave)
    		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
    		// Write channel Protection type. This signal indicates the
        // privilege and security level of the transaction, and whether
        // the transaction is a data access or an instruction access.
    		input wire [2 : 0] S_AXI_AWPROT,
    		// Write address valid. This signal indicates that the master signaling
        // valid write address and control information.
    		input wire  S_AXI_AWVALID,
    		// Write address ready. This signal indicates that the slave is ready
        // to accept an address and associated control signals.
    		output wire  S_AXI_AWREADY,
    		// Write data (issued by master, acceped by Slave) 
    		input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
    		// Write strobes. This signal indicates which byte lanes hold
        // valid data. There is one write strobe bit for each eight
        // bits of the write data bus.    
    		input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
    		// Write valid. This signal indicates that valid write
        // data and strobes are available.
    		input wire  S_AXI_WVALID,
    		// Write ready. This signal indicates that the slave
        // can accept the write data.
    		output wire  S_AXI_WREADY,
    		// Write response. This signal indicates the status
        // of the write transaction.
    		output wire [1 : 0] S_AXI_BRESP,
    		// Write response valid. This signal indicates that the channel
        // is signaling a valid write response.
    		output wire  S_AXI_BVALID,
    		// Response ready. This signal indicates that the master
        // can accept a write response.
    		input wire  S_AXI_BREADY,
    		// Read address (issued by master, acceped by Slave)
    		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
    		// Protection type. This signal indicates the privilege
        // and security level of the transaction, and whether the
        // transaction is a data access or an instruction access.
    		input wire [2 : 0] S_AXI_ARPROT,
    		// Read address valid. This signal indicates that the channel
        // is signaling valid read address and control information.
    		input wire  S_AXI_ARVALID,
    		// Read address ready. This signal indicates that the slave is
        // ready to accept an address and associated control signals.
    		output wire  S_AXI_ARREADY,
    		// Read data (issued by slave)
    		output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
    		// Read response. This signal indicates the status of the
        // read transfer.
    		output wire [1 : 0] S_AXI_RRESP,
    		// Read valid. This signal indicates that the channel is
        // signaling the required read data.
    		output wire  S_AXI_RVALID,
    		// Read ready. This signal indicates that the master can
        // accept the read data and response information.
    		input wire  S_AXI_RREADY
    	);
    
    	// AXI4LITE signals
    	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr;
    	reg  	axi_awready;
    	reg  	axi_wready;
    	reg [1 : 0] 	axi_bresp;
    	reg  	axi_bvalid;
    	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;
    	reg  	axi_arready;
    	reg [C_S_AXI_DATA_WIDTH-1 : 0] 	axi_rdata;
    	reg [1 : 0] 	axi_rresp;
    	reg  	axi_rvalid;
    
    	// Example-specific design signals
    	// local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH
    	// ADDR_LSB is used for addressing 32/64 bit registers/memories
    	// ADDR_LSB = 2 for 32 bits (n downto 2)
    	// ADDR_LSB = 3 for 64 bits (n downto 3)
    	localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;
    	localparam integer OPT_MEM_ADDR_BITS = 1;
    	//----------------------------------------------
    	//-- Signals for user logic register space example
    //*********************my code ****************************************
        wire [31:0] reg0_wire;
        reg [31:0] SW_Reg0;
        reg [31:0] SW_Reg1;
    	//------------------------------------------------
    	//-- Number of Slave Registers 4
    	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg0;
    	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg1;
    	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg2;
    	reg [C_S_AXI_DATA_WIDTH-1:0]	slv_reg3;
    	wire	 slv_reg_rden;
    	wire	 slv_reg_wren;
    	reg [C_S_AXI_DATA_WIDTH-1:0]	 reg_data_out;
    	integer	 byte_index;
    
    	// I/O Connections assignments
    
    	assign S_AXI_AWREADY	= axi_awready;
    	assign S_AXI_WREADY	= axi_wready;
    	assign S_AXI_BRESP	= axi_bresp;
    	assign S_AXI_BVALID	= axi_bvalid;
    	assign S_AXI_ARREADY	= axi_arready;
    	assign S_AXI_RDATA	= axi_rdata;
    	assign S_AXI_RRESP	= axi_rresp;
    	assign S_AXI_RVALID	= axi_rvalid;
    	// Implement axi_awready generation
    	// axi_awready is asserted for one S_AXI_ACLK clock cycle when both
    	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is
    	// de-asserted when reset is low.
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_awready <= 1'b0;
    	    end 
    	  else
    	    begin    
    	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)
    	        begin
    	          // slave is ready to accept write address when 
    	          // there is a valid write address and write data
    	          // on the write address and data bus. This design 
    	          // expects no outstanding transactions. 
    	          axi_awready <= 1'b1;
    	        end
    	      else           
    	        begin
    	          axi_awready <= 1'b0;
    	        end
    	    end 
    	end       
    
    	// Implement axi_awaddr latching
    	// This process is used to latch the address when both 
    	// S_AXI_AWVALID and S_AXI_WVALID are valid. 
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_awaddr <= 0;
    	    end 
    	  else
    	    begin    
    	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID)
    	        begin
    	          // Write Address latching 
    	          axi_awaddr <= S_AXI_AWADDR;
    	        end
    	    end 
    	end       
    
    	// Implement axi_wready generation
    	// axi_wready is asserted for one S_AXI_ACLK clock cycle when both
    	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is 
    	// de-asserted when reset is low. 
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_wready <= 1'b0;
    	    end 
    	  else
    	    begin    
    	      if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID)
    	        begin
    	          // slave is ready to accept write data when 
    	          // there is a valid write address and write data
    	          // on the write address and data bus. This design 
    	          // expects no outstanding transactions. 
    	          axi_wready <= 1'b1;
    	        end
    	      else
    	        begin
    	          axi_wready <= 1'b0;
    	        end
    	    end 
    	end       
    
    	// Implement memory mapped register select and write logic generation
    	// The write data is accepted and written to memory mapped registers when
    	// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
    	// select byte enables of slave registers while writing.
    	// These registers are cleared when reset (active low) is applied.
    	// Slave register write enable is asserted when valid address and data are available
    	// and the slave is ready to accept the write address and write data.
    	assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    //	      slv_reg0 <= 0;
    	      slv_reg1 <= 0;
    	      slv_reg2 <= 0;
    	      slv_reg3 <= 0;
    	    end 
    	  else begin
    	    if (slv_reg_wren)
    	      begin
    	        case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    //*********************my modify ****************************************
    //	          2'h0:
    //	            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    //	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    	                // Respective byte enables are asserted as per write strobes 
    	                // Slave register 0
    //	                slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    //	              end  
    	          2'h1:
    	            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    	                // Respective byte enables are asserted as per write strobes 
    	                // Slave register 1
    	                slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    	              end  
    	          2'h2:
    	            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    	                // Respective byte enables are asserted as per write strobes 
    	                // Slave register 2
    	                slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    	              end  
    	          2'h3:
    	            for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )
    	              if ( S_AXI_WSTRB[byte_index] == 1 ) begin
    	                // Respective byte enables are asserted as per write strobes 
    	                // Slave register 3
    	                slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
    	              end  
    	          default : begin
    	                      slv_reg0 <= slv_reg0;
    	                      slv_reg1 <= slv_reg1;
    	                      slv_reg2 <= slv_reg2;
    	                      slv_reg3 <= slv_reg3;
    	                    end
    	        endcase
    	      end
    	  end
    	end    
    
    	// Implement write response logic generation
    	// The write response and response valid signals are asserted by the slave 
    	// when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.  
    	// This marks the acceptance of address and indicates the status of 
    	// write transaction.
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_bvalid  <= 0;
    	      axi_bresp   <= 2'b0;
    	    end 
    	  else
    	    begin    
    	      if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
    	        begin
    	          // indicates a valid write response is available
    	          axi_bvalid <= 1'b1;
    	          axi_bresp  <= 2'b0; // 'OKAY' response 
    	        end                   // work error responses in future
    	      else
    	        begin
    	          if (S_AXI_BREADY && axi_bvalid) 
    	            //check if bready is asserted while bvalid is high) 
    	            //(there is a possibility that bready is always asserted high)   
    	            begin
    	              axi_bvalid <= 1'b0; 
    	            end  
    	        end
    	    end
    	end   
    
    	// Implement axi_arready generation
    	// axi_arready is asserted for one S_AXI_ACLK clock cycle when
    	// S_AXI_ARVALID is asserted. axi_awready is 
    	// de-asserted when reset (active low) is asserted. 
    	// The read address is also latched when S_AXI_ARVALID is 
    	// asserted. axi_araddr is reset to zero on reset assertion.
    
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_arready <= 1'b0;
    	      axi_araddr  <= 32'b0;
    	    end 
    	  else
    	    begin    
    	      if (~axi_arready && S_AXI_ARVALID)
    	        begin
    	          // indicates that the slave has acceped the valid read address
    	          axi_arready <= 1'b1;
    	          // Read address latching
    	          axi_araddr  <= S_AXI_ARADDR;
    	        end
    	      else
    	        begin
    	          axi_arready <= 1'b0;
    	        end
    	    end 
    	end       
    
    	// Implement axi_arvalid generation
    	// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both 
    	// S_AXI_ARVALID and axi_arready are asserted. The slave registers 
    	// data are available on the axi_rdata bus at this instance. The 
    	// assertion of axi_rvalid marks the validity of read data on the 
    	// bus and axi_rresp indicates the status of read transaction.axi_rvalid 
    	// is deasserted on reset (active low). axi_rresp and axi_rdata are 
    	// cleared to zero on reset (active low).  
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_rvalid <= 0;
    	      axi_rresp  <= 0;
    	    end 
    	  else
    	    begin    
    	      if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)
    	        begin
    	          // Valid read data is available at the read data bus
    	          axi_rvalid <= 1'b1;
    	          axi_rresp  <= 2'b0; // 'OKAY' response
    	        end   
    	      else if (axi_rvalid && S_AXI_RREADY)
    	        begin
    	          // Read data is accepted by the master
    	          axi_rvalid <= 1'b0;
    	        end                
    	    end
    	end    
    
    	// Implement memory mapped register select and read logic generation
    	// Slave register read enable is asserted when valid address is available
    	// and the slave is ready to accept the read address.
    	assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
    	always @(*)
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      reg_data_out <= 0;
    	    end 
    	  else
    	    begin    
    	      // Address decoding for reading registers
    	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    	        2'h0   : reg_data_out <= slv_reg0;
    	        2'h1   : reg_data_out <= slv_reg1;
    	        2'h2   : reg_data_out <= slv_reg2;
    	        2'h3   : reg_data_out <= slv_reg3;
    	        default : reg_data_out <= 0;
    	      endcase
    	    end   
    	end
    
    	// Output register or memory read data
    	always @( posedge S_AXI_ACLK )
    	begin
    	  if ( S_AXI_ARESETN == 1'b0 )
    	    begin
    	      axi_rdata  <= 0;
    	    end 
    	  else
    	    begin    
    	      // When there is a valid read address (S_AXI_ARVALID) with 
    	      // acceptance of read address by the slave (axi_arready), 
    	      // output the read dada 
    	      if (slv_reg_rden)
    	        begin
    	          axi_rdata <= reg_data_out;     // register read data
    	        end   
    	    end
    	end    
    //*********************my code ****************************************
    	// Add user logic here
        led_ul U1(
            .S_AXI_ACLK(S_AXI_ACLK),
            .slv_reg_wren(slv_reg_wren),
            .axi_awaddr(axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]),
            .S_AXI_WDATA(S_AXI_WDATA),
            .aresetn(S_AXI_ARESETN),
            .LED(LED_Out)
        );
        
        assign reg0_wire = slv_reg0;
        
        sw_ul U2(
           .S_AXI_ACLK(S_AXI_ACLK),
           .slv_reg_rden(slv_reg_rden),
           .axi_araddr(axi_araddr[3:2]),
           .aresetn(S_AXI_ARESETN),
           .SW_In(SW_In),
           .rdata(reg0_wire)
       );
        
    //    always @(slv_reg_rden or slv_reg0 or slv_reg1)
    //    begin
    //        case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
    //            2'h0   : reg_data_out <= slv_reg0;
    //            2'h1   : reg_data_out <= slv_reg1;
    //            default:reg_data_out <= 0;
    //        endcase
    //    end
    
    
    	// User logic ends
    
    	endmodule

    在这个文件中,我注释了AXI总线在写数据时对于slv_reg0写的定义,因为在我们的用户代码中使用一条reg0_wire将slv_reg0连到了sw_ul子核中,并且在子核中对reg0定义写操作(即将sw的状态输出到slv_reg0),然后另一段代码会将其放入reg_data_out,最后在slv_reg_rden线的输出为1时,它会进一步被送往axi_rdata,并通过数据总线S_AXI_RDATA输出。

    ip核内包含的子文件sw_ul.v

    module sw_ul(
        input S_AXI_ACLK,
        input slv_reg_rden,
        input [1:0] axi_araddr,
        input aresetn,
        input [7:0] SW_In,
        output reg [31:0] rdata
        );
        reg [31:0] SW_Reg0;
        reg [31:0] SW_Reg1;
        always @(posedge S_AXI_ACLK)
        begin
            if ( aresetn == 1'b0 )
            begin
                SW_Reg0 <= 0;
                SW_Reg1 <= 0;
                rdata <= 0;
            end
            else
            begin
                if(slv_reg_rden)
                begin
                    if(axi_araddr == 2'h0)
                    begin
                        SW_Reg0 <= SW_In;
                        SW_Reg1 <= SW_Reg0;
                        rdata[7:0] <= SW_Reg1[7:0];
                    end
                end
    
            end
        end
    endmodule

    ip核内包含的子文件led_ul.v

    module led_ul(
        input S_AXI_ACLK,
        input slv_reg_wren,
        input [1:0] axi_awaddr,
        input [31:0] S_AXI_WDATA,
        input aresetn,
        output reg [7:0] LED
        );
          
      always @( posedge S_AXI_ACLK )
        begin
                if( aresetn == 1'b0 )
                    begin
                        LED <= 8'b10011001;
                    end
                else
                    begin
                    if (slv_reg_wren && (axi_awaddr == 2'h1))
                    begin
                        LED <= S_AXI_WDATA[7:0]; 
                    end
    //                    LED <= 8'b11111111;
    //                    if (slv_reg_wren)
    //                    begin
    //                        case(axi_awaddr)
    //                            2'h1:
    //                            begin
    //                                LED <= S_AXI_WDATA[7:0];
    //                                  LED <= 8'b00000001;
    //                            end
    //                            2'h0:
    //                            begin
    //                                LED <= 8'b00000000;
    //                            end
    //                            default:
    //                            begin
    //                                LED <= 8'b11111111;
    //                            end
    //                         endcase
    //                     end
                    end
            end
    
    endmodule

    EDK中standalone程序:

    #include <stdio.h>
    #include "xparameters.h"
    #include "xil_io.h"
    #include "mygpio.h"
    #include "platform.h"
    
    
    
    int main()
    {
    	u32 inData = 0;
        init_platform();
        while(1)
        {
        	inData = Xil_In32(XPAR_MYGPIO_0_S00_AXI_BASEADDR);
        	xil_printf("SW0 data is 0x%x
    
    ",inData);
        	Xil_Out32(XPAR_MYGPIO_0_S00_AXI_BASEADDR+MYGPIO_S00_AXI_SLV_REG1_OFFSET,inData);
        	//inData = Xil_In32(XPAR_MYGPIO_0_S00_AXI_BASEADDR+1);
        	//xil_printf("SW1 data is 0x%x
    
    ",inData);
        	//MYGPIO_mWriteReg(XPAR_MYGPIO_0_S00_AXI_BASEADDR,0,inData);
        	//sleep(1);
        }
        return 0;
    }
    刚开始一直都测试不成功,一直得不到ip核中axi_araddr等于1的状态(即写第一个slv_reg1),后来看到了MYGPIO_S00_AXI_SLV_REG1_OFFSET=4,寄存器设置时设置的是32b,就是4Byte,灯只用到了其中最后的8bit,地址从0x43C00000开始,编号为1的寄存器地址应该是0x43C00004(存储器字长=1B)。(我们的ip核中,reg0用来存放sw读出的数据,而reg1用来从axi总线给led灯传送数据)。

    参考文献:懒兔子教程

  • 相关阅读:
    hdu 4339 Query 一道挺好的树状数组题(树状数组+二分思想)
    hdu 1133 Buy the Ticket(递推+精度精算)
    hdu 1267 下沙的沙子有几粒?(二维递推题)
    hdu 3397 Sequence operation(线段树的延迟标记)
    hdu 1258(dfs)
    hdu 3911 Black And White(线段树的延迟标记法)
    hdu 4148 Length of S(n) (坑爹的规律题)
    hdu 1016(一道经典的dfs)
    如何建立一棵哈夫曼树并且输出压缩码
    Codeforces Round #588 (Div. 2) E. Kamil and Making a Stream(DFS)
  • 原文地址:https://www.cnblogs.com/shenerguang/p/3790930.html
Copyright © 2011-2022 走看看