Commit a399be75 authored by twlostow's avatar twlostow

x

git-svn-id: http://svn.ohwr.org/wishbone-gen@20 4537843c-45c2-4d80-8546-c3283569414f
parent d20fa15c
...@@ -197,7 +197,7 @@ function cgen_generate_c_header_code() ...@@ -197,7 +197,7 @@ function cgen_generate_c_header_code()
cgen_c_fileheader(); cgen_c_fileheader();
cgen_c_field_masks(); cgen_c_field_masks();
if(options.c_regs_style == "struct") then if(options.c_reg_style == "struct") then
cgen_c_struct(); cgen_c_struct();
else else
cgen_c_defines(); cgen_c_defines();
......
...@@ -48,8 +48,12 @@ entity wbgen2_eic is ...@@ -48,8 +48,12 @@ entity wbgen2_eic is
rst_n_i : in std_logic; -- reset & system clock, as always :) rst_n_i : in std_logic; -- reset & system clock, as always :)
clk_i : in std_logic; clk_i : in std_logic;
irq_i : in std_logic_vector(g_num_interrupts-1 downto 0); -- raw interrupt -- raw interrupt inputs
-- inputs irq_i : in std_logic_vector(g_num_interrupts-1 downto 0);
-- interrupt acknowledge signal, used for level-active interrupts to
-- indicate that the interrupt has been handled
irq_ack_o: out std_logic_vector(g_num_interrupts-1 downto 0);
-- interrupt mask regsiter (slv/bus read-only) -- interrupt mask regsiter (slv/bus read-only)
reg_imr_o : out std_logic_vector(g_num_interrupts-1 downto 0); reg_imr_o : out std_logic_vector(g_num_interrupts-1 downto 0);
...@@ -149,7 +153,12 @@ begin -- syn ...@@ -149,7 +153,12 @@ begin -- syn
if((reg_isr_i(i) = '1' and reg_isr_wr_stb_i = '1') or irq_mask(i) = '0') then if((reg_isr_i(i) = '1' and reg_isr_wr_stb_i = '1') or irq_mask(i) = '0') then
irq_pending(i) <= '0'; irq_pending(i) <= '0';
irq_i_d0(i) <= '0';
irq_i_d1(i) <= '0';
irq_i_d2(i) <= '0';
else else
case irq_mode(i) is case irq_mode(i) is
when c_IRQ_MODE_LEVEL_0 => irq_pending(i) <= not irq_i_d2(i); when c_IRQ_MODE_LEVEL_0 => irq_pending(i) <= not irq_i_d2(i);
when c_IRQ_MODE_LEVEL_1 => irq_pending(i) <= irq_i_d2(i); when c_IRQ_MODE_LEVEL_1 => irq_pending(i) <= irq_i_d2(i);
...@@ -194,6 +203,10 @@ begin -- syn ...@@ -194,6 +203,10 @@ begin -- syn
end if; end if;
end process; end process;
gen_irq_ack: for i in 0 to g_num_interrupts-1 generate
irq_ack_o(i) <= '1' when (reg_isr_wr_stb_i = '1' and reg_isr_i(i) = '1') else '0';
end generate gen_irq_ack;
reg_imr_o <= irq_mask; reg_imr_o <= irq_mask;
reg_isr_o <= irq_pending; reg_isr_o <= irq_pending;
......
...@@ -70,6 +70,7 @@ package wbgen2_pkg is ...@@ -70,6 +70,7 @@ package wbgen2_pkg is
rst_n_i : in std_logic; rst_n_i : in std_logic;
clk_i : in std_logic; clk_i : in std_logic;
irq_i : in std_logic_vector(g_num_interrupts-1 downto 0); irq_i : in std_logic_vector(g_num_interrupts-1 downto 0);
irq_ack_o : out std_logic_vector(g_num_interrupts-1 downto 0);
reg_imr_o : out std_logic_vector(g_num_interrupts-1 downto 0); reg_imr_o : out std_logic_vector(g_num_interrupts-1 downto 0);
reg_ier_i : in std_logic_vector(g_num_interrupts-1 downto 0); reg_ier_i : in std_logic_vector(g_num_interrupts-1 downto 0);
reg_ier_wr_stb_i : in std_logic; reg_ier_wr_stb_i : in std_logic;
......
This diff is collapsed.
...@@ -75,6 +75,7 @@ function wbgen_generate_eic() ...@@ -75,6 +75,7 @@ function wbgen_generate_eic()
["hdl_prefix"] = "EIC_ISR"; ["hdl_prefix"] = "EIC_ISR";
["signals"] = { signal (SLV, periph.irqcount, "eic_isr_clear_int"); ["signals"] = { signal (SLV, periph.irqcount, "eic_isr_clear_int");
signal (SLV, periph.irqcount, "eic_isr_status_int"); signal (SLV, periph.irqcount, "eic_isr_status_int");
signal (SLV, periph.irqcount, "eic_irq_ack_int");
signal (BIT, 0, "eic_isr_write_int"); }; signal (BIT, 0, "eic_isr_write_int"); };
["write_code"] = { va("eic_isr_write_int", 1); }; ["write_code"] = { va("eic_isr_write_int", 1); };
...@@ -126,6 +127,7 @@ function wbgen_generate_eic() ...@@ -126,6 +127,7 @@ function wbgen_generate_eic()
["access_dev"] = READ_WRITE; ["access_dev"] = READ_WRITE;
}; };
local field_ier = { local field_ier = {
["__blockindex"] = irq.index; ["__blockindex"] = irq.index;
["__type"] = TYPE_FIELD; ["__type"] = TYPE_FIELD;
...@@ -168,13 +170,24 @@ function wbgen_generate_eic() ...@@ -168,13 +170,24 @@ function wbgen_generate_eic()
irq.full_prefix = string.lower("irq_"..irq.hdl_prefix);
irq.ports = { port(BIT, 0, "in", irq.full_prefix.."_i"); };
if(irq.ack_line == true) then
table_join(irq.ports, { port(BIT, 0, "out", irq.full_prefix.."_ack_o"); });
end
if(irq.mask_line == true) then
table_join(irq.ports, { port(BIT, 0, "out", irq.full_prefix.."_mask_o"); });
end
table.insert(reg_idr, field_idr); table.insert(reg_idr, field_idr);
table.insert(reg_isr, field_isr); table.insert(reg_isr, field_isr);
table.insert(reg_imr, field_imr); table.insert(reg_imr, field_imr);
table.insert(reg_ier, field_ier); table.insert(reg_ier, field_ier);
irq.full_prefix = string.lower("irq_"..irq.hdl_prefix);
irq.ports = { port(BIT, 0, "in", irq.full_prefix.."_i"); };
end); end);
...@@ -193,6 +206,7 @@ function wbgen_generate_eic() ...@@ -193,6 +206,7 @@ function wbgen_generate_eic()
vpm("clk_i", "bus_clock_int"); vpm("clk_i", "bus_clock_int");
vpm("rst_n_i", "rst_n_i"); vpm("rst_n_i", "rst_n_i");
vpm("irq_i", "irq_inputs_vector_int"); vpm("irq_i", "irq_inputs_vector_int");
vpm("irq_ack_o", "eic_irq_ack_int");
vpm("reg_imr_o", "eic_imr_int"); vpm("reg_imr_o", "eic_imr_int");
vpm("reg_ier_i", "eic_ier_int"); vpm("reg_ier_i", "eic_ier_int");
vpm("reg_ier_wr_stb_i", "eic_ier_write_int"); vpm("reg_ier_wr_stb_i", "eic_ier_write_int");
...@@ -220,8 +234,18 @@ function wbgen_generate_eic() ...@@ -220,8 +234,18 @@ function wbgen_generate_eic()
local irq_unit_code = { vinstance("eic_irq_controller_inst", "wbgen2_eic", maps ); }; local irq_unit_code = { vinstance("eic_irq_controller_inst", "wbgen2_eic", maps ); };
foreach_reg({TYPE_IRQ}, function(irq) foreach_reg({TYPE_IRQ},
function(irq)
table_join(irq_unit_code, {va(vi("irq_inputs_vector_int", irq.index), irq.full_prefix.."_i")}); table_join(irq_unit_code, {va(vi("irq_inputs_vector_int", irq.index), irq.full_prefix.."_i")});
if(irq.ack_line == true) then
table_join(irq_unit_code, {va(irq.full_prefix.."_ack_o", vi("eic_irq_ack_int", irq.index))});
end
if(irq.mask_line == true) then
table_join(irq_unit_code, {va(irq.full_prefix.."_mask_o", vi("eic_imr_int", irq.index))});
end
end); end);
local fake_irq = { local fake_irq = {
......
...@@ -682,6 +682,18 @@ function gen_hdl_code_reg_field(field, reg) ...@@ -682,6 +682,18 @@ function gen_hdl_code_reg_field(field, reg)
gen_hdl_code_constant(field, reg); gen_hdl_code_constant(field, reg);
end end
if(field.ack_read ~= nil) then
table_join(field.ports, { port (BIT, 0, "out", field.ack_read) });
table_join(field.read_code, { va(field.ack_read, 1) });
if(field.reset_code_main == nil) then field.reset_code_main = {}; end
table_join(field.reset_code_main, { va(field.ack_read, 0) });
if(field.ackgen_code == nil) then field.ackgen_code= {}; end
table_join(field.ackgen_code, { va(field.ack_read, 0) });
end
end end
-- generates VHDL for single register -- generates VHDL for single register
......
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