前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >双向IO与IOB

双向IO与IOB

作者头像
Lauren的FPGA
发布2024-06-19 18:41:28
840
发布2024-06-19 18:41:28
举报
文章被收录于专栏:Lauren的FPGALauren的FPGA

典型的全双工(Full Duplex)系统如下图所示,芯片1和芯片2之间有彼此独立的数据传输线,这意味着芯片1和芯片2可以同时给对方发送数据而不会发生冲突。SPI/UART采用的就是全双工通信方式。半双工系统则不同,芯片1和芯片2之间只有一条专用的且被彼此共享的数据传输线。这就要求芯片1和芯片2必须协商好,当前谁发送数据,谁接收数据。如果两者同时发送数据就会导致发送冲突,从而造成数据丢失。I2C采用的就是半双工通信方式。

在上面两张图片中,其中的三角形代表输入/输出缓冲器(IBUF/OBUF),在半双工系统中,多了一个控制信号TxEn,该信号控制的是三态缓冲器。这里我们先看一下三态缓冲器的真值表,如下图所示。可以看到TxEn为1时三态缓冲器输出等于输入,为0时,输出为高阻。当芯片1和芯片2的TxEn均为高时,两者均会驱动数据传输线发送数据,造成冲突。这在半双工系统中是一定要避免的。

无论是VHDL还是Verilog/SystemVerilog,都提供了相应的语句描述三态缓冲器,而综合工具也可将其正确地推断出来。下面给出了三态缓冲器对应的VHDL代码和Verilog代码。其中io_data被声明为双向信号。需要注意的是尽管VHDL不区分大小写,但高阻态则必须用大写Z来表示,Verilog中大小写均可。

VHDL代码

Verilog/SystemVerilog代码

当前主流的FPGA结构中,三态缓冲器只存在于IOB(Input/Output Block)中。因此,对应的双向IO一定要放在设计的顶层、。如果在子模块中使用了三态缓冲器,如下图的I2C子模块,因为综合工具判断其出现在子模块中,所以会将三态缓冲器移除使其成为普通输出,从而造成功能错误。

我们看一个案例,相应的VHDL代码和SystemVerilog代码如下图所示。双向端口bio均通过关键字inout定义。bio作为输入时和信号b相关,作为输出时和信号a相关。信号a由寄存器输出,信号b连接输出寄存器的输入端。这两组寄存器都可以放置在IOB内。

通过如下图所示约束可将这两组寄存器放置在IOB内,这里属性IOB的作用对象是通过命令get_cells获取的寄存器对象。通过命令report_datasheet可查看是否放置成功。如显示FDRE(IO)则说明该寄存器在IOB内。

也可以通过report_io_reg查看寄存器是否在IOB内。

Copyright @ FPGA技术驿站

转载事宜请私信 | 获得授权后方可转载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档