FPGA基础知识极简教程(8)详解三态缓冲器

article/2025/9/17 23:43:27



博文目录


  • 写在前面
  • 正文
  • 全双工与半双工
  • FPGA和ASIC中的三态缓冲器
  • 如何在VHDL和Verilog中推断出三态缓冲区
  • 参考资料
  • 交个朋友


写在前面

下面用举例子的方式引出三态门,内容过长,大家可直接跳过,进入正文!

三态门在FPGA以及ASIC设计中十分常用,随便举一个例子,在RAM的设计中(无论是同步读写RAM还是异步读写RAM设计),我们常将数据总线设计成inout类型,下面是一个设计程序实例:

复制
      
`timescale 1ns / 1ps
//
// Engineer: Reborn Lee
// Module Name: single_port_syn_ram
/
module single_port_syn_ram#(
parameter ADDR_WIDTH = 4,
parameter DATA_WIDTH = 16,
parameter DEPTH = 2**ADDR_WIDTH
)(
input i_clk,
input [ADDR_WIDTH - 1 : 0] addr,
inout [DATA_WIDTH - 1 : 0] data,
input cs,
input wr,
input oe

);

reg [DATA_WIDTH - 1 : 0] mem[0 : DEPTH - 1];
reg [DATA_WIDTH - 1 : 0] mid_data;

// write part
always@(posedge i_clk) begin
if(cs&wr) begin
mem[addr] <= data;
end
end

// read part
always@(posedge i_clk) begin
if(cs & !wr) begin
mid_data <= mem[addr];
end
end

assign data = (cs & oe & !wr)? mid_data: 'hz;

endmodule
  • /li>

在读数据的时候,我们需要设计一个三态缓冲器,如下:

复制
      
assign data = (cs & oe & !wr)? mid_data: 'hz;
  • 1.

读使能有效时,我们将从缓冲区读出的数据放到mid_data中,之后通过一个三态门来将数据mid_data输出到三态总线上,此三态门的使能条件为读使能!

这条语句在综合工具中就会被推断为一个三态缓冲器!

在读使能有效时,将读取数据放在总线上,否则呈现为高阻态,避免占用此数据总线。

在testbench文件中,我们同样需要作出类似的操作,如下针对上面的ram的测试文件:

复制
      
`timescale 1ns / 1ps
///
// Engineer: Reborn Lee
// Module Name: ram_tb
//
module ram_tb(
);
parameter ADDR_WIDTH = 4;
parameter DATA_WIDTH = 16;
parameter DEPTH = 2**ADDR_WIDTH;

reg i_clk;
reg [ADDR_WIDTH - 1 : 0] addr;
wire [DATA_WIDTH - 1 : 0] data;
reg cs;
reg wr;
reg oe;

reg [DATA_WIDTH-1:0] tb_data;

//generate system clock
initial begin
i_clk = 0;
forever begin
# 5 i_clk = ~i_clk;
end
end

assign data = !oe ? tb_data : 'hz;

initial begin
{cs, wr, addr, tb_data, oe} = 0;

repeat (2) @ (posedge i_clk);

//write test

for (integer i = 0; i < 2**ADDR_WIDTH; i= i+1) begin
repeat (1) @(negedge i_clk) addr = i; wr = 1; cs =1; oe = 0; tb_data = $random;
end

//read test
repeat (2) @ (posedge i_clk);

for (integer i = 0; i < 2**ADDR_WIDTH; i= i+1) begin
repeat (1) @(posedge i_clk) addr = i; wr = 0; cs = 1; oe = 1;
end

#20 $finish;
end

single_port_syn_ram #(
.ADDR_WIDTH(ADDR_WIDTH),
.DATA_WIDTH(DATA_WIDTH),
.DEPTH(DEPTH)
) inst_single_port_syn_ram (
.i_clk (i_clk),
.addr (addr),
.data (data),
.cs (cs),
.wr (wr),
.oe (oe)
);

endmodule
  • .
  • 64.
  • 65.

由于inout端口在测试文件中必须设置为wire类型,因此,我们在设计写数据时,需要定义一个中间reg类型变量,这个变量在写使能有效时候输入给写数据端口,如下:

复制
      
assign data = !oe ? tb_data : 'hz;
  • 1.

否则,也就是写使能无效时,就为高阻态,不占用数据总线!

注:上面用了oe无效代替写使能有效,有点不太严谨,但也没问题 ,仅供各位参考!


  • 个人微信公众号: FPGA LAB
  • 个人博客首页
  • 注:学习交流使用!



正文

三态缓冲器可以处于以下三种状态之一:逻辑0,逻辑1和Z(高阻抗)。它们的使用允许多个驱动程序共享一条公共线路。这使得它们在半双工通信中特别有用。让我们首先讨论半双工和全双工通信之间的区别。

全双工与半双工

全双工和半双工的区别可以使用下面的两幅图来说明:

在全双工系统中,有两个路径用于在两个芯片之间发送数据。从芯片1到芯片2有一条专用路径,从芯片2到芯片1有一条专用路径。在半双工系统中,只有一条路径可以在两个芯片之间发送数据。因此,这两个芯片必须在要传输的对象上达成共识。如果两者尝试同时传输,则线路上将发生冲突,并且数据将丢失。

FPGA基础知识极简教程(8)详解三态缓冲器_缓冲器

FPGA基础知识极简教程(8)详解三态缓冲器_缓冲器_02

在以上两个图中,三角形是您的缓冲区。注意,在半双工框图中,存在信号Tx En。这是控制三态发送缓冲器的信号。在全双工块图中,此信号不是必需的,因为两个发送器都可以在100%的时间内打开,而不会在线路上发生冲突。

FPGA和ASIC中的三态缓冲器

如下为三态缓冲器的真值表:

Tx Data

Tx Enable

Output

0

1

0

1

1

1

X

0

Z (high impedance)

请注意,如果两个Tx En同时都为高,则两个发送器都将在驱动并且线路上将发生冲突。 使用半双工三态缓冲器时,至关重要的是,共享线路的模块必须制定出一种避免数据冲突的通信方案。

如何在VHDL和Verilog中推断出三态缓冲区

综合工具可以推断出三态缓冲器。这是在VHDL中推断三态缓冲区的方法。信号io_data 在实体的端口映射部分中声明为inout。在VHDL中,“ Z”为高阻抗。

复制
      
inout io_data : std_logic; --port declaration of bidirectional data line

io_data <= w_Tx_Data when w_Tx_En = '1' else 'Z';
w_Rx_Data <= io_data;
  • 1.
  • 2.
  • 3.
  • 4.

这是在Verilog中推断三态缓冲区的方法。信号io_data 在模块的端口声明部分中声明为inout。在Verilog中,1’bZ是高阻抗。

复制
      
inout io_data; //port declaration of bidirectional data line

assign io_data = Tx_En ? Tx_Data : 1'bZ;
assign Rx_Data = io_data;
  • 1.
  • 2.
  • 3.
  • 4.

三态缓冲器常用于半双工UART和I2C接口等电路中。它们是数字设计师了解的非常有用的工具。您应该知道如何在VHDL和Verilog中推断三态缓冲区。


参考资料


参考资料1参考资料2参考资料3



交个朋友


  • 个人微信公众号:FPGA LAB
  • 知乎:李锐博恩
  • FPGA/IC技术交流2020


link


http://chatgpt.dhexx.cn/article/3cDoDyvw.shtml

相关文章

三态缓冲器的工作原理

转载自---百家号 三态缓冲器&#xff08;Three-state buffer&#xff09;&#xff0c;又称为三态门、三态驱动器&#xff0c;其三态输出受到使能输出端的控制&#xff0c;当使能输出有效时&#xff0c;器件实现正常逻辑状态输出&#xff08;逻辑0、逻辑1&#xff09;&#xff…

VSCODE调试时在cygwin.S中发生段错误

起因&#xff1a; C实现矩阵类和向量类 当看了我实现的矩阵类后&#xff0c;一个同学问我&#xff1a; 然后我就试了试1000维&#xff0c;结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault&#xff0c;而且这个文件还是一片空白&#xff0c;压根就没有代码 后来一番…

【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!

写在前面 Tomcat作为最常用的Java Web服务器&#xff0c;随着并发量越来越高&#xff0c;Tomcat的性能会急剧下降&#xff0c;那有没有什么方法来优化Tomcat在高并发环境下的性能呢&#xff1f; Tomcat运行模式 Tomcat的运行模式有3种。 1.bio模式 默认的模式,性能非常低下,…

Java-JVM-常用参数和调优方案(超保姆级)

Java-JVM-常用参数和调优方案 必须了解的内容 必须看过Java-JVM基础(调优必须知道)知道JVM大概的情况,这篇文章我博客里有 堆区&#xff08;Java堆&#xff1a;所有的线程共享该区域&#xff09; 通过new的方式创建的对象(一个类的实例)、数组所占的空间。 非堆区&#xff1a…

嵌入式知识图谱WiKi(嵌入式开发/研发入门教程和路线图)

嵌入式知识图谱WiKi 作者将狼才鲸创建时间2022-02-18 因图床更新不方便&#xff0c;最新版请跳转到Gitee文档源文件仓库网址 才鲸 / 嵌入式知识图谱WiKi CSDN有图的文档阅读网址 嵌入式知识图谱WiKi Bilibili视频讲解网址&#xff08;待完成&#xff09; 才鲸嵌入式主页 一、概…

select、poll和epoll

select、poll和epoll 对select、poll、epoll了解得不多&#xff0c;下面是从《构建高性能Web站点》摘录下来的介绍&#xff0c;等以后真正接触到select、poll和epoll方面的开发再详细写一下使用上的区别。 select select最早于1983年出现在4.2BSD中&#xff0c;它通过一个sele…

Mysql 和 Postgresql(PGSQL) 对比

Mysql 和 Postgresql(PGSQL) 对比 转载自&#xff1a;http://www.oschina.net/question/96003_13994 PostgreSQL与MySQL比较 MySQL使用太广泛了&#xff0c;以至于我不得不将一些应用从mysql 迁移到postgresql, 很多开源软件都是以Mysql 作为数据库标准&#xff0c;并且以Mysq…

JVM系列之常用参数的查看和设置

JVM常用参数 参数名称含义默认值说明-Xms初始堆大小&#xff0c;等价于-XX:InitialHeapSize物理内存的1/64默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时&#xff0c;JVM就会增大堆直到-Xmx的最大限制.-Xmx最大堆大小&#xff0c;等价于-XX:MaxHeapSize物理内存的1/…

Tomcat内存调整和默认线程池调整

上线了很久的一个项目&#xff08;财政数据共享平台&#xff09;&#xff0c;由于领导要求&#xff0c;新来的同事就把新项目&#xff08;社保数据共享&#xff09;做在了该项目上&#xff0c;这就导致了许多的问题&#xff0c;先从日志说起&#xff0c;该同事把数据获取和传送…

lunix下修改tomcat的堆内存大小

修改tomcat的初始堆大小和最大堆大小 要添加在tomcat 的bin 下catalina.sh 里&#xff0c;位置cygwinfalse前 。注意引号要带上,红色的为新添加的. # OS specific support. $var _must_ be set to either true or false.JAVA_OPTS"-Xms256m -Xmx512m -Xss1024K -XX:Perm…

java对象内存布局和对象定位

目录 观察对象在内存中的存储布局 利用java agent 利用JOL工具 Java对象定位 直接指针寻址 间接寻址 JIT(Just In-Time Compiler&#xff09; c1、c2 编译线程 c1, c2编译器线程高CPU消耗 - 潜在的解决方案 使用字节码和汇编语言同步分析volatile&#xff0c;synchron…

【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南

目录标题 Valgrind 工具的安装 交叉编译Valgrind Valgrind 工具的作用Memcheck 内存泄漏检测工具常规检测&#xff08;程序结束后生成报告&#xff09;重要参数长时间运行的服务使报告输出至文件报告分析示例一分析\_示例一示例二分析\_示例二 Massif堆栈检测工具Massif的基本…

C/C++开发,无可避免的多线程(篇一).跨平台并发编程姗姗来迟

目录 一、编译环境准备 1.1 编译环境配置 1.2 先睹为快的c11多线程编程示例 二、c/c并发编程支持 2.1 进程与线程 2.2 c/c多线程的并发编程 2.3 c11以前的多线程支持 2.4 c11以后的多线程支持 2.5 线程与互斥锁 2.6 跨线程安全问题 三、认识c/c的thread 3.1 std::thread类 3…

windows利器之cygwin

好久没写文章了&#xff0c;诸事烦身&#xff0c;脱不开。。。 不想开虚拟机占内存&#xff0c;同时还想在windows下使用linux命令&#xff0c;那就是cygwin了 第一部分 去官网下一个exe https://cygwin.com/install.html 直接运行&#xff0c; 基本都是默认&#xff0c; …

spi时序图怎么分析,怎么看懂spi时序图

我做产品的时候&#xff0c;最怕就是做IIC和SPI的通信。 这两种协议时序哪怕是延时时间有误差&#xff0c;都有可能导致通信不上。 出现问题的时候&#xff0c;如果没设备也很难排查问题到底出在哪里。 有时候这个产品写好的时序程序&#xff0c;换一个单片机用同一个程序移植过…

怎么看懂单片机时序图?

本人没有上过单片机相关的专业课&#xff0c;是在《计算机系统结构》里遇见的时序图。由于看不懂加之老师没有专门讲&#xff0c;因此自行查阅了相关的视频和博客。&#xff08;参考视频已放在文末&#xff09; 网上资源贫瘠&#xff0c;不过我也不需要太过深入的知识。 大家…

UML系列——时序图(顺序图)

引言 用例图、类图、活动图、时序图之间是什么关系&#xff1f; 时序图有什么作用&#xff1f; 先来模拟一下三国演义的赤壁之战的时序图&#xff0c;先知道它到底长什么样子&#xff0c;再深入介绍&#xff1a; 小伙伴惊呆了&#xff0c;这样画战略图&#xff0c;一目了然&…

UML图之五——时序图

一、什么是时序图 序列图表示了系统在参与者互动执行某一个用例期间,系统内部的一群对象的协作情况。一个用例就对应一个时序图。序列图是对系统动态行为进行描述。用于用例分析和设计阶段。 二、对比 1、序列图和协作图 序列图跟协作图相似,两种图传递的意思是一样的。不…

浅谈时序图

前序&#xff1a; 这周基本都在肝txmini项目&#xff0c;不知道是不是我菜&#xff0c;总觉得难度还是挺高的&#xff0c;所以就没太多时间整理知识点了。 项目进展了快大半个月了&#xff0c;最后因为性能问题&#xff0c;我们还是选择重构原来的代码。准备用golang去重构原本…

读懂时序图

UML建模之时序图&#xff08;Sequence Diagram&#xff09; 时序图简介&#xff08;Brief introduction&#xff09;时序图元素&#xff08;Sequence Diagram Elements&#xff09; 角色&#xff08;Actor&#xff09;对象&#xff08;Object&#xff09;生命线&#xff08;Li…