Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите новичку
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
maximus
Есть проект собранный в XPS на базе spartan6 и интерфейса AXI выглядит так. Нужно с помощью GPIO вывести на пин gpio 1КГц.

MHS файл
Код
PARAMETER VERSION = 2.1.0


PORT CLK_IN = net_CLK_IN, DIR = I, SIGIS = CLK
PORT axi_emc_0_Mem_A_pin = axi_emc_0_Mem_A, DIR = O, VEC = [31:0]
PORT axi_emc_0_Mem_CEN_pin = axi_emc_0_Mem_CEN, DIR = O
PORT axi_emc_0_Mem_OEN_pin = axi_emc_0_Mem_OEN, DIR = O
PORT axi_emc_0_Mem_WEN_pin = axi_emc_0_Mem_WEN, DIR = O
PORT axi_emc_0_Mem_ADV_LDN_pin = axi_emc_0_Mem_ADV_LDN, DIR = O
PORT axi_emc_0_Mem_DQ_pin = axi_emc_0_Mem_DQ, DIR = IO, VEC = [31:0]
PORT axi_gpio_0_GPIO_IO_pin = axi_gpio_0_GPIO_IO, DIR = IO, VEC = [31:0]


BEGIN clock_generator
PARAMETER INSTANCE = clock_generator_0
PARAMETER HW_VER = 4.03.a
PARAMETER C_CLKIN_FREQ = 100000000
PARAMETER C_CLKOUT0_FREQ = 100000000
PARAMETER C_CLKOUT0_GROUP = PLL0
PORT LOCKED = clock_generator_0_LOCKED_0
PORT CLKOUT0 = clock_generator_0_CLKOUT0
PORT RST = net_gnd
PORT CLKIN = net_CLK_IN
END

BEGIN proc_sys_reset
PARAMETER INSTANCE = reset_0
PARAMETER HW_VER = 3.00.a
PORT Dcm_locked = clock_generator_0_LOCKED_0
PORT MB_Debug_Sys_Rst = debug_module_0_Debug_SYS_Rst
PORT Ext_Reset_In = net_gnd
PORT Slowest_sync_clk = clock_generator_0_CLKOUT0
PORT MB_Reset = reset_0_MB_Reset
PORT Bus_Struct_Reset = reset_0_Bus_Struct_Reset
END

BEGIN microblaze
PARAMETER INSTANCE = microblaze_0
PARAMETER HW_VER = 8.50.c
PARAMETER C_USE_BARREL = 1
PARAMETER C_USE_ICACHE = 0
PARAMETER C_USE_DCACHE = 0
PARAMETER C_INTERCONNECT = 2
PARAMETER C_DEBUG_ENABLED = 1
BUS_INTERFACE DEBUG = debug_module_0_MBDEBUG_0
BUS_INTERFACE M_AXI_DP = axi_interconnect_0
BUS_INTERFACE M_AXI_IP = axi_interconnect_0
BUS_INTERFACE INTERRUPT = axi_intc_0_INTERRUPT
BUS_INTERFACE DLMB = lmb_v10_0
BUS_INTERFACE ILMB = lmb_v10_1
PORT MB_RESET = reset_0_MB_Reset
END

BEGIN mdm
PARAMETER INSTANCE = debug_module_0
PARAMETER HW_VER = 2.10.a
PARAMETER C_INTERCONNECT = 2
PARAMETER C_INTERCONNECT_S_AXI_MASTERS = microblaze_0.M_AXI_DP
PARAMETER C_BASEADDR = 0x04002000
PARAMETER C_HIGHADDR = 0x04002FFF
BUS_INTERFACE MBDEBUG_0 = debug_module_0_MBDEBUG_0
BUS_INTERFACE S_AXI = axi_interconnect_0
PORT Debug_SYS_Rst = debug_module_0_Debug_SYS_Rst
PORT S_AXI_ACLK = clock_generator_0_CLKOUT0
PORT Interrupt = debug_module_0_Interrupt
END

BEGIN axi_interconnect
PARAMETER INSTANCE = axi_interconnect_0
PARAMETER HW_VER = 1.06.a
PORT INTERCONNECT_ACLK = clock_generator_0_CLKOUT0
PORT INTERCONNECT_ARESETN = reset_0_Bus_Struct_Reset
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = bram_cntlr_0
PARAMETER HW_VER = 3.10.c
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0000ffff
BUS_INTERFACE SLMB = lmb_v10_1
BUS_INTERFACE BRAM_PORT = bram_cntlr_0_BRAM_PORT
END

BEGIN lmb_bram_if_cntlr
PARAMETER INSTANCE = bram_cntlr_1
PARAMETER HW_VER = 3.10.c
PARAMETER C_BASEADDR = 0x00000000
PARAMETER C_HIGHADDR = 0x0000ffff
BUS_INTERFACE SLMB = lmb_v10_0
BUS_INTERFACE BRAM_PORT = bram_cntlr_1_BRAM_PORT
END

BEGIN lmb_v10
PARAMETER INSTANCE = lmb_v10_0
PARAMETER HW_VER = 2.00.b
PORT LMB_Clk = clock_generator_0_CLKOUT0
PORT SYS_Rst = reset_0_MB_Reset
END

BEGIN lmb_v10
PARAMETER INSTANCE = lmb_v10_1
PARAMETER HW_VER = 2.00.b
PORT LMB_Clk = clock_generator_0_CLKOUT0
PORT SYS_Rst = reset_0_MB_Reset
END

BEGIN bram_block
PARAMETER INSTANCE = bram_block_0
PARAMETER HW_VER = 1.00.a
BUS_INTERFACE PORTA = bram_cntlr_0_BRAM_PORT
BUS_INTERFACE PORTB = bram_cntlr_1_BRAM_PORT
END

BEGIN axi_intc
PARAMETER INSTANCE = axi_intc_0
PARAMETER HW_VER = 1.04.a
PARAMETER C_INTERCONNECT_S_AXI_MASTERS = microblaze_0.M_AXI_DP
PARAMETER C_BASEADDR = 0x04003000
PARAMETER C_HIGHADDR = 0x04003FFF
BUS_INTERFACE S_AXI = axi_interconnect_0
BUS_INTERFACE INTERRUPT = axi_intc_0_INTERRUPT
PORT S_AXI_ACLK = clock_generator_0_CLKOUT0
PORT Intr = debug_module_0_Interrupt & axi_timer_0_Interrupt
END

BEGIN axi_emc
PARAMETER INSTANCE = axi_emc_0
PARAMETER HW_VER = 1.03.b
PARAMETER C_INTERCONNECT_S_AXI_MEM_MASTERS = microblaze_0.M_AXI_DP
PARAMETER C_S_AXI_MEM_PROTOCOL = axi4lite
PARAMETER C_S_AXI_MEM_ID_WIDTH = 1
PARAMETER C_MAX_MEM_WIDTH = 32
PARAMETER C_S_AXI_MEM0_BASEADDR = 0x05000000
PARAMETER C_S_AXI_MEM0_HIGHADDR = 0x057FFFFF
BUS_INTERFACE S_AXI_MEM = axi_interconnect_0
PORT RdClk = clock_generator_0_CLKOUT0
PORT S_AXI_ACLK = clock_generator_0_CLKOUT0
PORT Mem_A = axi_emc_0_Mem_A
PORT Mem_CEN = axi_emc_0_Mem_CEN
PORT Mem_OEN = axi_emc_0_Mem_OEN
PORT Mem_WEN = axi_emc_0_Mem_WEN
PORT Mem_ADV_LDN = axi_emc_0_Mem_ADV_LDN
PORT Mem_DQ = axi_emc_0_Mem_DQ
END

BEGIN axi_gpio
PARAMETER INSTANCE = axi_gpio_0
PARAMETER HW_VER = 1.01.b
PARAMETER C_INTERCONNECT_S_AXI_MASTERS = microblaze_0.M_AXI_DP
PARAMETER C_BASEADDR = 0x04000000
PARAMETER C_HIGHADDR = 0x04000FFF
BUS_INTERFACE S_AXI = axi_interconnect_0
PORT S_AXI_ACLK = clock_generator_0_CLKOUT0
PORT GPIO_IO = axi_gpio_0_GPIO_IO
END

BEGIN axi_timer
PARAMETER INSTANCE = axi_timer_0
PARAMETER HW_VER = 1.03.a
PARAMETER C_INTERCONNECT_S_AXI_MASTERS = microblaze_0.M_AXI_DP
PARAMETER C_BASEADDR = 0x04001000
PARAMETER C_HIGHADDR = 0x04001FFF
BUS_INTERFACE S_AXI = axi_interconnect_0
PORT S_AXI_ACLK = clock_generator_0_CLKOUT0
PORT Interrupt = axi_timer_0_Interrupt
END



И соответственно код в SDK

Код
#include <stdio.h>
#include "xparameters.h"
#include "xil_cache.h"
#include "xintc.h"
#include "xintc_l.h"
#include "intc_header.h"
#include "xbasic_types.h"
#include "xgpio.h"
#include "xgpio_l.h"
#include "gpio_header.h"
#include "xtmrctr.h"
#include "xtmrctr_l.h"
#include "tmrctr_header.h"
#include "tmrctr_intr_header.h"
#include <xuartlite.h>
#include <xuartlite_l.h>

// Global variables: count is the count displayed using the
// LEDs, and timer_count is the interrupt frequency.

    unsigned int count = 1; // default count
    unsigned int timer_count = 1; // default timer_count
    XGpio pin;
    // uartlite interrupt service routine

    void uart_int_handler(void *baseaddr_p)
    {
        char c;
        // till uart FIFOs are empty
        while (!XUartLite_IsReceiveEmpty(XPAR_DEBUG_MODULE_0_BASEADDR))
        {
            // read a character
            c = XUartLite_RecvByte(XPAR_DEBUG_MODULE_0_BASEADDR);
            // if the character is between "0" and "9"
                if ((c>47) && (c<58))
                    {
                        timer_count = c-48;
                        // print character on hyperterminal (STDOUT)
                        putnum(timer_count);
                        // Set timer with new value of timer_count
                        XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR, 0, (timer_count*timer_count+1) * 1000);
                    }
        }
    }

    // timer interrupt service routine
    void timer_int_handler(void * baseaddr_p)
    {
        unsigned int csr;
        unsigned int gpio_data;
        // Read timer 0 CSR to see if it raised the interrupt
        csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0);
            if (csr & XTC_CSR_INT_OCCURED_MASK)
            {
                // Increment the count
                if ((count <<= 1) > 8)
                {
                    count = 1;
                }
        // Write value to gpio. 0 means light up, hence count is negated
        gpio_data = ~count;
        XGpio_WriteReg(XPAR_AXI_GPIO_0_BASEADDR,0, gpio_data);
        // Clear the timer interrupt

        XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, csr);
            }
    }

int main()
{

   Xil_ICacheEnable();
   Xil_DCacheEnable();

  // print("---Entering main---\n\r");

      // Enable microblaze interrupts
      microblaze_enable_interrupts();
      // Connect uart interrupt handler that will be called when an interrupt for the uart occurs

      XIntc_RegisterHandler(XPAR_AXI_INTC_0_BASEADDR, XPAR_AXI_INTC_0_DEBUG_MODULE_0_INTERRUPT_INTR , (XInterruptHandler)uart_int_handler, (void *)XPAR_DEBUG_MODULE_0_BASEADDR);
      // Start the interrupt controller
      XIntc_MasterEnable(XPAR_INTC_SINGLE_BASEADDR);
      // Set the gpio as output on high 3 bits (LEDs)
      XGpio_SetDataDirection(&pin,1, 0x00);
      // set the number of cycles the timer counts before interrupting
      XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR, 0, (timer_count*timer_count+1) * 1000);
      // reset the timers, and clear interrupts
      XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK );
      // Enable timer and uart interrupts in the interrupt controller
      XIntc_EnableIntr(XPAR_AXI_INTC_0_BASEADDR, XPAR_AXI_TIMER_0_INTERRUPT_MASK| XPAR_DEBUG_MODULE_0_INTERRUPT_MASK);
      // Enable Uartlite interrupt
      XUartLite_EnableIntr(XPAR_DEBUG_MODULE_0_BASEADDR);
      // start the timers
      XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0,XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK);
      // Wait for interrupts to occur
      while (1)
          {
              XGpio_DiscreteWrite(&pin,1,0);
          };

   print("---Exiting main---\n\r");

   Xil_DCacheDisable();
   Xil_ICacheDisable();

   return 0;
}

Возникает ошибка при debug, связанная с таймаутами и прерыванием.
Помогите разобраться где что делаю не так?
Олег Гаврильченко
Подробнее опишите, что за ошибки, какие сообщения об ошибках выводятся.
maximus
при debug такие ошибки
Error: MicroBlaze Pipeline Stalled on a Blocking Instruction or Invalid Bus Access
Stalled PC: 0x00000854
Try Resetting the Processor to Continue..Processor is stalled at address 0x848. UNABLE to STOP MicroBlaze

Error Target request failed: Target is not responding (timed out).

error while launching application in sdk
maximus
Все разобрался, были ошибки в XPS, с адресами и не поставил вторую частоту в микроблейзе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.