微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于高阻态z的疑惑

关于高阻态z的疑惑

时间:10-02 整理:3721RD 点击:
最近在学习I2C协议,自己在编I2C模块的时候,想让其空闲时SCL与SDA全部为高阻态
仿真的结果的确是这样,但是在上板调试时,这些仿真为z的地方全部成了低电平,奇怪的是这个管脚我还有硬件的上拉
所以想请问下输出高阻态z在写代码有些什么要注意的地方么?
比如只能是inout口还是output也可以,然后wire reg之类有一些什么要求么?

谢谢~

I2C在空闲状态时,master&slave的SDA PAD都为输入状态,没有信号驱动,此时SDA即表现为高阻态,如果外接上拉电阻,SDA应该为高电平。
IO PAD简单的赋值办法如下:

  1. assign pad = ~oen ? dout : 1'bz;
  2. assign din = pad;

复制代码

如果是单向口,根据IO方向,oen接固定电平即可。



   嗯嗯,谢谢~
现在我很奇怪我仿真出来为高阻态,但是上板调试的时候变成了0 ,我明明板子硬件是上拉的。
我换了一个只输出1‘bz的程序,测试,的确上拉了。

所以我晕了o(╯□╰)o,不知道问题出在哪,的确按这种形式写的啊

bingo

记住一点,FPGA是固定的硬件,很多关键器件,不是你想怎么写,它就怎么综合,它一定要确认能够翻译为FPGA上某一种硬件,你写的RTL才算成功了,否则会出现意想不到的后果。
比如assign a = 1'bz;这种语句,等于没写,没有任何FPGA会把这句话当做“输出三态”,甚至有被优化掉的危险。
而标准的
assign b = tri? b_r : 1'bz;
则可以对应上FPGA端口上的三态门,于是就顺利对应上了你要功能。
所以写RTL语言是需要很多经验的,慢慢学吧,别着急。


学习了

是的。



   谢谢!原来如此。我再改改代码试试

这个问题后来有用其他方法解决了,在用三态门或者双向口的时候,可以直接用FPGA原语来写,这样就不会被综合掉了

学习了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top