pr.v
资源名称:_8259A.zip [点击查看]
上传用户:tzxuweilin
上传日期:2022-08-10
资源大小:747k
文件大小:10k
源码类别:
VHDL/FPGA/Verilog
开发平台:
VHDL
- module pr(sm, mask, request, isr, sp, eoi, isr_set, isr_clr, intr, code);
- input sm;
- input[7:0] mask;
- input[7:0] request;
- input[7:0] isr;
- input[2:0] sp;
- input[7:0] eoi;
- output[7:0] isr_set;
- output[7:0] isr_clr;
- output intr;
- output[2:0] code;
- wire[7:0] nmr;
- wire[7:0] isr_clr;
- wire[7:0] isr_set;
- reg[2:0] position, hp_nmr, hp_isr;
- assign nmr = (~mask) & request;
- assign isr_clr = eoi;
- assign isr_set[0] = (sm && /*hp_nmr != 3'd8 && */position == 3'd0) || (~sm && hp_nmr < hp_isr && position == 3'd0) ? 1'b1 : 1'b0;
- assign isr_set[1] = (sm && /*hp_nmr != 3'd8 && */position == 3'd1) || (~sm && hp_nmr < hp_isr && position == 3'd1) ? 1'b1 : 1'b0;
- assign isr_set[2] = (sm && /*hp_nmr != 3'd8 && */position == 3'd2) || (~sm && hp_nmr < hp_isr && position == 3'd2) ? 1'b1 : 1'b0;
- assign isr_set[3] = (sm && /*hp_nmr != 3'd8 && */position == 3'd3) || (~sm && hp_nmr < hp_isr && position == 3'd3) ? 1'b1 : 1'b0;
- assign isr_set[4] = (sm && /*hp_nmr != 3'd8 && */position == 3'd4) || (~sm && hp_nmr < hp_isr && position == 3'd4) ? 1'b1 : 1'b0;
- assign isr_set[5] = (sm && /*hp_nmr != 3'd8 && */position == 3'd5) || (~sm && hp_nmr < hp_isr && position == 3'd5) ? 1'b1 : 1'b0;
- assign isr_set[6] = (sm && /*hp_nmr != 3'd8 && */position == 3'd6) || (~sm && hp_nmr < hp_isr && position == 3'd6) ? 1'b1 : 1'b0;
- assign isr_set[7] = (sm && /*hp_nmr != 3'd8 && */position == 3'd7) || (~sm && hp_nmr < hp_isr && position == 3'd7) ? 1'b1 : 1'b0;
- // FOR /L %i IN (0, 1, 7) do (ECHO "assign isr_set[%i] = (sm && /*hp_nmr != 3'd8 && */position == 3'd%i) || (~sm && hp_nmr < hp_isr && position == 3'd%i) ? 1'b1 : 1'b0;" >> a.txt)
- assign code = (isr == 8'd0) ? 3'b000 : position;
- assign intr = ((/*hp_nmr != 3'd8 && */sm) || (/*hp_nmr != 3'd8 && */~sm && hp_nmr < hp_isr)) ? 1'b1 : 1'b0;
- always @(sp)
- begin
- if (nmr != 8'd0)
- begin
- case (sp)
- 3'd7:
- begin
- if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd0; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd1; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd2; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd3; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd4; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd5; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd6; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd7; end
- end
- 3'd6:
- begin
- if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd0; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd1; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd2; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd3; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd4; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd5; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd6; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd7; end
- end
- 3'd5:
- begin
- if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd0; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd1; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd2; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd3; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd4; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd5; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd6; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd7; end
- end
- 3'd4:
- begin
- if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd0; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd1; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd2; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd3; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd4; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd5; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd6; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd7; end
- end
- 3'd3:
- begin
- if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd0; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd1; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd2; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd3; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd4; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd5; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd6; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd7; end
- end
- 3'd2:
- begin
- if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd0; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd1; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd2; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd3; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd4; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd5; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd6; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd7; end
- end
- 3'd1:
- begin
- if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd0; end
- else if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd1; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd2; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd3; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd4; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd5; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd6; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd7; end
- end
- 3'd0:
- begin
- if (nmr[7] == 1'b1) begin position <= 3'd7; hp_nmr <= 3'd0; end
- else if (nmr[0] == 1'b1) begin position <= 3'd0; hp_nmr <= 3'd1; end
- else if (nmr[1] == 1'b1) begin position <= 3'd1; hp_nmr <= 3'd2; end
- else if (nmr[2] == 1'b1) begin position <= 3'd2; hp_nmr <= 3'd3; end
- else if (nmr[3] == 1'b1) begin position <= 3'd3; hp_nmr <= 3'd4; end
- else if (nmr[4] == 1'b1) begin position <= 3'd4; hp_nmr <= 3'd5; end
- else if (nmr[5] == 1'b1) begin position <= 3'd5; hp_nmr <= 3'd6; end
- else if (nmr[6] == 1'b1) begin position <= 3'd6; hp_nmr <= 3'd7; end
- end
- //// FOR /L %i in (0, 1, 7) do (ECHO "else if (nmr[%i] == 1) begin position <= %i; hp_nmr <= %i; end" >>a.txt)
- endcase
- end
- if (isr != 0)
- begin
- case (sp)
- 3'd7:
- begin
- if (isr[0] == 1'b1) hp_isr <= 3'd0;
- else if (isr[1] == 1'b1) hp_isr <= 3'd1;
- else if (isr[2] == 1'b1) hp_isr <= 3'd2;
- else if (isr[3] == 1'b1) hp_isr <= 3'd3;
- else if (isr[4] == 1'b1) hp_isr <= 3'd4;
- else if (isr[5] == 1'b1) hp_isr <= 3'd5;
- else if (isr[6] == 1'b1) hp_isr <= 3'd6;
- else if (isr[7] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd6:
- begin
- if (isr[1] == 1'b1) hp_isr <= 3'd0;
- else if (isr[2] == 1'b1) hp_isr <= 3'd1;
- else if (isr[3] == 1'b1) hp_isr <= 3'd2;
- else if (isr[4] == 1'b1) hp_isr <= 3'd3;
- else if (isr[5] == 1'b1) hp_isr <= 3'd4;
- else if (isr[6] == 1'b1) hp_isr <= 3'd5;
- else if (isr[7] == 1'b1) hp_isr <= 3'd6;
- else if (isr[0] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd5:
- begin
- if (isr[2] == 1'b1) hp_isr <= 3'd0;
- else if (isr[3] == 1'b1) hp_isr <= 3'd1;
- else if (isr[4] == 1'b1) hp_isr <= 3'd2;
- else if (isr[5] == 1'b1) hp_isr <= 3'd3;
- else if (isr[6] == 1'b1) hp_isr <= 3'd4;
- else if (isr[7] == 1'b1) hp_isr <= 3'd5;
- else if (isr[0] == 1'b1) hp_isr <= 3'd6;
- else if (isr[1] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd4:
- begin
- if (isr[3] == 1'b1) hp_isr <= 3'd0;
- else if (isr[4] == 1'b1) hp_isr <= 3'd1;
- else if (isr[5] == 1'b1) hp_isr <= 3'd2;
- else if (isr[6] == 1'b1) hp_isr <= 3'd3;
- else if (isr[7] == 1'b1) hp_isr <= 3'd4;
- else if (isr[0] == 1'b1) hp_isr <= 3'd5;
- else if (isr[1] == 1'b1) hp_isr <= 3'd6;
- else if (isr[2] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd3:
- begin
- if (isr[4] == 1'b1) hp_isr <= 3'd0;
- else if (isr[5] == 1'b1) hp_isr <= 3'd1;
- else if (isr[6] == 1'b1) hp_isr <= 3'd2;
- else if (isr[7] == 1'b1) hp_isr <= 3'd3;
- else if (isr[0] == 1'b1) hp_isr <= 3'd4;
- else if (isr[1] == 1'b1) hp_isr <= 3'd5;
- else if (isr[2] == 1'b1) hp_isr <= 3'd6;
- else if (isr[3] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd2:
- begin
- if (isr[5] == 1'b1) hp_isr <= 3'd0;
- else if (isr[6] == 1'b1) hp_isr <= 3'd1;
- else if (isr[7] == 1'b1) hp_isr <= 3'd2;
- else if (isr[0] == 1'b1) hp_isr <= 3'd3;
- else if (isr[1] == 1'b1) hp_isr <= 3'd4;
- else if (isr[2] == 1'b1) hp_isr <= 3'd5;
- else if (isr[3] == 1'b1) hp_isr <= 3'd6;
- else if (isr[4] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd1:
- begin
- if (isr[6] == 1'b1) hp_isr <= 3'd0;
- else if (isr[7] == 1'b1) hp_isr <= 3'd1;
- else if (isr[0] == 1'b1) hp_isr <= 3'd2;
- else if (isr[1] == 1'b1) hp_isr <= 3'd3;
- else if (isr[2] == 1'b1) hp_isr <= 3'd4;
- else if (isr[3] == 1'b1) hp_isr <= 3'd5;
- else if (isr[4] == 1'b1) hp_isr <= 3'd6;
- else if (isr[5] == 1'b1) hp_isr <= 3'd7;
- end
- 3'd0:
- begin
- if (isr[7] == 1'b1) hp_isr <= 3'd0;
- else if (isr[0] == 1'b1) hp_isr <= 3'd1;
- else if (isr[1] == 1'b1) hp_isr <= 3'd2;
- else if (isr[2] == 1'b1) hp_isr <= 3'd3;
- else if (isr[3] == 1'b1) hp_isr <= 3'd4;
- else if (isr[4] == 1'b1) hp_isr <= 3'd5;
- else if (isr[5] == 1'b1) hp_isr <= 3'd6;
- else if (isr[6] == 1'b1) hp_isr <= 3'd7;
- end
- endcase
- // FOR /L %i in (0, 1, 7) do (ECHO "else if (isr[%i] == 1) hp_isr <= %i;" >>a.txt)
- end
- end
- endmodule