module YD_int
(
	input		wire	clk, //时钟
	input		wire	rst,  //同步复位,高电平有效
	//int
	input 	wire int_vld, //中断脉冲输入,1周期高脉冲表示中断发生
	output 	reg int_rdy, //数据输出,高电平可以接受中断,低电平无法响应
	//
	input wire[15:0]PC, //下一条指令的地址
	input wire jpc, //跳转指示
	output reg int_jpc, //输出的跳转指示
	output reg inp,//插入NOP指示,异步作用
	//接管寄存器组写端口
	//输入口0
	input wire [15:0]din0,
	input wire [3:0]waddr0,
	input wire we0,
	//输入口1
	input wire [15:0]din1,
	input wire [3:0]waddr1,
	input wire we1,
	//输入口0
	output reg [15:0]int_din0,
	output reg [3:0]int_waddr0,
	output reg int_we0,
	//输入口1
	output reg [15:0]int_din1,
	output reg [3:0]int_waddr1,
	output reg int_we1
);
/*
非向量中断控制器
无中断,int_rdy=1,寄存器端口旁路
发生中断
0:int_vld=1,PC暂存,int_rdy=0
1:inp=1,插入NOP
2:接管寄存器端口,PC-r->RC,16'h0004->PC
3:NOP
4:inp=0,int_rdy=1
*/
//有限序列机
reg [2:0]state;//状态寄存器
reg sen;//序列机工作使能
localparam IDLE=3'h0;//等待状态
localparam CPL=3'h1;//清空流水线
localparam WBK=3'h2;//写返回地址,PC跳转
localparam RIN=3'h3;//指令读出前,插NOP
localparam IED=3'h4;//结束,复位控制器
//寄存器
reg [15:0]PC_r;
//状态转移控制
always @(posedge clk) begin
	if(rst) begin
		sen <= 1'b0;
		state <= 3'h0;
		end 
	else begin
		if(int_vld) begin//中断脉冲
			sen <= 1'b1;//启动序列机
			state <= CPL;//直接转移到CPL
			PC_r <= PC;
			end
		if(sen)//中断启动
			if(state<IED)//到达结束状态前
				state <= state+1;//进入下一个状态
			else begin//到达最终状态
				state <= IDLE;//复位
				sen <= 1'b0;
				end
		else//多余状态复位
			if(state!=IDLE)
				state <= IDLE;
		end
end

//输出控制,组合逻辑部分
always @(*) begin
	if(rst) begin
		//寄存器端口旁路
		int_din0=din0;
		int_waddr0=waddr0;
		int_we0=we0;
		int_din1=din1;
		int_waddr1=waddr1;
		int_we1=we1;
		//可中断
		int_rdy=1;
		//插入空指令
		inp=0;
		//jpc
		int_jpc=jpc;
		end 
	else begin
		case (state)
			IDLE: begin//等待状态
				//寄存器端口旁路
				int_din0=din0;
				int_waddr0=waddr0;
				int_we0=we0;
				int_din1=din1;
				int_waddr1=waddr1;
				int_we1=we1;
				//可中断
				int_rdy=1;
				//插入空指令
				inp=0;
				//jpc
				int_jpc=jpc;
				end
			CPL: begin//清空流水线
				//寄存器端口旁路
				int_din0=din0;
				int_waddr0=waddr0;
				int_we0=we0;
				int_din1=din1;
				int_waddr1=waddr1;
				int_we1=we1;
				//中断进行中
				int_rdy=0;
				//插入空指令
				inp=1;
				//jpc
				int_jpc=jpc;
				end
			WBK: begin//写返回地址,PC跳转
				//寄存器端口旁路
				int_din0=PC_r;//写返回地址
				int_waddr0=4'b1110;
				int_we0=1;
				int_din1=16'h0004;//PC跳转
				int_waddr1=4'b1111;
				int_we1=1;
				//中断进行中
				int_rdy=0;
				//插入空指令
				inp=1;
				//jpc
				int_jpc=1;
				end
			RIN: begin//指令读出前,插NOP
				//寄存器端口旁路
				int_din0=din0;
				int_waddr0=waddr0;
				int_we0=we0;
				int_din1=din1;
				int_waddr1=waddr1;
				int_we1=we1;
				//中断进行中
				int_rdy=0;
				//插入空指令
				inp=1;
				//jpc
				int_jpc=jpc;
				end
			IED: begin//结束,复位控制器
				//寄存器端口旁路
				int_din0=din0;
				int_waddr0=waddr0;
				int_we0=we0;
				int_din1=din1;
				int_waddr1=waddr1;
				int_we1=we1;
				//中断进行中
				int_rdy=0;
				//插入空指令
				inp=0;
				//jpc
				int_jpc=jpc;
				end
			default: begin
				//寄存器端口旁路
				int_din0=din0;
				int_waddr0=waddr0;
				int_we0=we0;
				int_din1=din1;
				int_waddr1=waddr1;
				int_we1=we1;
				//可中断
				int_rdy=1;
				//插入空指令
				inp=0;
				//jpc
				int_jpc=jpc;
				end
		endcase
		end
end


endmodule