这篇blog介绍I2C的学习了,首先要在我们的or1200_soc上添加进来I2C Controller,到opencores社区上面找到i2c_latest.tar.gz这个工程包。
解压得到如下文件目录:
注意啦,这里的i2c_top.v的顶层文件需要自己编写,因为需要在工程的更顶层将i2c_master_top.v里的输入输出信号组织成三态信号。
[plain] view plaincopyprint
- module i2c_top(
- //wishbone interfaces
- wb_clk_i, wb_rst_i, arst_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,
- i2c_scl, i2c_sda
- );
- // wishbone signals
- input wb_clk_i; // master clock input
- input wb_rst_i; // synchronous active high reset
- input arst_i; // asynchronous reset
- input [2:0] wb_adr_i; // lower address bits
- input [7:0] wb_dat_i; // databus input
- output [7:0] wb_dat_o; // databus output
- input wb_we_i; // write enable input
- input wb_stb_i; // stobe/core select signal
- input wb_cyc_i; // valid bus cycle input
- output wb_ack_o; // bus cycle acknowledge output
- output wb_inta_o; // interrupt request signal output
- // i2c signals
- inout i2c_scl; //i2c clock signal
- inout i2c_sda; //i2c data signal
- i2c_master_top i2c_master_top(
- //wishbone interfaces
- .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),
- .sda_pad_i(sda_pad_i),
- .sda_pad_o(sda_pad_o),
- .sda_padoen_o(sda_padoen_o)
- );
- assign i2c_scl = scl_padoen_o 1'bz : scl_pad_o;
- assign i2c_sda = sda_padoen_o 1'bz : sda_pad_o;
- assign scl_pad_i = i2c_scl;
- assign sda_pad_i = i2c_sda;
- endmodule
时间: 2024-08-27 20:17:38