双向IO与IOB详解

描述

典型的全双工(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内。

芯片

芯片

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分