典型的全雙工(Full Duplex)系統(tǒng)如下圖所示,芯片1和芯片2之間有彼此獨(dú)立的數(shù)據(jù)傳輸線,這意味著芯片1和芯片2可以同時(shí)給對(duì)方發(fā)送數(shù)據(jù)而不會(huì)發(fā)生沖突。SPI/UART采用的就是全雙工通信方式。半雙工系統(tǒng)則不同,芯片1和芯片2之間只有一條專(zhuān)用的且被彼此共享的數(shù)據(jù)傳輸線。這就要求芯片1和芯片2必須協(xié)商好,當(dāng)前誰(shuí)發(fā)送數(shù)據(jù),誰(shuí)接收數(shù)據(jù)。如果兩者同時(shí)發(fā)送數(shù)據(jù)就會(huì)導(dǎo)致發(fā)送沖突,從而造成數(shù)據(jù)丟失。I2C采用的就是半雙工通信方式。
在上面兩張圖片中,其中的三角形代表輸入/輸出緩沖器(IBUF/OBUF),在半雙工系統(tǒng)中,多了一個(gè)控制信號(hào)TxEn,該信號(hào)控制的是三態(tài)緩沖器。這里我們先看一下三態(tài)緩沖器的真值表,如下圖所示??梢钥吹絋xEn為1時(shí)三態(tài)緩沖器輸出等于輸入,為0時(shí),輸出為高阻。當(dāng)芯片1和芯片2的TxEn均為高時(shí),兩者均會(huì)驅(qū)動(dòng)數(shù)據(jù)傳輸線發(fā)送數(shù)據(jù),造成沖突。這在半雙工系統(tǒng)中是一定要避免的。
無(wú)論是VHDL還是Verilog/SystemVerilog,都提供了相應(yīng)的語(yǔ)句描述三態(tài)緩沖器,而綜合工具也可將其正確地推斷出來(lái)。下面給出了三態(tài)緩沖器對(duì)應(yīng)的VHDL代碼和Verilog代碼。其中io_data被聲明為雙向信號(hào)。需要注意的是盡管VHDL不區(qū)分大小寫(xiě),但高阻態(tài)則必須用大寫(xiě)Z來(lái)表示,Verilog中大小寫(xiě)均可。
VHDL代碼
Verilog/SystemVerilog代碼
當(dāng)前主流的FPGA結(jié)構(gòu)中,三態(tài)緩沖器只存在于IOB(Input/Output Block)中。因此,對(duì)應(yīng)的雙向IO一定要放在設(shè)計(jì)的頂層、。如果在子模塊中使用了三態(tài)緩沖器,如下圖的I2C子模塊,因?yàn)榫C合工具判斷其出現(xiàn)在子模塊中,所以會(huì)將三態(tài)緩沖器移除使其成為普通輸出,從而造成功能錯(cuò)誤。
我們看一個(gè)案例,相應(yīng)的VHDL代碼和SystemVerilog代碼如下圖所示。雙向端口bio均通過(guò)關(guān)鍵字inout定義。bio作為輸入時(shí)和信號(hào)b相關(guān),作為輸出時(shí)和信號(hào)a相關(guān)。信號(hào)a由寄存器輸出,信號(hào)b連接輸出寄存器的輸入端。這兩組寄存器都可以放置在IOB內(nèi)。
通過(guò)如下圖所示約束可將這兩組寄存器放置在IOB內(nèi),這里屬性IOB的作用對(duì)象是通過(guò)命令get_cells獲取的寄存器對(duì)象。通過(guò)命令report_datasheet可查看是否放置成功。如顯示FDRE(IO)則說(shuō)明該寄存器在IOB內(nèi)。
也可以通過(guò)report_io_reg查看寄存器是否在IOB內(nèi)。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21796瀏覽量
605999 -
芯片
+關(guān)注
關(guān)注
456文章
51170瀏覽量
427252 -
緩沖器
+關(guān)注
關(guān)注
6文章
1930瀏覽量
45645 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110392
原文標(biāo)題:雙向IO與IOB
文章出處:【微信號(hào):Lauren_FPGA,微信公眾號(hào):FPGA技術(shù)驛站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論