2016-02-22 23:03:50 +00:00
|
|
|
//
|
|
|
|
// fixed for 9.1 jan 21 2010 cruben
|
|
|
|
//
|
|
|
|
`include "timescale.v"
|
|
|
|
`include "i2c_master_defines.v"
|
|
|
|
|
|
|
|
module i2c_opencores
|
|
|
|
(
|
|
|
|
wb_clk_i, wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o,
|
|
|
|
wb_we_i, wb_stb_i, /*wb_cyc_i,*/ wb_ack_o, wb_inta_o,
|
2016-10-20 22:19:53 +00:00
|
|
|
scl_pad_io, sda_pad_io, spi_miso_pad_i
|
2016-02-22 23:03:50 +00:00
|
|
|
);
|
|
|
|
|
2016-10-20 22:19:53 +00:00
|
|
|
parameter drive_scl_high = 0;
|
2016-02-22 23:03:50 +00:00
|
|
|
|
|
|
|
// Common bus signals
|
|
|
|
input wb_clk_i; // WISHBONE clock
|
|
|
|
input wb_rst_i; // WISHBONE reset
|
|
|
|
|
|
|
|
// Slave signals
|
|
|
|
input [2:0] wb_adr_i; // WISHBONE address input
|
|
|
|
input [7:0] wb_dat_i; // WISHBONE data input
|
|
|
|
output [7:0] wb_dat_o; // WISHBONE data output
|
|
|
|
input wb_we_i; // WISHBONE write enable input
|
|
|
|
input wb_stb_i; // WISHBONE strobe input
|
|
|
|
//input wb_cyc_i; // WISHBONE cycle input
|
|
|
|
output wb_ack_o; // WISHBONE acknowledge output
|
|
|
|
output wb_inta_o; // WISHBONE interrupt output
|
|
|
|
|
|
|
|
// I2C signals
|
|
|
|
inout scl_pad_io; // I2C clock io
|
|
|
|
inout sda_pad_io; // I2C data io
|
|
|
|
|
2016-10-20 22:19:53 +00:00
|
|
|
// SPI MISO
|
|
|
|
input spi_miso_pad_i;
|
|
|
|
|
2016-02-22 23:03:50 +00:00
|
|
|
wire wb_cyc_i; // WISHBONE cycle input
|
|
|
|
// Wire tri-state scl/sda
|
|
|
|
wire scl_pad_i;
|
|
|
|
wire scl_pad_o;
|
|
|
|
wire scl_pad_io;
|
|
|
|
wire scl_padoen_o;
|
|
|
|
|
|
|
|
assign wb_cyc_i = wb_stb_i;
|
|
|
|
assign scl_pad_i = scl_pad_io;
|
2016-10-20 22:19:53 +00:00
|
|
|
assign scl_pad_io = scl_padoen_o ? (drive_scl_high ? 1'b1 : 1'bZ) : scl_pad_o;
|
2016-02-22 23:03:50 +00:00
|
|
|
|
|
|
|
wire sda_pad_i;
|
|
|
|
wire sda_pad_o;
|
|
|
|
wire sda_pad_io;
|
|
|
|
wire sda_padoen_o;
|
|
|
|
|
|
|
|
assign sda_pad_i = sda_pad_io;
|
|
|
|
assign sda_pad_io = sda_padoen_o ? 1'bZ : sda_pad_o;
|
|
|
|
|
|
|
|
// Avalon doesn't have an asynchronous reset
|
|
|
|
// set it to be inactive and just use synchronous reset
|
|
|
|
// reset level is a parameter, 0 is the default (active-low reset)
|
|
|
|
wire arst_i;
|
|
|
|
|
|
|
|
assign arst_i = 1'b1;
|
|
|
|
|
|
|
|
// Connect the top level I2C core
|
|
|
|
i2c_master_top i2c_master_top_inst
|
|
|
|
(
|
|
|
|
.wb_clk_i(wb_clk_i), .wb_rst_i(wb_rst_i), .arst_i(arst_i),
|
|
|
|
|
|
|
|
.wb_adr_i(wb_adr_i), .wb_dat_i(wb_dat_i), .wb_dat_o(wb_dat_o),
|
|
|
|
.wb_we_i(wb_we_i), .wb_stb_i(wb_stb_i), .wb_cyc_i(wb_cyc_i),
|
|
|
|
.wb_ack_o(wb_ack_o), .wb_inta_o(wb_inta_o),
|
|
|
|
|
|
|
|
.scl_pad_i(scl_pad_i), .scl_pad_o(scl_pad_o), .scl_padoen_o(scl_padoen_o),
|
2016-10-20 22:19:53 +00:00
|
|
|
.sda_pad_i(sda_pad_i), .sda_pad_o(sda_pad_o), .sda_padoen_o(sda_padoen_o),
|
|
|
|
.spi_miso_pad_i(spi_miso_pad_i)
|
2016-02-22 23:03:50 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
endmodule
|