eda課程設(shè)計--led點陣顯示控制_第1頁
已閱讀1頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  EDA技術(shù)</b></p><p>  課 程 設(shè) 計 報 告</p><p>  課題 LED點陣顯示控制設(shè)計 </p><p>  姓 名 </p><p>  學(xué) 號 </p&g

2、t;<p>  專業(yè)班級 </p><p>  指導(dǎo)教師 </p><p>  時 間 </p><p><b>  課程設(shè)計任務(wù)書</b></p><p><b>  LED點

3、陣顯示控制</b></p><p><b>  摘 要</b></p><p>  本文對基于FPGA控制的LED漢字滾動顯示器的設(shè)計方法進行了探討。提出了兩個實現(xiàn)方案。并對其中一個方案作了詳細說明。文中首先介紹了完成本設(shè)計所需的原理、技術(shù)、以及所要實現(xiàn)的功能;然后研究了滾動顯示漢字的方法及鍵控模式改變滾動的方式;最后,用VHDL語言程序設(shè)計了一個完整的

4、LED漢字滾動顯示器。</p><p>  本系統(tǒng)在FPGA試驗箱上完成,由掃描控制模塊、只讀存儲器ROM和16*16LED點陣顯示模塊、一個4-16譯碼器構(gòu)成。其中:掃描控制模塊和只讀存儲器ROM集成在FPGA芯片內(nèi)部。一個4-16譯碼器(74LS154)輸入完成FPGA中16×16點陣顯示模塊的列掃描模式。FPGA定義的只讀存儲器ROM中保存了要顯示的漢字的數(shù)模,并以16位的數(shù)據(jù)寬度輸出到LED陣顯

5、示模塊的行端,配合列掃描控制共同完成漢字的滾動顯示。同時通過鍵控模式,對字幕滾動速度、方式、形式可調(diào)。</p><p>  本系統(tǒng)利用數(shù)字系統(tǒng)設(shè)計自動化(EDA)技術(shù)實現(xiàn)了全硬件方式的LED點陣顯示。利用FPGA內(nèi)部的物理資源,將只讀存儲器ROM和主要功能模塊設(shè)計在FPGA內(nèi)部。充分顯示了EDA技術(shù)設(shè)計的靈活性,同時也大大提高了系統(tǒng)的集成度和穩(wěn)定性</p><p>  關(guān)鍵詞 FPGA;

6、 LED; EDA;動態(tài)掃描</p><p><b>  目 錄</b></p><p><b>  課程設(shè)計任務(wù)書I</b></p><p><b>  摘 要II</b></p><p><b>  1. 設(shè)計概述1</b></p>

7、;<p>  1.1LED點陣原理1</p><p>  1.3漢字顯示原理2</p><p>  1.4設(shè)計的主要功能2</p><p>  1.5設(shè)計的主要工作3</p><p><b>  2. 設(shè)計方案4</b></p><p><b>  2.1方案一

8、4</b></p><p><b>  2.2方案二4</b></p><p><b>  2.3方案比較4</b></p><p><b>  3. 設(shè)計實現(xiàn)5</b></p><p><b>  3.1分頻程序5</b></p

9、><p>  3.2移動速度控制程序7</p><p><b>  3.3按鍵掃描8</b></p><p>  3.4漢字顯示程序9</p><p>  4. 設(shè)計驗證11</p><p><b>  5. 總結(jié)13</b></p><p>&

10、lt;b>  參考文獻14</b></p><p><b>  附錄15</b></p><p><b>  設(shè)計概述</b></p><p>  1.1LED點陣原理</p><p>  以下為8×8點陣LED外觀及引腳圖及其等效電路,只要其對應(yīng)的X、Y軸順向偏壓,

11、即可使LED發(fā)亮。例如如果想使左上角LED點亮,則Y0=1,X0=0即可。應(yīng)用時限流電阻可以放在X軸或Y軸。</p><p>  圖 11 8×8點陣LED外觀圖[5]</p><p>  圖 12 8×8點陣LED等效圖[5]</p><p>  1.2點陣LED掃描法介紹</p><p>  點陣LED一般采用掃描

12、式顯示,實際運用分為三種方式: </p><p><b> ?。?)點掃描</b></p><p><b>  (2)行掃描</b></p><p><b> ?。?)列掃描</b></p><p>  若使用第一種方式,其掃描頻率必須大于16×64=1024Hz,周

13、期小于1ms即可。若使用第二和第三種方式,則頻率必須大于16×8=128Hz,周期小于7.8ms即可符合視覺暫留要求。此外一次驅(qū)動一列或一行(8顆LED)時需外加驅(qū)動電路提高電流,否則LED亮度會不足</p><p><b>  1.3漢字顯示原理</b></p><p>  要實現(xiàn)漢字的顯示,首先是獲得數(shù)模并保存,即在存貯器中建立漢字數(shù)據(jù)庫。這里,直接運用

14、取字模軟件,輸入要取模的字,自動生成字形碼。然后是在掃描模塊的控制下,從低往高列掃描的次序正確地輸出這些數(shù)據(jù),由于人視覺暫留效果,即呈現(xiàn)完整字形。</p><p>  某一時刻能在顯示數(shù)據(jù)序列中定位待顯示數(shù)據(jù)的地址指針可用下式計算:</p><p>  addr=n+m  </p><p>  圖 13滾動顯示多漢字信息的原理示意圖[5]</p&g

15、t;<p>  1.4設(shè)計的主要功能</p><p><b>  基本功能:</b></p><p> ?、賹崿F(xiàn)基本的字符顯示(譬如紹大)</p><p>  ②字符的顯示時間可調(diào)整(譬如1秒、5秒、10秒等)</p><p> ?、圩址蓪崿F(xiàn)閃爍顯示(譬如0.5s)</p><p>

16、; ?、茏址蓪崿F(xiàn)移位顯示,且移位方向可控(左移、右移等)</p><p><b>  附加功能:</b></p><p> ?、偻ㄟ^鍵控可以改變字幕滾動速度。</p><p> ?、谕ㄟ^鍵控可以使字幕橫向或縱向滾動。</p><p> ?、弁ㄟ^鍵控可以使字閃爍出現(xiàn)。</p><p>  1.5設(shè)

17、計的主要工作 </p><p>  本設(shè)計需要利用EDA工具軟件QuartusII編寫并調(diào)試系統(tǒng)的VHDL程序。并且每一個模塊都在這個軟件下進行了仿真。系統(tǒng)的VHDL程序編好過后先在實驗室的EDA實驗箱上下載調(diào)試、驗證。</p><p><b>  2. 設(shè)計方案</b></p><p><b>  2.1方案一</b&g

18、t;</p><p>  本文系統(tǒng)的LED點陣模塊,共由16×16=256個LED發(fā)光二極管組成。如何在該點陣模塊上顯示漢字是本文設(shè)計的關(guān)鍵技術(shù)。本文系統(tǒng)設(shè)計是采用一種16路動態(tài)分時掃描技術(shù)來實現(xiàn)的。具體方法是,將4個8×8數(shù)組的顯示模塊組合成兩個16行16列的掃描結(jié)構(gòu)。其行輸入端與FPGA內(nèi)的只讀存儲器ROM的16位數(shù)據(jù)輸出端口相連;16個列控制端與一個4-16譯碼器的輸出相連;而譯碼器的輸

19、入端和片選信號又與FPGA內(nèi)的列掃描控制模塊的輸出端口相連。</p><p>  圖2-1 系統(tǒng)結(jié)構(gòu)框圖</p><p><b>  2.2方案二</b></p><p>  VHDL程序設(shè)計的是硬件,可以“并發(fā)執(zhí)行”。本設(shè)計可以將LED顯示屏要的顯示內(nèi)容抽象成一個二維數(shù)組(數(shù)組中的‘1’對映點陣顯示屏上面的亮點),用VHDL語言設(shè)計一個進程將

20、這個數(shù)組動態(tài)顯示在LED顯示屏上,再利用另一個進程對這個數(shù)組按一定頻率進行數(shù)據(jù)更新,更新的方式可以有多種。因為兩個進程是同時進行的(并發(fā)執(zhí)行),如果對數(shù)組中的漢字數(shù)據(jù)按滾動的方式更新,則可實現(xiàn)漢字的滾動顯示。該方案的原理圖。</p><p><b>  2.3方案比較</b></p><p>  方案一很容易實現(xiàn),而且占用FPGA的資源較少。但是由于其實現(xiàn)方式的局限性

21、,該方案只能實現(xiàn)漢字的滾動顯示。方案二中將LED點陣抽象成了一個二維數(shù)組??梢栽O(shè)計一些比較復(fù)雜的算法來控制這個數(shù)組,使設(shè)計的系統(tǒng)不但可以滾動顯示漢字,還可以擴展一些其它的顯示效果。但是方案二中對數(shù)組的處理部分對FPGA芯片的資源消耗太大,所以最終選擇方案一。</p><p><b>  3. 設(shè)計實現(xiàn)</b></p><p><b>  3.1分頻程序<

22、;/b></p><p>  該電路主要包含有一個計數(shù)器模塊和一個譯碼輸出模塊,該電路是通過計數(shù)器模塊實現(xiàn)分頻的。比如要從12MHz的全局時鐘得到100Hz的時鐘,必須進行120000倍分頻。但是這么大的分頻需要仿真時間很久。仿真是一般采用小的分頻來替代,真正下載到電路上時,就需要采用120000分頻了。</p><p>  譯碼器的輸入采用了寄存器鎖存輸出,這是為了消除毛刺。多輸入

23、的組合邏輯電路中,默寫輸入信號在理想情況下應(yīng)該同時發(fā)生變化,但由于延遲路徑不同造成這些輸入信號發(fā)生變化的時間有微小差別(門延遲時間量級),這是得到的是輸出信號就會有毛刺,這些毛刺有可能會給下一級電路帶來,使得整個系統(tǒng)運行不穩(wěn)定。因此,為保證系統(tǒng)的穩(wěn)健性,一般情況下,都應(yīng)該給輸出信號去毛刺,使之變得干凈。在設(shè)計中,譯碼的輸入是計數(shù)器的輸出,計數(shù)器各級輸出延遲是不一樣的,因此譯碼器輸出clk_scan信號波形就會有毛刺。</p>

24、<p>  if(reset_n='0')then --clk輸入的500KHz信號</p><p>  cnt_scan:=0; --clk_scan1.25khz的點陣動態(tài)掃描信號</p><p>  cnt_key:=0;</p><p>  el

25、sif(rising_edge(clk))then --clk_key1KHz的鍵盤掃描信號</p><p>  if(cnt_scan=cnt_scan'high)then</p><p>  cnt_scan:=0;</p><p><b>  else</b></p><p>  cnt

26、_scan:=cnt_scan+1;</p><p><b>  end if;</b></p><p>  if(cnt_key=cnt_key'high)then</p><p>  cnt_key:=0;</p><p><b>  else</b></p><p&

27、gt;  cnt_key:=cnt_key+1;</p><p><b>  end if;</b></p><p>  if(cnt_scan>(cnt_scan'high/2))then</p><p>  clk_scan<='1';</p><p><b>  els

28、e</b></p><p>  clk_scan<='0';</p><p><b>  end if;</b></p><p>  if(cnt_key>(cnt_key'high/2))then</p><p>  clk_key<='1';<

29、;/p><p><b>  else</b></p><p>  clk_key<='0';</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  把有毛刺的信號通過

30、時鐘采樣,即通過一個D觸發(fā)器也可以消除毛刺。本設(shè)計就是使用這種方法。這種方法的缺點是信號通過一個D觸發(fā)器后,就延遲了一個時鐘周期。對于本設(shè)計這種延遲是允許的。</p><p>  process(reset_n,clk_key,key1_in)</p><p>  variable temp1:std_logic;</p><p>  variable cnt1:i

31、nteger range 0 to 15;</p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  key1_out<='1'; --高電平表示沒有按下</p><p>  e

32、lsif(rising_edge(clk_key))then</p><p>  if(temp1=key1_in)then</p><p>  if(cnt1=cnt1'high)then</p><p><b>  cnt1:=0;</b></p><p>  key1_out<=temp1;</

33、p><p><b>  else</b></p><p>  cnt1:=cnt1+1;</p><p><b>  end if;</b></p><p><b>  else</b></p><p>  temp1:=key1_in;</p>

34、<p><b>  cnt1:=0;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p>  3.2移動速度控制程序</p>

35、<p>  在用VHDL編程的時候,可以定義一個變量x作為“滑窗”在ROM上的起始地址,設(shè)計一個進程按一定的頻率對x進行累加,再設(shè)計一個進程將以x為起始地址的長度為16的ROM中的區(qū)域動態(tài)顯示在LED點陣中。顯然x累加的速度決定了漢字的滾動速度。</p><p>  if(reset_n='0')then</p><p>  n<=1;

36、 --初始化n為1 最快速度</p><p>  flag_key:='0';</p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(key1='0')then --key1的優(yōu)先級比key2高,key1=0表示按下</p&

37、gt;<p>  if(flag_key='0')then --flag_key=0表示上次掃描鍵盤的時候無按鍵按下 </p><p>  flag_key:='1'; </p><p>  if(n>=n'high)then</p><p><b

38、>  n<=n;</b></p><p><b>  else</b></p><p><b>  n<=n+1;</b></p><p><b>  end if;</b></p><p><b>  end if;</b>

39、</p><p>  elsif(key2='0')then</p><p>  if(flag_key='0')then</p><p>  flag_key:='1';</p><p>  if(n=1)then</p><p><b>  n<=n;

40、</b></p><p><b>  else </b></p><p><b>  n<=n-1;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p>&

41、lt;p><b>  else</b></p><p>  flag_key:='0';</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  if(reset_n='0'

42、;)then --x的控制進程</p><p><b>  cntx:=0;</b></p><p><b>  x<=0;</b></p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(flag_scan='1&#

43、39;)then</p><p>  if(cntx=n*10 or cntx=cntx'high)then</p><p><b>  cntx:=0;</b></p><p><b>  else</b></p><p>  cntx:=cntx+1;</p><p&

44、gt;<b>  end if;</b></p><p>  if(cntx=n*10)then</p><p>  if(x=x'high)then</p><p><b>  x<=0;</b></p><p><b>  else</b></p>

45、<p><b>  x<=x+1;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b> 

46、 end if;</b></p><p>  此進程根據(jù)定義的信號n來控制x遞增的速度,n由外部的按鍵控制。n的范圍為1~5代表了漢字的不同的滾動速度。當(dāng)n為1時漢字滾動的速度最快,n為5時LED點陣上顯示的漢字滾動速度最慢。</p><p><b>  3.3按鍵掃描</b></p><p>  本系統(tǒng)用到的按鍵只有5個:復(fù)位按鍵

47、,控制n增大和減小的兩個按鍵,控制閃爍的一個按鍵,控制橫向縱向的一個按鍵。</p><p><b>  3.4漢字顯示程序</b></p><p>  if(reset_n='0')then --顯示各種模式轉(zhuǎn)換</p><p>  data<="0000000000000

48、000";</p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(key4='1')then</p><p>  if(shanshuo='1')then</p><p>  if(key3='1')then <

49、;/p><p>  index:=((cnt-x) mod L_SZ); --左移</p><p>  if(key5='1')then--顯示模式轉(zhuǎn)換上下或左右</p><p>  data<=ledsj(index); </p><p><b>  else</b></p>

50、;<p>  data<=ledsj1(index);</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  if(key3='0')then</p><p>  index:=((cnt+x)

51、 mod L_SZ); --右移</p><p>  if(key5='1')then</p><p>  data<=ledsj(index); </p><p><b>  else</b></p><p>  data<=ledsj1(index);</p>&l

52、t;p><b>  end if;</b></p><p><b>  end if;</b></p><p>  elsif(shanshuo='0')then</p><p>  data<=x"0000";</p><p><b>

53、  end if;</b></p><p>  elsif(key4='0')then</p><p>  if(key3='1')then</p><p>  index:=((cnt-x) mod L_SZ);</p><p>  if(key5='1')then</p&

54、gt;<p>  data<=ledsj(index); </p><p><b>  else</b></p><p>  data<=ledsj1(index);</p><p><b>  end if;</b></p><p><b>  end i

55、f;</b></p><p>  if(key3='0')then</p><p>  index:=((cnt+x) mod L_SZ);</p><p>  if(key5='1')then</p><p>  data<=ledsj(index); </p><

56、p><b>  else</b></p><p>  data<=ledsj1(index);</p><p><b>  end if;</b></p><p>  end if;</p><p><b>  end if;</b></p>

57、<p><b>  end if;</b></p><p>  end process;</p><p><b>  4. 設(shè)計驗證</b></p><p><b>  分頻仿真圖</b></p><p>  圖 41 分頻仿真圖</p><p

58、><b>  按鍵掃描去抖仿真圖</b></p><p>  圖 42 按鍵去抖動仿真圖</p><p> ?。?)漢字顯示仿真圖</p><p>  圖 43 漢字顯示仿真圖</p><p>  圖 44 漢字顯示仿真圖</p><p>  (4)FPGA實驗箱結(jié)果</p>

59、;<p>  圖 45 FPGA實驗箱結(jié)果</p><p>  每次來一個時鐘脈沖,會對應(yīng)產(chǎn)生一個列掃描信號,同時會輸出一個16位的列段碼,當(dāng)完成16列的掃描之后就呈現(xiàn)一個完整的字碼。下一輪的輸出會根據(jù)N值的不同改變初始的列段碼,從而實現(xiàn)左右平移。</p><p><b>  總結(jié)</b></p><p>  本次設(shè)計是基于FP

60、GA的LED16*16點陣控制設(shè)計,是通過VHDL語言編輯實現(xiàn)漢字的可動可控效果。</p><p>  經(jīng)過為期兩周的課程設(shè)計,使得我對VHDL語言有了更多的認識,此次設(shè)計開始時,我和隊友開始方案討論,最后確定從兩個方向入手,先是配合王杰同學(xué)用數(shù)組的方法寫,經(jīng)過幾天的不斷摸索,討論,修改,最后寫完了設(shè)計要求的基本部分,通過仿真,調(diào)試和下載到試驗箱進行驗證,證明它的可行性,期間有張敏和鄭士港兩位同學(xué)幫助王杰同學(xué)完成

61、。接著就是發(fā)揮部分,發(fā)揮部分由我提供一點思路后,暫由王杰同學(xué)去完成。而我開始轉(zhuǎn)向我們的第二個方向——通過狀態(tài)機的方法寫,最后也在完成了設(shè)計的基本要求的前提下,加了漢字靜態(tài)顯示時間可控,且有暫停功能。當(dāng)然,期間王杰同學(xué)也增加了漢字移動速度可調(diào),以及漢字移動轉(zhuǎn)向可控等功能。此過程中金老師讓我們試圖添加的漢字上移下移功能由于用狀態(tài)機方法太過繁瑣,所以,沒有寫此部分代碼。當(dāng)然,此后的設(shè)計報告交由張敏等人完成,王杰負責(zé)答疑報告中的設(shè)計思路和功能解

62、釋,鄭士港負責(zé)報告排版,我和王杰負責(zé)設(shè)計報告初審。最后交由金老師進行終審。</p><p>  對于本次設(shè)計,使我明白團隊的重要性,以及平時實驗的必要性。當(dāng)然,感謝金老師和潘老師這兩周的悉心教導(dǎo)和諄諄教誨,辛苦了。</p><p><b>  參考文獻</b></p><p>  [1]黃任..VHDL入門·解惑·經(jīng)典實例&

63、#183;經(jīng)驗總結(jié).[M].北京:北京航空航天大學(xué)出版社,2005</p><p>  [2]王彥主.基于FPGA的工程設(shè)計與應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2007</p><p>  [3]游達章.簡易LED點陣漢字顯示控制模塊設(shè)計[J].中國光學(xué)期刊網(wǎng).2007/11/20 19(5): P42-P45</p><p>  [4]賈德旺.基于FPGA

64、的LED點陣書寫顯示屏的實現(xiàn)[J].電子世界.2011年 8 :P24-P25</p><p>  [5]任雪賓.用VHDL設(shè)計LED漢字滾動顯示器[EB/OL].http://www.doc88.com/p-9963788808180.html:</p><p>  2014年1月11日</p><p><b>  附錄</b></p

65、><p><b>  方向一——數(shù)組</b></p><p><b>  分頻模塊代碼</b></p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_

66、arith.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  entity fenpin is</p><p><b>  port(</b></p><p>  clk:in std_logic; --輸入的500KHz信號</p&g

67、t;<p>  clk_scan:out std_logic; --1.25khz的點陣動態(tài)掃描信號</p><p>  clk_key:out std_logic; --1KHz的鍵盤掃描信號</p><p>  reset_n:in std_logic</p><p><b>  );</b></p

68、><p>  end fenpin;</p><p>  architecture abc of fenpin is</p><p><b>  begin</b></p><p>  process(reset_n,clk)--產(chǎn)生clk_scan和clk_key信號</p><p>  

69、--下載用下面這兩條語句</p><p>  variable cnt_scan:integer range 0 to 400;</p><p>  variable cnt_key:integer range 0 to 500;</p><p>  --仿真用下面這兩條語句</p><p>  --variable cnt_scan:in

70、teger range 0 to 30;</p><p>  --variable cnt_key:integer range 0 to 24;</p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  cnt_scan:=0;<

71、;/p><p>  cnt_key:=0;</p><p>  elsif(rising_edge(clk))then</p><p>  if(cnt_scan=cnt_scan'high)then</p><p>  cnt_scan:=0;</p><p><b>  else</b>&

72、lt;/p><p>  cnt_scan:=cnt_scan+1;</p><p><b>  end if;</b></p><p>  if(cnt_key=cnt_key'high)then</p><p>  cnt_key:=0;</p><p><b>  else<

73、;/b></p><p>  cnt_key:=cnt_key+1;</p><p><b>  end if;</b></p><p>  if(cnt_scan>(cnt_scan'high/2))then</p><p>  clk_scan<='1';</p>

74、<p><b>  else</b></p><p>  clk_scan<='0';</p><p><b>  end if;</b></p><p>  if(cnt_key>(cnt_key'high/2))then</p><p>  cl

75、k_key<='1';</p><p><b>  else</b></p><p>  clk_key<='0';</p><p><b>  end if;</b></p><p><b>  end if;</b></p&

76、gt;<p>  end process;</p><p><b>  end abc;</b></p><p>  鍵盤掃描字幕顯示控制模塊程序</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p&

77、gt;  use ieee.std_logic_arith.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  entity mnscan is</p><p><b>  port(</b></p><p>  clk_scan:in std_logic;

78、 --分頻時鐘</p><p>  scan:out std_logic_vector(3 downto 0); --列掃描</p><p>  data:out std_logic_vector(15 downto 0); --列段碼輸出</p><p>  dis_n:out std_logic_vector(6 down

79、to 0); --不需要小數(shù)點(7位)</p><p>  key1,key2,key3,key4,key5:in std_logic;</p><p>  --key1(加速)key2(減速)key3=1左移key3=0右移 </p><p>  --key4(閃爍控制)key5(輸出形式) </p><p>  reset_n:in

80、 std_logic --復(fù)位</p><p><b>  ); </b></p><p>  end mnscan;</p><p>  architecture abc of mnscan is</p><p>  constant L_SZ:integer:=223;</p><p&

81、gt;  constant L_DZ:integer:=15;</p><p>  signal cnt:integer range 0 to L_DZ; --和點陣屏的列一樣大</p><p>  signal n:integer range 1 to 5; --控制速度</p><p>  signal flag_scan

82、:std_logic;</p><p>  signal x:integer range 0 to L_SZ;</p><p>  signal shanshuo:std_logic; --閃爍</p><p>  signal shanshuo_cnt:integer range 0 to 60;</p><p>  --創(chuàng)建

83、一個可以存儲2唯數(shù)據(jù)的數(shù)據(jù)類型 array_1 array_2</p><p>  type array_2 is array(0 to 31)of std_logic_vector(15 downto 0);</p><p>  constant ledsj:array_2:=(</p><p>  (x"0008"),(x"3f88

84、"),(x"2204"),(x"2204"),(x"2112"),(x"210f"),(x"2888"),(x"1044"),</p><p>  (x"3f82"),(x"209f"),(x"2080"),(x"2

85、080"),(x"2098"),(x"3f87"),(x"2080"),(x"0000"),</p><p><b>  --紹 上下</b></p><p>  (x"0000"),(x"0080"),(x"0080"

86、;),(x"0080"),(x"0080"),(x"7fff"),(x"0080"),(x"0140"),</p><p>  (x"0140"),(x"0240"),(x"0220"),(x"0420"),(x"0810&q

87、uot;),(x"1808"),(x"7004"),(x"2002")</p><p><b>  --大</b></p><p><b>  );</b></p><p>  type array_1 is array(0 to 31)of std_logic_

88、vector(15 downto 0);</p><p>  constant ledsj1:array_1:=(</p><p>  (x"0000"),(x"0000"),(x"7f7e"),(x"2182"),(x"2142"),(x"2102"),(x"

89、210e"),(x"2132"),</p><p>  (x"7f42"),(x"0080"),(x"0000"),(x"1210"),(x"1263"),(x"22ac"),(x"2330"),(x"2220"),</

90、p><p><b>  --紹 左右</b></p><p>  (x"0000"),(x"4020"),(x"c020"),(x"6020"),(x"3020"),(x"0820"),(x"0620"),(x"01a0&

91、quot;),</p><p>  (x"007f"),(x"03a0"),(x"0c20"),(x"1020"),(x"2020"),(x"4020"),(x"8020"),(x"0020")</p><p><b> 

92、 --大</b></p><p><b>  );</b></p><p><b>  begin</b></p><p>  process(reset_n,clk_scan) --cnt計數(shù)及flag_scan的產(chǎn)生</p><p><b&g

93、t;  begin</b></p><p>  if(reset_n='0')then</p><p><b>  cnt<=15;</b></p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(cnt=cnt'high)

94、then</p><p><b>  cnt<=0;</b></p><p><b>  else</b></p><p>  cnt<=cnt+1;</p><p><b>  end if;</b></p><p>  if(cnt =c

95、nt'high-1)then</p><p>  flag_scan<='1';</p><p><b>  else</b></p><p>  flag_scan<='0';</p><p><b>  end if;</b></p>

96、;<p><b>  end if;</b></p><p>  end process;</p><p>  process(shanshuo_cnt)</p><p><b>  begin</b></p><p>  if(shanshuo_cnt>shanshuo_cnt

97、'high/2)then shanshuo<='1'; --閃爍計時控制</p><p>  else shanshuo<='0';</p><p><b>  end if;</b></p><p>  end process;</p><p>  process

98、(reset_n,clk_scan,cnt) --掃描信號scan的產(chǎn)生</p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  scan<="ZZZZ";</p><p>

99、;  elsif(rising_edge(clk_scan))then</p><p>  case cnt is</p><p>  when 0 => scan <= "0000";</p><p>  when 1 => scan <= "0001";</p><p>  

100、when 2 => scan <= "0010";</p><p>  when 3 => scan <= "0011";</p><p>  when 4 => scan <= "0100";</p><p>  when 5 => scan <= &quo

101、t;0101";</p><p>  when 6 => scan <= "0110";</p><p>  when 7 => scan <= "0111";</p><p>  when 8 => scan <= "1000";</p><

102、;p>  when 9 => scan <= "1001";</p><p>  when 10 => scan <= "1010";</p><p>  when 11 => scan <= "1011";</p><p>  when 12 => scan

103、 <= "1100";</p><p>  when 13 => scan <= "1101";</p><p>  when 14 => scan <= "1110";</p><p>  when 15 => scan <= "1111";s

104、hanshuo_cnt<=shanshuo_cnt+1;</p><p>  when others => scan <= "ZZZZ";</p><p><b>  end case;</b></p><p><b>  end if;</b></p>&

105、lt;p>  end process;</p><p>  process(reset_n,clk_scan,flag_scan) --cntx,x的控制</p><p>  variable cntx:integer range 0 to 90;</p><p><b>  begin</b></p&

106、gt;<p>  if(reset_n='0')then</p><p><b>  cntx:=0;</b></p><p><b>  x<=0;</b></p><p>  elsif(rising_edge(clk_scan))then</p><p> 

107、 if(flag_scan='1')then</p><p>  if(cntx=n*10 or cntx=cntx'high)then</p><p><b>  cntx:=0;</b></p><p><b>  else</b></p><p>  cntx:=cnt

108、x+1;</p><p><b>  end if;</b></p><p>  if(cntx=n*10)then</p><p>  if(x=x'high)then</p><p><b>  x<=0;</b></p><p><b>  el

109、se</b></p><p><b>  x<=x+1;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p>

110、;<p><b>  end if;</b></p><p>  end process;</p><p>  process(reset_n,clk_scan,cnt,x,key3,key4,key5)--輸出列數(shù)據(jù)data</p><p>  variable index:integer range 0 to L_SZ;&l

111、t;/p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  data<="0000000000000000";</p><p>  elsif(rising_edge(clk_scan))then</p>

112、;<p>  if(key4='1')then</p><p>  if(shanshuo='1')then</p><p>  if(key3='1')then </p><p>  index:=((cnt-x) mod L_SZ); --左移</p><p> 

113、 if(key5='1')then--顯示模式轉(zhuǎn)換上下或左右</p><p>  data<=ledsj(index); </p><p><b>  else</b></p><p>  data<=ledsj1(index);</p><p><b>  end if

114、;</b></p><p><b>  end if;</b></p><p>  if(key3='0')then</p><p>  index:=((cnt+x) mod L_SZ); --右移</p><p>  if(key5='1')then</p>

115、<p>  data<=ledsj(index); </p><p><b>  else</b></p><p>  data<=ledsj1(index);</p><p><b>  end if;</b></p><p><b>  end if;

116、</b></p><p>  elsif(shanshuo='0')then</p><p>  data<=x"0000";</p><p><b>  end if;</b></p><p>  elsif(key4='0')then</

117、p><p>  if(key3='1')then</p><p>  index:=((cnt-x) mod L_SZ);</p><p>  if(key5='1')then</p><p>  data<=ledsj(index); </p><p><b>  e

118、lse</b></p><p>  data<=ledsj1(index);</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  if(key3='0')then</p><

119、p>  index:=((cnt+x) mod L_SZ);</p><p>  if(key5='1')then</p><p>  data<=ledsj(index); </p><p><b>  else</b></p><p>  data<=ledsj1(index)

120、;</p><p><b>  end if;</b></p><p>  end if;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;&l

121、t;/p><p>  process(reset_n,clk_scan,key1,key2) --n的控制</p><p>  variable flag_key:std_logic;</p><p><b>  begin</b></p><p>  if(reset_n='0')t

122、hen</p><p>  n<=1; --初始化n為1 最快速度</p><p>  flag_key:='0';</p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(key1='0')then

123、 --key1的優(yōu)先級比key2高,key1=0表示按下</p><p>  if(flag_key='0')then --flag_key=0表示上次掃描鍵盤的時候</p><p>  --無按鍵按下 </p><p>  flag_key:='1'; <

124、;/p><p>  if(n>=n'high)then</p><p><b>  n<=n;</b></p><p><b>  else</b></p><p><b>  n<=n+1;</b></p><p><b&g

125、t;  end if;</b></p><p><b>  end if;</b></p><p>  elsif(key2='0')then</p><p>  if(flag_key='0')then</p><p>  flag_key:='1';<

126、/p><p>  if(n=1)then</p><p><b>  n<=n;</b></p><p><b>  else </b></p><p><b>  n<=n-1;</b></p><p><b>  end if;&l

127、t;/b></p><p><b>  end if;</b></p><p><b>  else</b></p><p>  flag_key:='0';</p><p><b>  end if;</b></p><p>&l

128、t;b>  end if;</b></p><p>  end process;</p><p>  process(reset_n,n,clk_scan,cnt) --移動速度顯示</p><p><b>  begin</b></p><p>  if(reset_n='0&

129、#39;)then</p><p>  dis_n<="0111111";</p><p>  elsif(rising_edge(clk_scan))then</p><p>  if(cnt=7)then</p><p><b>  case n is</b></p><

130、p>  when 5=>dis_n<="1101101";</p><p>  when 4=>dis_n<="1100110";</p><p>  when 3=>dis_n<="1001111";</p><p>  when 2=>dis_n<=

131、"1011011";</p><p>  when 1=>dis_n<="0000110";</p><p>  when others=>dis_n<="0000000";</p><p><b>  end case;</b></p><

132、p><b>  else</b></p><p>  dis_n<="0000000";</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;

133、</p><p><b>  end abc;</b></p><p><b>  鍵盤消抖模塊程序</b></p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.s

134、td_logic_arith.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  entity keyscan is</p><p><b>  port(</b></p><p>  clk_key:in std_logic;</p><

135、;p>  reset_n:in std_logic;</p><p>  key1_in,key2_in:in std_logic; --按下時為低電平</p><p>  key1_out,key2_out:out std_logic</p><p><b>  );</b></p><p>

136、  end keyscan;</p><p>  architecture abc of keyscan is</p><p><b>  begin</b></p><p>  --key1的產(chǎn)生(消鍵抖動)</p><p>  process(reset_n,clk_key,key1_in)</p>&

137、lt;p>  variable temp1:std_logic;</p><p>  variable cnt1:integer range 0 to 15;</p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  key1_o

138、ut<='1'; --高電平表示沒有按下</p><p>  elsif(rising_edge(clk_key))then</p><p>  if(temp1=key1_in)then</p><p>  if(cnt1=cnt1'high)then</p><p><

139、;b>  cnt1:=0;</b></p><p>  key1_out<=temp1;</p><p><b>  else</b></p><p>  cnt1:=cnt1+1;</p><p><b>  end if;</b></p><p>

140、<b>  else</b></p><p>  temp1:=key1_in;</p><p><b>  cnt1:=0;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p>

141、;<p>  end process;</p><p>  --key2的產(chǎn)生(消鍵抖動)</p><p>  process(reset_n,clk_key,key2_in)</p><p>  variable temp2:std_logic;</p><p>  variable cnt2:integer range

142、 0 to 15;</p><p><b>  begin</b></p><p>  if(reset_n='0')then</p><p>  key2_out<='1';</p><p>  elsif(rising_edge(clk_key))then</p>

143、<p>  if(temp2=key2_in)then</p><p>  if(cnt2=cnt2'high)then</p><p><b>  cnt2:=0;</b></p><p>  key2_out<=temp2;</p><p><b>  else</b>&

溫馨提示

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

評論

0/150

提交評論