概述
在用FPGA开发通信系统时,经常会遇到FPGA接口的双工通信、FPGA的inout端口定义,以及端口三态等概念,如何理解双工通信、inout及三态这三个概念之间的关系,下面总结梳理如下。
双工通信与inout
双工通信包括全双工通信、半双工通信和单工通信,例如以FPGA作为了一个源来看(即观察目标),全双工通信是指FPGA用两根引脚,分别定义为input输入端口和output输出端口,与外部模块同时双向通信,发送与接收互不影响;半双工通信是指FPGA进行仅用一个引脚,与外部模块进行双向通信,但是发送与接收不能同时进行,这种端口即为inout端口;单工就不用多说了,要么定义为input输入端口或output输出端口,只能实现单向通信。
即在半双工通信中我们引出了inout端口。
三态与inout
三态是指芯片的输出端口有高电平、低电平和高阻态三种状态,高阻态是指该芯片的输出管脚切断了与外部其他芯片的连接,输出端口三态模型如下图:
用verilog可以表示为assign dataout = (enable == 1’b1) ? 1’bz : logic_data。
三态仅表示输出端口的状态,却是实现inout端口的基础,通过输出高阻态,实现端口输入功能,因此得到inout端口的模型如下图:
inout模块示例
下面是xilinx的ad_iobuf实现inout模块示例代码,通过该模块可以将对外单端口信号转换为内部logic需要的输入和输出信号。
module ad_iobuf (
dio_t,
dio_i,
dio_o,
dio_p);
parameter DATA_WIDTH = 1;
input [(DATA_WIDTH-1):0] dio_t;//端口输出三态控制端
input [(DATA_WIDTH-1):0] dio_i;//端口输出信号
output [(DATA_WIDTH-1):0] dio_o;//采集到的端口输入信号,供FPGA内部逻辑使用
inout [(DATA_WIDTH-1):0] dio_p;//对外输入输出端口
genvar n;
generate
for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_iobuf
assign dio_o[n] = dio_p[n];
assign dio_p[n] = (dio_t[n] == 1'b1) ? 1'bz : dio_i[n];
end
endgenerate