Cyclone III中LVDS的设计

一,概述

LVDS低压差分信号,最早由美国国家半导体公司
提出的一种高速串行信号传输电平,由于它传输速度快,功耗低,抗干扰能力强,传输距离远,易于匹配等优点,迅速得到诸多芯片制造厂商和应用商的青睐,并通过TIA/EIA的确认,成为该组织的标准(ANSI/TIA/EIA-644 standard)。LVDS信号被广泛应用于计算机、通信以及消费电子领域,并被以PCI-Express为代表的第三代I/O标准中采用。

LVDS信号的电压摆幅只有350MV, 为电流驱动的差分信号方式工作,最长的传输距离可以达到10米以上。为了确保信号在传输线当中传播时,不受反射信号的影响,LVDS信号要求传输线阻抗受控,其中单线阻抗为50ohms,差分阻抗100ohms。在实际应用当中,利用一些高速电路仿真分析工具,通过合理的设置层叠厚度和介质参数,调整走线的线宽和线间距,计算出单线和差分阻抗结果,来达到阻抗控制的目的。

LVDS的工作原理是其中发送端是一个为3.5mA的电流源,产生的3.5mA的电流通过差分线的其中一路到接收端。由于接收端对于直流表现为高阻,电流
通过接收端的100欧姆的匹配电阻产生350mA的电压,同时电流经过差分线的另一条流回发送端。当发送端进行状态变化时它通过改变流经100欧姆电阻的 电流的方向产生有效的'0'和'1'态。

二,硬件设计

    为了达到阻抗控制的要求,PCB的设计采用常见的4层板,基本叠层结构如下图:

f64a0fa3-4aa5-44c6-b552-d72fec9c460e.jpg

板子的总体厚度约为1.6mm,L1,L4为信号层,L2,L3分别为地线层和电源层,半固化片采用2116,根据CTS的计算,选取差分线线宽6mil,间距8mil,信号层铺铜厚度为0.5OZ(完成后约为高度48um),可以达到差分阻抗约100欧姆。

69d9038d-95f5-40fe-a63e-30e981181426.jpg

在CIII芯片中,有多组可以输出LVDS信号的IO,但有几点需要注意。在芯片的right bank,left bank上,也就是1,2,5,6 bank,设计了“dedicated output buffer”,这些IO不要添加其他器件既可以输出LVDS信号,也就是说不需要做任何电阻网络匹配的工作了。至于上下两边,3,4,7,8 bank上,没有“dedicated output buffer”,如果要做输出使用,仍然需要配上3个电阻的网络。Altera将这种方式名为“emulated lvds output...”。

9b088f23-dadd-49f2-9492-2ce5c1ed83b3.jpg

需要另外端接电阻的IO,其电阻的选取和链接方式如下:

8b84f300-7d34-4d41-a577-9d03c16934fc.jpg

端接的电阻应该尽量靠近输出的IO口。还有一点需要的注意的是,不管是需要端接电阻还是不需要端接电阻的IO,在作为LVDS输入方式时,都是需要一个100欧姆的电阻的。

       在PCB设计这些LVDS时,要把一组LVDS当做一根线来处理,它们与其他信号线的距离最好能大于20个mil。每一组LVDS内的两根信号线的长度需要做等长处理,同时采用“紧耦合”的走线方式更加有利于信号的的质量。当“紧耦合”和“等长”发生矛盾,两者不可以兼得时,应该优先考虑等长。LVDS走线尽量走直线,需要拐弯的部分,拐弯走成“圆弧”状,下面就是部分LVDS走线的截图:

077f52e3-b23c-42ba-9491-71313929fbd7.jpg

4872697c-2882-45f0-9b56-1c76a4a6b6aa.jpg

三,软件设计

       在Quartus中做信号分配时,需要注意,每一组LVDS其实就是一个信号,在Verilog中你就把它们当做一个信号处理,比如信号名称是outd[6]。。比如现需要配置一对LVDS,你想把它们分配的PIN101和PIN103,只需要对LVDS中的P信号做信号分配即可, P103在CIII中已经被定义成P了,你要做的就是把outd[6]指定到P103。首先,在IO
standard中指定电平标准为LVDS,再在outd[6]的location中选择P103就可以了,这个时候你会发现outd[6]的N端就会自动地分配了P101。

f4c5f154-b680-4e3d-87cd-3a3697b90394.jpg

上面提到在一些IO作为LVDS使用时需要添加3个端接电阻,Altera就把这些信号称为“LVDS_E_3R”,在分配IO时需要注意区分,将LVDS信号分配成LVDS_E_3R或者相反,“适配”的时候都会报错。

       分配好了以后,可以在assignment edit中查看每个IO的状态,以确认是否真的完成了LVDS的分配。

381e4d08-1bef-4690-b693-5bc9bfcc40fb.jpg

   如果想测试LVDS的信号,可以在两个IO上接入一个100欧姆的电阻,使用2个探头一起探测LVDS的眼图。

四,其他

设计中还需要注意以下3点:

1,  选作LVDS的Bank的VCCIO的电压是2.5V,在硬件设计时需要注意,如果电压分配不正确,也无法完成LVDS的分配。一旦该Bank的VCCIO电压被设计成2.5V,那么该Bank的其他非LVDS信号(包括配置信号)的高电平也是2.5V了,JTAG和AS的分配、MSEL的配置也需要注意。比如3.3V的VCCIO时候标准AS模式下MSEL[3..0]为0010,而2.5V时则为0011。

2,  当LVDS和普通信号一起作为输出信号时,普通信号的IO至少距离LVDS信号5个PIN。比如P101和P103作为LVDS输出,则P96~P100,P102,P104~P108不可以同时被分配成普通输出信号,但可以被配置成LVDS输出信号。这些在硬件设计之初也需要有考虑。

3,  LVDS非常讲究阻抗的匹配,LVDS的信号应该尽量少打过孔,在跨板传输时需要选择合适的接插件和信号线,如果接插件或者信号选择不正确,会大大影响传输的速率


视频处理心的(一) LVDS知识

近段时间接收一个电视行业视频处理项目,一路做下来,颇多的心的体会,


 首先了解一下基本的知识:在FPGA的前端是MSTAR机芯,信号传输采用LVDS形式.


在电视行业LVDS一般分两种传输方式:10bit与8bit(指RGB),编码方式分JEIDA与VESA方式.


4267d7c4-57f3-4830-be30-cec906759415.JPG


b169060f-c9cd-41cf-acd8-c07497c562dd.JPG


9b711ec1-ad64-4666-a202-8dda230872ec.JPG


8c561592-6d1b-4b87-88fc-a7c3dfaba9b9.JPG


在10bit传输时一组时钟,5组数据(5+1);8bit传输时一组时钟,4组数据(4+1);例如一般32寸标清屏,60Hz采用8bit模式,LVDS时钟频率一般不超过86MHz.JEIDA与VESA根据屏可选.而一般42寸高清屏,120Hz可能采用两组(5+1)传输线.LVDS时钟频率一般74.25MHz左右.


有些32寸标清屏的LVDS编码中并没有HSync与VSync信号,而只有通过DE信号来区别,看下面的图


b73c267c-e733-428d-8a6f-e52ae5e8456e.JPG


Tv:一帧图像;


Th:一行图像数据;


Tblk(v):帧消隐期;

视频处理心的(二) LVDS接收

上一篇我们介绍了LVDS的电视行业的一般知识,本篇来谈谈FPGA接收LVDS信号以及数据的解码.


在FPGA接收LVDS信号前,必须先保证信号的质量.下图为一组数据与时钟的眼图:


db70a194-84d7-4840-9699-c773ac5898cc.JPG


在图上,我们主要看以下几个方面:1,时钟与数据的相位;2,数据波形的幅度;


在LVDS的信号质量上,阻抗匹配是比较大的影响,关于PCB的布线,请参考这方面的资料,这里就不详细说明了.值得提出的一点是选FPGA芯片的时候一定要搞清楚所选的芯片100欧姆的匹配电阻是否可以通过FPGA内部的设置?因为在一些低端的芯片是没有这个功能的.就像我一样,买了一块FPGA开发板,卖方跟我说他们卖的开发板带LVDS输入,100欧姆匹配电阻在芯片里面设置.结果买回来仔细看芯片资料才发现这颗芯片没有设置匹配电阻的功能.白话了2000多块.这个卖方还是专业卖FPGA开发板的公司.北京的.什么玩意,这么不专业.


LVDS输入和输出在FPGA中都是有IP core的.以7bit,4+1,时钟74.25MHz为例.说明IP core的设置


caf5c1b6-1676-4582-bae7-0476177dab83.JPG


首先,选择你所用的器件,我用的是Cyclone 3.  再选择LVDS receiver,


what is the number of channels ?  选择4...........表示4组数据;


what is the deserialiation factor ?   选择7...........表示每个CLK传7bit;


4c52308a-94ce-4e2c-962f-4f1595f5e1ce.JPG


what is the input data rate?  填519.75.................即74.25*7


选择use shared PLL..........


what is the phase ............这个选项是选择数据线与时钟的相位差,因为LVDS的相位有差别,接收IP core能调整


视频处理心的(三) LVDS解码

LVDS 接收器IP core设置完以后,最好编译一次,然后就可以打开Pin Planner设置管脚了,首先将数据线和时钟线的I/O Standard设置为LVDS,系统自动把负端显示出来。当在Location一栏填Node name对应的管脚时,负端也是自动显示。所以从这里可以看出,刚开始的PCB定义管脚一定要按照芯片的DATASHEET上注明的LVDS管脚的正负对应清楚。


rx_in[3..0]对应视频处理心的(一)中LVDS传输图中的RDP,RCP,RBP,RAP.


因为LVDS的速率比较高,最好在Assignment Editor中,将输入管脚设置为Fast Input Regiter。


5801b882-ceb2-4f68-b27e-273dd36e681f.JPG


这样,LVDS的输入基本做完了。接下来就做LVDS的解码工作了。


在解码前,必须先了解LVDS IP Core的数据采集方式和输出。从IP core的帮助文档和使用手册我们可以了解到:1,LVDS以上升沿作为开始;2,数据的排列方式,原文是这样的:


rx_in[n-1] is the first bit received and rx_in[0] is the last bit received for channel one; for channel two, rx_in[2n-1] is the first bit received and rx_in[n] is the last bit received.


这端话的意思就是:每组数据都是高位在前,地位在后;第一组数据线数据为低;假设4组数据,每组传7bit的话。把上面的n用7来代替。那么28bit数据就是第一组数据线的第0bit为最低位,第四组数据线的第7bit为最高位。


c1afda1c-5dc3-4eca-a2af-43a1a21ac45e.JPG


在上图中的两条虚线是什么意思呢?一般在TCON的接收端是以图中的两虚线中的数据作为当前CLK的有效数据。而IP core是从CLK上升沿开始接收数据。这样就导致FPGA必须接收两个CLK的数据再从中各抽取一部分数据组成有效数据。


根据以上所说,我们先将输入的28bit数据打两拍,将两拍的数据按照JEIDA或者VESA把8bit或者10bitRGB与DE,HSync,VSync解出来

基于FPGA的LVDS切换设计经验心得

  电路设计的好坏和初期的分析、理论验证、查找相关资料密不可分,茫然的去凭空臆断一个设计,最后的结果往往会令人吃惊失望,带来更多的财力人力浪费。 FPGA 的设计也是如此。

      FPGA设计之初包括芯片的选型都可以做一个初步的估计,然后根据实际的需要在Quartus开发环境上面仿真验证,配合常用的modelsim仿真工具,可以做一个比较保险的容量使用估计,引脚使用估计和其他FPGA资源估计。而且最好是在初期按照需求就锁定引脚,以免出现不必要的不可回转的错误。这样的情况就在一个不经意的项目中发生了。

    项目是要做一个FPGA切换LVDS视频信号到同一个显示屏上,起初,只是以为也是和其他IO一样的属性,可以通过io_mux进行切换,在大概仿真模拟后就不在深入设计和分析就选择了器件,选用的是AlteraEP4CE22F17I7封装FBGA256的,对于视频应用和IO控制来说,资源和IO接口足够使用了。

      当PCB制版和贴片回来之后,就开始下载烧录程序,安装原理图锁定引脚后突然发现,一个同样的错误无论如何都不能解决,错误信息如下:

Error (15873): Output port DATAOUT of DDIO_OUT primitive "lvds_tx:u1_lvds_tx|altlvds_tx:ALTLVDS_TX_component|lvds_tx_lvds_tx:auto_generated|lvds_tx_ddio_out:ddio_out|ddio_outa_0" must drive input port I of an I/O OBUF primitive

Error (15873): Output port DATAOUT of DDIO_OUT primitive "lvds_tx:u1_lvds_tx|altlvds_tx:ALTLVDS_TX_component|lvds_tx_lvds_tx:auto_generated|lvds_tx_ddio_out:ddio_out|ddio_outa_1" must drive input port I of an I/O OBUF primitive

Error (15873): Output port DATAOUT of DDIO_OUT primitive "lvds_tx:u1_lvds_tx|altlvds_tx:ALTLVDS_TX_component|lvds_tx_lvds_tx:auto_generated|lvds_tx_ddio_out:ddio_out|ddio_outa_2" must drive input port I of an I/O OBUF primitive

     百度半天也没有找到合适的答案和解决方法,后来网上google搜索发现了一片俄文遇到相同的问题 http://electronix.ru/forum/lofiversion/index.php/t110916.html,看不懂,然后使用google翻译后发现一句话:也许是因为硬件模块对应的原语和ALTLVDS_TX ALTLVDS_RX,在连接到LVDS收发器,而无需切换功能,真正的FPGA。因此,这就要求,以及在该图描绘。也就是说,你需要一个串行解串器或并处理自己这样做(速度通)或扰并行代码做后串行器和解串器。 都是自动翻译的,不过大概意思明白了,就是LVDS经过FPGA处理后是直接连接到外部LVDS接收器的,不需要进行切换。无语了!

     此时由于pcb板已经设计好,不可能在电路外部做切换,所以没有办法的话只能废弃这一版然后重新设计了,时间和成本都是昂贵的东西,难道没有解决方法了吗?

      后来查阅LVDS总线,发现还有一种就是BUS LVDSBLVDS),LVDS总线这是一种比较不错的解决方法。简单说下BLVDSBLVDS是在LVDS 基础上面发展起来的,总线BLVDS (BLVDS) 是基于LVDS 技术的总线接口电路的一个新系列,专门用于实现多点电缆或背板应用。它不同于标准LVDS ,提供增强的驱动电流,以处理多点应用中所需的双重传输。BLVDS 具备大约250mV 的低压差分信号以及快速的过渡时间。这可以让产品达到自100 Mbps 至超过1Gbps 的高数据传输速率。此外,低电压摆幅可以降低功耗和噪声至最小化。差分数据传输配置提供有源总线的+/-1V 共模范围和热插拔器件。 BLVDS 产品有两种类型,可以为所有总线配置提供最优化的接口器件。两个系列分别是线路驱动器和接收器和串行器/解串器芯片组。总线BLVDS 产品为设计人员解决高速多点总线接口问题提供了一个新选择。

      BLVDS的器件级联模型如下所示:

 

    FPGA的逻辑实现模型:


  

    利用fpgaLVDS IP核,参照AN 522: Implementing Bus LVDS Interface in Supported Altera Device Families 中的相关描述,设计一个可以切换lvdsfpga电路。设计思路是首先设计一个总线接口,设定为bus lvds,然后在fpga内部添加一个lvds_rx的模块,这个模块的设置参数就是一个缓冲器,不做任何处理动作,输入和输出都是[2:0]三位的。但要注意的是fpgalvds输出信号必须是真实的io引脚,不能空余,需要锁定到不用的io口上面,否则会出错。

    Io锁定和fpga程序框图如下所示:

        通过这样的设计之后,就不会出现lvds切换时引起的错误,但是必须要浪费6个引脚作为bus lvds的输出接口使用,这是一个缺点。

        由此解决了lvds不能切换的问题,但是最后的效果还是不肯理想,视频的质量因为这样的切换有点失真,但是还可以看清楚。

        在第二个版本中,更改了设计,在外部添加lvds切换开关,fpga做开关的控制,这样的切换效果要好很多

















  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值