Commit e948330f authored by mcattin's avatar mcattin

One multiple irq bit per irq source instead of a unique flag.

git-svn-id: http://svn.ohwr.org/fmc-adc-100m14b4cha/trunk@88 ddd67a1a-c8ad-4635-afe9-0b8a11d8f8e4
parent 413ce60d
......@@ -64,23 +64,23 @@ architecture rtl of irq_controller is
------------------------------------------------------------------------------
component irq_controller_regs
port (
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(1 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
irq_ctrl_status_mult_irq_o : out std_logic;
irq_ctrl_status_mult_irq_i : in std_logic;
irq_ctrl_status_mult_irq_load_o : out std_logic;
irq_ctrl_src_o : out std_logic_vector(31 downto 0);
irq_ctrl_src_i : in std_logic_vector(31 downto 0);
irq_ctrl_src_load_o : out std_logic;
irq_ctrl_en_mask_o : out std_logic_vector(31 downto 0)
rst_n_i : in std_logic;
wb_clk_i : in std_logic;
wb_addr_i : in std_logic_vector(1 downto 0);
wb_data_i : in std_logic_vector(31 downto 0);
wb_data_o : out std_logic_vector(31 downto 0);
wb_cyc_i : in std_logic;
wb_sel_i : in std_logic_vector(3 downto 0);
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
irq_ctrl_multi_irq_o : out std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_i : in std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_load_o : out std_logic;
irq_ctrl_src_o : out std_logic_vector(31 downto 0);
irq_ctrl_src_i : in std_logic_vector(31 downto 0);
irq_ctrl_src_load_o : out std_logic;
irq_ctrl_en_mask_o : out std_logic_vector(31 downto 0)
);
end component irq_controller_regs;
......@@ -94,10 +94,8 @@ architecture rtl of irq_controller is
signal irq_src_rst : std_logic_vector(31 downto 0);
signal irq_src_rst_en : std_logic;
signal multi_irq : std_logic_vector(31 downto 0);
signal multi_irq_or : std_logic_vector(32 downto 0);
signal multi_irq_rst : std_logic;
signal multi_irq_rst : std_logic_vector(31 downto 0);
signal multi_irq_rst_en : std_logic;
signal multi_irq_flag : std_logic;
signal irq_p_or : std_logic_vector(32 downto 0);
......@@ -108,23 +106,23 @@ begin
------------------------------------------------------------------------------
cmp_irq_controller_regs : irq_controller_regs
port map(
rst_n_i => rst_n_i,
wb_clk_i => clk_i,
wb_addr_i => wb_adr_i,
wb_data_i => wb_dat_i,
wb_data_o => wb_dat_o,
wb_cyc_i => wb_cyc_i,
wb_sel_i => wb_sel_i,
wb_stb_i => wb_stb_i,
wb_we_i => wb_we_i,
wb_ack_o => wb_ack_o,
irq_ctrl_status_mult_irq_o => multi_irq_rst,
irq_ctrl_status_mult_irq_load_o => multi_irq_rst_en,
irq_ctrl_status_mult_irq_i => multi_irq_flag,
irq_ctrl_src_o => irq_src_rst,
irq_ctrl_src_i => irq_pending,
irq_ctrl_src_load_o => irq_src_rst_en,
irq_ctrl_en_mask_o => irq_en_mask
rst_n_i => rst_n_i,
wb_clk_i => clk_i,
wb_addr_i => wb_adr_i,
wb_data_i => wb_dat_i,
wb_data_o => wb_dat_o,
wb_cyc_i => wb_cyc_i,
wb_sel_i => wb_sel_i,
wb_stb_i => wb_stb_i,
wb_we_i => wb_we_i,
wb_ack_o => wb_ack_o,
irq_ctrl_multi_irq_o => multi_irq_rst,
irq_ctrl_multi_irq_load_o => multi_irq_rst_en,
irq_ctrl_multi_irq_i => multi_irq,
irq_ctrl_src_o => irq_src_rst,
irq_ctrl_src_i => irq_pending,
irq_ctrl_src_load_o => irq_src_rst_en,
irq_ctrl_en_mask_o => irq_en_mask
);
------------------------------------------------------------------------------
......@@ -159,25 +157,19 @@ begin
multi_irq(I) <= '0';
elsif irq_src_p_i(I) = '1' and irq_pending(I) = '1' then
multi_irq(I) <= '1';
elsif multi_irq_rst_en = '1' and multi_irq_rst = '1' then
elsif multi_irq_rst_en = '1' and multi_irq_rst(I) = '1' then
multi_irq(I) <= '0';
end if;
end loop; -- I
end if;
end process p_multi_irq_detect;
multi_irq_or(0) <= '0';
l_multi_irq_flag : for I in 0 to multi_irq'length-2 generate
multi_irq_or(I+1) <= multi_irq_or(I) or multi_irq(I);
end generate l_multi_irq_flag;
multi_irq_flag <= multi_irq_or(32);
------------------------------------------------------------------------------
-- Generate IRQ output pulse
------------------------------------------------------------------------------
irq_p_or(0) <= '0';
l_irq_out_pulse: for I in 0 to irq_p_or'length-2 generate
irq_p_or(I+1) <= irq_p_or(I) or irq_src_p_i(I);
l_irq_out_pulse : for I in 0 to irq_src_p_i'length-1 generate
irq_p_or(I+1) <= irq_p_or(I) or (irq_src_p_i(I) and irq_en_mask(I));
end generate l_irq_out_pulse;
p_irq_out_pulse : process (clk_i)
......
......@@ -3,7 +3,7 @@
---------------------------------------------------------------------------------------
-- File : ../rtl/irq_controller_regs.vhd
-- Author : auto-generated by wbgen2 from irq_controller_regs.wb
-- Created : Fri Nov 18 16:47:40 2011
-- Created : Mon Nov 21 18:08:05 2011
-- Standard : VHDL'87
---------------------------------------------------------------------------------------
-- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE irq_controller_regs.wb
......@@ -26,10 +26,10 @@ entity irq_controller_regs is
wb_stb_i : in std_logic;
wb_we_i : in std_logic;
wb_ack_o : out std_logic;
-- Ports for BIT field: 'Multiple interrupt' in reg: 'Interrupt controller status register'
irq_ctrl_status_mult_irq_o : out std_logic;
irq_ctrl_status_mult_irq_i : in std_logic;
irq_ctrl_status_mult_irq_load_o : out std_logic;
-- Port for std_logic_vector field: 'Multiple interrupt' in reg: 'Multiple interrupt register'
irq_ctrl_multi_irq_o : out std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_i : in std_logic_vector(31 downto 0);
irq_ctrl_multi_irq_load_o : out std_logic;
-- Port for std_logic_vector field: 'Interrupt sources' in reg: 'Interrupt sources register '
irq_ctrl_src_o : out std_logic_vector(31 downto 0);
irq_ctrl_src_i : in std_logic_vector(31 downto 0);
......@@ -71,7 +71,7 @@ begin
ack_sreg <= "0000000000";
ack_in_progress <= '0';
rddata_reg <= "00000000000000000000000000000000";
irq_ctrl_status_mult_irq_load_o <= '0';
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
irq_ctrl_en_mask_int <= "00000000000000000000000000000000";
elsif rising_edge(bus_clock_int) then
......@@ -80,11 +80,11 @@ begin
ack_sreg(9) <= '0';
if (ack_in_progress = '1') then
if (ack_sreg(0) = '1') then
irq_ctrl_status_mult_irq_load_o <= '0';
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
ack_in_progress <= '0';
else
irq_ctrl_status_mult_irq_load_o <= '0';
irq_ctrl_multi_irq_load_o <= '0';
irq_ctrl_src_load_o <= '0';
end if;
else
......@@ -92,40 +92,9 @@ begin
case rwaddr_reg(1 downto 0) is
when "00" =>
if (wb_we_i = '1') then
irq_ctrl_status_mult_irq_load_o <= '1';
irq_ctrl_multi_irq_load_o <= '1';
else
rddata_reg(0) <= irq_ctrl_status_mult_irq_i;
rddata_reg(1) <= 'X';
rddata_reg(2) <= 'X';
rddata_reg(3) <= 'X';
rddata_reg(4) <= 'X';
rddata_reg(5) <= 'X';
rddata_reg(6) <= 'X';
rddata_reg(7) <= 'X';
rddata_reg(8) <= 'X';
rddata_reg(9) <= 'X';
rddata_reg(10) <= 'X';
rddata_reg(11) <= 'X';
rddata_reg(12) <= 'X';
rddata_reg(13) <= 'X';
rddata_reg(14) <= 'X';
rddata_reg(15) <= 'X';
rddata_reg(16) <= 'X';
rddata_reg(17) <= 'X';
rddata_reg(18) <= 'X';
rddata_reg(19) <= 'X';
rddata_reg(20) <= 'X';
rddata_reg(21) <= 'X';
rddata_reg(22) <= 'X';
rddata_reg(23) <= 'X';
rddata_reg(24) <= 'X';
rddata_reg(25) <= 'X';
rddata_reg(26) <= 'X';
rddata_reg(27) <= 'X';
rddata_reg(28) <= 'X';
rddata_reg(29) <= 'X';
rddata_reg(30) <= 'X';
rddata_reg(31) <= 'X';
rddata_reg(31 downto 0) <= irq_ctrl_multi_irq_i;
end if;
ack_sreg(0) <= '1';
ack_in_progress <= '1';
......@@ -159,7 +128,7 @@ begin
-- Drive the data output bus
wb_data_o <= rddata_reg;
-- Multiple interrupt
irq_ctrl_status_mult_irq_o <= wrdata_reg(0);
irq_ctrl_multi_irq_o <= wrdata_reg(31 downto 0);
-- Interrupt sources
irq_ctrl_src_o <= wrdata_reg(31 downto 0);
-- Interrupt enable mask
......
......@@ -3,7 +3,7 @@
* File : irq_controller_regs.h
* Author : auto-generated by wbgen2 from irq_controller_regs.wb
* Created : Fri Nov 18 16:47:40 2011
* Created : Mon Nov 21 18:08:05 2011
* Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE irq_controller_regs.wb
......@@ -31,18 +31,15 @@
#endif
/* definitions for register: Interrupt controller status register */
/* definitions for field: Multiple interrupt in reg: Interrupt controller status register */
#define IRQ_CTRL_STATUS_MULT_IRQ WBGEN2_GEN_MASK(0, 1)
/* definitions for register: Multiple interrupt register */
/* definitions for register: Interrupt sources register */
/* definitions for register: Interrupt enable mask register */
PACKED struct IRQ_CTRL_WB {
/* [0x0]: REG Interrupt controller status register */
uint32_t STATUS;
/* [0x0]: REG Multiple interrupt register */
uint32_t MULTI_IRQ;
/* [0x4]: REG Interrupt sources register */
uint32_t SRC;
/* [0x8]: REG Interrupt enable mask register */
......
......@@ -34,7 +34,7 @@
<span style="margin-left: 0px; ">1. <A href="#sect_1_0">Memory map summary</a></span><br/>
<span style="margin-left: 0px; ">2. <A href="#sect_2_0">HDL symbol</a></span><br/>
<span style="margin-left: 0px; ">3. <A href="#sect_3_0">Register description</a></span><br/>
<span style="margin-left: 20px; ">3.1. <A href="#sect_3_1">Interrupt controller status register</a></span><br/>
<span style="margin-left: 20px; ">3.1. <A href="#sect_3_1">Multiple interrupt register</a></span><br/>
<span style="margin-left: 20px; ">3.2. <A href="#sect_3_2">Interrupt sources register </a></span><br/>
<span style="margin-left: 20px; ">3.3. <A href="#sect_3_3">Interrupt enable mask register</a></span><br/>
<h3><a name="sect_1_0">1. Memory map summary</a></h3>
......@@ -64,13 +64,13 @@ C prefix
REG
</td>
<td >
<A href="#STATUS">Interrupt controller status register</a>
<A href="#MULTI_IRQ">Multiple interrupt register</a>
</td>
<td class="td_code">
irq_ctrl_status
irq_ctrl_multi_irq
</td>
<td class="td_code">
STATUS
MULTI_IRQ
</td>
</tr>
<tr class="tr_even">
......@@ -122,7 +122,7 @@ rst_n_i
</td>
<td class="td_pblock_right">
<b>Interrupt controller status register:</b>
<b>Multiple interrupt register:</b>
</td>
<td class="td_arrow_right">
......@@ -139,10 +139,10 @@ wb_clk_i
</td>
<td class="td_pblock_right">
irq_ctrl_status_mult_irq_o
irq_ctrl_multi_irq_o[31:0]
</td>
<td class="td_arrow_right">
&rarr;
&rArr;
</td>
</tr>
<tr>
......@@ -156,10 +156,10 @@ wb_addr_i[1:0]
</td>
<td class="td_pblock_right">
irq_ctrl_status_mult_irq_i
irq_ctrl_multi_irq_i[31:0]
</td>
<td class="td_arrow_right">
&larr;
&lArr;
</td>
</tr>
<tr>
......@@ -173,7 +173,7 @@ wb_data_i[31:0]
</td>
<td class="td_pblock_right">
irq_ctrl_status_mult_irq_load_o
irq_ctrl_multi_irq_load_o
</td>
<td class="td_arrow_right">
&rarr;
......@@ -318,15 +318,15 @@ irq_ctrl_en_mask_o[31:0]
</table>
<h3><a name="sect_3_0">3. Register description</a></h3>
<a name="STATUS"></a>
<h3><a name="sect_3_1">3.1. Interrupt controller status register</a></h3>
<a name="MULTI_IRQ"></a>
<h3><a name="sect_3_1">3.1. Multiple interrupt register</a></h3>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td >
<b>HW prefix: </b>
</td>
<td class="td_code">
irq_ctrl_status
irq_ctrl_multi_irq
</td>
</tr>
<tr>
......@@ -342,7 +342,7 @@ irq_ctrl_status
<b>C prefix: </b>
</td>
<td class="td_code">
STATUS
MULTI_IRQ
</td>
</tr>
<tr>
......@@ -355,7 +355,7 @@ STATUS
</tr>
</table>
<p>
Multiple interrupts occurs before irq source is read.<br>Write '1' to clear a bit.
</p>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
......@@ -385,29 +385,29 @@ STATUS
</td>
</tr>
<tr>
<td class="td_unused">
-
<td style="border: solid 1px black;" colspan=8 class="td_field">
MULTI_IRQ[31:24]
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
</tr>
</table>
......@@ -439,29 +439,29 @@ STATUS
</td>
</tr>
<tr>
<td class="td_unused">
-
<td style="border: solid 1px black;" colspan=8 class="td_field">
MULTI_IRQ[23:16]
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
</tr>
</table>
......@@ -493,29 +493,29 @@ STATUS
</td>
</tr>
<tr>
<td class="td_unused">
-
<td style="border: solid 1px black;" colspan=8 class="td_field">
MULTI_IRQ[15:8]
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
</tr>
</table>
......@@ -547,37 +547,36 @@ STATUS
</td>
</tr>
<tr>
<td class="td_unused">
-
<td style="border: solid 1px black;" colspan=8 class="td_field">
MULTI_IRQ[7:0]
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td class="td_unused">
-
<td >
</td>
<td style="border: solid 1px black;" colspan=1 class="td_field">
MULT_IRQ
<td >
</td>
</tr>
</table>
<ul>
<li><b>
MULT_IRQ
MULTI_IRQ
</b>[<i>read/write</i>]: Multiple interrupt
<br>Multiple interrupts occurs before irq source is read.
</ul>
<a name="SRC"></a>
<h3><a name="sect_3_2">3.2. Interrupt sources register </a></h3>
......
......@@ -6,15 +6,14 @@ peripheral {
prefix = "irq_ctrl";
reg {
name = "Interrupt controller status register";
description = "";
prefix = "status";
name = "Multiple interrupt register";
description = "Multiple interrupts occurs before irq source is read.\nWrite '1' to clear a bit.";
prefix = "multi_irq";
field {
name = "Multiple interrupt";
description = "Multiple interrupts occurs before irq source is read.";
prefix = "mult_irq";
type = BIT;
type = SLV;
size = 32;
load = LOAD_EXT;
access_bus = READ_WRITE;
access_dev = READ_WRITE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment