在FPGA設計開發中,很多場合會遇到同一根信號既可以是輸入信號,又可以是輸出信號,即IO類型(Verilog定義成inout)。
對于inout型的信號,我們既可以使用FPGA原語來實現,也可以使用Verilog代碼來實現。下面將介紹在Xilinx 7系列FPGA上兩種實現方式的差別和注意點。
1.FPGA原語實現
首先,我們編寫的代碼如下:
`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實現IO功能,使用Vivado編譯后的原理圖如下圖所示。可以看到IOBUF內部由OBUFT和IBUF原語構成。
2.使用Verilog實現
把`define PRIMITIVE注釋掉,則為通過Verilog的實現方式,如下圖:
//`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編譯后的原理圖如下圖所示。該實現方式也會調用IOBUF原語,但多消耗了一個LUT資源。
通過Verilog實現時,我們在把IO信號當成輸入時給賦值高阻態(1‘bz)。假如我們把此時的IO信號賦值1‘b0或者1‘b1,會出現什么情況呢?我們把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
編譯后的原理圖如下,可以看到并不會調用IOBUF原語,IO的不能實現輸入功能,這就是解釋了為什么在使用Verilog實現一根信號的IO功能時需要賦值1‘bz。
-
FPGA
+關注
關注
1630文章
21759瀏覽量
604321 -
Xilinx
+關注
關注
71文章
2168瀏覽量
121690 -
代碼
+關注
關注
30文章
4803瀏覽量
68749
原文標題:FPGA之IO信號類型深入理解
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論