MicroBlaze User Peripheral with 2 interrupts

C

Ciaran

Guest
Hi all,

I have designed a user peripheral to connect via an OPB Bus to a
MicroBlaze processor. Also, an interrupt controller is connected to
the OPB Bus. My user peripheral generates two interrupts, which
connect to the interrupt controller. The interrupt controller irq then
connects to the MicroBlaze interrupt input.

My problem arises when I run libgen. It returns an error
ERROR:MDT - system.mss:42 - Property interrupt_handler is not found
I understand that this happens when I use the generic driver for the
user peripheral. But how do I define a driver that has 2 interrupt
outputs? What would the .mdd file look like? I can do this for one
that drives a single interrupt output

e.g.

:
:
BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 1, permit = none;
PARAM name = int_handler, default = XIntc_DefaultHandler, desc =
"Name of Interrupt Handler", type = string;
PARAM name = int_port, default = Interrupt, desc = "Interrupt pin
associated with the interrupt handler", permit = none;
END ARRAY
:
:

is in the .mdd file for the peripheral that drives a single interrupt.

Thanks for your help
Ciarán
 
This is more appropriate in comp.arch.fpga.

In case of multiple interrupt sources, the MDD file
should have entries for each of the interrupt port
in the interrupt handler array. Look at the
$XILINX_EDK/sw/XilinxProcessorIPLib/drivers/wdttb_v1_00_b/data/wdttb_v2_1_0.mdd
file for an example. Here is the snippet from the
MDD file :

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((XIntc_DefaultHandler, TimebaseInterrupt),
(XIntc_DefaultHandler, WDT_Interrupt));
PARAM name = int_handler, desc = "Name of Interrupt Handler", type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the interrupt
handler", permit = none;
END ARRAY

The default property of the interrupt_handler array
defines handlers for the 2 interrupt sources of the IP
opb_timebase_wdt.


Ciaran wrote:
Hi all,

I have designed a user peripheral to connect via an OPB Bus to a
MicroBlaze processor. Also, an interrupt controller is connected to
the OPB Bus. My user peripheral generates two interrupts, which
connect to the interrupt controller. The interrupt controller irq then
connects to the MicroBlaze interrupt input.

My problem arises when I run libgen. It returns an error
ERROR:MDT - system.mss:42 - Property interrupt_handler is not found
I understand that this happens when I use the generic driver for the
user peripheral. But how do I define a driver that has 2 interrupt
outputs? What would the .mdd file look like? I can do this for one
that drives a single interrupt output

e.g.

:
:
BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 1, permit = none;
PARAM name = int_handler, default = XIntc_DefaultHandler, desc > "Name of Interrupt Handler", type = string;
PARAM name = int_port, default = Interrupt, desc = "Interrupt pin
associated with the interrupt handler", permit = none;
END ARRAY
:
:

is in the .mdd file for the peripheral that drives a single interrupt.

Thanks for your help
Ciarán

--
/ 7\'7 Paulo Dutra (paulo.dutra@xilinx.com)
\ \ ` Xilinx hotline@xilinx.com
/ / 2100 Logic Drive http://www.xilinx.com
\_\/.\ San Jose, California 95124-3450 USA
 
Thanks Paulo.

I did what you said. My .mdd file looks like

OPTION psf_version = 2.1;

BEGIN driver rpa
PARAM name = level, desc = "Driver Level", type = int, default = 0,
range = (0, 1);

BEGIN BLOCK, dep = (level = 0)
OPTION depends = (common_v1_00_a);

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((XIntc_DefaultHandler, interruptA),
(XIntc_DefaultHandler, interruptB));
PARAM name = int_handler, desc = "Name of Interrupt Handler",
type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the
interrupt handler", permit = none;
END ARRAY
END BLOCK
END driver

In the .mss file for my project, I have the following
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = hw_inst
PARAMETER DRIVER_NAME = hw_driver
PARAMETER DRIVER_VER = 1.00.a
PARAMETER LEVEL = 0
PARAMETER INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
PARAMETER INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = myintc
PARAMETER DRIVER_NAME = intc
PARAMETER DRIVER_VER = 1.00.b
PARAMETER LEVEL = 0
END
:
:

Then I run libgen. If I look at my intc source code
(C:\project\mblaze\libsrc\intc_v1_00_b\src\xintc_lg.c) the file
contains the following:

#include "xbasic_types.h"
#include "xintc_l.h"
#include "xparameters.h"
extern void XIntc_DefaultHandler (void *);
extern void Xhw_InterruptAHandler (void *);


XIntc_VectorTableEntry
XIntc_InterruptVectorTable[XPAR_INTC_MAX_NUM_INTR_INPUTS] = {
{
XIntc_DefaultHandler,
(void *) NULL
},
{
Xhw_InterruptAHandler,
(void *) XPAR_RPA_BASEADDR
}
};
Xuint32 XIntc_AckBeforeService = XPAR_INTR_CTLR_KIND_OF_INTR;

Should there not be an entry for Xhw_InterruptBHandler, i.e. a handler
for interrupt interruptB?

Thank you,
Ciarán


Paulo Dutra <paulo@xilinx.com> wrote in message news:<400C8118.7040203@xilinx.com>...
This is more appropriate in comp.arch.fpga.

In case of multiple interrupt sources, the MDD file
should have entries for each of the interrupt port
in the interrupt handler array. Look at the
$XILINX EDK/sw/XilinxProcessorIPLib/drivers/wdttb v1 00 b/data/wdttb v2 1
0.mdd
file for an example. Here is the snippet from the
MDD file :

BEGIN ARRAY interrupt handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((XIntc DefaultHandler, TimebaseInterrupt),
(XIntc DefaultHandler, WDT Interrupt));
PARAM name = int handler, desc = "Name of Interrupt Handler", type
= string;
PARAM name = int port, desc = "Interrupt pin associated with the i
nterrupt
handler", permit = none;
END ARRAY

The default property of the interrupt handler array
defines handlers for the 2 interrupt sources of the IP
opb timebase wdt.


Ciaran wrote:
Hi all,

I have designed a user peripheral to connect via an OPB Bus to a
MicroBlaze processor. Also, an interrupt controller is connected to
the OPB Bus. My user peripheral generates two interrupts, which
connect to the interrupt controller. The interrupt controller irq then
connects to the MicroBlaze interrupt input.

My problem arises when I run libgen. It returns an error
ERROR:MDT - system.mss:42 - Property interrupt handler is not found
I understand that this happens when I use the generic driver for the
user peripheral. But how do I define a driver that has 2 interrupt
outputs? What would the .mdd file look like? I can do this for one
that drives a single interrupt output

e.g.

:
:
BEGIN ARRAY interrupt handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 1, permit = none;
PARAM name = int handler, default = XIntc DefaultHandler, desc =

"Name of Interrupt Handler", type = string;
PARAM name = int port, default = Interrupt, desc = "Interrupt p
in
associated with the interrupt handler", permit = none;
END ARRAY
:
:

is in the .mdd file for the peripheral that drives a single interrupt.

Thanks for your help
Ciar n
 
Hi Ciaran,
It looks like the port interruptB is not connected to the interrupt
controller in the MHS file. Your MHS should have an entry like the
following in the intc block :

PORT Intr = interruptA & interruptB

libgen generates the vector table for the intc based on the interrupt
ports connected to it.


Sathya


Ciaran wrote:
Thanks Paulo.

I did what you said. My .mdd file looks like

OPTION psf_version = 2.1;

BEGIN driver rpa
PARAM name = level, desc = "Driver Level", type = int, default = 0,
range = (0, 1);

BEGIN BLOCK, dep = (level = 0)
OPTION depends = (common_v1_00_a);

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((XIntc_DefaultHandler, interruptA),
(XIntc_DefaultHandler, interruptB));
PARAM name = int_handler, desc = "Name of Interrupt Handler",
type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the
interrupt handler", permit = none;
END ARRAY
END BLOCK
END driver

In the .mss file for my project, I have the following
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = hw_inst
PARAMETER DRIVER_NAME = hw_driver
PARAMETER DRIVER_VER = 1.00.a
PARAMETER LEVEL = 0
PARAMETER INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
PARAMETER INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = myintc
PARAMETER DRIVER_NAME = intc
PARAMETER DRIVER_VER = 1.00.b
PARAMETER LEVEL = 0
END
:
:

Then I run libgen. If I look at my intc source code
(C:\project\mblaze\libsrc\intc_v1_00_b\src\xintc_lg.c) the file
contains the following:

#include "xbasic_types.h"
#include "xintc_l.h"
#include "xparameters.h"
extern void XIntc_DefaultHandler (void *);
extern void Xhw_InterruptAHandler (void *);


XIntc_VectorTableEntry
XIntc_InterruptVectorTable[XPAR_INTC_MAX_NUM_INTR_INPUTS] = {
{
XIntc_DefaultHandler,
(void *) NULL
},
{
Xhw_InterruptAHandler,
(void *) XPAR_RPA_BASEADDR
}
};
Xuint32 XIntc_AckBeforeService = XPAR_INTR_CTLR_KIND_OF_INTR;

Should there not be an entry for Xhw_InterruptBHandler, i.e. a handler
for interrupt interruptB?

Thank you,
Ciarán


Paulo Dutra <paulo@xilinx.com> wrote in message news:<400C8118.7040203@xilinx.com>...

This is more appropriate in comp.arch.fpga.

In case of multiple interrupt sources, the MDD file
should have entries for each of the interrupt port
in the interrupt handler array. Look at the
$XILINX EDK/sw/XilinxProcessorIPLib/drivers/wdttb v1 00 b/data/wdttb v2 1
0.mdd
file for an example. Here is the snippet from the
MDD file :

BEGIN ARRAY interrupt handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((XIntc DefaultHandler, TimebaseInterrupt),
(XIntc DefaultHandler, WDT Interrupt));
PARAM name = int handler, desc = "Name of Interrupt Handler", type
= string;
PARAM name = int port, desc = "Interrupt pin associated with the i
nterrupt
handler", permit = none;
END ARRAY

The default property of the interrupt handler array
defines handlers for the 2 interrupt sources of the IP
opb timebase wdt.


Ciaran wrote:

Hi all,

I have designed a user peripheral to connect via an OPB Bus to a
MicroBlaze processor. Also, an interrupt controller is connected to
the OPB Bus. My user peripheral generates two interrupts, which
connect to the interrupt controller. The interrupt controller irq then
connects to the MicroBlaze interrupt input.

My problem arises when I run libgen. It returns an error
ERROR:MDT - system.mss:42 - Property interrupt handler is not found
I understand that this happens when I use the generic driver for the
user peripheral. But how do I define a driver that has 2 interrupt
outputs? What would the .mdd file look like? I can do this for one
that drives a single interrupt output

e.g.

:
:
BEGIN ARRAY interrupt handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 1, permit = none;
PARAM name = int handler, default = XIntc DefaultHandler, desc =



"Name of Interrupt Handler", type = string;
PARAM name = int port, default = Interrupt, desc = "Interrupt p

in

associated with the interrupt handler", permit = none;
END ARRAY
:
:

is in the .mdd file for the peripheral that drives a single interrupt.

Thanks for your help
Ciar n
 
Thanks for replying Sathya (and Paulo),

Bear with me here, because I just can't figure out what I am doing
wrong.
My system.mhs file is as follows

:
:
BEGIN microblaze
PARAMETER INSTANCE = mblaze
PARAMETER HW_VER = 2.00.a
PORT CLK = sys_clk
PORT INTERRUPT = mblaze_interrupt
BUS_INTERFACE DLMB = dlmb
BUS_INTERFACE ILMB = ilmb
BUS_INTERFACE DOPB = dopb
END
:
:
BEGIN opb_intc
PARAMETER INSTANCE = intr_ctlr
PARAMETER HW_VER = 1.00.c
PARAMETER C_BASEADDR = 0xFFFF8200
PARAMETER C_HIGHADDR = 0xFFFF82FF
PORT Intr = hw_interruptA & hw_interruptB
PORT Irq = mblaze_interrupt
PORT OPB_Clk = sys_clk
BUS_INTERFACE SOPB = dopb
END
:
:
BEGIN opb_hw_inst
PARAMETER INSTANCE = hw_inst
PARAMETER HW_VER = 1.03.b
PARAMETER C_BASEADDR = 0xFFFF8400
PARAMETER C_HIGHADDR = 0xFFFF85FF
PORT opb_clk = sys_clk
PORT interruptA = hw_interruptA
PORT interruptB = hw_interruptB
BUS_INTERFACE SOPB = dopb
END
:
:

My system.mss file reads as follows
:
:
BEGIN PROCESSOR
PARAMETER HW_INSTANCE = mblaze
PARAMETER DRIVER_NAME = cpu
PARAMETER DRIVER_VER = 1.00.a
PARAMETER EXECUTABLE = mblaze/code/executable.elf
PARAMETER COMPILER = mb-gcc
PARAMETER ARCHIVER = mb-ar
PARAMETER DEFAULT_INIT = XMDSTUB
PARAMETER DEBUG_PERIPHERAL = jtag
PARAMETER STDIN = rs232
PARAMETER STDOUT = rs232
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = hw_inst
PARAMETER DRIVER_NAME = hw_driver
PARAMETER DRIVER_VER = 1.00.a
PARAMETER INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
PARAMETER INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = intr_ctlr
PARAMETER DRIVER_NAME = intc
PARAMETER DRIVER_VER = 1.00.b
PARAMETER LEVEL = 0
END
:
:

These both seem to be in order to me. The interrupts generated by the
hw_inst sub_component are both connected to the intr input of the
intc, and the irq output of the intc is connected to the interrupt
input of the microblaze.

My driver files for the hw_driver are as follows
hw_driver.mdd is as follows:

### Start of file ###
BEGIN driver XRhw_driver
constant VERSION = 2.0.0 # uses SIF 2.0.0
parameter LEVEL = 0 # default level
END

BEGIN level 0
constant DEPENDS = (common_v1_00_a)
constant CONFIG_INCLUDE = xparameters, VALUES = ( C_BASEADDR )
parameter INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
parameter INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
### End of file ###

hw_driver_v2_1_0.mdd is as follows:

### Start of file ###
OPTION psf_version = 2.1;

BEGIN driver hw_driver
PARAM name = level, desc = "Driver Level", type = int, default = 0,
range = (0);

BEGIN BLOCK, dep = (level = 0)
OPTION depends = (common_v1_00_a);

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((Xhw_InterruptAHandler, interruptA),
(Xhw_InterruptBHandler, interruptB));
PARAM name = int_handler, desc = "Name of Interrupt Handler",
type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the
interrupt handler", permit = none;
END ARRAY
END BLOCK
END driver
### End of file ###

My hw_driver_v2_1_0.tcl file is:

### Start of File ###
proc generate {drv_handle} {
set level [xget_value $drv_handle "PARAMETER" "level"]
if {$level == 0} {
xdefine_include_file $drv_handle "xparameters.h" "Xhw_driver"
"NUM_INSTANCES" "C_BASEADDR" "C_HIGHADDR"
}
}
### End of file ###

It all seems in order to me. But I still get the same problems when I
run libgen, and only interruptA works when I synthesise and download
to the board.

I am using EDK 3.2.2, with Memec Insight V2MB1000 Rev. 3A board, if
that explains anything. (I have tried with EDK 6.1, but I get the same
problem)

I apologise for the amount of code posted, but I just can't figure out
what I'm doing wrong.

Thanks for all your help,
Ciaran Hughes,
National University of Ireland, Galway
 
Hi Ciaran,
Can you check if your MPD file of opb_hw_inst IP has SIGIS=INTERRUPT
subproperty on each of the ports interruptA and interruptB ?

Sathya


Ciaran wrote:
Thanks for replying Sathya (and Paulo),

Bear with me here, because I just can't figure out what I am doing
wrong.
My system.mhs file is as follows

:
:
BEGIN microblaze
PARAMETER INSTANCE = mblaze
PARAMETER HW_VER = 2.00.a
PORT CLK = sys_clk
PORT INTERRUPT = mblaze_interrupt
BUS_INTERFACE DLMB = dlmb
BUS_INTERFACE ILMB = ilmb
BUS_INTERFACE DOPB = dopb
END
:
:
BEGIN opb_intc
PARAMETER INSTANCE = intr_ctlr
PARAMETER HW_VER = 1.00.c
PARAMETER C_BASEADDR = 0xFFFF8200
PARAMETER C_HIGHADDR = 0xFFFF82FF
PORT Intr = hw_interruptA & hw_interruptB
PORT Irq = mblaze_interrupt
PORT OPB_Clk = sys_clk
BUS_INTERFACE SOPB = dopb
END
:
:
BEGIN opb_hw_inst
PARAMETER INSTANCE = hw_inst
PARAMETER HW_VER = 1.03.b
PARAMETER C_BASEADDR = 0xFFFF8400
PARAMETER C_HIGHADDR = 0xFFFF85FF
PORT opb_clk = sys_clk
PORT interruptA = hw_interruptA
PORT interruptB = hw_interruptB
BUS_INTERFACE SOPB = dopb
END
:
:

My system.mss file reads as follows
:
:
BEGIN PROCESSOR
PARAMETER HW_INSTANCE = mblaze
PARAMETER DRIVER_NAME = cpu
PARAMETER DRIVER_VER = 1.00.a
PARAMETER EXECUTABLE = mblaze/code/executable.elf
PARAMETER COMPILER = mb-gcc
PARAMETER ARCHIVER = mb-ar
PARAMETER DEFAULT_INIT = XMDSTUB
PARAMETER DEBUG_PERIPHERAL = jtag
PARAMETER STDIN = rs232
PARAMETER STDOUT = rs232
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = hw_inst
PARAMETER DRIVER_NAME = hw_driver
PARAMETER DRIVER_VER = 1.00.a
PARAMETER INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
PARAMETER INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = intr_ctlr
PARAMETER DRIVER_NAME = intc
PARAMETER DRIVER_VER = 1.00.b
PARAMETER LEVEL = 0
END
:
:

These both seem to be in order to me. The interrupts generated by the
hw_inst sub_component are both connected to the intr input of the
intc, and the irq output of the intc is connected to the interrupt
input of the microblaze.

My driver files for the hw_driver are as follows
hw_driver.mdd is as follows:

### Start of file ###
BEGIN driver XRhw_driver
constant VERSION = 2.0.0 # uses SIF 2.0.0
parameter LEVEL = 0 # default level
END

BEGIN level 0
constant DEPENDS = (common_v1_00_a)
constant CONFIG_INCLUDE = xparameters, VALUES = ( C_BASEADDR )
parameter INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
parameter INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
### End of file ###

hw_driver_v2_1_0.mdd is as follows:

### Start of file ###
OPTION psf_version = 2.1;

BEGIN driver hw_driver
PARAM name = level, desc = "Driver Level", type = int, default = 0,
range = (0);

BEGIN BLOCK, dep = (level = 0)
OPTION depends = (common_v1_00_a);

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((Xhw_InterruptAHandler, interruptA),
(Xhw_InterruptBHandler, interruptB));
PARAM name = int_handler, desc = "Name of Interrupt Handler",
type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the
interrupt handler", permit = none;
END ARRAY
END BLOCK
END driver
### End of file ###

My hw_driver_v2_1_0.tcl file is:

### Start of File ###
proc generate {drv_handle} {
set level [xget_value $drv_handle "PARAMETER" "level"]
if {$level == 0} {
xdefine_include_file $drv_handle "xparameters.h" "Xhw_driver"
"NUM_INSTANCES" "C_BASEADDR" "C_HIGHADDR"
}
}
### End of file ###

It all seems in order to me. But I still get the same problems when I
run libgen, and only interruptA works when I synthesise and download
to the board.

I am using EDK 3.2.2, with Memec Insight V2MB1000 Rev. 3A board, if
that explains anything. (I have tried with EDK 6.1, but I get the same
problem)

I apologise for the amount of code posted, but I just can't figure out
what I'm doing wrong.

Thanks for all your help,
Ciaran Hughes,
National University of Ireland, Galway
 
Sathya,

The ports in my .mpd file are as follows

:
:
## Ports
PORT opb_abus = OPB_ABus, DIR = IN, VEC = [0:31], BUS = SOPB
PORT opb_be = OPB_BE, DIR = IN, VEC = [0:3], BUS = SOPB
PORT opb_clk = "", DIR = IN, SIGIS = CLK, BUS = SOPB
PORT opb_dbus = OPB_DBus, DIR = IN, VEC = [0:31], BUS = SOPB
PORT opb_rnw = OPB_RNW, DIR = IN, BUS = SOPB
PORT opb_rst = OPB_Rst, DIR = IN, BUS = SOPB
PORT opb_select = OPB_select, DIR = IN, BUS = SOPB
PORT opb_seqaddr = OPB_seqAddr, DIR = IN, BUS = SOPB
PORT sln_dbus = Sl_DBus, DIR = OUT, VEC = [0:31], BUS = SOPB
PORT sln_errack = Sl_errAck, DIR = OUT, BUS = SOPB
PORT sln_retry = Sl_retry, DIR = OUT, BUS = SOPB
PORT sln_toutsup = Sl_toutSup, DIR = OUT, BUS = SOPB
PORT sln_xferack = Sl_xferAck, DIR = OUT, BUS = SOPB

PORT HW_Clk = "", DIR = IN, SIGIS = CLK
PORT interruptA = "", DIR = OUT, LEVEL = HIGH, SIGIS = INTERRUPT
PORT interruptB = "", DIR = OUT, LEVEL = HIGH, SIGIS = INTERRUPT
PORT chA = "", DIR = OUT
PORT chB = "", DIR = OUT
PORT trigger = "", DIR = OUT
:
:

Both signals are declared as level sensitive interrupts.

Thank you,
(A very confused) Ciaran


Sathya Thammanur <sathyanarayanan.thammanur@xilinx.com> wrote in message news:<40117899.7060607@xilinx.com>...
Hi Ciaran,
Can you check if your MPD file of opb_hw_inst IP has SIGIS=INTERRUPT
subproperty on each of the ports interruptA and interruptB ?

Sathya


Ciaran wrote:
Thanks for replying Sathya (and Paulo),

Bear with me here, because I just can't figure out what I am doing
wrong.
My system.mhs file is as follows

:
:
BEGIN microblaze
PARAMETER INSTANCE = mblaze
PARAMETER HW_VER = 2.00.a
PORT CLK = sys_clk
PORT INTERRUPT = mblaze_interrupt
BUS_INTERFACE DLMB = dlmb
BUS_INTERFACE ILMB = ilmb
BUS_INTERFACE DOPB = dopb
END
:
:
BEGIN opb_intc
PARAMETER INSTANCE = intr_ctlr
PARAMETER HW_VER = 1.00.c
PARAMETER C_BASEADDR = 0xFFFF8200
PARAMETER C_HIGHADDR = 0xFFFF82FF
PORT Intr = hw_interruptA & hw_interruptB
PORT Irq = mblaze_interrupt
PORT OPB_Clk = sys_clk
BUS_INTERFACE SOPB = dopb
END
:
:
BEGIN opb_hw_inst
PARAMETER INSTANCE = hw_inst
PARAMETER HW_VER = 1.03.b
PARAMETER C_BASEADDR = 0xFFFF8400
PARAMETER C_HIGHADDR = 0xFFFF85FF
PORT opb_clk = sys_clk
PORT interruptA = hw_interruptA
PORT interruptB = hw_interruptB
BUS_INTERFACE SOPB = dopb
END
:
:

My system.mss file reads as follows
:
:
BEGIN PROCESSOR
PARAMETER HW_INSTANCE = mblaze
PARAMETER DRIVER_NAME = cpu
PARAMETER DRIVER_VER = 1.00.a
PARAMETER EXECUTABLE = mblaze/code/executable.elf
PARAMETER COMPILER = mb-gcc
PARAMETER ARCHIVER = mb-ar
PARAMETER DEFAULT_INIT = XMDSTUB
PARAMETER DEBUG_PERIPHERAL = jtag
PARAMETER STDIN = rs232
PARAMETER STDOUT = rs232
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = hw_inst
PARAMETER DRIVER_NAME = hw_driver
PARAMETER DRIVER_VER = 1.00.a
PARAMETER INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
PARAMETER INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
:
:
BEGIN DRIVER
PARAMETER HW_INSTANCE = intr_ctlr
PARAMETER DRIVER_NAME = intc
PARAMETER DRIVER_VER = 1.00.b
PARAMETER LEVEL = 0
END
:
:

These both seem to be in order to me. The interrupts generated by the
hw_inst sub_component are both connected to the intr input of the
intc, and the irq output of the intc is connected to the interrupt
input of the microblaze.

My driver files for the hw_driver are as follows
hw_driver.mdd is as follows:

### Start of file ###
BEGIN driver XRhw_driver
constant VERSION = 2.0.0 # uses SIF 2.0.0
parameter LEVEL = 0 # default level
END

BEGIN level 0
constant DEPENDS = (common_v1_00_a)
constant CONFIG_INCLUDE = xparameters, VALUES = ( C_BASEADDR )
parameter INT_HANDLER = Xhw_InterruptAHandler, INT_PORT = interruptA
parameter INT_HANDLER = Xhw_InterruptBHandler, INT_PORT = interruptB
END
### End of file ###

hw_driver_v2_1_0.mdd is as follows:

### Start of file ###
OPTION psf_version = 2.1;

BEGIN driver hw_driver
PARAM name = level, desc = "Driver Level", type = int, default = 0,
range = (0);

BEGIN BLOCK, dep = (level = 0)
OPTION depends = (common_v1_00_a);

BEGIN ARRAY interrupt_handler
PROPERTY desc = "Interrupt Handler Information";
PROPERTY size = 2, permit = none;
PROPERTY default = ((Xhw_InterruptAHandler, interruptA),
(Xhw_InterruptBHandler, interruptB));
PARAM name = int_handler, desc = "Name of Interrupt Handler",
type = string;
PARAM name = int_port, desc = "Interrupt pin associated with the
interrupt handler", permit = none;
END ARRAY
END BLOCK
END driver
### End of file ###

My hw_driver_v2_1_0.tcl file is:

### Start of File ###
proc generate {drv_handle} {
set level [xget_value $drv_handle "PARAMETER" "level"]
if {$level == 0} {
xdefine_include_file $drv_handle "xparameters.h" "Xhw_driver"
"NUM_INSTANCES" "C_BASEADDR" "C_HIGHADDR"
}
}
### End of file ###

It all seems in order to me. But I still get the same problems when I
run libgen, and only interruptA works when I synthesise and download
to the board.

I am using EDK 3.2.2, with Memec Insight V2MB1000 Rev. 3A board, if
that explains anything. (I have tried with EDK 6.1, but I get the same
problem)

I apologise for the amount of code posted, but I just can't figure out
what I'm doing wrong.

Thanks for all your help,
Ciaran Hughes,
National University of Ireland, Galway
 
Hello,

My name is Jeremy. I am working on a similar design with the microblaze but not having much sucess with the interrupts. I was wondering if you were able to sort out your problems? I am using a single interrupt directly to the Microblaze IRQ pin. My interrupt input halts my design but I don't think the ISR is being recognized. I was hopeful that you might be able to share your experience with me.

Thankyou
Jeremy

you may reply to
jweese@senstarstellar.com
 
Hello,

My name is Jeremy. I am working on a similar design with the microblaze but not having much sucess with the interrupts. I was wondering if you were able to sort out your problems? I am using a single interrupt directly to the Microblaze IRQ pin. My interrupt input halts my design but I don't think the ISR is being recognized. I was hopeful that you might be able to share your experience with me.

Thankyou
Jeremy

you may reply to
jweese@senstarstellar.com
 
Hello,

I am having a similar problem with microblaze. I have created a user peripherial with only 1 interrupt and have connected it directly to the mblaze IRQ input. I have hacked the IPIF driver and created a MDD to go with it. At this point I can generate all the code and libraries but when the application is executing and I generate the interrrupt using a pushbutton the application freezes and does not appear to execute the ISR. I think that the ISR is not being registered my the Mblaze. I was hoping you could share what you have learned. Have you sucessfully got your design to run? I would appreciate it if you could point me in the right direction before I pull out every last strand of my hair.

Thanks,
Jeremy
 
Jeremy,

Do you really think you will get three answers ???

senstar wrote:
Hello,

My name is Jeremy. I am working on a similar design with the microblaze but not having much sucess with the interrupts. I was wondering if you were able to sort out your problems? I am using a single interrupt directly to the Microblaze IRQ pin. My interrupt input halts my design but I don't think the ISR is being recognized. I was hopeful that you might be able to share your experience with me.

Thankyou
Jeremy

you may reply to
jweese@senstarstellar.com
 
I was having connection problems last night and it was my first time on this forum.

Hamilton, thank you for pointing out the obvious. Do you have anything constructive to offer on this topic?
 
There are some EDK examples for the microblaze at the xilinx sites (also
working with interrupts). By the way, interrupts connected to the microblaze
directly needs to be level sensitive, in case of using an edge triggered
interrupt you'll need an interrupt controller.

Maybe you could better try the comp.arch.fpga newsgroup for these topics...

Frank

"senstar" <jweese@senstarstellar.com> wrote in message
news:e81ed7ccaf4eade9bd5c52721c926a77@localhost.talkaboutprogramming.com...
Hello,

My name is Jeremy. I am working on a similar design with the microblaze
but not having much sucess with the interrupts. I was wondering if you were
able to sort out your problems? I am using a single interrupt directly to
the Microblaze IRQ pin. My interrupt input halts my design but I don't think
the ISR is being recognized. I was hopeful that you might be able to share
your experience with me.
Thankyou
Jeremy

you may reply to
jweese@senstarstellar.com
 

Welcome to EDABoard.com

Sponsor

Back
Top