欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > FPGA中的双向信号inout与三态门

FPGA中的双向信号inout与三态门

2024/10/24 4:31:24 来源:https://blog.csdn.net/qq_40238141/article/details/142954552  浏览:    关键词:FPGA中的双向信号inout与三态门

       一句话阐述inout与三态门的关系:双向端口inout既可以作为输入端口接收数据,也可以作为输出端口发出数据,双向端口对信号的操作是双向的。双向端口在综合时是以三态门的形式存在的。

三态门的Verilog 功能模型

// Tristate Description Using Concurrent Assignment
// Combinatorial Always Block Can be Used too.module v_three_st_2 (T, I, O);input T, I;output O;assign O = (~T) ? I: 1’bZ;
endmodule

当控制信号T=1时,管子被置为高阻态,输出O为高阻态;当控制信号T=0时,管子开通,输出O=输入I。

三态门中有一个状态是高阻。高阻,即可以认为是没有输出,作为输出端口而言,对下级电路没有任何影响。悬空是针对输入端口来说的,也就是说没有接输入。这也就意味着,实际上高阻和悬空是一个状态,在HDL语言里都表示为Z

也就是说,一个输出端口在高阻态的时候,其状态是由于其相连的其他电路决定的,可以将其看作是输入。

  双向端口用作输出时,使用方式不变,但双向端口作输入引脚时需要将此引脚置为高阻态,这样其电平就可以由外部输入信号决定了(这是高阻态的特性)。

当上面的管子开通时,此时数据可以从上面的管子中通过,此时双向端口为输出端口,Device IO的赋值 from FPGA (输入)

  当上面的管子被置为高阻态时,数据只能从下面的管子通过,此时双向端口为输入端口,Device IO的赋值 to FPGA(输出)。

双向端口的Verilog实现

Verilog中实现双向端口,首先要明确inout端口的变量类型。inout端口只能被定义为net型变量wire,只能采用assign赋值语句,不能在always块内使用。

module inout_def(clk,data_inout)
input clk;
inout data_inout;
reg data_out;
reg data_out_control;
//define data_out//define data_out_control//assign data_inout
assign data_inout=data_out_control?data_out:1'bz;//assign data_in
wire data_in;
assign data_in=(!data_out_control)&data_inout;endmodule

        控制信号data_out_control决定了双向端口data_inout的特性。data_out_control=1时,data_inout作输出,此时将data_out的值赋给data_inout;当data_out_control=0时,data_inout作输入,将data_inout赋给data_in。实际上,当inout端口面向输出处于高阻态时,即data_out_control=0时,inout端口就相当于输入,所以可以直接当作input端口使用。

Verilog代码处理双向信号的两种方式

        1、写代码assign IO_data = (Control == 1’b0)? I_data_in : 1'bz ;assign O_data_out = IO_data ;2、例化IOBUF原语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_data_out),     // Buffer output.IO(IO_data),   // Buffer inout port (connect directly to top-level port).I(I_data_in),     // Buffer input.T(Control)      // 3-state enable input, high=input, low=output);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com