tinyxml

更新时间:2023-03-02 08:21:35 阅读: 评论:0

资料推荐内容包括:C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式 等。。。后台私信;资料;两个字可以免费领取

随着高速数据传输业务需求的增加,如何高质量的解决高速IC芯片间的互连变得越来越重要。低功耗及优异的噪声性能是有待解决的主要问题。芯片间互连通常有三种接口:PECL (Positive Emitter-Coupled Logic)、LVDS (Low-Voltage Differential Signals)、CML (Current Mode Logic)。在设计高速数字系统时,人们常会遇到不同接口标准芯片间的互连,为解决这一问题,我们首先需要了解每一种接口标准的输入输出电路结构,由此可以知道如何进行直流偏置和终端匹配。本文介绍了高速通信系统中PECL、CML和LVDS之间相互连接的几种方法,并给出了Maxim产品的应用范例。

PECL接口

PECL由ECL标准发展而来,在PECL电路中省去了负电源,较ECL电路更便于使用。PECL信号的摆幅相对ECL要小,这使得该逻辑更适合于高速数据的串行或并行连接。PECL标准最初由Motorola公司提出,经过很长一段时间才在业内推广开。

2.1 PECL接口输出结构

PECL电路的输出结构如图1所示,包含一个差分对管和一对射随器。输出射随器工作在正电源范围内,其电流始终存在,这样有利于提高开关速度。标准的输出负载是接50电阻至VCC-2V的电平上,如图1所示,在这种负载条件下,OUT+与OUT-的静态电平典型值为VCC-1.3V,OUT+与OUT-输出电流为14mA。PECL结构的输出阻抗很低,典型值为4-5,这表明它有很强的驱动能力,但当负载与PECL的输出端之间有一段传输线时,低阻抗造成的失配将导致信号时域波形的振铃现象。

图1. PECL接口输出结构

2.2 PECL接口输入结构

PECL输入结构如图2所示,它是一个具有高输入阻抗的差分对。该差分对共模输入电压需偏置到VCC-1.3V,这样允许的输入信号电平动态范围最大。Maxim公司的PECL接口有两种形式的输入结构,一种是在芯片上已加有偏置电路,如MAX3885,另一种则需要外加直流偏置,如MAX3867、MAX3675。

图2. PECL接口输入结构

表I中给出了Maxim公司PECL接口输入输出的具体电气指标。

表I. PECL输入和输出规格

在+5.0V和+3.3V供电系统中,PECL接口均适用,+3.3V供电系统中的PECL常被称作低压PECL,简写为

图5. CML输入电路匹配

表II以MAX3831/MAX3832为例列出了CML器件的输入输出技术参数

表II. CML输入和输出规格(负载 = 50

至VCC)

注:Maxim不同产品CML输入灵敏度不同,如MAX3875、MAX3876。

4 LVDS接口

LVDS用于低压差分信号点到点的传输,该方式有三大优点,使其更具有吸引力。A) LVDS传输的信号摆幅小,从而功耗低,一般差分线上电流不超过4mA,负载阻抗为100。这一特征使它适合做并行数据传输。B) LVDS信号摆幅小,从而使得该结构可以在2.5V的低电压下工作。C) LVDS输入单端信号电压可以从0V到2.4V变化,单端信号摆幅为400mV,这样允许输入共模电压从0.2V到2.2V范围内变化,也就是说LVDS允许收发两端地电势有±1V的落差。

4.1 LVDS接口输出结构

Maxim公司LVDS输出结构在低功耗和速度方面做了优化,电路如图6所示。电路差分输出阻抗为100,表III列出了其它一些指标。

图6. LVDS接口输出结构

4.2 LVDS接口输入结构

LVDS输入结构如图7所示,IN+与IN-输入差分阻抗为100,为适应共模电压宽范围内的变化,输入级还包括一个自动电平调整电路,该电路将共模电压调整为一固定值,该电路后面是一个施密特触发器。施密特触发器为防止不稳定,设计有一定的滞回特性,施密特后级是差分放大器。

图7. LVDS接口输入结构

表III总结了Maxim公司LVDS输入与输出技术指标(MAX3831, MAX3821和MAX3890)

表III. LVDS输入和输出规格

5 接口互连

5.1 CML到CML的连接

如果接收器与发送器之间采用相同的VCC电源,CML驱动器输出可以直流耦合到CML接收器输入,无需额外的元件。如果接收器与发送器采用不同的电源,系统需要用交流

图11. PECL与PECL之间的交流耦合

R2和R3的选择应考虑如下几点:(1) PECL输入直流偏压应固定在VCC-1.3V;(2)输入阻抗应等于传输线阻抗;(3)低功耗;(4)外围器件少。最常用的就是图11中的两种。在图11(a)中,R2和R3的选择应满足下面方程组:

求解得到:

图11(a)的缺陷是:由终端网络引起的功耗较大。如果系统对于功耗要求较高,可以采用图11(b)所示电路。这时,我们需要满足:

解得:

PECL的输出共模电压需固定在VCC-1.3V,在选择直流偏置电阻(R1)时仅需该电阻能够提供14mA到地的通路,这样R1=(VCC-1.3V)/14mA。在+3.3V供电时,R1 = 142,+5.0V供电时,R1 = 270。然而这种方式给出的交流负载阻抗低于50,在实际应用中,+3.3V供电时,R1可以从142到200之间选取,+5.0V供电时,R1可以从270 到350之间选取,原则是让输出波形达到最佳。

可以通过两种方式进一步改善PECL的终端匹配:(1)增加一个与耦合电容串联的电阻,使得PECL驱动器端的等效交流阻抗接近50;(2)添加一个与R1串联的电感,使交流阻抗受控于接收器阻抗,与R1无关。

5.3 LVDS与LVDS的连接

因为LVDS的输入与输出都是内匹配的,所以LVDS间的连接可以如图12中那样直接连接。

图12. LVDS与LVDS的连接

6 LVDS,PECL,CML间的互连

在下面的讨论中,假设采用+3.3V PECL。

6.1 LVPECL到CML的连接

LVPECL与CML之间的耦合方式可以是交流方式,也可以是直流方式。

6.1.1 交流耦合情况

LVPECL到CML的一种连接方式就是交流耦合方式,如图13所示。在LVPECL的两个输出端各加一个到地的偏置电阻,电阻值选取范围可以从142到200。如果LVPECL的输出信号摆幅大于CML的接收范围,可以在信号通道上串一个25的电阻,这时CML输入端的电压摆幅变为原来的0.67倍。

图13. LVPECL与CML之间的交流耦合

6.1.2 直流耦合情况

在LVPECL到CML的直流耦合连接方式中需要一个电平转换网络,如图14中所示。该电平转换网络的作用是匹配LVPECL的输出与CML的输入共模电压。一般要求该电平转换网络引入的损耗要小,以保证LVPECL的输出经过衰减后仍能满足CML输入灵敏度的要求;另外还要求自LVPECL端看到的负载阻抗近似为50。下面以LVPECL驱动MAX3875的CML输入为例说明该电平转换网络。

图14. LVPECL与CML之间的电阻网络(MAX3875)

下面是该电阻网络必须满足的方程:

(注:假定LVPECL的最小差分输出摆幅为1200mV,而MAX3875的输入灵敏度为50mV,这样电阻网络的最小增益必须大于50mV/400mV = 0.042。)

求解上面的方程组,我们得到R1 = 215,R2 = 82.5,R3 = 274 (标准值的1%),VA = 1.35V,VB = 3.11V,增益 = 0.147,ZIN = 49。把LVPECL输出与MAX3875输入连接好,实测得:VA = 2.0V,VB = 3.13V。

LVPECL到MAX3875的直流耦合结构如图15所示,对于其它的CML输入,最小共模电压和灵敏度可能不同,读者可根据上面的考虑计算所需的电阻值。

图15. LVPECL与CML之间的直流耦合(MAX3875)

6.2 CML到LVPECL的连接

图16给出了CML到LVPECL三种交流耦合解决方案。

图16. CML与LVPECL之间的交流耦合

6.3 LVPECL到LVDS的连接

6.3.1 直流耦合情况

LVPECL到LVDS的直流耦合结构需要一个电阻网络,如图17中所示,设计该网络时有这样几点必须考虑:首先,我们知道当负载是50接到VCC-2V时,LVPECL的输出性能是最优的,因此我们考虑该电阻网络应该与最优负载等效;然后我们还要考虑该电阻网络引入的衰减不应太大,LVPECL输出信号经衰减后仍能落在LVDS的有效输入范围内。注意LVDS的输入差分阻抗为100,或者每个单端到虚拟地为50 (图7所示),该阻抗不提供直流通路,这里意味着LVDS输入交流阻抗与直流阻抗不等。LVPECL到LVDS的直流耦合所需的电阻网络需满足下面方程组:

. LVPECL与LVDS之间的直流耦合

考虑VCC = +3.3V情况,解上面的方程组得到:R1 = 182,R2 = 47.5,R3 = 47.5,VA = 1.13V,RAC = 51.5,RDC = 62.4,增益 = 0.337。通过该终端网络连接LVPECL输出与LVDS输入时,实测得VA = 2.1V,VB = 1.06V。假定LVPECL差分最小输出电压为930mV,在LVDS的输入端可达到313mV,能够满足LVDS输入灵敏度要求。考虑信号较大时,如果LVPECL的最大输出为1.9V,LVDS的最大输入电压则为640mV,同样可以满足LVDS输入指标要求。

6.3.2 交流耦合情况

LVPECL到LVDS的交流耦合结构如图18所示,LVPECL的输出端到地需加直流偏置电阻(142到200),同时信号通道上一定要串接50电阻,以提供一定衰减。LVDS的输入端到地需加5.0k电阻,以提供共模偏置。

图18. LVPECL与LVDS之间的交流耦合

6.4 LVDS到LVPECL的连接

LVDS与LVPECL之间的直流和交流耦合需要进行几项匹配。

6.4.1 直流耦合情况

LVDS与LVPECL之间采用直流耦合结构时,需要加一个电阻网络,如图19所示。该电阻网络完成LVDS输出电平(1.2V)到LVPECL输入电平(VCC-1.3V)的转换。由于LVDS的输出是以地为参考,而LVPECL的输入是以VCC 为参考,这需要在构建电平转换网络时注意LVDS的输出不会对供电电源的变化敏感;另一个问题是需要在功耗和速度方面折中考虑,如果电阻值(R1、R2、R3)取得较小,由电阻网络和LVPECL输入寄生电容构成的时间常数较小,允许电路在更高的速度下工作。但是,由于这些电阻上流过较大的电流,使得总功耗增大。这时,LVDS的输出性能容易受电源波动的影响。还有一个问题就是要考虑阻抗匹配和网络衰减问题,电阻值可以通过下面的方程导出。

图19. LVDS与LVPECL之间的直流耦合

在VCC电压为+3.3V时,解上面的方程得:R1 = 374,R2 = 249,R3 = 402,VA = 1.2V,VB = 2.0V,RIN = 49,增益 = 0.62。LVDS的最小差分输出信号摆幅为500mVP-P,在上面结构中加到LVPECL输入端的信号摆幅变为310mVP-P,该幅度低于LVPECL的输入标准,但对于绝大多数Maxim公司的LVPECL电路来说,该信号幅度是足够的,原因是Maxim公司LVPECL输入端有较高的增益。在实际应用中,读者可根据器件的实际性能作出自己的判断。

6.4.2 交流耦合情况

LVDS到LVPECL的交流耦合结构较为简单,图20给出了两个例子。

图20. LVDS与LVPECL之间的交流耦合

6.5 CML和LVDS间互连

CML与LVDS之间采用交流耦合方式连接时(图21),注意,CML输出信号摆幅应该在LVDS输入能够处理的范围以内。

图21. CML与LVDS之间的交流耦合

如果LVDS驱动器需要驱动一个CML接收器,可以采用图22所示的交流耦合方式。

图22. LVDS与CML之间的交流耦合

TinyXML2使用教程

1.TinyXML2概述

TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

TinyXML2详细介绍与源码获取方法详见:TinyXML2官网。

2. TinyXML1与TinyXML2对比

TinyXML1与TinyXML2这两个著名的开源XML文件解析库均出自Lee Thomason之手,向这位满怀开源精神的大家致敬。

TinyXML2适用于大部分的C/C++项目开发,经得住考验,是最好的选择。较TinyXML1而言,TinyXML2化繁为简,使用时只需要包含两个文件,而TinyXML1需要6个文件,一般生成静态链接库供项目的使用。TinyXML1详细介绍与源码见:TinyXML1官网。TinyXML1用法用例可以参考博文:TinyXML快速入门。

TinyXML2使用了与TinyXML1相似都可API,并且拥有丰富的测试案例。但TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存分配。

TinyXML2无需STL,也放弃了对STL支持。所有字符串查询均使用C风格字符串“const char *”来表示,省去string类型对象的构造,并使代码更简单。

二者共同点:

(1)都使用了简单易用的API。

(2)都是基于DOM(Document Object Model,文档对象模型)的解析器。

(3)都支持UTF-8编码。

TinyXML2的优点:

(1)对大部分大部分的C/C++项目具有普适性。

(2)使用较少的内存(约TinyXML1的40%),速度变得更快。

(3)没有C++的STL的要求。

(4)更接近现代C++的特性,如使用了适当的命名空间。

(5)适当有效的处理了的空白字符(空格,TAB和回车)。

TinyXML1的优点:

(1)可以报告分析错误的位置。

(2)提供一些C++ STL公约支持:流和字符串。

(3)拥有非常成熟和良好的调试代码库。

3. TinyXML2的用法用例

TinyXML2的网上教程并不多见,醍醐灌顶,受益匪浅的教程更是凤毛麟角。有的也是蜻蜓点水、参差不齐的泛泛而谈。最终,所能参考的资料也就是官网的文档和示例代码,但却有点晦涩难懂。因此,本文就为了解决这个尴尬的局面,结合官网的资料和网上资源,尽量详细的列出TinyXML2的常见用法用例,不足之处,请留言补充,后续增加修改。

XML文件本质就是小型的数据库,换个角度来说就是,对数据库有什么操作,那么对XML文件就应能实现什么操作。一般而言,对数据库的操作包括以下几种:新建数据库和对数据库增删查改。那么对应XML文件就是新建XML文件、增加XML文件的节点,删除XML文件的指定节点,查询XML文件指定节点的值,修改XML文件节点的值。

使用方法:将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含#include "tinyxml2.h"和using namespace tinyxml2。

使用场景:存储用户信息。

用户数据表设计如下:

对应XML文件实现如下:

从中可以看出,XML由三大部分组成,分别是声明、根节点和其它节点。其中xml文件的声明包括三方面的内容:Version、Standalone和Encoding。下面将详细列出常见tinyxml2的用法。

注意:以下示例代码针对本人下载使用的TinyXML2,官网的TinyXML2在不断的完善和更新当中,最新的TinyXML2和本人的示例代码可能会有出入。本人使用的TinyXML2是2015.9.23从官网下载的,已上传至CSDN下载,见:TinyXML2。

3.1创建XML文件

示例代码:

创建结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER/>123.2增加XML文件的节点

示例代码:

//用户类

class Ur

{

public:

Ur(){

gender=0;

};

Ur(const string& urName, const string& password, int gender, const string& mobile, const string& email){

this->urName=urName;

this->password=password;

this->gender=gender;

this->mobile=mobile;

this->email=email;

};

string urName;

string password;

int gender;

string mobile;

string email;

};

//function:inrt XML node

//param:xmlPath:xml文件路径; ur:用户对象

//return:0:成功; 非0:失败

int inrtXMLNode(const char* xmlPath,const Ur& ur)

{

XMLDocument doc;

int res=doc.LoadFile(xmlPath);

if(res!=0)

{

cout<<"load xml file failed"<<endl;

return res;

}

XMLElement* root=doc.RootElement();

XMLElement* urNode = doc.NewElement("Ur");

urNode->SetAttribute("Name",ur.urName.c_str());

urNode->SetAttribute("Password ",ur.password.c_str());

root->InrtEndChild(urNode);

XMLElement* gender = doc.NewElement("Gender");

XMLText* genderText=doc.NewText(itoa(ur.gender));

gender->InrtEndChild(genderText);

urNode->InrtEndChild(gender);

XMLElement* mobile = doc.NewElement("Mobile");

mobile->InrtEndChild(doc.NewText(ur.mobile.c_str()));

urNode->InrtEndChild(mobile);

XMLElement* email = doc.NewElement("Email");

email->InrtEndChild(doc.NewText(ur.email.c_str()));

urNode->InrtEndChild(email);

return doc.SaveFile(xmlPath);

}

创建结果:

3.3查询XML文件的指定节点

Xml文件中,一个用户节点存储一个用户的信息。因此,对用户信息的增删查改,即无论查询节点、删除节点、修改节点和增加节点,都需要获取需要操作的节点。那么先实现一个根据用户名获取节点指针的函数:

//function:根据用户名获取用户节点

//param:root:xml文件根节点;urName:用户名

//return:用户节点

XMLElement* queryUrNodeByName(XMLElement* root,const string& urName)

{

XMLElement* urNode=root->FirstChildElement("Ur");

while(urNode!=NULL)

{

if(urNode->Attribute("Name")==urName)

break;

urNode=urNode->NextSiblingElement();//下一个兄弟节点

}

return urNode;

}

在以上函数的基础上,获取用户信息的函数:

3.4修改XML文件的指定节点

验证代码:

修改结果:

3.5删除XML文件的指定节点的信息总结;资料内容包括:C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,嵌入式 等。。。后台私信;资料;两个字可以免费领取

本文发布于:2023-02-28 21:01:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1677716495100443.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:tinyxml.doc

本文 PDF 下载地址:tinyxml.pdf

标签:tinyxml
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|