典型的全雙工(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
+關注
關注
1644文章
21993瀏覽量
615459 -
芯片
+關注
關注
459文章
52308瀏覽量
437907 -
緩沖器
+關注
關注
6文章
2039瀏覽量
46777 -
Verilog
+關注
關注
29文章
1366瀏覽量
111996
原文標題:雙向IO與IOB
文章出處:【微信號:Lauren_FPGA,微信公眾號:FPGA技術驛站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
FPGA中雙向端口IO的研究
無法將符號組合到單個IOB中
DCM/IOB不合適
IOB / BUFGCTRL時鐘元件對發生錯誤
不兼容的IOB被鎖定到同一個銀行11沖突的IO標準是什么
stm32單片機準雙向IO口配置介紹
一文詳解Spartan-6系列IO Tile結構

《Linux設備驅動開發詳解》第9章、Linux設備驅動中的異步通知與異步IO

FPGA中IOB寄存器的使用教程詳細說明
FPGA中IOB寄存器的使用心得
xilinx FPGA的IOB使用教程說明

關于stm32單片機準雙向IO口配置

xilinx FPGA IOB約束使用以及注意事項

評論