Line 43... |
Line 43... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.16 2003/12/17 13:00:52 gorand
|
|
// added ECLK and NEC registers, all tests passed.
|
|
//
|
// Revision 1.15 2003/11/10 23:21:22 gorand
|
// Revision 1.15 2003/11/10 23:21:22 gorand
|
// bug fixed. all tests passed.
|
// bug fixed. all tests passed.
|
//
|
//
|
// Revision 1.14 2003/11/06 13:59:07 gorand
|
// Revision 1.14 2003/11/06 13:59:07 gorand
|
// added support for 8-bit access to registers.
|
// added support for 8-bit access to registers.
|
Line 113... |
Line 116... |
|
|
// Auxiliary inputs interface
|
// Auxiliary inputs interface
|
aux_i,
|
aux_i,
|
|
|
// External GPIO Interface
|
// External GPIO Interface
|
ext_pad_i, clk_pad_i, ext_pad_o, ext_padoen_o
|
ext_pad_i, clk_pad_i, ext_pad_o, ext_padoe_o
|
);
|
);
|
|
|
parameter dw = 32;
|
parameter dw = 32;
|
parameter aw = `GPIO_ADDRHH+1;
|
parameter aw = `GPIO_ADDRHH+1;
|
parameter gw = `GPIO_IOS;
|
parameter gw = `GPIO_IOS;
|
Line 144... |
Line 147... |
// External GPIO Interface
|
// External GPIO Interface
|
//
|
//
|
input [gw-1:0] ext_pad_i; // GPIO Inputs
|
input [gw-1:0] ext_pad_i; // GPIO Inputs
|
input clk_pad_i; // GPIO Eclk
|
input clk_pad_i; // GPIO Eclk
|
output [gw-1:0] ext_pad_o; // GPIO Outputs
|
output [gw-1:0] ext_pad_o; // GPIO Outputs
|
output [gw-1:0] ext_padoen_o; // GPIO output drivers enables
|
output [gw-1:0] ext_padoe_o; // GPIO output drivers enables
|
|
|
`ifdef GPIO_IMPLEMENTED
|
`ifdef GPIO_IMPLEMENTED
|
|
|
//
|
//
|
// GPIO Input Register (or no register)
|
// GPIO Input Register (or no register)
|
Line 343... |
Line 346... |
`endif
|
`endif
|
|
|
//
|
//
|
// GPIO registers address decoder
|
// GPIO registers address decoder
|
//
|
//
|
|
`ifdef GPIO_RGPIO_OUT
|
assign rgpio_out_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_OUT) & full_decoding;
|
assign rgpio_out_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_OUT) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_OE
|
assign rgpio_oe_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_OE) & full_decoding;
|
assign rgpio_oe_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_OE) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_INTE
|
assign rgpio_inte_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_INTE) & full_decoding;
|
assign rgpio_inte_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_INTE) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_PTRIG
|
assign rgpio_ptrig_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_PTRIG) & full_decoding;
|
assign rgpio_ptrig_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_PTRIG) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_AUX
|
assign rgpio_aux_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_AUX) & full_decoding;
|
assign rgpio_aux_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_AUX) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_CTRL
|
assign rgpio_ctrl_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_CTRL) & full_decoding;
|
assign rgpio_ctrl_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_CTRL) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_INTS
|
assign rgpio_ints_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_INTS) & full_decoding;
|
assign rgpio_ints_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_INTS) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_ECLK
|
assign rgpio_eclk_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_ECLK) & full_decoding;
|
assign rgpio_eclk_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_ECLK) & full_decoding;
|
|
`endif
|
|
`ifdef GPIO_RGPIO_NEC
|
assign rgpio_nec_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_NEC) & full_decoding;
|
assign rgpio_nec_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`GPIO_OFS_BITS] == `GPIO_RGPIO_NEC) & full_decoding;
|
|
`endif
|
|
|
|
|
//
|
//
|
// Write to RGPIO_CTRL or update of RGPIO_CTRL[INT] bit
|
// Write to RGPIO_CTRL or update of RGPIO_CTRL[INT] bit
|
//
|
//
|
Line 419... |
Line 438... |
`else
|
`else
|
assign rgpio_out = `GPIO_DEF_RGPIO_OUT; // RGPIO_OUT = 0x0
|
assign rgpio_out = `GPIO_DEF_RGPIO_OUT; // RGPIO_OUT = 0x0
|
`endif
|
`endif
|
|
|
//
|
//
|
// Write to RGPIO_OE. Bits in RGPIO_OE are stored inverted.
|
// Write to RGPIO_OE.
|
//
|
//
|
`ifdef GPIO_RGPIO_OE
|
`ifdef GPIO_RGPIO_OE
|
always @(posedge wb_clk_i or posedge wb_rst_i)
|
always @(posedge wb_clk_i or posedge wb_rst_i)
|
if (wb_rst_i)
|
if (wb_rst_i)
|
rgpio_oe <= #1 {gw{1'b0}};
|
rgpio_oe <= #1 {gw{1'b0}};
|
else if (rgpio_oe_sel && wb_we_i)
|
else if (rgpio_oe_sel && wb_we_i)
|
begin
|
begin
|
`ifdef GPIO_STRICT_32BIT_ACCESS
|
`ifdef GPIO_STRICT_32BIT_ACCESS
|
rgpio_oe <= #1 ~wb_dat_i[gw-1:0];
|
rgpio_oe <= #1 wb_dat_i[gw-1:0];
|
`endif
|
`endif
|
|
|
`ifdef GPIO_WB_BYTES4
|
`ifdef GPIO_WB_BYTES4
|
if ( wb_sel_i [3] == 1'b1 )
|
if ( wb_sel_i [3] == 1'b1 )
|
rgpio_oe [gw-1:24] <= #1 ~wb_dat_i [gw-1:24] ;
|
rgpio_oe [gw-1:24] <= #1 wb_dat_i [gw-1:24] ;
|
if ( wb_sel_i [2] == 1'b1 )
|
if ( wb_sel_i [2] == 1'b1 )
|
rgpio_oe [23:16] <= #1 ~wb_dat_i [23:16] ;
|
rgpio_oe [23:16] <= #1 wb_dat_i [23:16] ;
|
if ( wb_sel_i [1] == 1'b1 )
|
if ( wb_sel_i [1] == 1'b1 )
|
rgpio_oe [15:8] <= #1 ~wb_dat_i [15:8] ;
|
rgpio_oe [15:8] <= #1 wb_dat_i [15:8] ;
|
if ( wb_sel_i [0] == 1'b1 )
|
if ( wb_sel_i [0] == 1'b1 )
|
rgpio_oe [7:0] <= #1 ~wb_dat_i [7:0] ;
|
rgpio_oe [7:0] <= #1 wb_dat_i [7:0] ;
|
`endif
|
`endif
|
`ifdef GPIO_WB_BYTES3
|
`ifdef GPIO_WB_BYTES3
|
if ( wb_sel_i [2] == 1'b1 )
|
if ( wb_sel_i [2] == 1'b1 )
|
rgpio_oe [gw-1:16] <= #1 ~wb_dat_i [gw-1:16] ;
|
rgpio_oe [gw-1:16] <= #1 wb_dat_i [gw-1:16] ;
|
if ( wb_sel_i [1] == 1'b1 )
|
if ( wb_sel_i [1] == 1'b1 )
|
rgpio_oe [15:8] <= #1 ~wb_dat_i [15:8] ;
|
rgpio_oe [15:8] <= #1 wb_dat_i [15:8] ;
|
if ( wb_sel_i [0] == 1'b1 )
|
if ( wb_sel_i [0] == 1'b1 )
|
rgpio_oe [7:0] <= #1 ~wb_dat_i [7:0] ;
|
rgpio_oe [7:0] <= #1 wb_dat_i [7:0] ;
|
`endif
|
`endif
|
`ifdef GPIO_WB_BYTES2
|
`ifdef GPIO_WB_BYTES2
|
if ( wb_sel_i [1] == 1'b1 )
|
if ( wb_sel_i [1] == 1'b1 )
|
rgpio_oe [gw-1:8] <= #1 ~wb_dat_i [gw-1:8] ;
|
rgpio_oe [gw-1:8] <= #1 wb_dat_i [gw-1:8] ;
|
if ( wb_sel_i [0] == 1'b1 )
|
if ( wb_sel_i [0] == 1'b1 )
|
rgpio_oe [7:0] <= #1 ~wb_dat_i [7:0] ;
|
rgpio_oe [7:0] <= #1 wb_dat_i [7:0] ;
|
`endif
|
`endif
|
`ifdef GPIO_WB_BYTES1
|
`ifdef GPIO_WB_BYTES1
|
if ( wb_sel_i [0] == 1'b1 )
|
if ( wb_sel_i [0] == 1'b1 )
|
rgpio_oe [gw-1:0] <= #1 ~wb_dat_i [gw-1:0] ;
|
rgpio_oe [gw-1:0] <= #1 wb_dat_i [gw-1:0] ;
|
`endif
|
`endif
|
end
|
end
|
|
|
`else
|
`else
|
assign rgpio_oe = `GPIO_DEF_RPGIO_OE; // RGPIO_OE = 0x0
|
assign rgpio_oe = `GPIO_DEF_RGPIO_OE; // RGPIO_OE = 0x0
|
`endif
|
`endif
|
|
|
//
|
//
|
// Write to RGPIO_INTE
|
// Write to RGPIO_INTE
|
//
|
//
|
Line 510... |
Line 529... |
`endif
|
`endif
|
end
|
end
|
|
|
|
|
`else
|
`else
|
assign rgpio_inte = `GPIO_DEF_RPGIO_INTE; // RGPIO_INTE = 0x0
|
assign rgpio_inte = `GPIO_DEF_RGPIO_INTE; // RGPIO_INTE = 0x0
|
`endif
|
`endif
|
|
|
//
|
//
|
// Write to RGPIO_PTRIG
|
// Write to RGPIO_PTRIG
|
//
|
//
|
Line 557... |
Line 576... |
rgpio_ptrig [gw-1:0] <= #1 wb_dat_i [gw-1:0] ;
|
rgpio_ptrig [gw-1:0] <= #1 wb_dat_i [gw-1:0] ;
|
`endif
|
`endif
|
end
|
end
|
|
|
`else
|
`else
|
assign rgpio_ptrig = `GPIO_DEF_RPGIO_PTRIG; // RGPIO_PTRIG = 0x0
|
assign rgpio_ptrig = `GPIO_DEF_RGPIO_PTRIG; // RGPIO_PTRIG = 0x0
|
`endif
|
`endif
|
|
|
//
|
//
|
// Write to RGPIO_AUX
|
// Write to RGPIO_AUX
|
//
|
//
|
Line 604... |
Line 623... |
rgpio_aux [gw-1:0] <= #1 wb_dat_i [gw-1:0] ;
|
rgpio_aux [gw-1:0] <= #1 wb_dat_i [gw-1:0] ;
|
`endif
|
`endif
|
end
|
end
|
|
|
`else
|
`else
|
assign rgpio_aux = `GPIO_DEF_RPGIO_AUX; // RGPIO_AUX = 0x0
|
assign rgpio_aux = `GPIO_DEF_RGPIO_AUX; // RGPIO_AUX = 0x0
|
`endif
|
`endif
|
|
|
|
|
//
|
//
|
// Write to RGPIO_ECLK
|
// Write to RGPIO_ECLK
|
Line 653... |
Line 672... |
`endif
|
`endif
|
end
|
end
|
|
|
|
|
`else
|
`else
|
assign rgpio_eclk = `GPIO_DEF_RPGIO_ECLK; // RGPIO_ECLK = 0x0
|
assign rgpio_eclk = `GPIO_DEF_RGPIO_ECLK; // RGPIO_ECLK = 0x0
|
`endif
|
`endif
|
|
|
|
|
|
|
//
|
//
|
Line 703... |
Line 722... |
`endif
|
`endif
|
end
|
end
|
|
|
|
|
`else
|
`else
|
assign rgpio_nec = `GPIO_DEF_RPGIO_NEC; // RGPIO_NEC = 0x0
|
assign rgpio_nec = `GPIO_DEF_RGPIO_NEC; // RGPIO_NEC = 0x0
|
`endif
|
`endif
|
|
|
|
|
//
|
//
|
// Latch into RGPIO_IN
|
// Latch into RGPIO_IN
|
Line 1419... |
Line 1438... |
//
|
//
|
always @(wb_adr_i or rgpio_in or rgpio_out or rgpio_oe or rgpio_inte or
|
always @(wb_adr_i or rgpio_in or rgpio_out or rgpio_oe or rgpio_inte or
|
rgpio_ptrig or rgpio_aux or rgpio_ctrl or rgpio_ints or rgpio_eclk or rgpio_nec)
|
rgpio_ptrig or rgpio_aux or rgpio_ctrl or rgpio_ints or rgpio_eclk or rgpio_nec)
|
case (wb_adr_i[`GPIO_OFS_BITS]) // synopsys full_case parallel_case
|
case (wb_adr_i[`GPIO_OFS_BITS]) // synopsys full_case parallel_case
|
`ifdef GPIO_READREGS
|
`ifdef GPIO_READREGS
|
|
`ifdef GPIO_RGPIO_OUT
|
`GPIO_RGPIO_OUT: begin
|
`GPIO_RGPIO_OUT: begin
|
wb_dat[dw-1:0] = rgpio_out;
|
wb_dat[dw-1:0] = rgpio_out;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_OE
|
`GPIO_RGPIO_OE: begin
|
`GPIO_RGPIO_OE: begin
|
wb_dat[dw-1:0] = ~rgpio_oe;
|
wb_dat[dw-1:0] = rgpio_oe;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_INTE
|
`GPIO_RGPIO_INTE: begin
|
`GPIO_RGPIO_INTE: begin
|
wb_dat[dw-1:0] = rgpio_inte;
|
wb_dat[dw-1:0] = rgpio_inte;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_PTRIG
|
`GPIO_RGPIO_PTRIG: begin
|
`GPIO_RGPIO_PTRIG: begin
|
wb_dat[dw-1:0] = rgpio_ptrig;
|
wb_dat[dw-1:0] = rgpio_ptrig;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_NEC
|
`GPIO_RGPIO_NEC: begin
|
`GPIO_RGPIO_NEC: begin
|
wb_dat[dw-1:0] = rgpio_nec;
|
wb_dat[dw-1:0] = rgpio_nec;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_ECLK
|
`GPIO_RGPIO_ECLK: begin
|
`GPIO_RGPIO_ECLK: begin
|
wb_dat[dw-1:0] = rgpio_eclk;
|
wb_dat[dw-1:0] = rgpio_eclk;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_AUX
|
`GPIO_RGPIO_AUX: begin
|
`GPIO_RGPIO_AUX: begin
|
wb_dat[dw-1:0] = rgpio_aux;
|
wb_dat[dw-1:0] = rgpio_aux;
|
end
|
end
|
|
`endif
|
|
`ifdef GPIO_RGPIO_CTRL
|
`GPIO_RGPIO_CTRL: begin
|
`GPIO_RGPIO_CTRL: begin
|
wb_dat[1:0] = rgpio_ctrl;
|
wb_dat[1:0] = rgpio_ctrl;
|
wb_dat[dw-1:2] = {dw-2{1'b0}};
|
wb_dat[dw-1:2] = {dw-2{1'b0}};
|
end
|
end
|
`endif
|
`endif
|
|
`endif
|
|
`ifdef GPIO_RGPIO_INTS
|
`GPIO_RGPIO_INTS: begin
|
`GPIO_RGPIO_INTS: begin
|
wb_dat[dw-1:0] = rgpio_ints;
|
wb_dat[dw-1:0] = rgpio_ints;
|
end
|
end
|
|
`endif
|
default: begin
|
default: begin
|
wb_dat[dw-1:0] = rgpio_in;
|
wb_dat[dw-1:0] = rgpio_in;
|
end
|
end
|
endcase
|
endcase
|
|
|
Line 1502... |
Line 1539... |
`endif
|
`endif
|
|
|
//
|
//
|
// Output enables are RGPIO_OE bits
|
// Output enables are RGPIO_OE bits
|
//
|
//
|
assign ext_padoen_o = rgpio_oe;
|
assign ext_padoe_o = rgpio_oe;
|
|
|
//
|
//
|
// Generate GPIO outputs
|
// Generate GPIO outputs
|
//
|
//
|
assign out_pad = rgpio_out & ~rgpio_aux | aux_i & rgpio_aux;
|
assign out_pad = rgpio_out & ~rgpio_aux | aux_i & rgpio_aux;
|
Line 1531... |
Line 1568... |
// is cleared and WISHBONE transfers complete with errors
|
// is cleared and WISHBONE transfers complete with errors
|
//
|
//
|
assign wb_inta_o = 1'b0;
|
assign wb_inta_o = 1'b0;
|
assign wb_ack_o = 1'b0;
|
assign wb_ack_o = 1'b0;
|
assign wb_err_o = wb_cyc_i & wb_stb_i;
|
assign wb_err_o = wb_cyc_i & wb_stb_i;
|
assign ext_padoen_o = {gw{1'b1}};
|
assign ext_padoe_o = {gw{1'b1}};
|
assign ext_pad_o = {gw{1'b0}};
|
assign ext_pad_o = {gw{1'b0}};
|
|
|
//
|
//
|
// Read GPIO registers
|
// Read GPIO registers
|
//
|
//
|