有關資料傳輸的設計盲點
【傳輸波形歪斜,通信不穩】
※現 象 傳輸波形歪斜、通信狀況不穩等問題,通常是發生在資料轉送率極高的數位資料傳輸線路,例如Line Drive與Receive等電路。該電路是經由系統主機進行網際網路資料傳輸,因此一般是利用包覆型電纜(Twist Pair Cable)以差動電壓作資料的收發。電壓規格則是根據EIA-485的規範,在同一傳輸線路作複數Node連接。Topology是屬於包裹式Bus連線,它的兩端是利用與Cable特性阻抗(Impe dance)相同的Impedance Terminate作終端。由於傳輸距離在Net Work可能高達數公尺,機器內部可能會遭受馬達、Solenoid等電洞(Surge)電壓的侵襲,連接器(Connector)必需承受反覆插拔,基於保護Line Drive與Receive等考量,因此插入如圖4-1所示的二極體(Diode)Clump電路,由於該二極體具備耐電洞衝擊特性,因此經常被應用於Switching Power Supply的電源整流。
※原因分析 二極體一旦被施加逆電壓時,二極體內部的PN接合處會產生靜電容量,進而造成Line Drive與Receive的阻抗(Impedance)受到影響。
※對策 理論上利用Pulse Transformer作絕緣是最佳對策,不過事實上卻不易達成,因此改用PN接合處靜電容量較低的二極體作對策。由於Data Sheet並未記載有關二極體的靜電容量相關資料,因此祇能依靠反覆的實驗才能決定二極體的的型號。一般而言順電流的最大絕對定格值越大,相對的二極體的PN接合處面積也越大,靜電容量也隨著增大,換句話說基本上祇要選用最大絕對定格值較小的二極體即可,不過必需注意的是最大絕對定格值如果太小時,二極體較易受到電洞電壓的破壞,因此本對策採用ST Micro Electronics的DA112S1 Diode Arr ay。
【信號洩漏至鄰近頻道】
※現象 隨著電路低電壓、高速化,使用傳統74LS系列TTL IC的機會逐年降低,不過未來仍有可能將72LS244 IC當作輸出入的緩衝器(Buffer)。圖5-1是將72LS244 IC當作Switch的Input使用,該電路為了減低外部噪訊混入Switch A,因此72LS24 4 IC附近插入防噪訊用電容(Condenser),不過當該Switch A ON的瞬間,鄰近電路也會同時出現Output現象,最後變成設計失敗例。
※原因分析 原先懷疑是Switch A ON時,短暫(Transient)電流流成為Cross Talk,流入鄰近的Input Line,造成鄰近電路誤動作,然而確認噪訊Margin並無任何不妥,因此調閱Data Book檢討內部等價電路,認為LS-TTL的設計才是問題的根源,所以採取如圖5-2的對策,利用負的輸入電壓產生寄生Transistor,不過Pattern的電感(Inductance)與噪訊去除用電容所形成的LC共振電路,卻因Switch ON的動作增加額外的Step電壓變化,進而發生衰減振動造成IC的輸入電壓變化負的時間,內部的寄生Transistor引進鄰近Gate內部的寄生Transistor,最後導致鄰近電路誤動作。
※對策 追加衰減(Damping)電阻就可以解決Switch A ON時的誤動作問題,換言之設計數位電路時除了理論計算之外,更應充分閱讀相關的Data Book。
有關消耗電流的設計盲點
【CMOS標準IC構成的電路,消耗電流偏高】
※現象 為了使電池能長時間動作,因此採用74HC系列的CMOS標準邏輯IC設計電路,不過實際上電路的消耗電流卻比預期值高。
※原因分析 如圖6-1所示1個Package具有複數個電路,由於未使用的電路Input Pin呈開放狀,造成開放狀的Input Pin受到鄰近Pin與噪訊的影響產生誤動作。主要原因是CMOS邏輯IC的輸入阻抗(Impedance)非常高,加上設計者誤認為CMOS邏輯IC的消耗電流很低,當輸出由ON變成OFF或是由OFF變成ON時,會因Switching產生極大電流。為了檢討上述推論因此利用圖6-2電路作測試,該電路是由74HC00 CMO S邏輯IC所構成,NAND Gate具有四個電路,並由電池提供 Vcc=3.0V的電壓,其中一個電路的輸入端呈開放狀,輸出Pin的電壓波形 (ch1)是利用插入 Vcc的100Ω電阻的壓降 (ch2)特性觀測,圖6-3是觀測波形的結果,由圖可知輸出Pin (ch1)的Ham出現高頻波噪訊重疊形狀,此時74HC00 IC內的電流值利用100Ω電阻兩端的電壓 (ch2) 計算約為40mA,換言之由以上的檢測結果可知,Ham對電路具有強大影響,使的電路產生各種變化。
※對策 為了讓未使用的Input Pin電壓Level能維持一定Level,因此將Input Pin與GND連接,如此便可解決上述問題。
【噪訊混入類比CMOS邏輯混載電路,耗電量偏高】
※現象 圖7-1是利用電池驅動的感測(Sensor)電路的部分電路圖,基本上它是利用OP增幅器(Amplifier)使感測器傳來的信號(正弦波)增幅,再用74HC04邏輯IC進行感測信號同步處理,然而實際上該電路卻面臨噪訊與耗電量偏高的困擾。
※原因分析 主要原因是設計者誤將邏輯IC當作是以臨界(Threshold)電壓動作的Comparator,如果仔細查閱74HC04 IC的輸出特性就可發現,事實上輸入電壓通過74HC04 IC的臨界值附近時會產生Chattering。圖7-2是將10kHz正弦波施加於74HC04 In put端時的耗電量特性,圖中上半段是耗電量特性的波形,下半段是輸出的波形,正弦波的中央附近亦即74HC04 IC的臨界值附近,電源電流呈脈衝狀(3μs,2 0mA)增加,而該脈衝狀電源電流就是造成耗電量過大與發生噪訊的主要原因,值得一提的是該狀態時的74HC04 IC的電源電流平均值為0.6mA。主要原因是設計者誤將邏輯IC當作是以臨界(Threshold)電壓動作的Comparator,如果仔細查閱74HC04 IC的輸出特性就可發現,事實上輸入電壓通過74HC04 IC的臨界值附近時會產生Chattering。圖7-2是將10kHz正弦波施加於74HC04 In put端時的耗電量特性,圖中上半段是耗電量特性的波形,下半段是輸出的波形,正弦波的中央附近亦即74HC04 IC的臨界值附近,電源電流呈脈衝狀(3μs,2 0mA)增加,而該脈衝狀電源電流就是造成耗電量過大與發生噪訊的主要原因,值得一提的是該狀態時的74HC04 IC的電源電流平均值為0.6mA。
※對策 類比信號必需通過Comparator才能輸入至74HC04 IC,不過卻不可使High或是Low以外的信號流入邏輯電路內。圖7-1的電路更換兩個OP增幅器(Amplifier)替代品,其中一個使用Comparator,類似如此的設計可能是基於用途上的考量。在一個封裝Package設有兩個OP增幅IC,可使用MAX951之類OP增幅器與Comparator合成的標準元件,也可以利用Schmidt Trigger Input元件,不過這類元件具備兩種臨界(Threshold)電壓,因此對要求精密Tinning的場合,必需考慮圖7-3的 信號延遲問題。
【Schmidt Input IC耗電量過高】
※現象 基本上它是使用多顆74HC系列的IC進行Tinning電路測試,不過實際上卻發生耗電量過高問題,耗電量過高對電源為3V定格鋰離子電池而言,可說是致命性的困擾,然而簡討導線Layout卻未發現任何不妥,因而懷疑是IC初期特性不良所造成,然而更換IC後情況並未改善。
※原因分析 主要原因是該電路內設有使用Schmidt Input Gate IC所構成的低頻振盪電路(圖8-1),因此祇要將該Gate IC拔除,耗電量立即大幅下降。換句話說利用單一的Gate製作振盪電路,如何避免頻率與Duty比的變化不會造成問題,成為設計上的重點。由於該振盪電路的復歸阻抗為1MΩ,因此即使作短路處理理論上祇能獲得3V,3μA的電流,不過經過電路振盪後上述電流會提高近100倍左右。
※對策 為了要驗證該振盪電路是造成耗電量增加的推論,因此另外組裝電路作測試,該電路使用74HC14與4584 IC,復原阻抗為1MΩ,輸入Pin的Tinning電容為0.1μF。表8-1是電源電壓變化時的振盪頻率變化特性。由於輸入Pin的電壓非常接近臨界(Threshold)電壓Level,因此輸出反轉之前的電流會變大,換句話說以往CMOS低消耗電流的觀念,在類似振盪電路等具有類比要素的電路上未必適用,有鑑於此利用4000號系列標準CMOS臨界(Threshold)Input IC4093,取代74HC 132 IC構成的振盪電路,雖然4000號系列標準CMOS邏輯IC的最低動作電壓為3V,不過即使該IC的電氣特性惡化,電壓低於3V也能動作。事實上並非祇有利用臨界(Threshold)Input IC構成的振盪電路消耗電流會增加,例如附有大CR時定數的Chartering去除電路,或是將臨界(Threshold)Input IC當作無法確定H/L的類比信號轉換成數位信號的Comparator使用時更需注意上述問的題。2~3個Inverter直列並排,再用電阻與電容施加於復歸振盪電路,如此一來在振盪的同時就可作類比性的動作,且74HC系列的IC電流值往往大於預期值。
有關HDL編寫的盲點
【非同步信號輸入State Machine,信號就遷移至Illegal State】
※現象 利用PDL設計State Machine時,如果未將State Machine的信號與Clock作同步直接連接的話,當Input信號的遷移接近Clock的有效Edge時,Input信號經常會遷移至Illegal State。例如根據List 9-1設計成圖9-1的電路,圖9-2就成為該電路的狀態遷移圖,在圖9-2以State名稱敘述值是程式編寫器(Compiler)將Sta te Encoding轉寫的結果。上述設計由於兩個Resistor都成為1的狀態無法使用,因此該狀態成為Illegal State。
※原因分析 圖9-1的電路中具有複數個sw輸入信號傳輸至Resistor的路徑,各路徑的傳輸延遲時間即使是極微小差異,Resistor的Set Up時間就會產生極大的不同。例如圖9-1的電路,當sw信號為1 (H Level)時,假設某個Tinning的Clock的有效Ed ge可使上方的Resistor保持0,使下方的Resistor保持1,如此一來1會傳輸至上方的Resistor,0會傳輸至下方的Resistor,理論上在下個Clock的有效Edge ,Resistor會將該值Keep住,不過若在這之前如果sw信號變成0(L Level ),上方Register輸入端子的信號會從1變成0,下方Resistor輸入端子的信號則從0變成1,此時如果上方Resistor輸入端子的信號變化,因Clock的有效Edge發生微小的延遲,則上方Resistor會維持1,使的上、下方的Resistor都變成1,這種現象稱為「Illegal State」,直到sw信號回復成為1為止持續維持Illegal State狀態。
※對策 上述現象是因為輸入信號與Clock變化非常接近所造成,因此對策上必需使輸入信號與Clock同步,其結果如List9-2所示。實際上這種現象並非祇有State Mac hine才會發生,一般而言同步電路都有可能發生相同問題,換句話在說同步電路中如何使輸入信號與Clock同步化是同步設計的基本原則(Rule)。
【利用PLD製作One Shot Timer的輸出,在PLD內部再利用時發生Tinning偏差】
※ 現象 List10-1是將電阻與電容器連接於PLD的外部,作成One Shot Timer時,利用ABEL編寫的程式部份摘要,圖10-1是根據該程式合成的電路。該電路可以檢測CLK端子的站立Edge,再輸出一定時間的脈衝,由於CLK端子的站立,D Flip F lop的輸出變成H Level,如此一來由於CR端子變成高阻抗(High Impedance),因此電容器通過電阻進行充電,當電容的電位上升後D Flip Flop的ACLR成為Active,D Flip Flop被Reset輸出Q成為H Level,R端子也成為H Level,電容器(Capacitor)開始放電。雖然電路單獨狀態時的動作都很正常,不過該電路的Output信號在內部再使用時就發生困擾(Trouble)。PLD的Macro cell的Output信號經常會在內部再度被使用時,而實際上到底使用多少的Product Term,若不詳閱程式編寫器(Compiler)的Report根本無法清楚掌握重點。正因如此上述Trouble是因為再度使用Output信號的各電路,針對Output信號動作的Tinning產生偏差所造成。
※原因分析 10-1是根據程式編寫器(Compiler)合成的複數電路,是造成上述Trouble主要原因,具體而言由於Source Code並非敘述單一程式,而且還將Output信號應用於複數電路,再將這些電路跨越其它邏輯Block,最後當然會形成如圖10-1所示的複數電路。由於CR端子祇有一個,與外部連接的電阻與電容也都祇有一個,也就是說CR端子的Feed Back必需與複數個D Flip Flop的ACLR連接,CR端子的電壓是屬於緩慢變化的信號,因此被各D Flip Flop Reset的Tinning就產生差異。
※對策 最簡單的對策就是不將Out信號當作Feed Back應用於內部,在外部與其它Input Pin連接,如此一來Out put信號祇對外部輸出,進而形成一個合成電路。
【利用CPLD設計的Port執行位元操作指令時,機器發生誤動作】
※現象 利用PLD設計如圖11-1所示的Micro Computer外部擴充I/O Port,PLD的內部電路是用VHDL編寫,List11-1是部份程式摘要,圖11-2是是根據該程式合成的電路,Output Port是用Clock同步方式設計,相當於第6行到第6行的Process敘述,同步Clock主要是應用於CPU周邊電路的Output System,因此信號的名稱又稱為CLK。該Output Port被設計成可作Lead Back,相當於第20行到第41行的Proc ess敘述。 上述設計主要是針對機器的控制器,因此輸出入信號的名稱直接使用機器的驅動器(Actuator)名稱,例如第9行的DCM1CW_fb信號名稱,是使DC馬達初始朝時鐘方向(CW)旋轉的信號。不過實際上電路動作時,DC馬達初始動作卻經常發生問題(Trouble)。
※原因分析 主要原因是利用CPLD製成的Lead Back電路的程式敘述有瑕疵(Bug)。具體而言在第9行Output Port的Data位元0,分配有DCM1CW_fb信號,然而在第31行Input Port的的DATA的位元0,卻又分配DCM1CCW_fb信號,也就是說Output Port與Inp ut Port的位元0與位元1信號名稱分配不一致,所以當Micro Computer執行位元操作指令時便發生問題,因為位元操作指令會從指定的位址(Address)將資料讀入Resistor,接著針對Resistor的資料將指定的位元Set至指定值,之後便執行「將Resistor的資料寫入原位址」的動作,亦即進行與Memory的位元操作相同的Lead Modify Light動作 。
※對策 最根本的對策是修改Source Code,將第31行的DCM1CW_fb與DCM1CCW_fb兩者對調使動作恢復正常。為了防範未然HDL(Hardware Description Language)的敘述方式盡可能單純化,具體實例如下:
【Clock同步式的Latch經常發生怪異值,如何Latch】
※現象 List12-1是利用ABEL設計PLD的程式產生Clock同步式Latch的實例,理論上根據該List應該可以合成如圖12-1所示的電路,然而實際上電路卻不動作。
※原因分析 List12-1的敘述中第19行代入式右邊Q0信號名稱卻未添加擴充子,造成未明示到底是Register Feed Back或是Pin Feed Back的困擾。由於程式編寫器(Compi le)解釋成Pin Feed Back,依此合成圖12-1的電路是造成問題的主要原因。 List12-2是Therinks公司的WebPackISE,經過程式編寫(Compile)時的部份Rep ort File,由該List可知Q0.D的代入式右邊使用Q0.PIN。在圖12-2的電路 為0(L Level)時,Resistor Feed Back與Pin Feed Back的值不一致,因此即使LE變成1(H Level),Resistor的值無法被Latch,因為隨著與Q0連接的外部電路電壓Level變化,Resistor的值也跟著改變。
List12-2 Therinks公司的WebPackISE經過
※對策 正確的敘述方法如List12-3所示,添加擴充子明示Resistor Feed Back,具體內容是在第19行代入式右邊Q0的信號名稱,「.fb」就是該信號名稱。圖12-2是根據該程式合成的電路,List12-4是用WebPackISE將List12-3 Compile時的部份Re port File,由該List可知Q0.D的代入式右邊使用Q0.Q,所謂的.Q是明示Resistor Feed Back的擴充子,這種方式經常出現在ABEL的Source Code。.Q與.fb最大差異是.Q祇能用於Resistor Output的Feed Back,而.fb卻可用Combina tion Output的Feed Back,所謂的Combination是指組合理論電路的輸(Output),例如List12-1的第12行的istype’reg’雖然是表示Resistor Output,然而Combination Output的場合卻變成istype’com’。
【算數演算Package變成Compile】
※現象 利用VHDL設計PDL將List13-1的Source Code Compile時發生錯誤(Error)。List13-2是Therinks公司的WebPackISE,經過程式編寫(Compile)時的部份Rep ort File,由該List可知錯誤的原因可能是利用第25,26,31,32行的程式進 行算數演算時出現Error,不過第3行卻可叫出算數演算Package std_logi c_ a rith。
※原因分析 雖然std_logic_arith是屬於可以演算signed與unsigned兩者的算數演算Packag e,不過卻無法直接處理std_logic_vector的資料形式(Data Type),是發生問題的主要原因。
List13-2 用WebPackISE將List13-1 Compile時的部份Report File
※對策 最簡單的對策是在第3行將呼叫Package,變更成std_logic_unsigned或是std_ logic_signed。以List13-1為例如果要將Input的A與B、Output的C以無碼方式處理,祇需將第3行的敘述更改成如下所示即可。 Use IEEE.std_logic_unsigned.all; 另一種對策是將算數演算的信號從std_logic_vector的資料形式變更成signed或是unsigned。以List13-3而言是在第17行以unsigned宣示算數演算的信號,接著在第21行與第22行代入A與B,由於無法直接將std_logic_vector直接代入unsigned,所以連結std_logic後才代入。實際上進行算數演算時是使用第28,29,34,35右邊unsigned的信號,此時未作資料形式轉換直接將unsigned代入std_logic_vector,不過由於進行理論演算的30~33行無法使用unsigned,因此改用std_logic_vector。 還有一種對策是使用Type變換關數法,List13-4就是使用變換關數法的例子,具體方法是利用25,26,31,32行所謂的unsigned Type變換關數,將std_lo gic_vector變換成unsigned,由於這些關數包含在std_logic_arith Package內,所以並不需要呼叫其它的Package。
【利用16進位敘述Counter值就發生錯誤】
※現象 接著要介紹利用VHDL設計邏輯電路經常發生的錯誤。List14-1是敘述Counter的實例,由於Counter的位元數非常多,如果用2進位敘述Counter相當煩瑣,所以改用16進位敘述,例如List14-1的第31行ADD_fb信號是16位元std_logic_vect or,如果用2進位敘述則多達16行,而16進位祇有4行,不過將List14-1Compile會因用Compiler會產生Error。
※原因分析 主要原因是std_logic_vector祇允許2進位敘述,雖然某些程式編寫器(Compil er)允許這種方式,不過卻很容易發生錯誤(Error)。std_logic_vector祇允許2進位主要原因是std_logic的抓取值是0與1之外的數字,List14-1表示std_logi c的抓取值,由List可知該值表示邏輯電路信號線的狀態,例如Z表示高阻(High Impedance)狀態,而High Impedance狀態卻對該值不具任何意義,因此不論是2進位或是16進位都無法敘述。2進位允許的敘述會被當作一次元配列處理,例如所謂的”ZZZ ”的std_logic_vector(0到3),事實上是表示4位元信號全部都是高阻抗(High Impedance)狀態。
抓取值 |
定義 |
U |
初期值 |
X |
不定義 |
0 |
0 |
1 |
1 |
Z |
高阻抗 |
W |
弱信號不定義 |
L |
弱信號的0 |
H |
弱信號的1 |
-- |
Don’t care |
表14-1 std_logic的抓取值
※對策 最簡單的對策是將資料形式(Data Type)變更成bit_vector,所謂的Data Type的抓取值祇有0與1,所以允許2進位以外8進位、16進位的敘述,不過某些情況卻不適用,例如List14-1的第42行欲作ADDR_fb<=(other=>’-‘)時,就無法將AD DR_fb作成bit_vector,此時必需使用Type關數變換作以下的敘述: ADDR_fb<=To_stdlogicvector)x”FFFC”); 所謂的To_stdlogicvector關數,是將位元bit_vector轉換成std_logic_vector的關數,值得一提的是關數名稱會因Compiler有所不同,因此必需事先確認Com piler的使用說明(Manual)避免會產生錯誤(Error)。
【bit_vector的資料形式變成Compile Error】
※現象 利用VHDL敘述作List15-1的8位元Counter設計時,使用所謂的「bit_vector」資料形式(Data Type),然而事實上bit_vector的bit資料形式抓取值為0與1,。本設計的BX bit_vector是企圖設計2進位(Binary)Counter,期待BX的表示值能被當作2進位處理,在第18行該2進位祇用一個加算合成電路,不過該電路Com pile時卻發生錯誤(Error)。
※原因分析 主要原因是未呼叫bit_vector的算術演算Package造成上述錯誤(Error)。因為在第18行是作bit_vector的BX_fb與integer 1的算術演算,因此必需叫出算術演算Package,雖然第3行有呼叫st_logic_unsigned,不過該Package卻無法支援(Support)bit_vector的算術演算。
※對策 最簡單的對策是呼叫可支援(Support) bit_vector的算術演算Package,具體方法是變更List15-1第3行的敘述: userk.bit_arith.all; 必需注意的是關數名稱會因Compiler有所不同,因此必需事先確認Compiler的使用說明(Manual)避免會產生錯誤(Error)。例如List15-2第1行至第20行就是敘述將bit_vector「Inclement」的關數,第23行至第44行也是使該關數敘述Counter,它相當於List15-2的第40行。除了使用所謂的bitinc關數之外,如果延用Source Code時,可將第1行至第20行複製(Copy)置於Source Code的前端,再以其它檔(File)讀入制同一個Project,之後祇要如第25行將User Package叫出就可使用。 |