一、實驗目的
學習計數器的設計、仿真和硬件測試,進一步熟悉VHDL設計技術。
二、實驗儀器與器材
計算機1台,GW48-PK2S實驗箱1台,QuartusⅡ6.0 1套。
三、實驗
1. 基本命題
在QuartusⅡ上設計一個含計數使能、異步復位和計數值並行預置功能的4位加法計數器,並進行編輯、編譯、綜合、適配、仿真,給出其所有信號的時序仿真波形。
1) 實驗原理
由數電知識可知,4位加法計數器由clk時鍾,rst置位,en使能,cq輸出,cout進位輸出構成。
2) 程序設計
3) 編譯仿真波形
圖1 4位加法計數器波形
從圖1分析可知,在每一個時鍾上身沿到來的時候,4位加法計數器計數值加1(圖中1),最大計數值為15,並進行進位輸出(圖中2);當rst為高電平時,輸出清零。
2. 擴展命題
在上述設計基礎上,設計具有同步復位和計數值並行預置功能的8位加法計數器。並進行編輯、編譯、綜合、適配、仿真,給出其所有信號的時序仿真波形。
1) 實驗原理
由原來的設計的兩個4位加法計數器件組成一個8位加法計數器U0。設有兩個4位加法計數器U1,U2。我們規定U1為U0的低位,U2為U0的高位。將U1的進位輸出cout連接到U2的時鍾輸入clk;U1和U2的rst連接在一起作為總置位端brst;en也連接在一起,作為總使能端ben。U2的進位輸出cout作為總進位輸出bcout;
2) 程序設計
3) 編譯仿真波形
圖2.1 8位加法計數器從0計數到26
圖2.2 8位加法計數器從26計數到50
8位加法計數器可以計數到196,但是后面的計數運行正常且與前面相似,不再截圖。
4) 分析結果
從圖中可以看出,實驗的結果與預期相符。
四、實驗設計思路
圖5-1是一含計數使能、異步復位和計數值並行預置功能的4位加法計數器。如圖所示,圖中間是4位鎖存器;rst是異步清信號,高電平有效;clk是鎖存信號;D[3:0]是4位數據輸入端。當ENA為‘1’時,多路選擇器將加1器的輸出值加載於鎖存器的數據端;當ENA為‘0’時將“0000”加載於鎖存器。
附圖5-1 4位加法計數器的RTL電路圖
設計提示:
若目標器件是EP1C6Q240C8,建議選實驗電路模式5,用鍵8(PIO7)控制RST;用鍵7(PIO6)控制ENA;計數溢出COUT接發光管D8(PIO15);輸出Y是計數輸出,接數碼1(PIO19-PIO16,低位靠右);時鍾CLK接clock0,通過跳線選擇4Hz信號。引腳鎖定后進行編譯、下載和硬件測試實驗。
五、實驗思考題
(1)是否可以不定義信號 CQI,而直接用輸出端口信號完成加法運算,即: OUTY <= OUTY + 1 ? 為什么?
假設可行,將cnt4中的實驗程序修改為直接使用輸出端口信號完成加法運算,如圖3所示。經分析,程序中的輸出cq是不可讀的,另外,如果沒有一個變量來保存程序的計數值,那么程序就相當於一個組合邏輯電路,不具備計數的功能。
圖3直接使用輸出端口信號完成加法運算
六、問題的總結
1、Cnt4中的不准確的進位輸出,導致cnt8中的計數出錯。
之前在cnt4判斷進位的輸出的語句如圖3 所示。該語句檢測當計數值為15的時候,就進行輸出。當4位加法計數器的數量為一個的時候,可以正常工作。但是復用cnt4的時候,發現8位加法計數器cnt8的計數出現了如圖4的錯誤。經分析,在cnt8中時,當低位cnt4的計數值為15,同時輸出一個進位信號到高位cnt4,照成高位cnt4多計數了一次。由於在下一個時鍾到來的時候,低位的cnt4才重新從0開始計數,因此會產生仿真結果與預期不符。只要我們將程序修改為如下方程序塊1所示。
圖3 進位輸出語句
圖3 Cnt8計數輸出不准確
| LIBRARYieee; USEieee.std_logic_1164.ALL; USEieee.std_logic_unsigned.ALL; ENTITY cnt4 IS PORT(clk, rst, en :INstd_logic; --clk時鍾,rst置位,en使能 cq :OUTstd_logic_vector(3DOWNTO0);--cq輸出 cout :OUTstd_logic); --cout進位輸出 END cnt4; ARCHITECTURE behave OF cnt4 IS BEGIN PROCESS(clk,rst,en) VARIABLE cqi :std_logic_vector(3DOWNTO0); BEGIN IF rst = '1' THEN cqi :=(OTHERS=>'0');-- 計算機異步復位 ELSIF clk='1' and clk'eventTHEN -- 檢測時鍾上升沿 IF en='1' THEN -- 檢測是否允許計數(同步使能) IF cqi <15 THEN cqi := cqi +1; -- 允許計數,檢測是否小於15 ELSE cqi :=(OTHERS=>'0'); -- 大於15,計數值清零 ENDIF; ENDIF; ENDIF; IF cqi =15THEN IF clk='1' and clk'eventTHEN cout <= '1'; -- 計數大於15,輸出進位信號 ENDIF; ELSE cout <='0'; ENDIF; cq <= cqi; -- 將計數值送往輸出端口 ENDPROCESS; END behave;
|
代碼塊1 修改后的cnt4代碼









