文章目录
FPGA设计与外界接口
不和外界打交道的FPGA设计
不和外界打交道的FPGA设计是一个没有任何意义的设计,因为除了发热外别无它用。
Summary
本段强调了FPGA设计与外界交互的重要性,指出缺乏外界接口的设计只有发热作用,没有实际意义。
外界接口分类
按照信号传递的方向分类
输入接口
输出接口
双向接口
如图5-85所示,芯片A和芯片B利用一个双向接口进行通信,对于双向的任何一方,连接到双向接口上的信号都有四个——输入信号、输出信号、控制信号、总线信号。对于数字电路来说,一个输出可以对应多个输入,因为输入端口对外的电阻特性是高阻,所以它们之间的并联只要不是太多,基本不会对输出电路的电压值产生影响,因此图5-85中的输入信号是直接连接到双向总线上的。但是多个输出端口却不能并联,因为输出端口对外呈现低阻特性,如果并联的输出端口中,有些输出高电平、有些输出低电平,那么总线将会出现竞争现象,而无法判断其上的信号到底是什么状态,所以输出信号不能直接连接到双向总线上,这也是为什么双向接口都是半双工的原因。因此,为了保证双向接口的正常工作,通信的双方必须通过恰当的三态门控制逻辑来保证通信时不会出现两个输出接口同时和双向总线连通的情况出现。此外,为了保证在通信双方均关闭三态门时,总线能够进入一个确定的状态,通常需要为双向总线配置一个上拉电阻,当然,有些时候,FPGA的管脚内部已经嵌入了上拉电阻,这时就不需要在芯片外部为总线再做上拉操作。(注意,对于使用三极管实现的集电极开路形式的单向总线复用情况,也即OC门,必须加入上拉电阻才能保证线与逻辑输出高电平。)
那么,当芯片A向芯片B发送信息时,芯片A内部的控制信号使得其三态门导通,而芯片B处的控制信号使得其三态门关闭(即输出高阻),那么此时等效的电路图如图5-86所示。
(从图中可以看出,主设备发出的时候,其实也可以接受用于监控发出的数据是否和接受的一致)
反之,当芯片B向芯片A发送信息时,等效电路图则如图5-87所示。
如果同时使能通信双方的三态门,则双向总线因具有多个驱动源而呈现出不稳定状态,此时任何一方的输入电路都无法得到确定的输入信号,因此,在使用中应该避免这一情况的发生。
常见的双向端口的工作模式
主从模式
主从模式是指通信的多个设备之间有主从关系,即有一个设备为主设备,主导每次通信工作;而其他设备均为从设备,根据需求响应主设备发起的每次通信。
鉴于主从模式下的设备关系,系统初始化或者空闲时,所有的从设备均必须关闭三态门,输出高阻,将双向总线的使用权留给主设备,并同时利用输入功能电路监听双向总线上的消息。而主设备则可以在系统初始化或空闲时工作在输出状态或高阻状态。
当需要通信时,主设备打开三态门,首先输出想要建立连接的从设备地址(对于只有一主一从的端对端通信可以省略这一步,而对于多点通信则必须经历这一步)。然后再输出通信命令字,例如写入、读出或其他控制命令。如果该命令仅为控制命令,无需配合数据发送也不需等待反馈,则通信到此结束;如果该命令需要配合数据一起发给从设备,例如写入命令,则主设备接下来会发送具体的数据(通常还需要配合数据长度字或特殊的结束符),数据发送完后结束通信;如果该命令需要等待从设备的反馈,则主设备发送完命令后便关闭三态门,将总线的控制权交出,自己则进入监听状态,等待从设备的应答。
整个通信过程中,从设备一开始均处于监听状态,当监听到的设备地址和自己的地址匹配时(端对端通信可省略这一步),则会根据接下来监听到的命令字做出相应的动作。如果主设备需要自己的应答,则应答完后迅速关闭自己的三态门,将总线使用权立即交还给主设备。
以上便是主从模式的原理,在实际的使用中往往需要根据实际需求向其中注入更多的设计元素,例如,命令字格式、数据字格式、帧格式、通信协议等等。
对于主从模式来说,如果两个从设备之间想交换数据,则必须以主设备为媒介,即主设备先发起一次通信,从一个从设备中读取相应的数据,然后再发起一次通信,将之前读取的数据写入到另一个从设备中。由此可见,如果从设备之间经常会有信息交换需求,则按照主从模式来工作其效率是比较低的,而接下来介绍的对等模式则可以解决这个问题。
对等模式
对等模式是指通信的多个设备之间,平时是没有主从关系的,即大家是平等的,每个设备均可发起或响应一次通信。这样一来,任意两个设备之间均可建立连接,从而直接完成通信。
一旦通信连接建立后,发起通信的设备便成为临时的主设备,而响应通信的设备便成为临时的从设备,其他设备此刻便成为冻结设备。当然了,可以通过广播地址等技术,让系统中出现多个临时从设备。
由于对等模式下大家是平等的,所以同一时刻便可能会有多个设备同时想要发起通信,这便导致总线出现冲突现象。因此,实现对等模式的关键,便是需要引入能够成功避免总线出现冲突的技术。
可以想象,对等模式下,所有设备在系统初始化或者空闲时,均应该关闭三态门,释放总线,并同时进入监听状态。那么,当某个设备想要成为临时主设备,并发起一次通信时,它首先要做的不是打开三态门,而是监听总线。由于总线通常被上拉,因此,如果在一定时间段内监听的结果始终为逻辑1,则说明此时总线未被使用。完成这一步之后,才能打开三态门,输出一个约定好的测试字段(每个设备均不同,通常可以选择发送自己的设备地址)。这么做的原因在于,可能有多个设备同时发现总线空闲并想要发起通信,因此仍可能出现总线冲突。为了避免这种情况,在发送测试字段时,该设备还必须同时监听总线,看能否正确从总线上读回刚刚发送的测试字段。如果回读成功,则说明此时总线上只有自己在发送数据,根据总线监听机制,可以证明总线的控制权此刻已被自己掌握,可以放心向任一设备发起通信;如果回读失败,则说明此时总线上至少还有另一个设备打算发送数据,此时必须停止通信,并等待上一段时间后重新开始上述环节。为了减小再次通信时仍发生冲突的概率,每个设备的等待时间一般是随机的,或者设计好不同的等待时间以让各个设备具有一定的优先级关系。
简单示例
下面给出一个简单的双向端口的定义和使用示例,实际使用中,只要参考对等模式中的内容,让通信的多个模块控制好自己的三态门通断,即可实现可靠的双向通信。
Summary
本节介绍了双向接口的工作原理、主从模式和对等模式的差异及实现方法,并通过示例说明了如何在实际设计中应用这些模式。
外界接口电气特性分类
单端接口
单端接口,即传输电信号的物理载体为1根电线,其上传递的电压值通过与一个阈值或两个阈值进行比较,就可以得出其对应的数字电信号——逻辑1或逻辑0。按照电压值、阈值的选取不同,单端接口又分为TTL、LVCMOS等,详见【共同语言→模拟与数字→模拟信号处理电路系统与数字信号处理电路系统→数字系统之间的接口】中的介绍。
例如,在【按传递方向分类】中的那些例子里,接口全为单端接口。
差分接口
差分接口,即传输电信号的物理载体为2根电线,通过这两根线之间的电压差值来判断其上传递的数字电信号是逻辑1还是逻辑0。按照电压值、阈值的不同,差分接口又分为LVDS、RS485等(注意,这里的名称是电气特性的名称)
下面就以Xilinx的Virtex5系列FPGA器件为例,给出HDL代码中定义和使用差分接口的一些简单示例:
// outer interface with other chip
input clk_p;
input clk_n;
input dln_p;
input dln_n;
output dOut_p;
output dOut_n;
// inner interface with FPGA fabric
output clkln;
output dln;
input dOut;
// Differential Termination
// Specify the input I/O standard
IBUFGDS # (
.DIFF_TERM("TRUE"),
.IOSTANDARD("DEFAULT")
) IBUFGDS_inst (
.O(clkln), // Clock buffer output
.I(clk_p), // Diff_p clock buffer input (connect directly to top-level port)
.IB(clk_n) // Diff_n clock buffer input (connect directly to top-level port)
);
// Differential Termination (Virtex-5, Spartan-3E/3A)
// Specify the input I/O standard
IBUFDS # (
.IOSTANDARD("DEFAULT")
) IBUFDS_inst (
.O(dln),
.I(dln_p),
.IB(dln_n)
); // Buffer output // Diff_p buffer input (connect directly to top-level port) // Diff_n buffer input (connect directly to top-level port)
// Specify the output I/O standard
// Differential Termination
// Specify the output I/O standard
OBUFDS # (
.IOSTANDARD("DEFAULT")
) OBUFDS_inst (
.O(dOut_p),
.OB(dOut_n),
.I(dOut)
); // Diff_p output (connect directly to top-level port) // Diff_n output (connect directly to top-level port) // Buffer input
差分接口不能直接在HDL中使用,必须通过恰当的原语转换才可用于功能描述。
当然了,实际使用中,还必须要配合正确的硬件连接和管脚约束信息。
无线接口
无论是之前介绍的单端接口还是差分接口,都是有线接口,信息的传输都是利用看得见、摸得着的硬件连线。而无线接口与有线接口恰恰相反,信息的传输都是利用空间电磁波的形式。不过,目前FPGA芯片的直接接口都是有线接口,因此只能通过利用有线接口的方式与相关的无线传输设备连接,对有线信息进行转换,进而实现无线通信。
Summary
本节详细介绍了单端接口和差分接口的特点、应用场景及HDL代码示例,并简要提及了无线接口的概念。
按功能特性分类
时钟接口
时钟接口,顾名思义,是传递时钟信号的接口,它是为FPGA设计提供时钟驱动信号或者FPGA芯片为外围硬件提供时钟信号的接口,除非整个FPGA芯片实现的是一个纯组合逻辑功能,否则时钟接口信号必不可少。
时钟信号从电信号波形上来看,通常都具有周期性,受其驱动的电路通常会在其上升沿或下降沿做出响应动作。在后续的章节中会根据时钟信号的特性不同来进一步分析外界接口。
控制接口
控制接口,是传递控制信号的接口,例如复位信号、各类使能信号、标志信号等。
控制信号从电信号波形上来看,通常传递的都是电平信息,受其驱动的电路通常会根据其当前处于高电平或低电平来做出不同的响应动作。
数据接口
数据接口,是传递数据信号的接口,例如视频数据、音频数据、坐标数据等。
数据信号从电信号波形上来看,通常传递的都是脉冲序列,序列中高、低脉冲的排列情况就是数据信息。因此,为了能够不遗漏地、正确地传递和接收数据信息,数据接口通常都需要配合时钟接口一起工作。
按时钟特性分类
异步接口
异步接口,即不含有时钟信息的接口。一般牵涉信号中较容易碰到异步接口的情况,例如异步复位接口等。对于数据信号来说,同步接口的情况较多,但也有异步接口的情况,例如异步串口。这里主要讨论一下异步接口情况下是如何保证正确地数据传递的。
异步串口原理简介
数据信号是脉冲序列,那么在没有匹配的时钟信号的情况下,该如何不遗漏且不重复地采集到所有的数据信息呢?
首先,通信的双方必须约定好数据的传递速率,例如,1 MSPs(每秒1百万个采样点)。接下来,发送方将会采用这个速率发送数据,而数据的发送显然需要一个1 MHz的时钟配合生成,只不过这个时钟信号并不会通过接口传递到接收端。
那么,由于接收端没有这样一个时钟信号,但却要正确接收数据,因此异步数据接口的实现难度主要在数据的接收端。既然发送端没有传过来跟数据匹配的时钟信号,那么在接收端的硬件电路上利用晶振等方法生成一个同频的时钟信号是不是就可以进行数据采集呢?答案是不行。因为就算能够得到一个频率一模一样的时钟信号,但由于相位无法保证,因此在进行数据采样时就难以保证各项时序指标的正确性。因此为了确保一定能够正确采样信号,在接收端会以一个频率远高于数据信号采样率的时钟来对异步数据信号进行采样,令其倍率为N(N通常为3倍以上,有时候甚至为几十倍)。这样一来便可以根据冗余采样的结果,随便找一个不接近数据变化沿的高频采样时钟边沿(越居中越好,因为这样建立和保持时间余量都比较大),然后每隔N个高频时钟周期采集一次数据信号即可顺利从异步接口中提取出所有的数据信息。
以异步串口数据通信为例,如果发送端的数据率为1 MSPS,那么在接收端采用一个5 MHz的采样时钟,其数据接收原理分析如下:
由于接收端的高频采样时钟和产生数据的时钟之间没有固定相位关系,因此接收端的两种极限采样情况如图5-88所示。
采样1为最好极限,即每个采样时钟都能采样到稳定的信号,因此采样结果为
… 11100000111…
采样2为最差极限,即数据的变化沿与高频时钟采样沿对齐,因此采样结果为
…. 11xoooox111……
X表示不确定数值,可能判断为1也可能判断为0。
由于异步串口通常会以一个符号位的低脉冲表示通信的起始数据位,因此当高频采样时钟监测到至少4个连续的0时,就表示通信开始。且此时,以第三个0的采样时刻为基准,每隔5个时钟周期采集一次数据,便可得到所有的异步数据,如图5-89所示。
对于极限情况采样1,第三个0正好位于数据符号的中央,因此今后的每次采样都在数据位的中央;而对于极限情况采样2,由于数据从1至0的变化沿对准了高频时钟的采样沿,所以这一个采样可能为0也可能为1,从而导致第三个0的判断出现两种情况,分别如图5-89中椭圆和长方形所示,不过无论是哪种情况,今后的每次采样也都是比较靠近数据位中央的。
综上所述,选取起始位的第三个0采样为采样基准,可以确保今后的采样点介于极限情况采样2的两种基准情况之间,如图5-89中“采样范围”所示,从而确保异步采样的正确性。
(注意:这里是先确定通信的起始位和定下采样的基准,这个基准是在接收端的时钟域,如果定下基准之后,就每个接收端时钟域下5个始终周期采样一次得到异步数据,但却带你是数据会飘,后续会讲到)
异步串口注意事项
疑问一:使用异步串口进行通信的时候,有一个非常重要的注意事项,那就是每次通信所传输的数据量不要太大。
举个例子来说,如果有100 B的数据要发送,不要采用
“ 1 bit 起始位+数据长度(字节数) +100 bit 数据+ 1 bit 停止位”
这样的格式,而应该尽量分散每次传输的数据量,例如,采用
“ 1 bit 起始位+ 8 bit 数据+ 1 bit 停止位”
这样的格式,重复100次来完成所有数据的传输。
为什么要这样呢?
疑问二:在【异步串口HDL范例】中可以看到,N= 5时已经能够很好地完成异步串口通信工作了,那为什么在【异步串口原理简介】中,提到接收端的高频采样时钟相比于数据率的倍率N有时候可能达到几十倍之高呢?
要解释以上两个疑问,得从异步串口的实际应用状况着手。
首先,既然是异步的,那么高频采样时钟就不可能精确地是数据率的某个整数倍。所以,自从识别出起始位后,每采样一次数据位,所间隔的时间都和实际的数据变化周期存在着误差。这是一种具有积累效应的误差,它会让接下来的数据采样点相对于数据的中心位置发生定向移动,并很快呈现出逐渐远离数据中心位置的趋势。因此,如果每次连续传递的数据位数过多,就有可能出现采样点进入数据变化区、同一个数据位被采样2次或者某个数据位被漏采的情况。
其次,异步串口应该具有通用性,否则一旦下次换另外一台不同数据速率的设备接入,就无法正常通信。因此,为了使得异步串口能够适应多种速率的通信,通常为其提供一个频率较高的时钟信号,倍率可能是该串口所支持的通信数据速率最大值的几十倍以上。这样一来,由于该时钟的周期较小,所以用来发送或接收某一指定速率的数据时,所引入的误差就小,从而能够保证更长的连续数据通信。例如,异步串口的高频时钟为1 MHz,如果需要发送30 KSPS的数据,则可以近似用高频时钟的33分频——30. 3030 … KHz去发送;如果需要接收30 KSPS的数据,则同样可以在找到起始位后近似用30. 3030 … KHz去采样数据。
综上所述,一个通用的串口描述,其内部的高频时钟的频率应该选择在最大支持时钟频率的几十倍以上(不一定要是整数倍),并且每次通信所传递或接收的连续数据位数应该严格受控,在不影响通信的前提下越短越好。
(实际上的异步传输就是设置小段小段的数据传输,有起始位、数据位、停止位,然后采样的时候,就是发现起始位之后,开始计数,尽可能在数据的中间采样)
Summary
本节详细介绍了时钟接口、控制接口和数据接口的功能特性及注意事项,并重点讲解了异步串口的工作原理和设计要点。
FPGA设计与外界接口分类及原理
60

被折叠的 条评论
为什么被折叠?



