【文章內容簡介】
1)行為描述中常見問題在VHDL語言中,一條信號帶入語句就可以創(chuàng)建一個驅動器。當同一賦值目標處于不同進程中時,其賦值結果就比較復雜。這可以看成是多個信號驅動源連在一起,可以發(fā)生線或、線與或者三態(tài)等不同結果。若處理不當,則會出現驅動器沖突。所以應避免在不同的進程中對同一個信號賦值,即多重源賦值問題。(2)RTL描述中常見問題,禁止使用兩個寄存器描述,對兩個寄存器的描述是不允許的;,對變量要先讀后寫,因為變量值是立即獲得的,所以如果先寫后讀就會產生長的組合邏輯和鎖存器(或寄存器)。因此在編寫代碼過程中,對變量要先讀后寫;,禁止使用ELSE項。對于RTL描述方式中的IF語句在其描述寄存器功能時,禁止采用ELSE項,因為這種賦值方式相當于檢測如果沒有時鐘信號時,則賦新值,而實際上不可能有這樣的硬件電路與之對應;,其敏感向量表中要包含所有要讀取得信號,以防止出現不必要的鎖存器。(3)語言描述中常見的語法錯誤,應該列出程序中所有使用到的程序庫及庫中什么程序包。例如,在程序中使用“+”運算,那么程序頭必須列出程序行“use”;,必須符合VHDL的文字規(guī)則。例如實體名不能以數字開頭,名字中不能出現“”、“”等;,不要在代碼中使用buffer類型的端口讀取輸出數據,要使用out類型,再增加另外變量或信號,以獲取輸出值。因為buffer類型的端口不能連接到其他類型的端口上,因此buffer類型就會在整個設計的端口中傳播下去。3. QuartusII常見錯誤(1)Found clocksensitive change during active clock edge at time time on register “name”原因:vectorsourcefile中時鐘敏感信號(如:數據,允許端,清零,同步加載等)在時鐘的邊緣同時變化。而時鐘敏感信號是不能在時鐘邊沿變化的。其后果為導致結果不正確。措施:編輯vectorsourcefile(2)VerilogHDLassignmentwarningatlocation:truncatedwithsizenumbertomatchsizeoftarget(number)原因:在HDL設計中對目標的位數進行了設定,如:reg[4:0]a。而默認為32位,將位數裁定到合適的大小。措施:如果結果正確,無須加以修正,如果不想看到這個警告,可以改變設定的位數。(3)Error:Can39。tnamelogicscfifo0ofinstanceinsthassamenameascurrentdesignfile原因:模塊的名字和project的名字重名了。措施:把兩個名字之一改一下,一般改模塊的名字。七、實驗總結和結論本學期的數電實驗,我主要學會了通過有限狀態(tài)機的方法來設計一個小系統。有限狀態(tài)機及其設計技術是實用數字系統設計中重要組成部分,是實現高效率高可靠邏輯控制的重要途徑。有限狀態(tài)機克服了純硬件數字系統順序方式控制不靈活的缺點。狀態(tài)機的工作方式是根據控制信號按照預先設定的狀態(tài)進行順序運行的,狀態(tài)機是純硬件數字系統中的順序控制電路,因此狀態(tài)機在其運行方式上類似于控制靈活和方便的CPU,而在運行速度和工作可靠性方面都優(yōu)于CPU。狀態(tài)機容易構成性能良好的同步時序邏輯模塊,這對于大規(guī)模邏輯電路設計中令人深感棘手的競爭冒險現象無疑是一個上佳的選擇。本系統,我是通過狀態(tài)機實現的。由于在VHDL中,一個狀態(tài)機由多個進程構成,一個結構體中可以包含多個狀態(tài)機,而一個單獨的狀態(tài)機(或多個并行運行的狀態(tài)機)以順序方式所能完成的運算和控制方面的工作與一個CPU的功能類似。因此,一個設計實體的功能便類似于一個含有并行運行的多個CPU的高性能微處理器的功能。我通過本次綜合實驗的學習,我的收獲頗多。首先,我更加了解到VHDL編程的技巧與意義;然后,方框圖的設計師一個自頂向下、逐步細化的層次化設計過程。在總體結構設計(以框圖表示)中,任何優(yōu)化設計的考慮要比邏輯電路設計過程中優(yōu)化設計產生大得多的效益;最后,我通過VHDL編程對本來枯燥無味的硬件實驗產生濃厚的興趣。八、源程序LIBRARY IEEE。USE 。USE 。USE 。ENTITY Game IS PORT(clk,reset,btn0,btn1:IN STD_LOGIC。 cat: OUT STD_LOGIC_VECTOR(5 DOWNTO 0)。數碼管顯示 b:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)。數碼管需要顯示的數值段碼的二進制表示; row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)。行 col:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)。列 music:OUT STD_LOGIC )。END Game。ARCHITECTURE GameState OF Game IS TYPE state_type IS(s0,s1,s2,s3,s4)。 用戶自定義的可枚舉類型 s0代表第一局;s1代表第二至五局;s2代表第六局;s3代表第七局以上;s4代表游戲結束 SIGNAL current_state,next_state:state_type:=s0。 定義兩個信號用于指定的狀態(tài)機的狀態(tài) SIGNAL judge1,judge2To5,judge3,judge4:STD_LOGIC:=39。039。定義判斷條件 judge1表示第一局的判斷條件:只有一人的和為7或11 judge2To5表示游戲在2到5局時,是否決出勝負; judge3表示第六局的判斷條件:游戲中出現最大點數和; judge4表示第七局以上的判斷條件:游戲中出現最大點數和; SIGNAL sum1,sum2:INTEGER RANGE 0 TO 20。表示甲乙兩人點數之和; SIGNAL num1_1,num1_2,num2_1,num2_2:INTEGER RANGE 0 TO 6。表示甲乙兩人的兩個骰子的點數; SIGNAL first_sum1,first_sum2:INTEGER RANGE 0 TO 20。表示第一局的點數和; SIGNAL game_counter:INTEGER RANGE 0 TO 50。表示游戲進行的總局數; SIGNAL game_counter_shiwei:INTEGER RANGE 0 TO 9。 SIGNAL game_counter_gewei:INTEGER RANGE 0 TO 9。 SIGNAL counter_2,counter_1:STD_LOGIC_VECTOR(3 DOWNTO 0)。counter_2,counter_1分別表示counter的BCD碼的十位和個位的二進制形式 SIGNAL btn0_counter:INTEGER RANGE 0 TO 20。表示btn0按下時:btn0的上升沿的次數; SIGNAL btn1_counter:INTEGER RANGE 0 TO 20。表示btn1按下時:btn1的上升沿的次數; SIGNAL btn_over:STD_LOGIC:=39。039。甲乙兩人是否按完,按完為‘1’,否則為‘0’; SIGNAL win_name:INTEGER RANGE 0 TO 2。顯示獲勝者的姓名; SIGNAL clk_scan:STD_LOGIC。 SIGNAL temp1:INTEGER RANGE 0 TO 12499。 SIGNAL temp2:INTEGER RANGE 0 TO 499。 SIGNAL cat_temp:STD_LOGIC_VECTOR(5 DOWNTO 0)。 SIGNAL row_temp:STD_LOGIC_VECTOR(7 DOWNTO 0)。 SIGNAL col_temp:STD_LOGIC_VECTOR(7 DOWNTO 0)。列 SIGNAL a_temp:STD_LOGIC_VECTOR(3 DOWNTO 0)。數碼管需要顯示的數值的二進制表示; SIGNAL b_temp:STD_LOGIC_VECTOR(6 DOWNTO 0)。數碼管需要顯示的數值段碼的二進制表示; SIGNAL rand_temp:INTEGER RANGE 0 TO 7。 SIGNAL rand1,rand2:INTEGER RANGE 0 TO 6。 SIGNAL do_temp:INTEGER RANGE 0 TO 47800。 SIGNAL clk_do:STD_LOGIC。 SIGNAL re_temp:INTEGER RANGE 0 TO 42588。 SIGNAL clk_re:STD_LOGIC。 SIGNAL mi_temp:INTEGER RANGE 0 TO 37935。 SIGNAL clk_mi:STD_LOGIC。 SIGNAL fa_temp:INTEGER RANGE 0 TO 35815。 SIGNAL clk_fa:STD_LOGIC。 SIGNAL so_temp:INTEGER RANGE 0 TO 31886。 SIGNAL clk_so:STD_LOGIC。 SIGNAL beat_temp:INTEGER RANGE 0 TO 2499999。 SIGNAL clk_beat:STD_LOGIC。 SIGNAL pace:INTEGER RANGE 0 TO 60。 SIGNAL timecounter:INTEGER RANGE 0 TO 59。 BEGIN 第一個進程P1中描述次狀態(tài)邏輯,由于次狀態(tài)是當前狀態(tài)和輸入信號的函數, 所以敏感信號表中包含了當前狀態(tài)current_state和輸入信號reset, judge1,judge2To5,judge3,judge4。 P1:PROCESS(clk) BEGIN IF(clk39。EVENT AND clk=39。139。) THEN CASE current_state IS WHEN s0=IF(reset=39。139。)THEN next_state=s0。 ELSIF(judge1=39。139。)THEN next_state=s4。 ELSE next_state=s1。 END IF。 WHEN s1=IF(reset=39。139。)THEN next_state=s0。 ELSIF(judge2To5=39。139。 AND game_counter 6 AND game_counter 1)THEN next_state=s4。 ELSIF(judge2To5=39。039。 AND game_counter 5 AND game_counter 1)THEN next_state=s1。 ELSE next_state= s2。 END IF。 WHEN s2=IF(reset=39。139。)THEN next_state=s0。 ELSIF(judge3=39。139。)THEN next_state=s4。 ELSE next_state=s3。 END IF。 WHEN s3=IF(reset=39。139。)THEN next_stat