在FPGA設(shè)計(jì)開(kāi)發(fā)中,很多場(chǎng)合會(huì)遇到同一根信號(hào)既可以是輸入信號(hào),又可以是輸出信號(hào),即IO類(lèi)型(Verilog定義成inout)。
對(duì)于inout型的信號(hào),我們既可以使用FPGA原語(yǔ)來(lái)實(shí)現(xiàn),也可以使用Verilog代碼來(lái)實(shí)現(xiàn)。下面將介紹在Xilinx 7系列FPGA上兩種實(shí)現(xiàn)方式的差別和注意點(diǎn)。
1.FPGA原語(yǔ)實(shí)現(xiàn)
首先,我們編寫(xiě)的代碼如下:
`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
該代碼通過(guò)原語(yǔ)IOBUF實(shí)現(xiàn)IO功能,使用Vivado編譯后的原理圖如下圖所示??梢钥吹絀OBUF內(nèi)部由OBUFT和IBUF原語(yǔ)構(gòu)成。

2.使用Verilog實(shí)現(xiàn)
把`define PRIMITIVE注釋掉,則為通過(guò)Verilog的實(shí)現(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編譯后的原理圖如下圖所示。該實(shí)現(xiàn)方式也會(huì)調(diào)用IOBUF原語(yǔ),但多消耗了一個(gè)LUT資源。

通過(guò)Verilog實(shí)現(xiàn)時(shí),我們?cè)诎袸O信號(hào)當(dāng)成輸入時(shí)給賦值高阻態(tài)(1‘bz)。假如我們把此時(shí)的IO信號(hào)賦值1‘b0或者1‘b1,會(huì)出現(xiàn)什么情況呢?我們把1‘bz寫(xiě)成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
編譯后的原理圖如下,可以看到并不會(huì)調(diào)用IOBUF原語(yǔ),IO的不能實(shí)現(xiàn)輸入功能,這就是解釋了為什么在使用Verilog實(shí)現(xiàn)一根信號(hào)的IO功能時(shí)需要賦值1‘bz。

-
FPGA
+關(guān)注
關(guān)注
1650文章
22217瀏覽量
627815 -
Xilinx
+關(guān)注
關(guān)注
73文章
2190瀏覽量
129167 -
代碼
+關(guān)注
關(guān)注
30文章
4924瀏覽量
72421
原文標(biāo)題:FPGA之IO信號(hào)類(lèi)型深入理解
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Xilinx 7系列FPGA的時(shí)鐘結(jié)構(gòu)解析
求大神分享基于FPGA的DDFS與DDWS的兩種實(shí)現(xiàn)方式
Xilinx 7系列FPGA管腳是如何定義的?
Xilinx 7系列FPGA芯片管腳定義與封裝
xilinx公司的7系列FPGA應(yīng)用指南
實(shí)現(xiàn)ARM9與FPGA的并口通信的兩種方式
兩種視頻流的展示介紹
兩種JESD204B A/D轉(zhuǎn)換器轉(zhuǎn)FPGA設(shè)置與實(shí)現(xiàn)技巧
Xilinx 7系列FPGA簡(jiǎn)介--選型參考
在MATLAB/simulink中建模時(shí)的兩種不同實(shí)現(xiàn)方式
MATLAB/simulink中兩種實(shí)現(xiàn)建模方式的優(yōu)勢(shì)
Xilinx 7系列與Ultrascale系列FPGA的區(qū)別

在Xilinx 7系列FPGA上兩種實(shí)現(xiàn)方式的差別
評(píng)論