vhdl硬件描述語言與數字邏輯電路設計 第三版 侯伯亨713_第1頁
vhdl硬件描述語言與數字邏輯電路設計 第三版 侯伯亨713_第2頁
vhdl硬件描述語言與數字邏輯電路設計 第三版 侯伯亨713_第3頁
vhdl硬件描述語言與數字邏輯電路設計 第三版 侯伯亨713_第4頁
vhdl硬件描述語言與數字邏輯電路設計 第三版 侯伯亨713_第5頁
已閱讀5頁,還剩181頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第10章 數字系統的實際設計技巧10.1 數字系統優化的基本方法10.2 數字系統設計中的工程實際問題在線教務輔導網:教材其余課件及動畫素材請查閱在線教務輔導網QQ:349134187 或者直接輸入下面地址:在數字系統設計初期,人們根據系統功能總會畫出一些滿足系統要求的電路框圖,在這些電路框圖中往往存在一些不合理或冗余的部分需要進行進一步優化,以提高系統的整體性能。這種冗余的部分在生成門級電路以后是很難去除的。因此,必須在電路框圖階段進行優化。10.1 數字系統優化的基本方法10.1.1 相同電路的處理在系統設計的前期,設計人員不一定預先知道有多處存在著相同的運算電路,只有在畫出電路框圖后才會

2、發現它們的存在。例如在圖10-1(a)中,2個狀態都需進行B+1運算,要正確實現其功能需要3個B+1的運算電路。但是,進行優化以后實際上只要用1個B+1的運算電路就可以實現正確的邏輯功能,如圖10-1(b)所示。圖10-1 多個相同運算電路優化實例(a) 有多個相同運算的電路;(b) 優化后采用一個運算電路如圖10-1(a)所示,未優化的VHDL語言程序清單如下:ARCHITECTURE rtl of test IS SIGNAL aReg,bReg,cReg:INTEGER RANGE 0 TO 1023;BEGINPROCESS(clk) ISBEGINIF(clk EVENT AND c

3、lk=1) THEN CASE stateReg ISWHEN SO=aReg=bReg+1;bReg=bReg+1;cReg=aReg;stateRegaReg=aReg;bReg=cReg;cReg=bReg+1;stateReg=S0;END CASE;END IF;END PROCESS;END ARCHITECTURE rtl 如圖10-1(b)所示,優化后的VHDL語言程序清單如下:ARCHITECTURE rtl OF test IS SIGNAL node: INTEGER RANGE 0 TO 1023;BEGINnodeaReg=node;bReg=node;cReg=aR

4、eg;stateReg=S1;WHENaReg=aReg;bReg=cReg;cReg=node;stateRegaReg=aReg*bReg;bReg=bReg;cReg=cReg;stateRegaReg=aReg;bReg=cReg*dReg;cReg=cReg;stateReg=S0;END CASE;END IF;END PROCESS; 如圖10-3(b)所示,優化后的VHDL語言程序清單如下:SIGNAL multin1:INTEGER RANGE 0 TO 1023;SIGNAL multin2:INTEGER RANGE 0 TO 1023;SIGNAL multiout:I

5、NTEGER RANGE 0 TO 1023;multin1= aReg WHEN stateReg =S0 ELSE cReg;multin2=bReg WHEN stateReg=S0 ELSE dReg;multoutaReg=multout;bReg=bReg;cReg=cReg;dReg=dReg;stateRegaReg=aReg;bReg=multout;cReg=cReg;dReg=dReg;stateRegaReg=aReg+bReg;bReg=bReg;stateReg=S1;WHEN aReg=aReg;bReg=aReg-bReg;stateReg=S0;END CAS

6、E;END IF;END PROCESS;如圖10-4(b)所示,優化后的VHDL程序清單如下:SIGNAL addin1:INTEGER RANGE -512 TO 511;SIGNAL addin2:INTEGER RANGE -512 TO 511;SIGNAL addin3:INTEGER RANGE -512 TO 511;addin1=aReg;addin2=bReg WHEN stateReg=S0 ELSE -(bReg;)addoutaReg=addout;bReg=bReg;stateRegaReg=aReg;bReg=addout;stateRegaReg=in0;bRe

7、g=in1;cReg=in2;stateRegaReg=aReg* (bReg*cReg);臨界路徑bReg=bReg;cReg=cReg;stateRegaReg=aReg*2;bReg=bReg;cReg=cReg;stateReg=S0;END CASE;END IF;END PROCESS;從程序中可以看出,aReg=aReg*(bReg*cReg) 的路徑最長,因此,該系統的工作速度由該路徑中信號傳送的時間所確定。假設每個乘法器的運算時間需要100 ns,每個選擇器的時間延時需要1 ns,那么只考慮2個乘法器所需的運算處理時間就不能小于200ns。由此推斷,時鐘頻率一定不能高于5 M

8、Hz。2) 門電路之間延時時間的計算數字系統的延時也包含門電路之間的延時。門電路之間的延時由兩部分組成:門電路本身所產生的延時和連線所產生的傳輸延時。門電路之間的延時時間如圖10-5所示。一般來說,連線長度和門的扇出數成正比,當然也就和連線的延時時間成正比。如果某系統都是由門電路組成的,那么其系統總的延時時間應為系統總的延時時間= 使用邏輯單元和宏單元的FPGA和CPLD器件的延時,同樣可以用下面公式去估算:延時= 在ASIC芯片中,標準單元和門陣列的每個門延時約為0.10.5 ns;FPGA芯片中1個單元的延時約為幾個ns;LSTTL芯片每個門延時約為10 ns;ASIC芯片如果按1 ns延

9、時計算,則時鐘頻率可達1 GHz。由此可知,這就是ASIC芯片的工作速度比一般電路高得多的原因。3) 系統延時時間的評估在用EDA軟件工具對系統進行綜合時,軟件會自動尋找系統的臨界路徑,并為設計者指出系統所能工作的最高頻率。由于沒有考慮系統的動態工作特性,只以電路圖或網表為依據來尋找臨界路徑,因此把這種分析稱為靜態定時分析。例如,下面的VHDL語言程序清單中,EDA軟件把經過2個乘法器的路徑認定為該系統的臨界路徑,但是實際的信號傳輸路徑是經過一個加法器和一個乘法器(見圖10-6)。圖10-6 實際信號傳輸路徑示意圖系統的VHDL語言程序描述如下: nodeaReg=node+cReg;bReg

10、=node;cReg=cReg;stateRegaReg=node*cReg;bReg=node;cReg=cReg;stateRegaReg=in0;bReg=in1;cReg=in2;stateReg aReg=aReg*bReg;bReg= bReg;cReg=cReg;stateReg=S2;WHEN S2 aReg=aReg*(cReg*2);bReg= bReg;cReg=cReg;stateReg=S0;END CASE;END IF;END PROCESS;經修改后,臨界路徑變為aRegaReg=aReg*bReg;bReg=bReg-1;stateRegaReg=aReg+1

11、;bReg=bReg+2;stateReg=S0;END CASE;END IF;END PROCESS;利用多周期路徑后的VHDL語言程序描述如下:SIGNAL node :INTEGER RANGE 0 TO (2*16-1);TYPE STATENAME IS (S0, Sadd, S1);SIGNAL stateReg:STATENAME;NodeaReg=aReg;bReg=bReg;stateRegaReg=node;bReg=bReg-1;stateRegaReg=aReg+1;bReg=bReg+2;stateReg=S0;END CASE;END IF;END PROCESS

12、;在例10-3修改前的S0狀態中,aReg*bReg在1個時鐘周期中是無法完成的,因此,在S0和S1狀態之間插入一個中間狀態Sadd。aReg*bReg在S0狀態開始就進行運算,到Sadd狀態結束,aReg*bReg的中間值node形成,在S1狀態開始node值被賦予aReg,然后完成最后的運算。由VHDL語法知道,node=aReg*bReg語句和PROCESS語句是并發執行的,引入的Sadd狀態是為了拉長乘法時間,并使node= aReg*bReg運算與PROCESS同步。假設aReg*bReg需2個時鐘周期,那么這種修改是有效的。這樣就縮短了臨界路徑長度,提高了系統的整體工作速度。5)

13、減少臨界路徑上部件的扇出數眾所周知,一個部件的扇出數愈多,負載愈重,該部件對信號所產生的延時也就愈大。因此,減少臨界路徑上部件的扇出數無疑會提高系統的工作速度。圖10-10是減少臨界路徑上部件的扇出數來提高系統工作速度的實例。圖10-10(a)中,系統臨界路徑上部件的扇出數為3。將2個乘法器合并后,如圖10-10(b)所示,部件的扇出數變為2。圖10-10 減少臨界路徑上部件的扇出數來提高系統工作速度的實例(a) 系統原部件連接情況;(b) 利用共享乘法器減少扇出數情況利用計算系統的臨界路徑長度來評估系統的工作速度,在大多數情況下是可行的,但是也有例外。例如,當組合電路跨模塊進行連接時,有可能

14、使優化效果變差。也就是說,多個組合電路模塊合并成一個模塊進行優化,其臨界路徑肯定會更短。另外,多模塊連接后的實際路徑長度有可能比各模塊臨界路徑長度之和要長。10.2.2 縮小電路規模和降低功耗的方法1縮小電路規模的方法縮小電路規模的最基本方法是在設計時盡可能共享資源。1) 共享組合電路的部件使用EDA軟件達到理想的資源(部件)共享效果,這種情況大多是存在的。例如,在計算A+(BC)和(BC)2時,(BC)是相同的,可以用一個電路來實現。2) 共享寄存器在用VHDL語言設計電路時,要盡可能減少變量和信號量的設置,能共享的盡可能共享,因為冗余的寄存器將會增大電路規模和功耗,特別是位數較長的寄存器更

15、是如此。假如現有100個32位的冗余寄存器,那么就需要3200個觸發器。這樣大的規模在當前條件下是不能忽視的。3) 共享連線連線也是一種資源。利用三態門使多個輸出共享一條總線,這是共享總線的一種形式。當然,在CMOS電路中為了防止總線浮動,通常在輸出端要接上拉電阻或者下拉電阻。為了降低功耗有時也不采用三態總線。4) 展開處理時間實現資源共享如果在一個狀態中有幾次相同種類的運算或譯碼,那么將幾個相同運算依次分散到幾個狀態中進行處理,此時可以利用共享部件的方法使多個相同運算的電路用一個電路進行分時處理。5) 展開處理空間實現資源共享對數據流圖的處理順序進行適當調整就可以縮小數據流圖的規模。(1)

16、通過改變處理順序來縮小電路規模。圖10-11是通過改變處理順序來縮小電路規模的數據流圖。圖10-11(a)是未進行修改的數據流圖;圖10-11(b)是修改處理順序后的數據流圖。兩個圖的不同點是后者先作加法,后作乘法。這樣修改以后可以節省3個乘法器和1個加法器,從而縮小了電路規模。圖10-11 通過改變處理順序來縮小電路規模的數據流圖(a) 未進行修改的數據流圖;(b) 修改處理順序后的數據流圖(2) 通過串行處理來縮小電路規模。圖10-12是通過串行處理來縮小電路規模的數據流圖。圖10-12(a)是未進行修改前的數據流圖,圖10-12(b)是進行串行處理后的數據流圖。圖10-12(a)的運算公

17、式為f1=3a+bf2=a+3bf3=f1+f2完成此運算需要2個乘法器和3個加法器。如果直接對f3進行運算:f3=3a+b+a+3b=4a+4b=4(a+b)那么完成4(a+b)運算只要1個加法器和進行2次移位操作即可,如圖10-12(b)所示。這樣就大大縮小了電路的規模。圖10-12 通過串行處理縮小電路規模的數據流圖(a) 未修改前的數據流圖;(b) 進行串行處理后的數據流圖(3) 復雜運算化簡成簡單運算。復雜的運算通過適當改變順序可以變成簡單的運算。例如,(a+1)+b)+2)可以用(a+b)+3)來替代。這樣就可以省掉1個加法器。(4) 利用數據流圖中的已有結果。在數據流圖中某些分支

18、可能會得到相同的結果,此時可省掉1個分支,利用1個分支已得到的結果參與下一級運算,從而減少重復的運算電路。2在RTL級上降低系統功耗的方法功耗是單片系統的一個很重要的指標,功耗愈低,系統的壽命、可靠性和體積也愈低。1) 縮小電路的規模電路規模愈小,功耗也就愈小。前述的縮小電路規模的方法對降低功耗都有實際意義。2) 停止不必要的運算處理下面是某系統的VHDL語言程序描述清單,它由S0S3四個狀態組成。S0=1 WHEN stateReg=00 ELSE 0;S1=1 WHEN stateReg=01 ELSE 0;S2=1 WHEN stateReg=10 ELSE 0;S3=1 WHEN st

19、ateReg=11 ELSE 0;plus=aReg+bReg;minus=aReg-bReg;mult=aReg*bReg;nextA=plusWHEN S0=1 ELSEminusWHEN S1=1 ELSEmultWHEN S2=1 ELSEbReg; PROCESS(clk) IS BEGINIF(clkEVENT and clk=1) THENIF(reset=1) THENaReg=127;bReg=2;stateReg=00;ELSEaReg=nextA;bRegstateRegstateRegstateRegstateReg=00;END CASE END IF;END IF;

20、END PROCESS;上述程序中,S0進行加法運算,S1進行減法運算,S2進行乘法運算。經編譯綜合后,其電路的基本結構如圖10-13所示。這樣結構的電路無論在何種狀態下,所有運算電路都要進行工作。但是實際上S0狀態下只要加法運算器工作,S1狀態下乘法器就沒有必要進行工作。這些運算器沒有選擇的無用工作會增加電路的功耗。采用下面方法可以停止不必要的運算處理。(1) 只允許必要的運算電路工作。為了降低電路的功耗,只選擇必要的運算電路進行工作,對圖10-13進行修改后電路結構如圖10-14所示。圖10-14中,在各個運算器的輸入端插入一個“與門”,在沒有工作必要時使該電路輸出為“0”。由此可知,S0

21、狀態下乘法運算器和減法運算器不工作,S1狀態下乘法器不工作。圖10-13 某系統的基本電路結構圖10-14 圖10-13修改后的電路結構圖10-14對應的VHDL語言程序清單如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY hazard3 ISPORT(reset :IN STD_LOGIC;clk :IN STD_LOGIC;(途中省略)plusOut :OUT INTEGER RANGE 0 to (2*8-1);s3out :OUT STD_LOGIC;);END ENTITY

22、hazard3;ARCHITECTURE rtl OF hazard3 IS FUNCTION INTAND(val:INTEGER;cond : :STD_LOGIC)RETURN INTEGER ISBEGINvec:=CONV_STD_LOGIC_VECTOR(val,8);FOR i IN 0 TO 7 LOOPvec ( i ):=vec( i ) AND cond;END LOOP;RETURN CONV_INTEGER(UNSIGNED(vec);END FONCTION INTAND;FUNCTION INTOR4(val1,val2,val3,val4:INTEGER)RET

23、URN INTEGER ISVARIABLE vec1,vec2,vec3,vec4:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINvec1:=CONV_STD_LOGIC_VECTOR(val1,8);vec2:=CONV_STD_LOGIC_VECTOR(val2,8);vec3:=CONV_STD_LOGIC_VECTOR(val3,8);vec4:=CONV_STD_LOGIC_VECTOR(val4,8);RETURN CONV_INTEGER(UNSIGNED(vec1 or vec2 or vec3 or vec4);END FONCTION INTOR4;

24、SIGNAL aReg :INTEGER RANGE 0 to (2*8-1)(省略)SIGNAL S3:STD_LOGIC;BEGINS0 =1 WHEN stateReg=00 ELSE 0;S1 =1 WHEN stateReg=01 ELSE 0;S2 =1 WHEN stateReg=11 ELSE 0;S3 =1 WHEN stateReg=10 ELSE 0;aRegSt0 = INTAND (aReg , S0);aRegSt1 = INTAND (aReg , S1);aRegSt2 = INTAND (aReg , S2);aRegSt3 = INTAND (bReg ,

25、S3);bRegSt0 = INTAND (bReg , S0);bRegSt1 = INTAND (bReg , S1);bRegSt2 = INTAND (bReg , S2);plus = aRegSt0 + bRegSt0;minus = aRegSt1 -bRegSt1;mult = aRegSt2 *bRegSt2;nextA = INTOR4 (plus, minus, mult, aRegSt3);PROCESS (clk) IS(途中省略)END PROCESS;plusOut = plus;(省略)s3out = S3;END ARCHITECTURE rtl;(2) 盡可

26、能在數據流的前部分屏蔽數據流。數據流圖中的一個管道增加的控制“與門”像一個閥門,不需要進行運算的數據流應盡可能早地在數據流的前部分屏蔽,這樣可以降低功耗。在進行流水線操作時,在沒有有效數據的情況下管道的輸入側如果屏蔽數據,則會停止后階段的操作。如果控制數據流入的信號(如“與門”的輸入)與數據信號相比滯后,則會出現競爭冒險現象,從而降低減小功耗的效果。因此,必須消除這種競爭冒險現象。有關細節將在10.2.3節詳述。(3) 寄存器的值沒有必要改變時不要改變。若每個時鐘到來時寄存器的輸出值都要變化,那么它后面連接的組合電路也會隨之工作。另外,像移位寄存器等那樣的電路,即使沒有和組合電路相連接,只要數

27、據被移位,就會增加功耗。在運算器輸入端設置專用的寄存器是一種降低功耗的方法。例如在圖10-14中,各運算器在一個時鐘周期內有2次動作:第一次是當數據輸入時,第二次是當狀態切換時。要使運算器在一個時鐘周期只進行一次動作,就必須在運算器輸入端設置專用寄存器。只有當需要進行運算時,才將其數據寫入該寄存器。這樣動作減少了,當然功耗也就降低了。3) 減少競爭冒險的總量由于組合電路的信號在多條路徑中的傳輸延時不同,因而就會產生競爭冒險現象。譬如,冒險在信號流圖的前部分發生,就會向后面部分傳播,數量也會增加。特別地,多個處理串行連接時問題就會更大。圖10-15是多個加法器串行連接的電路。圖中,加法器產生的冒

28、險現象從前面向后面傳播,最后一個輸出 node6out 比第一級加法器輸出 node1out的冒險量增加了11倍。由此可見,這種串行工作的電路其最后一級輸出的冒險量與串聯的級數成正比。事實上,要完全消除冒險現象是困難的,但是使其減少卻是完全可以做到的。圖10-15對應的串接加法器的VHDL語言描述清單如下:node1= aReg +bReg;node2= cReg +node1;node3= dReg +node2;node4= eReg +node3;node11= fReg +node4;nextA = gReg +node11;通常減少串接電路數目就可以減少冒險總量。將圖10-15所示的

29、串接加法器的結構改為樹型,結果使其級數從6級減少為3級,那么冒險總量就會減少一半。樹型加法器連接的冒險現象如圖10-16所示。圖10-15 多個加法器串行連接的電路圖10-16 樹型加法器連接的冒險現象此外,還可以采取一些其它措施:減少參加運算輸入信號到來的時間量;縮短頻繁變化信號的傳輸路徑;減少多位長度的運算;構筑防止冒險傳播的防傳輸墻等。詳細內容將在10.2.3節中討論。圖10-16對應的樹型加法器連接的VHDL語言程序清單如下:node1= aReg +bReg;node2= cReg +dReg;node3= eReg +fReg;node4= node1 +node2;node11=

30、 node3 +gReg;nextA =node4+node11;4) 控制時鐘通過降低時鐘頻率,用“與門”控制某些工作單元,使其在不工作期間不提供時鐘等措施,同樣也可以降低系統的功耗。10.2.3 系統誤操作的成因及其消除方法系統在工作過程中有可能出現誤操作,其產生原因是多方面的。由于設計不當或存在的缺陷誘發的誤操作大致有以下幾種:(1) 冒險現象。冒險現象通常在信號發生變化時產生,其產生原因主要是輸入信號經不同路徑傳輸而出現不同的延時所引起的。冒險的傳播將危及后續的電路,特別是時序電路的正確工作。(2) 不遵守既定的定時關系。在用邊沿觸發器作為數據寄存器時,觸發器的數據輸入端和時鐘觸發邊沿

31、應保持嚴格的定時關系。圖10-17示出了寄存器的定時關系,在時鐘上升沿到來之前,觸發器的數據輸入端(D端)所加的信號必須有一段穩定的時間,這段時間稱為建立時間。在時鐘上升沿到來以后,D端的輸入信號仍需穩定地保持一段時間,該段時間稱為保持時間。建立時間和保持時間對不同的觸發器和不同工藝的電路都有明確不同的要求。如果在設計電路時破壞了這種定時關系,如建立時間不夠或保持時間不夠,則可能導致寄存器輸出值不穩定,即“0”或“1”無法確定,從而使系統出現誤操作。圖10-17 寄存器的定時關系(3) 數據和時鐘的臨界競爭。圖10-18是數據和時鐘的臨界競爭實例及定時關系。電路輸入信號在時鐘上升沿到來時,多個

32、寄存器或寄存器各位之間的值出現了參差不齊的變化,從而使輸出出現不穩定,這種現象稱為數據時鐘的臨界競爭,也稱為競爭。圖10-18 數據和時鐘的臨界競爭實例及定時關系(a) 臨界競爭電路實例;(b) 定時關系上述三個原因有可能導致系統或電路的誤操作。1設計時應重點注意的地方上述導致誤操作的因素并不是在所有場合都會起作用,例如,對于冒險現象來說,在寄存器與寄存器連接的同步電路中就可以不予考慮。下面列舉一些應重點注意的場合。1) 必須消除冒險現象的地方在與非同步電路的連接線上必須消除冒險現象。(1) 控制存儲器和觸發器的控制信號。對于存儲器或觸發器,無論是邊沿控制還是電平控制,如DRAM的RAS、CA

33、S、WE及觸發器的置位/復位端和鎖存控制端,都不能有冒險信號出現,否則就會破壞存儲器和觸發器的正常數據。另外,邊沿觸發的觸發器時鐘端和CPU邊沿觸發的中斷輸入信號同樣也不應混入冒險信號。(2) 應保持數個時鐘周期的信號。當CPU和存儲器等設備連接時,對建立/保持時間都有嚴格規定。如果系統的時鐘頻率比較高,則建立/保持時間要跨越幾個時鐘周期。此時如果信號中混有冒險信號,那么有可能破壞這種定時關系。例如,所設計芯片與110ns建立時間的存儲器相連,芯片時鐘為100 MHz(周期為10 ns),如果數據總線混入了周期為10ns的冒險信號,那么就會使存儲器產生讀/寫錯誤。2) 必須消除亞穩定和競爭的地

34、方需要接收來自非同步系統信號的地方必須考慮消除亞穩定和競爭。這里所說的非同步系統是指同一芯片內時鐘不同的模塊或芯片外連接的電路,而不是非同步電路。即使同一個時鐘驅動的電路,如果位于其它芯片或端口上,也應看做非同步系統。這是因為芯片的輸入和輸出驅動等會使時鐘和數據的相位產生延時。2消除冒險現象的方法消除冒險現象的方法很多,這里只舉幾個常用的方法。(1) 利用專用寄存器輸出信號。電路的輸出信號不由組合電路輸出,而是通過專用寄存器直接輸出。圖10-19是未使用專用寄存器出現冒險現象的實例。該實例的電路由一個八進制計數器和1個3-8譯碼器組成。當八進制計數器工作時,在其譯碼器輸出端y(0)y(7)就會

35、輪流出現1個時鐘周期的低電平。從圖10-19的仿真圖中可以發現,在譯碼器的輸出端出現了不應有的負向尖脈沖,也就是說出現了冒險現象。這些負向尖峰脈沖可能會對后接電路產生不利影響。為了消除這種冒險現象,在其各輸出端加一個鎖存寄存器,使它們通過寄存器輸出,以消除冒險現象。圖10-19 未使用專用寄存器出現冒險現象的實例圖10-19對應的VHDL語言程序清單如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY state_8 IS PORT( reset :IN STD_LOGIC; clk :I

36、N STD_LOGIC; y :OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END ENTITY state_8;ARCHITECTURE rtl OF state_8 IS SIGNAL S0,S1,S2,S3:STD_LOGIC; SIGNAL stateReg:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN y(0)=0 WHEN statereg=000 ELSE 1; y(1)=0 WHEN statereg=001 ELSE 1; y(2)=0 WHEN statereg=010 ELSE 1; y(3)=0 WHEN statere

37、g=011 ELSE 1; y(4)=0 WHEN statereg=100 ELSE 1; y(11)=0 WHEN statereg=101 ELSE 1; y(6)=0 WHEN statereg=110 ELSE 1; y(7)=0 WHEN statereg=111 ELSE 1; PROCESS(clk) IS BEGIN IF(clkEVENT AND clk=1) THEN IF(reset=1) THEN stateReg stateReg stateReg stateReg stateReg stateReg stateReg stateReg stateReg y y y

38、 y y y y y y=11111111; END CASE; END IF; END PROCESS; PROCESS(clk) IS BEGIN IF(clkEVENT AND clk=1) THEN IF(reset=1) THEN stateReg stateReg stateReg stateReg stateReg stateReg stateReg stateReg stateReg=000; END CASE; END IF; END IF; END PROCESS;END ARCHITECTURE rtl;圖10-20是輸出端插入專用寄存器清除冒險現象的實例。從圖10-20

39、中可以看出,在圖10-19中所出現的冒險現象被專用寄存器屏蔽掉了。寄存器之所以能屏蔽冒險現象,是因為寄存器的輸出值只在時鐘上升沿到來時采樣,在該時刻寄存器的數據輸入端處于穩定的數據狀態,從而避開了數據動態的變化過程。圖10-20 輸出端插入專用寄存器消除冒險現象的實例(2) 輸入至輸出只經過一條傳輸路徑。冒險現象是由于變化信號經過不同的路徑,產生不同延時而引起的。因此,在組合電路設計時使變化信號只通過一條路徑就可以消除冒險現象。圖10-21(a)是輸入至輸出只經過一條傳輸路徑消除冒險現象的實例。圖10-21(a)中,輸入信號b到達輸出端有2條路徑,這必定會發生冒險現象。現在假設只有輸入信號b發

40、生變化或a、b、c 3個信號只有一個信號發生變化,經調整后的邏輯電路如圖10-21(b)所示,此時輸入信號b從輸入到輸出只有一條傳輸路徑,因此該電路就不會發生冒險現象。當然,如果c和a(或b)同時發生變化,則在輸出端仍有可能發生冒險現象。圖10-21 輸入至輸出只經過一條傳輸路徑消除冒險現象的實例(a) 原電路圖;(b) 修改后的電路圖(3) 組合電路輸入信號同時只變化1位。如上所述,如果組合電路的多個輸入信號只有1位同時發生變化,那么在邏輯設計時就容易做到無冒險現象出現。例如,數字系統中的狀態機有多個狀態,許多控制信號是對狀態機不同的狀態進行譯碼產生的。圖10-22是8個狀態的狀態機編碼實例

41、。圖10-22(a)是一般編碼情況,從000111;圖10-22(b)則是漢明距離為1的編碼情況。前者在一個狀態向另一個狀態轉移時有可能同時使編碼值發生1位以上的變化,例如,111000就發生了3位變化;后者編碼按000000010011110010000000的規律進行改變,狀態在轉移時狀態編碼只發生1位變化。當然,這種方法并不能完全消除冒險現象,通常要對狀態譯碼電路進行分析,看在什么情況出現冒險。得到確定出現冒險現象的條件后,對邏輯電路進行適當修改,使其信號變化的輸入只有一條傳輸路徑,即可消除冒險現象。圖10-22 8個狀態的狀態機編碼實例(a) 通常的編碼;(b) 漢明距離為1的編碼在某

42、些情況下,狀態編碼不能保證只有1位發生變化(即漢明距離超過1)時,有2種編碼方法保證狀態圖編碼仍維持1位變化,如圖10-23所示。第一種方法是一個狀態分配多個編碼,如圖10-23(b)所示。原001狀態再分配1個010編碼,這樣可以保證漢明距離為1。例如,原110狀態轉移至001狀態,狀態編碼發生了3位變化。現在加了010編碼,那么該狀態編碼為001和010。110與該狀態的010編碼對照,只改變1位編碼。其余依次類推,也可得到相似的結果。第二種方法是在狀態譯碼時采用分組譯碼,如圖10-23(c)所示。1011轉移至0001時只對低2位譯碼,這樣就保證了只有1位發生變化。(4) 在譯碼輸出端加

43、選通電路。冒險現象通常發生在譯碼電路輸入發生變化的時刻。如果待輸入信號穩定以后,再輸出譯碼信號,那么就可以屏蔽冒險現象。例如,在圖10-19所示的仿真圖中如果加上選通信號STB,那么此時譯碼輸出就消除了,如圖10-24所示。圖10-24中,STB信號應相對clk前沿延時幾十納秒才行。在這里引入了一個比clk時鐘信號頻率高5倍的clk信號。圖10-23 狀態編碼漢明距離超過1時的處理方法(a) 漢明距離超過1的狀態圖;(b) 多編碼狀態圖;(c) 分組譯碼狀態圖圖10-24 加選通信號消除冒險現象的實例2個D觸發器U1、U2連接產生一個周期為clk/5的選通脈沖STB。該STB在clk上升沿時變

44、高,在經歷一個clk/5的周期之后變低。將該信號與譯碼輸出信號相“或”,即可屏蔽掉在clk上升沿之后出現的“1”冒險現象。同理,如果譯碼輸出是“1”有效,那么可以將NOT STB與譯碼輸出信號相“與”,從而消除“0”冒險現象。圖10-24對應的加選通信號STB的VHDL語言程序清單如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt8_deco11 IS PORT(reset,clk,clk11:IN STD_LOGIC; y_out:OUT STD_LOGIC_VECTOR(7

45、DOWNTO 0);END ENTITY cnt8_deco11;ARCHITECTURE rtl OF cnt8_deco11 IS COMPONENT cnt8 IS PORT(reset,clk:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); END COMPONENT cnt8; COMPONENT dff1 IS PORT(reset,clk,d:IN STD_LOGIC; q,qb:OUT STD_LOGIC); END COMPONENT dff1; SIGNAL reset_s,reset1,clk_s,clk111,q1,q

46、1b,q2,q2b,stb,vcc:STD_LOGIC; SIGNAL q_s:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL y_s,y:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN reset_s=reset; clk_s= clk; y_out(0)=y(0) OR stb; y_out(1)=y(1) OR stb; y_out(2)=y(2) OR stb; y_out(3)=y(3) OR stb; y_out(4)=y(4) OR stb; y_out(11)=y(11) OR stb; y_out(6)=y(6) OR stb

47、; y_out(7)yyyyyyyyy=11111111; END CASE; END PROCESS; stb=q1; vcc=1; reset1=reset_s AND (q1 NAND q2); u0:cnt8 PORT MAP(reset_s,clk_s,q_s); u1:dff1 PORT MAP(reset1,clk_s,vcc,q1,q1b); u2:dff1 PORT MAP(reset1,clk11,q1,q2,q2b); END ARCHITECTURE rtl;圖10-26 非同步信號同步的實例(5) 在譯碼邏輯中增加冗余項。若單個譯碼輸入發生變化,則可以在譯碼邏輯電路中

48、增加冗余項,從而達到消除冒險現象的目的。圖10-25是增加冗余項消除“1”冒險現象的實例,其表達式為F=AB+AC。這是因為,當B=C=“1”時,F=A+A。若電路在某些輸入組合情況下出現F= AA,那么該電路會產生“0”冒險現象。圖10-25所示電路的邏輯表達式中如增加冗余項BC,則為F=AB+AC+BC。當B=C=1時,F=1,從而消除了“1”冒險現象(產生負向干擾脈沖)。圖10-25 增加冗余項消除“1”冒險現象的實例(a) 產生“1”冒險的電路;(b) 增加冗余項消除“1”冒險的電路10.2.4 非同步信號的控制方法數字系統的外部輸入和內部不同時鐘模塊之間連接的信號都屬于非同步信號,系

49、統只有采用適當的非同步信號控制方法才能保證可靠的工作。1將非同步信號變為同步信號的方法將非同步信號變為同步信號的最簡單辦法是用D觸發器鎖存非同步信號,如圖10-26所示。圖10-26中,非同步輸入信號與D觸發器的D端相連,時鐘端clk與系統時鐘相連。這樣,在時鐘脈沖上升沿到來時就將非同步輸入信號鎖存于D觸發器的Q輸出端。在用VHDL語言描述時,表示鎖存的代入語句應位于IF( clk EVENT AND clk=1)語句的內側。例如:SIGNAL req _sync _reg:STD_LOGIC;PROCESS (clk ,reset _n ) IS BEGINIF( reset _n =0 )THENState_req = WAIT_ACCESS;ELSIF( clk EVENT AND clk=1 ) THENreq_sync_regIF( req_sync_reg=1) THEN State_reqIF ( req_sync_reg=0 )THEN State_reg= WAIT_ACCESS;END IF;END CASE;END IF;END PROCESS;該例中,非同步輸入信號是req,經觸發器同步后的信號為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論