典型的全雙工(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內。
-
FPGA
+關注
關注
1620文章
21510瀏覽量
598882 -
芯片
+關注
關注
450文章
49631瀏覽量
417121 -
緩沖器
+關注
關注
6文章
1903瀏覽量
45324 -
Verilog
+關注
關注
28文章
1333瀏覽量
109712
原文標題:雙向IO與IOB
文章出處:【微信號:Lauren_FPGA,微信公眾號:FPGA技術驛站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論