mirror of
git://projects.qi-hardware.com/nn-usb-fpga.git
synced 2025-01-09 08:00:15 +02:00
80 lines
1.5 KiB
Verilog
80 lines
1.5 KiB
Verilog
module PIC ( DI, DO, addr,
|
|
ISRC_LP, nIRQ,
|
|
CS, nwe, noe,
|
|
MCLK,
|
|
RESET);
|
|
|
|
input [7:0] DI;
|
|
output [7:0] DO;
|
|
input [6:0] addr;
|
|
input [6:0] ISRC_LP;
|
|
output nIRQ;
|
|
input CS, nwe, noe;
|
|
input MCLK, RESET;
|
|
|
|
//------------------------------
|
|
// registros internos
|
|
|
|
|
|
reg nIRQ;
|
|
|
|
reg [7:0] DO; //Registro de salida.
|
|
|
|
|
|
reg [7:0] IRQEnable; //Interrupt Mask
|
|
reg IRQSoft; //Soft interrupt flag
|
|
|
|
|
|
wire [7:0] ISRCF, IREG_LP;
|
|
|
|
assign ISRCF = {ISRC_LP, IRQSoft}; //
|
|
assign IREG_LP = ( ISRCF & IRQEnable); //
|
|
|
|
|
|
always @(posedge MCLK)
|
|
begin
|
|
nIRQ <= ~(|IREG_LP);
|
|
end
|
|
|
|
|
|
always @(CS or addr or noe or IREG_LP or ISRCF or IRQEnable)
|
|
begin
|
|
if (~CS & noe)
|
|
begin
|
|
case (addr)
|
|
7'b0000000: DO<=IREG_LP; //IRQStatus
|
|
7'b0000001: DO<=ISRCF; //IRQRawStatus
|
|
7'b0000010: DO<=IRQEnable; //IRQEnable
|
|
default: DO<=8'b0;
|
|
endcase
|
|
end
|
|
else DO<=8'b0;
|
|
end
|
|
|
|
|
|
always @(posedge MCLK or posedge RESET)
|
|
begin
|
|
if (RESET)
|
|
begin
|
|
IRQEnable <= 8'b0;
|
|
IRQSoft <= 1'b0;
|
|
end
|
|
else
|
|
begin
|
|
if (~CS & nwe)
|
|
begin
|
|
case (addr)
|
|
7'b0000010: IRQEnable <= ( DI | IRQEnable); //EnableSet
|
|
7'b0000011: IRQEnable <= (~DI & IRQEnable); //EnableClear
|
|
7'b0000100: IRQSoft <= DI[1]; //Programmed IRQ
|
|
default: ;
|
|
endcase
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
endmodule
|