1.原理以及主机实现
原理可参考【接口时序】6、IIC总线的原理与Verilog实现,原理讲的很详细,其中也给出了IIC主机的实现思路以及Verilog,包括写数据与读数据的过程,分为两个module。但没有给出从机的Verilog实现,因此我按照其思路设计了相应的从机且为一个module内实现主机的写数据与读数据请求,另外我也将主机的写数据与读数据的合并为一个module。
iic_master.v :IIC主机,可实现写数据与读数据请求的时序。
iic_slave.v :IIC从机,可实现接收主机的写数据与读数据请求的时序。
iic_sim.v :IIC仿真testbench,仿真需要注意的是inout端口sda需要在此文件内实现,单独放到主机或者从机文件中都会出错(一直是x)assign io_sda = sda_mode ? sda_reg: sda_reg_slave;//inout
2.IIC从机的实现
需要先看懂【接口时序】6、IIC总线的原理与Verilog实现
其实按照主机的思路依葫芦画瓢可以有个大概,主要注意几点
1.从机的scl边沿检测,原理很简单,reg一下并保存,01就是上升沿,10下降沿
assign scl_neg = (scl_r == 2