三态门指的是门电路的输出有3种状态:高电平,低电平和高阻态。

当两个以上的设备分时驱动同一根信号线时,就需要用到三态门。
任意一个时刻,只能有一个设备驱动信号,其他设备需要设定为高阻态。
否则,如果两个设备同时驱动同一信号,一个设备输出高电平,一个设备输出低电平,对于推挽输出来说,两个设备间相当于上拉管和下拉管直接短路,瞬时大电流会将设备烧毁,造成严重后果。

FPGA中设定一个信号为三态门,在Verilog中,就是设定该信号的类型为inout。
其等效的电路结构如图所示。

图中的sda信号声明为inout,当ENB为高电平HI时,sda由data_o驱动。
当ENB为低电平LO时,ENB控制的门电路处于高阻状态,相当于切断了data_o和sda之间的通路,对于连接到sda信号的其他设备而言,相当于根本不存在data_o这个驱动源。

此时,该FPGA可从sda管脚读取外部数据。

对于FPGA而言,即便只有一个外设与FPGA相连,如果要通过同一根信号既能读取FPGA数据又能向FPGA写入数据,那么该信号线就需要定义为三态门。

为了测试FGPA上的三态门,写了一个小模块inout_if.v,代码如下:

`timescale 1ns/10psmodule inout_if #(parameter     INOUTIF_ID_NUM = 0) (input           rst_n,input           i_clk,input   [1:0]   rd_cs,input           rd_en,inout           sda);reg     [7:0]   cnt;
reg             clk_out;assign  sda = ((rd_cs == INOUTIF_ID_NUM) & rd_en)   ? clk_out : 1'bz;always @(posedge i_clk or negedge rst_n) beginif (rst_n == 1'b0) begin// resetcnt         <= 8'h0;clk_out     <= 1'b0;endelse begincnt         <= cnt + 1'b1;if (cnt == 2**INOUTIF_ID_NUM) begincnt     <= 8'h0;clk_out <= ~clk_out;endend
endendmodule

式中用INOUTIF_ID_NUM表示该模块的ID号,在testbench中可以通过指定1和2来实现模块识别。
模块的功能是对输入时钟分频2^INOUTIF_ID_NUM。
顶层模块tb_inout_if.v代码如下:

`timescale 1ns/10psmodule tb_inout_if ();wire            tb_clk;
wire            tb_rst_n;
wire            tb_sda;
wire    [1:0]   tb_rd_cs;
wire            tb_rd_en;reg     [1:0]   rd_cs;
reg             rd_en;assign  tb_rd_cs    = rd_cs;
assign  tb_rd_en    = rd_en;
assign  tb_sda      = (tb_rd_en == 1'b0) ? tb_clk : 1'bz;// genrate clock
clk_rst clk_rst_inst(.i_clk  (tb_clk    ),.i_rst_n(tb_rst_n  )
);// user logic
inout_if #(.INOUTIF_ID_NUM (1))inout_if_inst0(.rst_n  (tb_rst_n   ),.i_clk  (tb_clk     ),.rd_cs  (tb_rd_cs   ),.rd_en  (tb_rd_en   ),.sda    (tb_sda     ));inout_if #(.INOUTIF_ID_NUM (2))inout_if_inst1(.rst_n  (tb_rst_n   ),.i_clk  (tb_clk     ),.rd_cs  (tb_rd_cs   ),.rd_en  (tb_rd_en   ),.sda    (tb_sda     ));initial
beginrd_en       <= 1'b0;rd_cs       <= 2'b00;#1000 rd_en  <= 1'b1;rd_cs        <= 2'b01;#1000 rd_cs  <= 2'b10;#1000 rd_cs  <= 2'b00;rd_en        <= 1'b0;
end// dump fsdb file for debussy
initial
begin$fsdbDumpfile("wave.fsdb");$fsdbDumpvars;
endendmodule

辅助时钟和复位信号模块clk_rst.v的代码如下:

`timescale 1ns/10psmodule clk_rst(output reg i_clk,output reg i_rst_n
);parameter CLK_PERIOD = 20;
parameter MULT_RATIO = 10;
parameter RESET_TIME = MULT_RATIO * CLK_PERIOD + 1;initial
begini_rst_n <= 1'b0;#RESET_TIME i_rst_n <= 1'b1;
endinitial
begini_clk <= 1'b0;forever#(CLK_PERIOD / 2) i_clk <= ~i_clk;
endendmodule

编译并调用波形查看器的结果如图所示。

从图中可以看出,当tb_rd_cs为0时,sda由tb_inout_if.v中tb_clk直接驱动;
当tb_rd_cs为1时,sda的信号改为由inout_if_inst0驱动,sda的时钟频率是tb_clk的2*2^1分频;
当tb_rd_cs为2时,sda的信号改为由inout_if_inst1驱动,sda的时钟频率是tb_clk的2*2^2分频;

FPGA三态门使用介绍相关推荐

  1. (134)FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构

    1.1 FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍冯·诺依曼体系结构和哈佛体系结构: 5) ...

  2. (135)FPGA面试题-介绍FPGA的速度等级与温度等级

    1.1 FPGA面试题-介绍FPGA的速度等级与温度等级 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍FPGA的速度等级与温度等级: 5)结束语. ...

  3. (127)FPGA面试题-介绍FPGA 门控时钟

    1.1 FPGA面试题-介绍FPGA 门控时钟 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍FPGA 门控时钟: 5)结束语. 1.1.2 本节引 ...

  4. (123)FPGA面试题-介绍低速接口(UART、IIC、SPI),SPI有几根线,每根线的作用?(三)

    1.1 FPGA面试题-介绍低速接口(UART.IIC.SPI),SPI有几根线,每根线的作用?(三) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介 ...

  5. (111)FPGA面试题-介绍Verilog 块语句fork-join执行过程

    1.1 FPGA面试题-介绍Verilog 块语句fork-join执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog 块语句f ...

  6. (110)FPGA面试题-介绍Verilog块语句begin-end执行过程

    1.1 FPGA面试题-介绍Verilog块语句begin-end执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog块语句beg ...

  7. (108)FPGA面试题-介绍STA静态时序分析及其作用

    1.1 FPGA面试题-介绍STA静态时序分析及其作用 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍STA静态时序分析及其作用: 5)结束语. 1 ...

  8. (3)FPGA开发语言介绍(第1天)

    (3)FPGA开发语言介绍(第1天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA开发语言介绍(第1天) 5)技术交流 6)参考资料 2 FPGA初级课 ...

  9. (2)FPGA开发流程介绍(第1天)

    (2)FPGA开发流程介绍(第1天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA开发流程介绍(第1天) 5)技术交流 6)参考资料 2 FPGA初级课 ...

最新文章

  1. 死锁产生原因-竞争不可剥夺资源
  2. Visual C#创建Windows服务程序
  3. Effective Java读书笔记七:泛型(部分章节需要重读)
  4. Linux文件I/O编程(二)lseek函数
  5. ExtJs:收集基于ExtJs扩展的一些控件。
  6. Service worker 的概念和用法
  7. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  8. vue-awesome-swiper:依赖于6.X版本Swiper时autoplay自动播放设置无效
  9. tinygrad ->要求python3.8以上
  10. 电商项目---完成内容管理cms系统
  11. 360杀毒软件安装在windows2003系统的解决方法
  12. SegmentFault 社区访谈 | Linxz:只会写 CSS 不会写 JS 的“伪”前端
  13. 基于卷积和递归神经网络的物联网流量分类器
  14. 《30天吃掉那只 TensorFlow2.0》 开篇辞(Tensorflow 学习之路)
  15. OSPF 协议中的一个普通区域通过ASBR 注入192.168.0.0/24~192.168.3.0/24 共4 条路由,在ABR 中配置聚合为一条聚合路由192.168.0.0/22,此时ABR 会
  16. 【奥特曼迪迦表情包】
  17. 漏洞复现----6、Jenkins远程命令执行漏洞(CVE-2018-1000861)
  18. Python含金量较高的证书以及学习困难盘点!
  19. SQL 注入漏洞(八)时间注入/延时注入
  20. 数学分形之复牛顿迭代法

热门文章

  1. 光脚丫思考Vue3与实战:第04章 模板语法 第02节 指令的参数+动态参数
  2. Linux 命令之 cp -- 复制文件或目录
  3. 能一次进临界区的时候,不要多次进入
  4. vscode更新之后rg.exe占用cpu过高
  5. 小技巧 | 关于问卷星如何粘贴复制
  6. 基于MATLAB GUI的串口通信
  7. matlab读写xlsx文件和txt文件
  8. python竖线怎么打_Python 极简教程(五)输入输出
  9. DG维护常用命令---oracle DG dataguard
  10. Windows server 2008、2012、2016、2019搭建sftp服务(超级简单)