verilog中的inout端口与三态门、高阻态的使用

高阻态

百度百科:高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。

电子学中,高阻态(英语:High impedance)表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。这个概念在三态逻辑上拉电阻中有所涉及。在硬件描述语言(如Verilog HDLVHDL)中,高阻态通常用字母z来表示。

当一个器件具备高电平、低电平、高阻态时就称为三态门。三态门,是指逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。高阻态相当于隔断状态(电阻很大,相当于开路)。三态门都有一个EN控制使能端,来控制门电路的通断。三态门是一种扩展逻辑功能的输出级,也是一种控制开关。主要是用于总线的连接,因为总线只允许同时只有一个使用者。通常在数据总线上接有多个器件,每个器件通过OE/CE之类的信号选通。如器件没有选通的话它就处于高阻态,相当于没有接在总线上,不影响其它器件的工作。

 三态门中,EN‘为0时,门电路正常工作,EN’为1时,T1、T2均截止,整个门电路不对外输出,成高阻态,三态门常用在总线传输中,多个器件共用一个数据总线,通过控制多个EN唯一导通,实现指定器件的数据传输。

双向端口的设计需要考虑三态的使用。因为双向端口在完成输入功能时必须使原来呈输出模式的端口呈高阻状态。否则,待输入的外部数据会与端口处原来的电平发生线与,导致无法将外部数据正确的写入。

结合一个实例来看一下!!就明白了!

首先需要注意几点,1.boot_strap_1定义为了inout类型的端口(tri应该是三态门的意思吧,);

                                2.dsp_rstn_state在此处可看作是控制信号boot_strap_1流向的信号;

                                3."assign a=b;"格式的语句,a都是作为输入被赋值,assign不会被用来给输

                                    出赋值的

inout   tri   [00:00]                boot_strap_1           ,//DSP0_GPIO[1]
parameter       DSP_BOOT_MODE      = 13'b0110000000000;//dsp boot config
assign          boot_strap_1  = (dsp_rstn_state==1'b0)? DSP_BOOT_MODE[0]  : 1'bz;
always@(posedge clk_sys or posedge sys_rst_p1)
  begin
    if(sys_rst_p1 == 1'b1 )
    begin
      Comd_Interrupt <= 1'b0;
      dsp_led        <= 4'b0000;
    end
    else 
    begin
      if(dsp_rstn_state == 1'b1)
      begin
        Comd_Interrupt <= boot_strap_1; 
        dsp_led        <= {boot_strap_4,boot_strap_5,boot_strap_6,boot_strap_7};       
      end    
      else
      begin
        Comd_Interrupt <= 1'b0;  
        dsp_led        <= 4'b0000;
      end
    end

NET "boot_strap_1[0]" LOC = AG12;
NET "boot_strap_1[0]" IOSTANDARD = LVCMOS15;

然后我们再来理解代码,boot_strap_1既要做输入又要做输出,在always块中,当dsp_rstn_state==1'b1时,boot_strap_1赋值给Comd_Interrupt;在assign语句中,dsp_rstn_state==1‘b0时,就赋值为DSP_BOOT_MODE[0],否则就赋值为高阻态。

dsp_rstn_state作为一个控制信号,assign语句是无条件执行的,always@()是要满足括号里的内容才执行虽然一般只是时钟和复位。也就是说dsp_rstn_state为0时,就将DSP_BOOT_MODE[0]赋值,否则就是高阻,为啥是高阻?因为他不能影响到boot_strap_1作为输入的情况,dsp_rstn_state不为0也就是1的时候,要作为输入Comd_Interrupt <= boot_strap_1; 赋值给Comd_Interrupt的,此时为高阻就不会对作为输入信号造成影响。在ucf文件中,也有定义boot_strap_1引脚,这也就是作为输入时所读入的值。

总结一哈,boot_strap_1是inout类型,作为输出时,assign语句有效,作为输入时assign无效,为啥,没有assing input=xxx,给一个输入赋值的。语法上讲 不管是out还是in都可以作为右边赋值给左边,但它按照inout+assign判断高阻态这样写就一定被翻译成三态门。

control作为控制流向的信号,为0就作为output,为1就作为input,所以当他为1的时候就会读取为input作为输入端口使用,为0就会作为output走assign语句。

参考文献

高阻态_百度百科 (baidu.com)

(42条消息) 三态门与高阻态_欧阳海宾-CSDN博客_高阻态输出电压波形图

(42条消息) Verilog中InOut引脚、三态门实现、仿真_爱吃土豆的柯基-CSDN博客

(42条消息) [三态门原理]VHDL中的INOUT双向口使用_Blademaster QAQ的博客-CSDN博客

还有我的师兄,,

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog三态门是一种逻辑门,其输出端具有三种可能的状态:高电平、低电平和高阻态。它通常用于多个设备共享同一个总线的情况下,以防止输出口相互影响和产生干扰。在Verilog,可以使用inout型的三态门来实现这一功能。 下面是一个示例代码,演示了如何实现一个inout型的三态门: ```verilog module tristate_gate ( input logic ctrl, // 控制信号 inout logic out_port // 三态输出端口 ); assign out_port = ctrl ? 1'bz : 1'b0; // 三态门输出计算规则 endmodule ``` 在这个示例,当控制信号`ctrl`为1时,输出端口`out_port`处于高阻态,输出为高阻态;当控制信号`ctrl`为0时,输出端口`out_port`开通,输出为输入信号。这个行为可以根据控制信号的高有效或低有效来确定。 通过使用inout信号和三态门模型,可以实现对inout信号的控制和共享。 #### 引用[.reference_title] - *1* *2* [【FPGA实现三态门(inout)Verilog代码详解】](https://blog.csdn.net/ai52learn/article/details/131356506)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [2022-5-20](https://blog.csdn.net/A15619228315/article/details/124881909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dayana_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值