版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- eda課程設(shè)計(jì)--1616點(diǎn)陣顯示
- eda課程設(shè)計(jì)-- 1616點(diǎn)陣顯示
- led點(diǎn)陣顯示屏課程設(shè)計(jì)
- eda(led點(diǎn)陣顯示屏控制系統(tǒng)設(shè)計(jì))
- eda課程設(shè)計(jì)報(bào)告--1616點(diǎn)陣顯示
- 計(jì)算機(jī)控制課程設(shè)計(jì)---點(diǎn)陣led顯示系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)----led點(diǎn)陣漢字顯示
- 課程設(shè)計(jì)--led1616點(diǎn)陣顯示設(shè)計(jì)
- 課程設(shè)計(jì)---點(diǎn)陣led圖文顯示屏的設(shè)計(jì)
- led點(diǎn)陣課程設(shè)計(jì)
- 基于單片機(jī)的led點(diǎn)陣顯示課程設(shè)計(jì)
- led點(diǎn)陣課程設(shè)計(jì)報(bào)告
- led點(diǎn)陣課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)--點(diǎn)陣led電子顯示屏
- 單片機(jī)課程設(shè)計(jì)---點(diǎn)陣led電子顯示屏
- eda課程設(shè)計(jì)--心電圖顯示
- eda課程設(shè)計(jì)--循環(huán)顯示ceo
- led點(diǎn)陣顯示屏論文 led漢字點(diǎn)陣論文 led點(diǎn)陣顯示論文
- led點(diǎn)陣顯示及設(shè)計(jì)
- 16乘16led點(diǎn)陣電子顯示屏課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論