資料推薦內容包括: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,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/1677716495100443.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:tinyxml.doc
本文 PDF 下載地址:tinyxml.pdf
| 留言與評論(共有 0 條評論) |