brightchl的个人空间 https://bbs.21ic.com/?171901 [收藏] [复制] [RSS]

日志

基礎電路設計(八)數位電路設計盲點實例與對策

已有 1607 次阅读2005-12-16 09:06 |系统分类:接口电路

關數位電路設計盲點的內容,將分別針對Tinning、資料傳輸、消耗電流、HDL編寫等項目,輔以實例進行現象、原因分析以及對策探討。首先要介紹的是二進位計數器(Binary Counter)的設計。


有關Tinning的設計盲點


【二進位計數器】


二進位計數器經常被用來作外部輸入脈衝的同步化,此外計數器的輸出可負載(Lo ad)到計數器本身,如果某種原因使得同步信號消失,可因為二進位計數器持續維持輸出Tinning,直到同步信號恢復正常再度取得同步為止,而且二進位計數器具有抗噪訊特性,所以是種廣被使用的電路Block。


※現象
1-1是典型的二進位計數器電路,該電路是將0~5計數(Count),將6 Counter,不過由於某種原因使得同步信號與計數器(Counter)的輸出Tinning產生偏差,就會像產生如圖1-2所示的電路輸出持續偏差現象。




※原因分析
Flip Flop可keep已負載於二進位計數器LD的信號,因此若是忘記將「Flip Flop」Reset就會發生上述現象。為了符合設計規格因此利用圖1-3的二進位計數器輸出,不過由於圖1-1的電路,負載之前已將Tinning解碼(Decoder),並用D Flip Flop將該信號延遲一位元(Bit)作成Load Tinning,因此某種原因使得同步信號與後段Flip Flop判定(Assert)Tinning延遲一位元時,Tinning就會持續維持輸出偏差狀態。




※對策
根據電路Block的動作特性進行延遲計算,通常設計上不會有任何問題,因此採用如圖1-4所示的對策,如果因為負載信號的傳輸延遲造成延遲(delay),祇需在圖1-4後面的D Flip Flop作Load就可解決上述問題。
圖1-1的電路原先是與圖1-3的電路相同,不過可能是進行Bread Board評鑑測試時發生解碼錯誤(miss),或者是負載信號傳輸的Line Delay無法滿足Set Up與Hold Tinning,因此插入D Flip Flop作Careless Miss對策。



【夾雜延遲無法提高Clock頻率】


※現象
這是經常發生的典型失敗設計實例,主要原因是計數器的Illegal State對策不當造成Clock頻率無法提高。在理論合成階段理論壓縮的PLD,有許多情況雖然不致構成障礙,然而實際上卻潛伏許多無法釐清盲點。圖2-1是十進位計數器設計實例,圖中的3至8 Line Decoder相當於74137的TTL Micro。


※原因分析
如上所述Clock頻率無法提高,主要原因是不當的Illegal State對策所造成。由於Illegal State對策上因為某種因,使得必要的Counter以外的值插入State,為了順利回復原正常狀態因此設置Illegal State,不過該對策卻會壓迫動作性能,造成本末倒置的反效果。



※對策
將Illegal State對策降至最小範圍,根據State Machine的情況充分檢討,設法使Clock數能回復原正常狀態,且不會產生其它問題。尤其是二進位計數器(Binary Counter),可以應用過去Disc Lead IC設計手法,簡化Illegal Sta te的Decoder。圖2-2是根據上述方式設計的電路圖,如圖所示Illegal State(此時為Ah以上)的Decoder是由負載條件決定,並刻意使Flip Flop的輸出變成1,再使負載條件能完全成立進行Decoder(此時為Bh,Dh,Fh),進而使電路恢復正常狀態。



【計數器切換造成分佈不均】










※現象
為製作時間分析儀因此在輸入端分別設置可儲存檢測中的資料的計數器,以及可將資料記憶至Memory的計數器(Counter),不過由於計數器產生分佈不均現象,所以無法正確檢測。時間分析儀又稱為「Multi Channel Analyzer」,它的主要功能是將時間分割作信號分類。圖3-1是2頻時間分析儀的Counter Channel切換電路,圖中的InO Switch是用來作初期化,圖中的下半段是產生頻道切換時間的電路,本電路圖是美國Beige Bag Software公司設計的 Spice A-D 2000 Versi on3.0.2。Sig主要用意是希望用時間分析儀檢測的脈衝,Out1是區分成Counter U6脈衝,它是用信號Sel進行區分,當Sel為「H」時利用計數器(Count er)U4計數(Count),若是「L」時則利用計數器(Counter)U6計數(Count)。此外脈衝在區分成U4時會讀取U6的資料,脈衝在區分成U6(Out3)時會讀取U4(Out2)的資料(位圖示)。U9與U10在切換計數器(Counter)時會將U4與U6清除(Clear)。此外從計數器讀取資料後會作清除動作,因此利用U13、U16、U14產生Tinning信號。



※原因分析
輸入至Counter Clock的Selector作非同步切換,造成選擇(Selector)切換與Coun ter的頻率特性同時出現,如圖3-2所示更惡劣的情況是通過切換時的切換脈衝被分斷成Out 1與Out2,形成雙重計數(Double Count)現象,即使使用正確的時間選擇(Selector)做切換,都無法解決上述雙重計數的問題。



圖3-2 圖3-1電路的Time Chart


※對策
由於上述電路是以Selector作切換,所以沒有簡易的對策可供參考,必需將被測信號與系列Clock同步化(圖3-3),同時Counter也需使用同步Type,並將Counter改成一個,使頻道(Channel)切換時前頻道的計數資料(Count Data)能被Latch同時還能清除Counter。由圖3-3可知它是利用Master Clock的Mck使U3、U4、U12、U14同步動作,並利用U3、U4、U12、U14輸出的的結果,使得Mck也作能同步動作。在被測Sig的脈衝,U2的Q一旦變成H時,與Mck同步化的Out 0就成為H,在此同時U3對Out 0反轉,利用輸出Q將U2清除,其結果使得Out 0對Sig的站立發生反應,輸出脈衝信號Out 0,信號與Mck同步化而且可使Clock成為H,如此便可在Mast er Clock獲得同步的被測信號Out 0,因此用U4將信號Out 0 Counter,進而獲得輸出Out 2,隨著時間切換,利用脈衝Sel可以獲得時間內的計數結果,同時還可清除(Clear)U,,並開始下個檢測動作。不過必需注意的是Clear若有Out 0時會將它作1的初期化。雖然檢測脈衝在同步化後,祇檢測站立部分並將它計數(Coun t),然而實際上並非祇是單純的同步化,而是藉由Flip Flop的Clock的輸入,使得幅寬狹窄的脈衝也無法遺漏,不過作業上存有Dead Time,因此若是連續性的幅寬狹窄脈衝不斷出現時,上述方法就不適用,換句話說被測信號的脈衝幅寬必需是Master Clock的兩倍以上。
如圖3-4所示的Tinning,切換時的Data Latch與Clear是利用Mast Clock Mck下降執行,所以不會影響檢測動作。Tinning除了Counter之外還具有Latch成份,因此會在下個頻道檢測中記錄(Memory)上個頻道的資料並列入計算範圍,如此一來理論上頻道之間就無任何不協調,此外由於可檢測的頻率受到限制,因此可以進行正確的量測動作。



 


  有關資料傳輸的設計盲點

【傳輸波形歪斜,通信不穩】


※現 象
傳輸波形歪斜、通信狀況不穩等問題,通常是發生在資料轉送率極高的數位資料傳輸線路,例如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的電壓波形 (ch
1)是利用插入 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)的敘述方式盡可能單純化,具體實例如下:




  • 信號名稱不要太複雜
    以上述的例子而言盡量避免使用與機器元件相關的名稱,改用位址與位元等單純的信號名稱。



  • 盡量避免將std_logic連結代入std_logic_vector,不得以時則用
    元方式替代,就可避免發生上述的錯誤。


【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叫出就可使用。




路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)