之前在做一个项目的时候需要使用FPGA与32个I2C设备进行通信,但是一个I2C模块所占的资源也不算太小,如果直接例化32个I2C模块的话将造成FPGA资源的极大浪费。
由于这32个I2C设备不需要同时进行通信,所以我们可以只用一个I2C模块将其接口拓展成32即可。
首先,我们拓展SCL端口。I2C模块的SCL输出信号接口命名为scl_out,以拓展5个接口(scl_0, scl_1, scl_2, scl_3, scl_4, sda_0, sda_1, sda_2, sda_3, sda_4)为例。定义一个选择信号,由于只需要拓展5个,所以3bit数据位就足够了。
reg [2:0] i2c_io_sel;
assign scl_0 = (i2c_io_sel == 3'b000) ? scl_r : 1'b1;
assign scl_1 = (i2c_io_sel == 3'b001) ? scl_r : 1'b1;
assign scl_2 = (i2c_io_sel == 3'b010) ? scl_r : 1'b1;
assign scl_3 = (i2c_io_sel == 3'b011) ? scl_r : 1'b1;
assign scl_4 = (i2c_io_sel == 3'b100) ? scl_r : 1'b1;
如以上代码所示,使用“?:”语句判断是否选择该接口即可。
但是SDA接口是双向接口,需要具有输入和输出功能,定义模块的输入寄存器为 sda_in,于是在信号输入的时候我们可以使用和上面SCL信号拓展的方法,选择到底是哪一路信号输入到模块中。