在vivado中,連接的管腳的信號一般都會自動添加OBUF或IBUF。
但是對於inout類型的接口,不會主動添加IOBUF,因為in/out切換需要控制信號,需要用戶自己分配好。
在Language Template中能找到IOBUF的標准實例:
// IOBUF: Single-ended Bi-directional Buffer // All devices // Xilinx HDL Language Template, version 2017.2 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 );
我們現在實例化一個叫 inout spi_io[0]的雙向口
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_io0 ( .O(s_din[0]), // IO_pad輸入。管腳經過IBUF緩沖輸出到內部信號 .IO(spi_io[0]), // pad接口/管腳 .I(s_dout[0]), // 輸出到IO_pad。內部信號經過OBUF緩沖到管腳 .T(x_writ_read) // 當IO_pad需要輸入的時候,使能OBUF使其輸出高組態。 );
1、原語中的O/I都是針對這個BUF來說的,不是針對管腳,務必注意。
我們把 .IO() 端口當成pad管腳一側,那么
需要輸出到io的內部信號填入到 .I(),通過OBUF緩沖輸出到.IO()管腳;
從.IO()管腳輸入進來的信號經過IBUF緩沖到 .O()內部信號。
輸入信號想要正確,那么這個時候的OBUF必須是高阻z,也就是 .T()要有效。
所以 .T() 填管腳input的使能條件,即讓輸出無效,這里是read。
2、原語只支持一個信號的處理,如果處理多位總線,需要用到循環語句。
genvar i; generate for(i=0;i<8;i=i+1) begin // iobuf end endgenerate