Line 55... |
Line 55... |
// This register resets the edge sense circuitry
|
// This register resets the edge sense circuitry
|
// indicated by the low order five bits of the input data.
|
// indicated by the low order five bits of the input data.
|
//
|
//
|
// 0x80 - irq control for irq #0
|
// 0x80 - irq control for irq #0
|
// 0x84 - irq control for irq #1
|
// 0x84 - irq control for irq #1
|
// bits 0 to 6 = cause code to issue
|
// bits 0 to 7 = cause code to issue
|
// bits 8 to 10 = irq level to issue
|
// bits 8 to 11 = irq level to issue
|
// bit 16 = irq enable
|
// bit 16 = irq enable
|
// bit 17 = edge sensitivity
|
// bit 17 = edge sensitivity
|
//=============================================================================
|
//=============================================================================
|
|
|
module FT64_pic
|
module FT64_pic
|
Line 95... |
Line 95... |
reg [31:0] iedge;
|
reg [31:0] iedge;
|
reg [31:0] rste;
|
reg [31:0] rste;
|
reg [31:0] es;
|
reg [31:0] es;
|
reg [5:0] cause_base;
|
reg [5:0] cause_base;
|
reg [3:0] irq [0:31];
|
reg [3:0] irq [0:31];
|
reg [6:0] cause [0:31];
|
reg [7:0] cause [0:31];
|
integer n;
|
integer n;
|
|
|
initial begin
|
initial begin
|
ie <= 32'h0;
|
ie <= 32'h0;
|
es <= 32'hFFFFFFFF;
|
es <= 32'hFFFFFFFF;
|
rste <= 32'h0;
|
rste <= 32'h0;
|
for (n = 0; n < 32; n = n + 1) begin
|
for (n = 0; n < 32; n = n + 1) begin
|
cause[n] <= 7'h00;
|
cause[n] <= 8'h00;
|
irq[n] <= 4'h8;
|
irq[n] <= 4'h8;
|
end
|
end
|
end
|
end
|
|
|
wire cs = cyc_i && stb_i && adr_i[31:8]==pIOAddress[31:8];
|
wire cs = cyc_i && stb_i && adr_i[31:8]==pIOAddress[31:8];
|
Line 136... |
Line 136... |
ie[dat_i[4:0]] <= adr_i[2];
|
ie[dat_i[4:0]] <= adr_i[2];
|
6'd4: es <= dat_i[31:0];
|
6'd4: es <= dat_i[31:0];
|
6'd5: rste[dat_i[4:0]] <= 1'b1;
|
6'd5: rste[dat_i[4:0]] <= 1'b1;
|
6'b1?????:
|
6'b1?????:
|
begin
|
begin
|
cause[adr_i[6:2]] <= dat_i[6:0];
|
cause[adr_i[6:2]] <= dat_i[7:0];
|
irq[adr_i[6:2]] <= dat_i[11:8];
|
irq[adr_i[6:2]] <= dat_i[11:8];
|
ie[adr_i[6:2]] <= dat_i[16];
|
ie[adr_i[6:2]] <= dat_i[16];
|
es[adr_i[6:2]] <= dat_i[17];
|
es[adr_i[6:2]] <= dat_i[17];
|
end
|
end
|
endcase
|
endcase
|
Line 153... |
Line 153... |
if (irqenc!=5'd0)
|
if (irqenc!=5'd0)
|
$display("PIC: %d",irqenc);
|
$display("PIC: %d",irqenc);
|
if (cs)
|
if (cs)
|
casez (adr_i[7:2])
|
casez (adr_i[7:2])
|
6'd0: dat_o <= {cause_base,3'd0} + irqenc;
|
6'd0: dat_o <= {cause_base,3'd0} + irqenc;
|
6'b1?????: dat_o <= {es[adr_i[6:2]],ie[adr_i[6:2]],4'b0,irq[adr_i[6:2]],1'b0,cause[adr_i[6:2]]};
|
6'b1?????: dat_o <= {es[adr_i[6:2]],ie[adr_i[6:2]],4'b0,irq[adr_i[6:2]],cause[adr_i[6:2]]};
|
default: dat_o <= ie;
|
default: dat_o <= ie;
|
endcase
|
endcase
|
else
|
else
|
dat_o <= 32'h0000;
|
dat_o <= 32'h0000;
|
end
|
end
|
|
|
assign irqo = (irqenc == 5'h0) ? 4'd0 : irq[irqenc];
|
assign irqo = (irqenc == 5'h0) ? 4'd0 : irq[irqenc];
|
assign causeo = (irqenc == 5'h0) ? 7'd0 : cause[irqenc];
|
assign causeo = (irqenc == 5'h0) ? 8'd0 : cause[irqenc];
|
assign nmio = nmii & ie[0];
|
assign nmio = nmii & ie[0];
|
|
|
// Edge detect circuit
|
// Edge detect circuit
|
always @(posedge clk_i)
|
always @(posedge clk_i)
|
begin
|
begin
|