如何用verilog实现以下功能
assign cam_scl1 = cam_i2c_scl;
assign cam_scl2 = cam_i2c_scl;
...
assign cam_scl8 = cam_i2c_scl;
always@(*)
begin
case(mux) begin
3'd0 : begin
cam_sda_master_out <= cam_sda1_slave_in;
cam_sda1_slave_out <= cam_sda_master_in;
end
3'd1 : begin
cam_sda_master_out <= cam_sda2_slave_in;
cam_sda2_slave_out <= cam_sda_master_in;
end
...
3'd7 : begin
cam_sda_master_out <= cam_sda8_slave_in;
cam_sda8_slave_out <= cam_sda_master_in;
end
end ;
end
然后 cam_sda_master_out /in 通过三态门连接master端
cam_sda1_slave_in/out 通过三态门连接8个slave端
希望能有帮助

我想用FPGA 替换MUX芯片
用CD4066就可以了,有必要用这么贵的东西吗?
这是一个大项目的一小部分,用FPGA一个个取代电路中的器件
如果SDA的数据格式是不变的,那么我是否可以通过寻址的方式来实现,这样的话,SDA又是如何变化的呢
我认为你想要简单的切换是不行,可行的办法是自己设计一个多端口的IIC,才能解决你的问题
手册中的9.2的系统框图画的非常清楚了。从I2Cbus中解析出mux寄存器来,然后去控制8个slave的选通。
如果是FPGA的话,建议用一个低速的时钟来透传SCA和SDA,这样的话,时序有保证。
本来IIC总线是支持1拖n的,给每个从机分配地址就行了
说的再细点,希望有帮助
1.CPU发地址给9个slave (TCA9548也算一个),解析到地址后,TCA9548把SDA拉低(占住总线)。
2.disable 8个slave。
3.TCA9548 release SDA, CPU会继续发command(配置该选通的slave),TCA9548解析command得到mux寄存器。TCA9548把SDA拉低(占住总线)。
4.enable 选通的slave.
5.TCA9548 release SDA.
6.通路建立,TCA9548监控SDA_IN,遇到CPU再发地址的话,重复步骤1
那要是n个器件的地址不可编程且都相同,而且连在一个I2C bus 上该怎么办呢?
说的详细一点,希望有帮助:
1)大致流程:
A)CPU广播发start 到9个slave(FPGA 在这算一个slave).默认9个slave是enable的。
B) CPU广播发slave的地址,FPGA从cam_sda_master_in 中解析出地址,将cam_sda_master_out拉低。
C)FPGA disable 8个slave,然后释放cam_sda_master_out。
D)FPGA解析CPU发的Command byte,得到对8个slave的控制信息mux。将cam_sda_master_out拉低。
E)根据mux的信息,enable相应的slave。然后释放cam_sda_master_out。
F)监测CPU发STOP的信息,检测到STOP信息后,enable 8个slave,然后状态机进入A,继续监测START.
2)对于写来说,多个slave同时选通是可行的,可以把slave的ACK与起来连接到cam_sda_master_out上,对于读来说,多个同时选通,将造成总线冲突,无法得到正确的结果。
3) SDA和SCL的透传,如下,最好使用时序逻辑,以保证时序的要求。
cam_sda_master_out <= cam_sda1_slave_in;
cam_sda1_slave_out <= cam_sda_master_in;
什么手册
网上搜TCA9854a
N个器件的地址相同?这无解的哦
https://www.ti.com/lit/ds/symlink/tca9548a.pdf?HQS=TI-null-null-alldatasheets-df-pf-SEP-wwe
很详细,谢谢了,知道怎么做了,网址发上来,方便以后的朋友
