Verilog中inout端口的使用方法和仿真方法
时间:10-02
整理:3721RD
点击:
小弟在最近设计中用到inout端口,查看网上的资料都说需要加三态门控制。因此在设计IIC时,在底层module里面讲数据线SDA分为了sda_in和sda_out,并加了一个控制信号sda_en,
利用assign语句赋值,sda=(sda_en)?sda_out:1'bz
此处的疑问是 sda_in如何处理?
仿真时,将inout端口定义为wire型,其他输入定义为reg型,也加入三态门控制,定义data_out和link信号。
在initial块中对data_out赋值,并打开link端口
最后使用assign语句,sda=(link)?data_out:1'bz,这样测试模块的SDA就是输出端口,将激励输出到IIC模块的SDA端口。
有一个疑问是,当测试模块的SDA作为输入端口,接收来自IIC模块的数据时,应该如何操作?
利用assign语句赋值,sda=(sda_en)?sda_out:1'bz
此处的疑问是 sda_in如何处理?
仿真时,将inout端口定义为wire型,其他输入定义为reg型,也加入三态门控制,定义data_out和link信号。
在initial块中对data_out赋值,并打开link端口
最后使用assign语句,sda=(link)?data_out:1'bz,这样测试模块的SDA就是输出端口,将激励输出到IIC模块的SDA端口。
有一个疑问是,当测试模块的SDA作为输入端口,接收来自IIC模块的数据时,应该如何操作?
自己顶一个
assign sda_in = sda;
您好,为什么不是这样呢?sda_in = (!link)?sda : 1'bz,直接把sda给sda_in,会不会存在同时输入输出的问题?
不会同时输入输出,sda_en会控制的
那我把源代码中的sda_in这样处理,你看对不对?sda_in = (sda_en)? sda :'bz;
不用的,你搜一下designware的iic手册,查一下接口电路就明白了。
我看到综合之后的inout端口的电路,sda_in与sda是直接连接起来的应该是高阻态就表示此时正在当做输入端口用,控制信号无效,
控制信号有效的时候当做输出用,对吧?
inout端口输出的时候不能给输入,应该是sda_in = (!sda_en)? sda :1'b0;
可以直接做为输入信号
三态门综合之后的电路,确实是直接把sda赋值给sda_in的,并没有加使能控制。我看网上关于inout端口的原理图上也是直接给的
你的意思是 sda_in = sda是吧?
