課程設計(基于FPGA的數碼管十進制顯示)_第1頁
課程設計(基于FPGA的數碼管十進制顯示)_第2頁
課程設計(基于FPGA的數碼管十進制顯示)_第3頁
課程設計(基于FPGA的數碼管十進制顯示)_第4頁
課程設計(基于FPGA的數碼管十進制顯示)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、中北大學課 程 設 計 說 明 書指導教師: 崔永俊 職稱: 副教授2012 年 6 月 22 日目 錄1、課程設計的目的 12、課程設計內容和要求 2.1、設計內容 2.2、設計要求 3、設計方案及實現情況 3.1、設計思路 3.2、工作原理及框圖 3.3、各模塊功能描述 3.4、仿真結果 3.5、試驗箱驗證情況 4、課程設計總結 5、參考文獻 - 1 - 1 1 1 1 1 1 3 9 1011 121、課程設計的目的1)、學習操作數字電路設計實驗開發(fā)系統(tǒng),掌握數碼管顯示模塊的工作原理及應用。2)、掌握組合邏輯電路、時序邏輯電路的設計方法。3)、學習掌握可編程器件設計的全過程。2、課程設計

2、內容和要求2.1、設計內容1)、學習掌握鍵盤控制模塊、數碼管顯示模塊的工作原理及應用;2)、熟練掌握VHDL編程語言,編寫鍵盤控制模塊的控制邏輯。2.2、設計要求1)、仿真所編寫的程序,模擬驗證所編寫的模塊功能;2)、下載程序到芯片中,硬件驗證所設置的功能,能夠實現十進制數的顯示;3)、整理設計內容,編寫設計說明書。3、設計方案及實現情況3.1、設計思路1)、鍵盤不斷掃描,有按鍵按下則輸出相應信號,并且發(fā)出使能信號給處理模塊。 2)、處理模塊對收到的信號進行判斷,決定執(zhí)行什么操作,對數據進行運算。 3)、對于數字鍵需要移位顯示,功能鍵要考慮優(yōu)先級判斷,進行倒計時操作時要能對時鐘信號分頻自減。4

3、)、專門的程序段用來不斷將當前數據各位求出,譯碼成顯示內容輸給數據選擇模塊。 5)、數據選擇模塊根據掃描電路選擇信號將各位數字顯示出來。3.2、工作原理及框圖1、鍵盤原理鍵盤電路網絡很像一臺微縮的計算機,它擁有自己的處理器和在該處理器之間傳輸數據的電路,這個電路的很大一部分組成了鍵矩陣。鍵矩陣是位于鍵下方的一種電路網格。在所有的鍵盤(中,每個電路在每個按鍵所處的位置點下均處于斷開狀態(tài)。當您按下某個鍵時,此按鍵將按下了開關,從而閉合電路,使得少量電流可以通過。開關的機械作用會導致某種振動(稱作回彈),處理器可以過濾掉這種振動。如果您按下某鍵并保 - 1 -持住,則處理器認為您是在反復按下該鍵。試

4、驗箱上的鍵盤可以看做是8*4的矩陣鍵盤(雖然外部不是),8行由38譯碼器選擇,所以有外部sel0-2三根線控制掃描。2、鍵盤中按鍵的判斷對于鍵盤中有無鍵按下的判斷是很重要的,具體判斷如下:將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與行線相交叉的按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與低電平的行線交叉處的按鍵就是閉合的按

5、鍵。鍵盤掃描模塊在時鐘下不斷將行置零,掃描列的狀態(tài),判斷按鍵。3、鍵盤按鍵對應的編碼4、數據處理鍵盤掃描模塊檢測到按鍵按下后,給下級發(fā)出使能脈沖,同時將按鍵信息給數據處理模塊。根據按鍵不同進行不同處理。數字鍵按下時,要進行移位操作;加減鍵按下時要進行寄存操作;自加減鍵按下是要進行加減1操作;清零鍵按下時要進行全部清零;確認鍵按下時要進行計算操作或者倒計時操作。這就需要設立一些標志位來判斷。計算采用一位BCD形式計算,進借位標志位輔助,這樣比用實數計算后轉BCD形式的電- 2 -路簡單高效。處于倒計時模式時,引入外部時鐘,內部分頻后自減一操作。5、多路選擇顯示四個需要顯示的數碼管的值始終輸入,通

6、過片選決定某一時刻那個值輸出。選擇信號即為掃描輸出信號,因為數碼管和鍵盤是共用一個掃描端。所以當掃描信號選中相應數碼管時讓對應值輸出即可。6、整體電路結構框圖圖1.原理圖框架3.3、各模塊功能描述掃描模塊:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan ISPORT(clk:IN STD_LOGIC;en:OUT STD_LOGIC;- 3 - -輸入時鐘 -有鍵按下時輸出使能data:OUT STD_LOGIC_V

7、ECTOR(3 DOWNTO 0); -輸出按鍵信息 slk:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -數碼管選擇端口 kin:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -鍵盤響應輸入端口 END scan;ARCHITECTURE behave OF scan ISBEGINPROCESS(clk)VARIABLE pslk:STD_LOGIC_VECTOR(2 DOWNTO 0); -掃描變量 VARIABLE p:STD_LOGIC_VECTOR(6 DOWNTO 0); -按鍵信息變量 VARIABLE i:INTEGER RANGE

8、 0 TO 7; -掃描循環(huán)變量 VARIABLE rel:INTEGER RANGE 0 TO 300; -重復按鍵延時變量 VARIABLE int:STD_LOGIC; -按鍵中斷變量 BEGINIF(clk'EVENT AND clk='1')THEN -500HZ的時鐘信號上升沿觸發(fā) IF(rel=300)THEN -兩次按鍵產生有效的最短時間,延時避免重復觸發(fā) rel:=rel;ELSErel:=rel+1;END IF;IF(i<=7)THEN -掃描信號為000111,8次循環(huán)掃描 slk<=pslk; -賦掃描值 int:=kin(0) A

9、ND kin(1) AND kin(2) AND kin(3); -按鍵輸入任意位為0即引起中斷 IF(int='0' AND rel=300)THENFOR j IN 0 TO 20 LOOP END LOOP; int:=kin(0) AND kin(1) AND kin(2) AND kin(3); IF(int='0')THEN -消抖后再次確認有鍵按下 rel:=0; p:=(pslk-1) & kin; -結合slk和kin的信息判斷哪個鍵按下 CASE p IS -判斷按鍵信息 WHEN "0001110"=>da

10、ta<="0000" -0 WHEN "0011110"=>data<="0001" -1 WHEN "0101110"=>data<="0010" -2 WHEN "0111110"=>data<="0011" -3 WHEN "1101110"=>data<="0100" -4 WHEN "1111110"=>data<=&qu

11、ot;0101" -5 WHEN "0001101"=>data<="0110" -6 WHEN "0011101"=>data<="0111" -7 WHEN "1001101"=>data<="1000" -8 WHEN "1011101"=>data<="1001" -9 WHEN "1101011"=>data<="1010&qu

12、ot; -10-NEXT WHEN "0001011"=>data<="1011" -11-LAST WHEN "1111011"=>data<="1100" -12-ENTER WHEN "1011110"=>data<="1101" -13-ESC WHEN "1101101"=>data<="1110" -14-A(+) WHEN "1111101"=>da

13、ta<="1111" -15-B(-) WHEN OTHERS=>NULL; END CASE; en<='1' -產生脈沖信號 END IF; ELSE - 4 - -在中斷和最小按鍵間隔條件滿足下對按鍵內容進行判斷 -延時(避開抖動階段)en<='0'END IF;pslk:=pslk+1;FOR j IN 0 TO 3 LOOPEND LOOP;i:=i+1;ELSEi:=0;END IF;END IF;END PROCESS;END behave;數據處理模塊:LIBRARY IEEE;USE IEEE.STD

14、_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY eightbit ISPORT(data2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -按鍵信息輸入 en2:IN STD_LOGIC; -使能脈沖接收 clk2:IN STD_LOGIC; -時鐘信號,負責檢查輸入信號狀態(tài),分頻倒計時 bit1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);bit2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);bit3:OUT

15、STD_LOGIC_VECTOR(7 DOWNTO 0);bit4:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-對應四個需要顯示的數碼管需要顯示的信息END eightbit;ARCHITECTURE behave OF eightbit ISPROCEDURE q_to_bit -子程序(數值轉數碼管顯示碼) (q:IN INTEGER; -需要顯示的數值 SIGNAL bit0:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)IS -轉換出來的數碼管顯示碼 BEGINCASE q ISWHEN 0=>bit0<="0011111

16、1"WHEN 1=>bit0<="00000110"WHEN 2=>bit0<="01011011"WHEN 3=>bit0<="01001111"WHEN 4=>bit0<="01100110"WHEN 5=>bit0<="01101101"WHEN 6=>bit0<="01111101"WHEN 7=>bit0<="00100111"WHEN 8=>bi

17、t0<="01111111"WHEN 9=>bit0<="01101111"WHEN OTHERS=>bit0<="00000000"END CASE;END PROCEDURE q_to_bit;PROCEDURE x_to_y -子程序(四變量賦值) (x1:IN INTEGER; -賦值內容 x2:IN INTEGER;x3:IN INTEGER;- 5 -x4:IN INTEGER;y1:OUT INTEGER; -被賦值變量 y2:OUT INTEGER;y3:OUT INTEGER;y4:OU

18、T INTEGER)ISBEGINy1:=x1;y2:=x2;y3:=x3;y4:=x4;END PROCEDURE x_to_y;PROCEDURE add -子程序(十進制一位加法) (a:IN INTEGER; -被加數 b:IN INTEGER; -加數 c1:IN INTEGER RANGE 0 TO 2; -上級進位 z:OUT INTEGER; -和 c2:OUT INTEGER RANGE 0 TO 2)IS -下級進位 VARIABLE zz:INTEGER;BEGINzz:=a+b+c1; -被加數+加數+進位 IF(zz>9)THEN -大于10進位 c2:=1;z

19、z:=zz-10;ELSEc2:=0;END IF;z:=zz;END PROCEDURE add;PROCEDURE sub -子程序(十進制一位減法) (a:IN INTEGER; -被減數 b:IN INTEGER; -減數 c1:IN INTEGER RANGE 0 TO 2; -上級借位 z:OUT INTEGER; -差 c2:OUT INTEGER RANGE 0 TO 2)IS -下級借位 VARIABLE zz:INTEGER;BEGINzz:=a-b-c1; -被減數-減數-借位 IF(zz<0)THEN -差小于0借位 c2:=1;zz:=zz+10;ELSEc2:

20、=0;END IF;z:=zz;END PROCEDURE sub;BEGINPROCESS(clk2)VARIABLE q1,q2,q3,q4,p1,p2,p3,p4:INTEGER RANGE 0 TO 9:=0;-q為顯示的數對應的四個位的值,p和q一一對應,用作加減法時存放被加數,被減數- 6 -VARIABLE c:INTEGER RANGE 0 TO 2:=0; VARIABLE r,n,a,b,e:BIT:='0'-進位,借位標志位BEGINIF(clk2'EVENT AND clk2='1')THEN -時鐘信號上升沿觸發(fā)檢查端口狀態(tài) I

21、F(en2='1' AND e='0')THEN -使能信號有效,且重復屏蔽信號關閉時響應按鍵信息 CASE data2 ISWHEN "1100" => -按鍵為“enter”鍵,執(zhí)行求結果,倒計時啟動暫停功能 n:='0' -解除加減法待操作狀態(tài) IF(a='1')THEN -有加法則進行加法運算 a:='0' -加法標志位清零 add(q1,p1,0,q1,c); -被加數與加數求和 add(q2,p2,c,q2,c); add(q3,p3,c,q3,c);add(q4,p4,c,q

22、4,c);ELSIF (b='1')THEN -有減法則進行減法運算 b:='0' -減法標志位清零 sub(p1,q1,0,q1,c); -被減數與減數作差 sub(p2,q2,c,q2,c); sub(p3,q3,c,q3,c); sub(p4,q4,c,q4,c);ELSIF (r='0')THEN -沒有加減法操作又不在倒計時狀態(tài)則啟動倒計時 r:='1'ELSE -否則為在倒計時狀態(tài),“enter”鍵功能為暫停 r:='0' END IF;WHEN "1110" => -按鍵為“

23、A(+)”鍵,執(zhí)行加法功能 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) a:='1' -加法標注位置1 b:='0' -減法標志位清零 n:='1' -待操作位置1 x_to_y(q1,q2,q3,q4,p1,p2,p3,p4); -被加數暫存 x_to_y(0,0,0,0,q1,q2,q3,q4); -顯示清零 END IF;WHEN "1111" => -按鍵為“B(-)”鍵,執(zhí)行減法功能 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) a:=

24、9;0' -加法標志位清零 b:='1' -減法標志位置1 n:='1' -待操作位置1 x_to_y(q1,q2,q3,q4,p1,p2,p3,p4); -被減數暫存 x_to_y(0,0,0,0,q1,q2,q3,q4); -顯示清零 END IF;WHEN "1010" => -按鍵為“next”鍵,執(zhí)行自加1功能 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) IF (n='0')THEN -不在加減號剛輸入之后(否則無效) add(q1,1,0,q1,c); -加1 ad

25、d(q2,0,c,q2,c); add(q3,0,c,q3,c); add(q4,0,c,q4,c); END IF; END IF;- 7 -r為倒計時標志位,n為加減法待操作位,a為加法標志位,b為減法標志位,e為重復屏蔽位VARIABLE count:INTEGER RANGE 0 TO 500:=0; -倒計時分頻計數變量WHEN "1011" => -按鍵為“l(fā)ast”鍵,執(zhí)行自減1功能 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) IF (n='0')THEN -不在加減號剛輸入之后(否則無效) sub(q

26、1,1,0,q1,c); -減1 sub(q2,0,c,q2,c);sub(q3,0,c,q3,c);sub(q4,0,c,q4,c);END IF;END IF;WHEN "1101" => -按鍵為“esc”鍵,執(zhí)行清零功能 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) x_to_y(0,0,0,0,p1,p2,p3,p4); -寄存器,標志位清零 x_to_y(0,0,0,0,q1,q2,q3,q4);a:='0'b:='0'n:='0'END IF;WHEN OTHERS =&g

27、t; -按鍵為“09”,執(zhí)行多位數據輸入,移位顯示 IF (r='0')THEN -不在倒計時狀態(tài),則(否則無效) n:='0' -解除加減法待操作狀態(tài) q4:=q3; -后一個數碼管顯示內容給前一個 q3:=q2;q2:=q1;q1:=CONV_INTEGER(date2); -第一位讀取輸入的數字 END IF;END CASE;e:='1' -重復屏蔽信號打開,防止重復觸發(fā) ELSIF (en2='0')THEN -使能脈沖過去后重復屏蔽信號關閉 e:='0'END IF;IF(r='1')T

28、HEN -在倒計時狀態(tài),執(zhí)行每秒減1倒計時 IF(count<500)THEN -計500次一分頻 count:=count+1; -未到500時累加 ELSIF(count=500)THEN -計到500時減1 count:=0; -計數清零 sub(q1,1,0,q1,c);sub(q2,0,c,q2,c);sub(q3,0,c,q3,c);sub(q4,0,c,q4,c);END IF;END IF;END IF;q_to_bit(q1,bit1); -將各位數值轉成數碼管顯示碼給輸出 q_to_bit(q2,bit2);q_to_bit(q3,bit3);q_to_bit(q4,

29、bit4);END PROCESS;END behave;顯示模塊:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;- 8 -USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY choose ISPORT(slk2:IN STD_LOGIC_VECTOR(2 DOWNTO 0); number1:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number2:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number3:IN STD_L

30、OGIC_VECTOR(7 DOWNTO 0); number4:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END choose;ARCHITECTURE behave OF choose IS BEGINPROCESS(slk2) BEGINCASE slk2 ISWHEN "000"=>number<=number1; WHEN "001"=>number<=number2; WHEN "010"=>number<=number3; WHEN "011"=>number<=number4;WHEN OTHERS=>number<="00000000" END CASE; END PROCESS; END behave;-掃描信號,用作選擇 -各數碼管要顯示的內容-片選的數碼管顯示的內容-片選信號對應的多路選擇器的選通規(guī)則-高四位數碼管未用,選到是統(tǒng)一輸出全暗3.4、仿真結果圖2.掃

溫馨提示

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

評論

0/150

提交評論