module int_ctrl ( input wire clk, input wire resetn, input wire [31:0] int_en, // 中断使能:1有效 input wire [31:0] int_edge, // 触发方式:1边沿触发,0电平触发 input wire [31:0] int_pol, // 极性选择:电平(1高/0低),边沿(1上升沿/0下降沿) input wire [31:0] int_in, // 外部输入中断信号 input wire [31:0] int_clr, // 软件中断清除(针对边沿触发) input wire [31:0] int_set, // 软件中断置位(针对边沿触发) output wire [31:0] int_out // 最终输出到处理器的高电平有效中断信号 ); // 寄存输入信号以检测边沿 reg [31:0] int_in_d1; always @(posedge clk or negedge resetn) begin if (!resetn) begin int_in_d1 <= 32'b0; end else begin int_in_d1 <= int_in; end end // 生成上升沿和下降沿信号 wire [31:0] rising_edge = int_in & ~int_in_d1; wire [31:0] falling_edge = ~int_in & int_in_d1; // 边沿触发状态维护寄存器 reg [31:0] edge_int_state; integer i; always @(posedge clk or negedge resetn) begin if (!resetn) begin edge_int_state <= 32'b0; end else begin for (i = 0; i < 32; i = i + 1) begin // 清除操作优先级最高(按照基础SoC惯例,写clr信号清零) if (int_clr[i]) begin edge_int_state[i] <= 1'b0; end // 软件置位操作 else if (int_set[i]) begin edge_int_state[i] <= 1'b1; end // 硬件检测到有效边沿并锁存 else if (int_edge[i]) begin if (int_pol[i] && rising_edge[i]) begin edge_int_state[i] <= 1'b1; // 上升沿触发 end else if (!int_pol[i] && falling_edge[i]) begin edge_int_state[i] <= 1'b1; // 下降沿触发 end end end end end // 电平触发状态评估 // 如果极性配置为1(高电平触发),则 int_in 为1时有效 // 如果极性配置为0(低电平触发),则 int_in 为0时有效 wire [31:0] level_int_state; assign level_int_state = (int_in & int_pol) | (~int_in & ~int_pol); // 结合 edge/level 选择,并用 en 屏蔽 assign int_out = int_en & ( (int_edge & edge_int_state) | (~int_edge & level_int_state) ); endmodule