module xdma_multi_interrupt (
input wire clk, // 时钟信号
input wire rst_n, // 复位信号,低电平有效
input wire [15:0] event_trigger, // 16 位事件信号,触发多个中断
output reg [15:0] usr_irq_req, // 用户中断请求信号(16 个中断)
input wire [15:0] usr_irq_ack // 用户中断确认信号(16 个中断)
);
// 状态定义
localparam IDLE = 2'b00; // 空闲状态
localparam IRQ_ASSERT = 2'b01; // 发送中断请求
localparam IRQ_WAIT_ACK = 2'b10; // 等待中断确认
// 状态机寄存器,每个中断有独立状态
reg [1:0] state [15:0]; // 当前状态
reg [1:0] next_state [15:0]; // 下一个状态
integer i;
// 状态机和中断请求的处理
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
usr_irq_req <= 16'b0;
for (i = 0; i < 16; i = i + 1) begin
state[i] <= IDLE; // 初始化每个中断为 IDLE 状态
end
end else begin
for (i = 0; i < 16; i = i + 1) begin
state[i] <= next_state[i]; // 更新每个中断的状态
case (state[i])
IDLE: begin
// 等待事件触发
usr_irq_req[i] <= 1'b0; // 确保中断请求信号低电平
if (event_trigger[i]) begin
next_state[i] <= IRQ_ASSERT; // 事件触发,准备发送中断
end else begin
next_state[i] <= IDLE; // 保持在空闲状态
end
end
IRQ_ASSERT: begin
// 发送中断请求
usr_irq_req[i] <= 1'b1; // 设置中断请求
next_state[i] <= IRQ_WAIT_ACK; // 切换到等待确认状态
end
IRQ_WAIT_ACK: begin
// 等待主机确认中断
if (usr_irq_ack[i]) begin
usr_irq_req[i] <= 1'b0; // 主机确认后清除中断请求
next_state[i] <= IDLE; // 返回空闲状态
end else begin
next_state[i] <= IRQ_WAIT_ACK; // 等待确认
end
end
default: begin
next_state[i] <= IDLE; // 默认状态为 IDLE
end
endcase
end
end
end
endmodule
标签:multi,wire,15,中断,irq,localparam,interrupt,input,xdma From: https://www.cnblogs.com/zyk-2024/p/18497772