在FPGA設(shè)計開發(fā)中,很多場合會遇到同一根信號既可以是輸入信號,又可以是輸出信號,即IO類型(Verilog定義成inout)。
對于inout型的信號,我們既可以使用FPGA原語來實現(xiàn),也可以使用Verilog代碼來實現(xiàn)。下面將介紹在Xilinx 7系列FPGA上兩種實現(xiàn)方式的差別和注意點。
1.FPGA原語實現(xiàn)
首先,我們編寫的代碼如下:
`define PRIMITIVE module io_buf( input T , input I , output O , inout IO ); `ifdef PRIMITIVE IOBUF #( .DRIVE (12 ), // Specify the output drive strength .IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE" .IOSTANDARD ("DEFAULT" ), // Specify the I/O standard .SLEW ("SLOW" ) // Specify the output slew rate ) IOBUF_INST ( .O (O ), // Buffer output .IO (IO ), // Buffer inout port (connect directly to top-level port) .I (I ), // Buffer input .T (T ) // 3-state enable input, high=input, low=output ); `else assign IO = T? I:1'bz; assign O = IO; `endif endmodule
該代碼通過原語IOBUF實現(xiàn)IO功能,使用Vivado編譯后的原理圖如下圖所示??梢钥吹絀OBUF內(nèi)部由OBUFT和IBUF原語構(gòu)成。
2.使用Verilog實現(xiàn)
把`define PRIMITIVE注釋掉,則為通過Verilog的實現(xiàn)方式,如下圖:
//`define PRIMITIVE module io_iobuf( input T , input I , output O , inout IO ); `ifdef PRIMITIVE IOBUF #( .DRIVE (12 ), // Specify the output drive strength .IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE" .IOSTANDARD ("DEFAULT" ), // Specify the I/O standard .SLEW ("SLOW" ) // Specify the output slew rate ) IOBUF_INST ( .O (O ), // Buffer output .IO (IO ), // Buffer inout port (connect directly to top-level port) .I (I ), // Buffer input .T (T ) // 3-state enable input, high=input, low=output ); `else assign IO = T? I:1'bz; assign O = IO; `endif endmodule
該代碼使用Vivado編譯后的原理圖如下圖所示。該實現(xiàn)方式也會調(diào)用IOBUF原語,但多消耗了一個LUT資源。
通過Verilog實現(xiàn)時,我們在把IO信號當成輸入時給賦值高阻態(tài)(1‘bz)。假如我們把此時的IO信號賦值1‘b0或者1‘b1,會出現(xiàn)什么情況呢?我們把1‘bz寫成1‘b1,如下所示:
//`define PRIMITIVE module io_iobuf( input T , input I , output O , inout IO ); `ifdef PRIMITIVE IOBUF #( .DRIVE (12 ), // Specify the output drive strength .IBUF_LOW_PWR ("TRUE" ), // Low Power - "TRUE", High Performance = "FALSE" .IOSTANDARD ("DEFAULT" ), // Specify the I/O standard .SLEW ("SLOW" ) // Specify the output slew rate ) IOBUF_INST ( .O (O ), // Buffer output .IO (IO ), // Buffer inout port (connect directly to top-level port) .I (I ), // Buffer input .T (T ) // 3-state enable input, high=input, low=output ); `else assign IO = T? I:1'b1; assign O = IO; `endif endmodule
編譯后的原理圖如下,可以看到并不會調(diào)用IOBUF原語,IO的不能實現(xiàn)輸入功能,這就是解釋了為什么在使用Verilog實現(xiàn)一根信號的IO功能時需要賦值1‘bz。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21803瀏覽量
606464 -
Xilinx
+關(guān)注
關(guān)注
71文章
2172瀏覽量
122268 -
代碼
+關(guān)注
關(guān)注
30文章
4841瀏覽量
69147
原文標題:FPGA之IO信號類型深入理解
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Xilinx 7系列FPGA的時鐘結(jié)構(gòu)解析
![<b class='flag-5'>Xilinx</b> <b class='flag-5'>7</b><b class='flag-5'>系列</b><b class='flag-5'>FPGA</b>的時鐘結(jié)構(gòu)解析](https://file1.elecfans.com/web2/M00/A2/67/wKgaomTv_gaALvZ8AACcRRHkK8A389.jpg)
求大神分享基于FPGA的DDFS與DDWS的兩種實現(xiàn)方式
Xilinx 7系列FPGA管腳是如何定義的?
Xilinx 7系列FPGA芯片管腳定義與封裝
實現(xiàn)ARM9與FPGA的并口通信的兩種方式
兩種JESD204B A/D轉(zhuǎn)換器轉(zhuǎn)FPGA設(shè)置與實現(xiàn)技巧
Xilinx 7系列FPGA簡介--選型參考
![<b class='flag-5'>Xilinx</b> <b class='flag-5'>7</b><b class='flag-5'>系列</b><b class='flag-5'>FPGA</b>簡介--選型參考](https://file.elecfans.com/web1/M00/DB/AC/o4YBAGAKKoSAaTDJAAiGxO9_fy0760.png)
在MATLAB/simulink中建模時的兩種不同實現(xiàn)方式
MATLAB/simulink中兩種實現(xiàn)建模方式的優(yōu)勢
Xilinx 7系列與Ultrascale系列FPGA的區(qū)別
![<b class='flag-5'>Xilinx</b> <b class='flag-5'>7</b><b class='flag-5'>系列</b>與Ultrascale<b class='flag-5'>系列</b><b class='flag-5'>FPGA</b>的區(qū)別](https://file1.elecfans.com/web2/M00/A3/3F/wKgZomUD_OeAbG-BAALKVVeSlSU117.jpg)
評論