2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

7、;<p>  1.1LED點(diǎn)陣原理1</p><p>  1.3漢字顯示原理2</p><p>  1.4設(shè)計(jì)的主要功能2</p><p>  1.5設(shè)計(jì)的主要工作3</p><p><b>  2. 設(shè)計(jì)方案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è)計(jì)實(shí)現(xiàn)5</b></p><p><b>  3.1分頻程序5</b></p

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

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

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

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

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

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

15、t;<p>  1.4設(shè)計(jì)的主要功能</p><p><b>  基本功能:</b></p><p>  ①實(shí)現(xiàn)基本的字符顯示(譬如紹大)</p><p> ?、谧址娘@示時(shí)間可調(diào)整(譬如1秒、5秒、10秒等)</p><p>  ③字符可實(shí)現(xiàn)閃爍顯示(譬如0.5s)</p><p>

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

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

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

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

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

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

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

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

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

25、sif(rising_edge(clk))then --clk_key1KHz的鍵盤掃描信號(hào)</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>  把有毛刺的信號(hào)通過

30、時(shí)鐘采樣,即通過一個(gè)D觸發(fā)器也可以消除毛刺。本設(shè)計(jì)就是使用這種方法。這種方法的缺點(diǎn)是信號(hào)通過一個(gè)D觸發(fā)器后,就延遲了一個(gè)時(shí)鐘周期。對(duì)于本設(shè)計(jì)這種延遲是允許的。</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移動(dòng)速度控制程序</p>

35、<p>  在用VHDL編程的時(shí)候,可以定義一個(gè)變量x作為“滑窗”在ROM上的起始地址,設(shè)計(jì)一個(gè)進(jìn)程按一定的頻率對(duì)x進(jìn)行累加,再設(shè)計(jì)一個(gè)進(jìn)程將以x為起始地址的長(zhǎng)度為16的ROM中的區(qū)域動(dòng)態(tài)顯示在LED點(diǎn)陣中。顯然x累加的速度決定了漢字的滾動(dòng)速度。</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)先級(jí)比key2高,key1=0表示按下</p&

37、gt;<p>  if(flag_key='0')then --flag_key=0表示上次掃描鍵盤的時(shí)候無按鍵按下 </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的控制進(jìn)程</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)程根據(jù)定義的信號(hào)n來控制x遞增的速度,n由外部的按鍵控制。n的范圍為1~5代表了漢字的不同的滾動(dòng)速度。當(dāng)n為1時(shí)漢字滾動(dòng)的速度最快,n為5時(shí)LED點(diǎn)陣上顯示的漢字滾動(dòng)速度最慢。</p><p><b>  3.3按鍵掃描</b></p><p>  本系統(tǒng)用到的按鍵只有5個(gè):復(fù)位按鍵

47、,控制n增大和減小的兩個(gè)按鍵,控制閃爍的一個(gè)按鍵,控制橫向縱向的一個(gè)按鍵。</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è)計(jì)驗(yàn)證</b></p><p><b>  分頻仿真圖</b></p><p>  圖 41 分頻仿真圖</p><p

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

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

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

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

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

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

64、的LED點(diǎn)陣書寫顯示屏的實(shí)現(xiàn)[J].電子世界.2011年 8 :P24-P25</p><p>  [5]任雪賓.用VHDL設(shè)計(jì)LED漢字滾動(dòng)顯示器[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信號(hào)</p&g

67、t;<p>  clk_scan:out std_logic; --1.25khz的點(diǎn)陣動(dòng)態(tài)掃描信號(hào)</p><p>  clk_key:out std_logic; --1KHz的鍵盤掃描信號(hào)</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信號(hào)</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、 --分頻時(shí)鐘</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ù)點(diǎn)(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; --和點(diǎn)陣屏的列一樣大</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、一個(gè)可以存儲(chǔ)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計(jì)數(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'; --閃爍計(jì)時(shí)控制</p><p>  else shanshuo<='0';</p><p><b>  end if;</b></p><p>  end process;</p><p>  process

98、(reset_n,clk_scan,cnt) --掃描信號(hào)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)先級(jí)比key2高,key1=0表示按下</p><p>  if(flag_key='0')then --flag_key=0表示上次掃描鍵盤的時(shí)候</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) --移動(dòng)速度顯示</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; --按下時(shí)為低電平</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)生(消鍵抖動(dòng))</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)生(消鍵抖動(dòng))</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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論