版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 本科畢業(yè)設(shè)計(論文)</p><p> Southwest Petroleum University </p><p> Graduation Thesis</p><p> Design a LED Chinese Character Rolling</p><p> Display with VHDL<
2、/p><p> Grade: 2004</p><p> Name: Ren Xuebin</p><p> Specialty: Telecommunications Engineering</p><p> Instructor: Wang Zhangrui </p><p> School of El
3、ectronic and Information Engineering</p><p><b> 2008-6</b></p><p><b> 摘 要</b></p><p> 本文對基于FPGA控制的LED漢字滾動顯示器的設(shè)計方法進行了探討。提出了兩個實現(xiàn)方案。并對其中一個方案作了詳細說明。文中首先介紹了LE
4、D發(fā)光二極管點陣的控制原理;然后研究了在LED發(fā)光二極管點陣上滾動顯示漢字的方法;最后,用VHDL語言程序設(shè)計了一個完整的LED漢字滾動顯示器。</p><p> 本系統(tǒng)由掃描控制模塊、只讀存儲器ROM和FPGA外面的LED點陣顯示模塊、一個反相器和兩個4-16譯碼器構(gòu)成。其中:掃描控制模塊和只讀存儲器ROM集成在FPGA芯片內(nèi)部。兩個4-16譯碼器(74LS154)和一個反相器配合FPGA中的列掃描控制模塊共
5、同完成了兩塊16×16點陣顯示模塊的32列的掃描控制。FPGA定義的只讀存儲器ROM中保存了要顯示的漢字的數(shù)據(jù),并以16位的數(shù)據(jù)寬度輸出到LED陣顯示模塊的行端,配合列掃描控制共同完成漢字的滾動顯示。</p><p> 本系統(tǒng)利用數(shù)字系統(tǒng)設(shè)計自動化(EDA)技術(shù)實現(xiàn)了全硬件方式的LED點陣顯示。利用FPGA內(nèi)部的物理資源,將只讀存儲器ROM和主要功能模塊設(shè)計在FPGA內(nèi)部。充分顯示了EDA技術(shù)設(shè)計的靈
6、活性,同時也大大提高了系統(tǒng)的集成度和穩(wěn)定性。</p><p> 關(guān)鍵詞:FPGA; LED; EDA;動態(tài)掃描</p><p><b> Abstract</b></p><p> This article discusses the designing method of FPGA controlled LED Chinese char
7、acter rolling display. This article also proposes two feasible plans and gives a detailed explanation to one of the plans. The article firstly introduces the LED control principle. Then the article studies rolled the dem
8、onstration Chinese character method on the LED light emitter diode lattice. Finally, I design a complete LED Chinese character rolling display with VHDL language program.</p><p> This system is composed of
9、a scanning control module, a ROM, an LED plot array module, an inverter and two decoders, with the scanning control module and the ROM installed inside the FPGA chip. The two decoders and the inverter work with the out-s
10、canning control module in the FPGA to exercise 32-array scanning control of the two 16×16 dot-matrix display module. The FPGA-defined ROM preserves the data of the Chinese characters that will be displayed, and it s
11、ends the data, by way of a 16-bit data</p><p> This system has realized the entire hardware way LED lattice demonstration using the number system design automation (EDA) technology. Using FPGA internal phys
12、ics resources, non-erasable storage ROM and major function module design in FPGA. It had demonstrated fully the EDA technical design's flexibility, simultaneously also greatly enhanced system's integration rate a
13、nd the stability.</p><p> Keywords: FPGA; LED; EDA; Dynamic scanning</p><p><b> 目 錄</b></p><p><b> 1 緒 論1</b></p><p> 1.1 本設(shè)計的研究背景和研究目的1&l
14、t;/p><p> 1.2 研究內(nèi)容及方法2</p><p> 1.3 設(shè)計的主要工作2</p><p><b> 2 設(shè)計方案3</b></p><p><b> 2.1 方案一3</b></p><p><b> 2.2 方案二3</b&g
15、t;</p><p> 2.3 方案比較4</p><p> 3 掃描控制模塊5</p><p> 3.1 LED點陣原理5</p><p> 3.2 漢字的存儲6</p><p> 3.3 漢字的顯示7</p><p> 3.4 滾動速度的控制9</p>
16、<p> 3.5存儲模塊10</p><p> 3.5.1 使用參數(shù)化組件LPM_ROM來實現(xiàn)10</p><p> 3.5.2 用FPGA內(nèi)部的邏輯單元設(shè)計一個ROM12</p><p><b> 4 分頻電路13</b></p><p> 4.1 解決毛刺13</p>&l
17、t;p> 4.1.1 改變輸入信號消除毛刺13</p><p> 4.1.2 通過D觸發(fā)器消除毛刺14</p><p> 4.2 關(guān)鍵部分VHDL程序14</p><p> 5 按鍵掃描電路16</p><p> 5.1 直接式/矩陣式按鍵16</p><p> 5.2 鍵盤消抖電路18&
18、lt;/p><p> 5.2.1 比較法消鍵抖動18</p><p> 5.2.2 積分法消鍵抖動18</p><p> 6 FPGA的頂層設(shè)計19</p><p> 6.1 層次化設(shè)計的概念19</p><p> 6.1.1 模塊化19</p><p> 6.1.2 元件重用
19、19</p><p> 6.2 生成組件符號20</p><p> 6.3 調(diào)用組件符號20</p><p> 6.3.1 建立項目20</p><p> 6.3.2 定義輸入/輸出端口與聯(lián)線21</p><p><b> 7 結(jié)論23</b></p><
20、p><b> 7.1 總結(jié)23</b></p><p><b> 7.2 建議23</b></p><p><b> 謝 辭24</b></p><p><b> 參考文獻25</b></p><p> 附錄:系統(tǒng)各個模塊的VHDL
21、程序26</p><p><b> 1 緒 論</b></p><p> 1.1 本設(shè)計的研究背景和研究目的</p><p> 受到體育場館用LED顯示屏需求快速增長的帶動,近年來,中國 LED顯示屏應(yīng)用逐步增多。目前,LED已經(jīng)廣泛應(yīng)用在銀行、火車站、廣告、體育場館之中。而隨著奧運會、世博會的臨近,LED顯示屏將廣泛的應(yīng)用在體育場館以
22、及道路交通指示中,LED顯示屏在體育廣場中的應(yīng)用將出現(xiàn)快速增長。</p><p> 2007年,中國LED顯示屏市場需求額為49.5億元,比2006年增長22.2%,這其中全彩顯示屏需求額達到21.1億元,占整體市場的42.6%,雙色顯示屏的需求額位于第二位,需求額為18.3億元,占整體市場的40%,單色顯示屏需求額為10.1億元。</p><p> 2008年奧運會的召開將會直接推動
23、體育場用屏幕數(shù)量的快速增加,同時,由于奧運會用屏對LED顯示屏的質(zhì)量要求也較高,因此,高端屏幕的使用比例也將會增加,數(shù)量和質(zhì)量的提高帶動LED顯示屏市場的增長。除了體育場館之外,奧運會和世博會等重大活動召開的另一直接推動領(lǐng)域就是廣告領(lǐng)域國內(nèi)外的廣告公司必然會看好奧運會和世博會帶來的商機,因此必然會增加廣告用屏的數(shù)量來提高自身收入,從而促進了廣告用屏市場的發(fā)展。</p><p> 奧運會和世博會等重大活動的召開必
24、然會伴隨著很多大型活動,政府、新聞媒體和各種組織都可能會在奧運會和世博會之間舉辦各種相關(guān)活動,某些活動可能需要大屏LED,這些需求直接帶動顯示屏市場。</p><p> 目前,國內(nèi)從事LED顯示屏生產(chǎn)的企業(yè)眾多,同時,受到外資企業(yè)LED顯示屏價格過高的影響,在中國LED顯示屏市場上多以本土企業(yè)為主。目前,本土LED顯示屏生產(chǎn)企業(yè)除供應(yīng)國內(nèi)需求外,還不斷把產(chǎn)品出口到國外市場。而近年來,受到成本壓力的影響,國際上一
25、些知名的LED顯示屏企業(yè)也逐步把 生產(chǎn)基地移到了中國,如巴可在北京設(shè)立了顯示屏生產(chǎn)基地,Lighthouse在惠州也擁有生產(chǎn)基地,Daktronics、萊茵堡都在國內(nèi)設(shè)立了生產(chǎn)工廠。隨著國際LED顯示屏生產(chǎn)大廠不斷把生產(chǎn)基地轉(zhuǎn)移至國內(nèi), 加之國內(nèi)眾多的LED顯示屏本土企業(yè),中國正在成為全球LED顯示屏的主要生產(chǎn)基地。</p><p> 因此研究研究LED漢字滾動顯示屏的設(shè)計方法具有重要的理論和現(xiàn)實意義。<
26、/p><p> 1.2 研究內(nèi)容及方法</p><p> 采用傳統(tǒng)方法設(shè)計的漢字滾動顯示器,通常需要使用單片機、存儲器和制約邏輯電路來進行PCB(印制電路板)板級的系統(tǒng)集成。盡管這種方案有單片機軟件的支持較為靈活,但是由于受硬件資源的限制,未來對設(shè)計的變更和升級,總是難以避免要付出較多研發(fā)經(jīng)費和較長投放市場周期的代價。</p><p> 隨著電子設(shè)計自動化(EDA
27、)技術(shù)的進展,基于可編程ASIC器件的數(shù)字電子系統(tǒng)設(shè)計的完整方案越來越受到人們的重視,并且以EDA技術(shù)為核心、的能在可編程ASIC器件上進行系統(tǒng)芯片集成的新設(shè)計方法,也正在快速地取代基于PCB板的傳統(tǒng)設(shè)計方式。</p><p> 如何使用EDA工具設(shè)計電子系統(tǒng)是人們普遍關(guān)心的問題。在EDA工具軟件QuartusII的支持下,本設(shè)計通過了編譯、適配和軟件仿真驗證。最后載入硬件系統(tǒng)證明了它的正確性。</p&g
28、t;<p> 1.3 設(shè)計的主要工作</p><p> 本設(shè)計需要利用EDA工具軟件QuartusII編寫并調(diào)試系統(tǒng)的VHDL程序。并且每一個模塊都在這個軟件下進行了仿真。系統(tǒng)的VHDL程序編好過后先在實驗室的EDA實驗箱上下載調(diào)試,成功過后再根據(jù)電路焊接相應(yīng)的電路板。最好將程序下載到制好的電路上驗證。</p><p><b> 2 設(shè)計方案</b>
29、;</p><p><b> 2.1 方案一</b></p><p> 本文系統(tǒng)的LED點陣模塊,共由16×32=512個LED發(fā)光二極管組成。如何在該點陣模塊上顯示漢字是本文設(shè)計的關(guān)鍵技術(shù)。本文系統(tǒng)設(shè)計是采用一種32路動態(tài)分時掃描技術(shù)來實現(xiàn)的。具體方法是,將8個8×8數(shù)組的顯示模塊組合成兩個16行16列的掃描結(jié)構(gòu)并將其串聯(lián)(如圖2.1所示)。
30、其行輸入端與FPGA內(nèi)的只讀存儲器ROM的16位數(shù)據(jù)輸出端口相連;32個列控制端與兩個4-16譯碼器A、B的輸出相連;而譯碼器A、B的輸入端和片選信號又與FPGA內(nèi)的列掃描控制模塊的輸出端口scan4-scan0相連。圖2.1為方案的結(jié)構(gòu)框圖。</p><p><b> 2.2 方案二</b></p><p> VHDL程序設(shè)計的是硬件,他和編程語言的最大區(qū)別是它
31、可以“并發(fā)執(zhí)行”。本設(shè)計可以將LED顯示屏要的顯示內(nèi)容抽象成一個二維數(shù)組(數(shù)組中的‘1’對映點陣顯示屏上面的亮點),用VHDL語言設(shè)計一個進程將這個數(shù)組動態(tài)顯示在LED顯示屏上,再利用另一個進程對這個數(shù)組按一定頻率進行數(shù)據(jù)更新,更新的方式可以有多種。因為兩個進程是同時進行的(并發(fā)執(zhí)行),如果對數(shù)組中的漢字數(shù)據(jù)按滾動的方式更新,則可實現(xiàn)漢字的滾動顯示。圖2.2為該方案的原理圖。</p><p><b>
32、 2.3 方案比較</b></p><p> 方案一很容易實現(xiàn),而且占用FPGA的資源較少。但是由于其實現(xiàn)方式的局限性,該方案只能實現(xiàn)漢字的滾動顯示。方案二中將LED點陣抽象成了一個二維數(shù)組??梢栽O(shè)計一些比較復(fù)雜的算法來控制這個數(shù)組,使設(shè)計的系統(tǒng)不但可以滾動顯示漢字,還可以擴展一些其它的顯示效果。但是方案二中對數(shù)組的處理部分對FPGA芯片的資源消耗太大學(xué)校實驗室里的EPF10K10LC84-4芯片只
33、有576個邏輯單元遠遠不夠設(shè)計要求。所以最終選擇方案一。</p><p><b> 3 掃描控制模塊</b></p><p> 3.1 LED點陣原理</p><p> 以下為8×8點陣LED外觀及引腳圖及其等效電路,只要其對應(yīng)的X、Y軸順向偏壓,即可使LED發(fā)亮。例如如果想使左上角LED點亮,則Y0=1,X0=0即可。應(yīng)用時限
34、流電阻可以放在X軸或Y軸。</p><p> 點陣LED掃描法介紹</p><p> 點陣LED一般采用掃描式顯示,實際運用分為三種方式: </p><p><b> ?。?)點掃描</b></p><p><b> ?。?)行掃描</b></p><p><b&g
35、t; (3)列掃描</b></p><p> 若使用第一種方式,其掃描頻率必須大于16×64=1024Hz,周期小于1ms即可。若使用第二和第三種方式,則頻率必須大于16×8=128Hz,周期小于7.8ms即可符合視覺暫留要求。此外一次驅(qū)動一列或一行(8顆LED)時需外加驅(qū)動電路提高電流,否則LED亮度會不足。</p><p><b> 3.
36、2 漢字的存儲</b></p><p> 用動態(tài)分時掃描技術(shù)使LED點陣模塊顯示圖像,需要進行兩步工作。第一步是獲得數(shù)據(jù)并保存,即在存貯器中建立漢字數(shù)據(jù)庫。第二步是在掃描模塊的控制下,配合行掃描的次序正確地輸出這些數(shù)據(jù)。獲得圖像數(shù)據(jù)的步驟是,先將要顯示的每一幅圖像畫在一個如圖3.3所示的被分成16×16共256個小方格的矩形框中,再在有筆劃下落處的小方格里填上“1”,無筆劃處填上“0”,這
37、樣就形成了與這個漢字所對應(yīng)的二進制數(shù)據(jù)在該矩形框上的分布,再將此分布關(guān)系以32×16的數(shù)據(jù)結(jié)構(gòu)組成64個字節(jié)的數(shù)據(jù),并保存在只讀存貯器ROM中。以這種方式將若干個漢字的數(shù)據(jù)貯存在存貯器內(nèi),就完成了圖像數(shù)據(jù)庫的建立工作。</p><p> 然后,依次對多漢字抽取像素信息,并按序排隊存放起來,便可得到一個待顯示數(shù)據(jù)序列。將這個序列存到ROM中進一步通過尋址的方法來控制該數(shù)據(jù)序列的釋放過程,就可實現(xiàn)在LED
38、 發(fā)光二極管點陣上滾動顯示多漢字信息的目的。</p><p> 由圖3.4可知,某一時刻能在顯示數(shù)據(jù)序列中定位待顯示數(shù)據(jù)的地址指針可用下式計算:</p><p> addr=n+m (式3.1)</p><p><b> 3.3 漢字的顯示</b></p&
39、gt;<p> 第二步工作的步驟是:先在掃描模塊的控制下,由地址線確定每次由ROM送出某一列的16個LED所要顯示的漢字的控制字節(jié)數(shù)據(jù),同時由掃描模塊輸出的5位掃描碼經(jīng)兩個4-16譯碼器解碼后決定相應(yīng)的某一列可以被點亮,而另外31列都不能被點亮。該狀態(tài)持續(xù)約0.4毫秒后,就接著進行下一行的掃描。當完成了一次32行的掃描后,也就完成了一幀畫面的顯示。重復(fù)上述過程不斷修改ROM的地址區(qū)間的起始地址,轉(zhuǎn)向下一幅畫面的數(shù)據(jù)傳送和
40、顯示。如此進行,就可以在LED點陣模塊上滾動顯示ROM中存儲的漢字。</p><p> 關(guān)鍵部分VHDL程序:</p><p> process(reset_n,clk_scan) --掃描信號的輸出</p><p><b> begin</b></p><p> if(reset_n='0'
41、;)then</p><p><b> cnt<=31;</b></p><p> elsif(rising_edge(clk_scan))then</p><p> if(cnt=cnt'high)then</p><p><b> cnt<=0;</b></p&
42、gt;<p><b> else</b></p><p> cnt<=cnt+1;</p><p><b> end if;</b></p><p> if(cnt =cnt'high-1)then</p><p> flag_scan<='1
43、39;;</p><p><b> else</b></p><p> flag_scan<='0';</p><p><b> end if;</b></p><p><b> end if;</b></p><p>
44、end process;</p><p> process(reset_n,clk_scan,cnt)</p><p><b> begin</b></p><p> if(reset_n='0')then</p><p> scan<="ZZZZZ";<
45、;/p><p> elsif(rising_edge(clk_scan))then</p><p> case cnt is</p><p> when 0 => scan <= "00000";</p><p> when 1 => scan <= "00001";<
46、/p><p><b> ……</b></p><p> when 30 => scan <= "11110";</p><p> when 31 => scan <= "11111";</p><p> when others => scan &l
47、t;= "ZZZZZ";</p><p><b> end case;</b></p><p><b> end if;</b></p><p> end process;</p><p> ----------------------------------</p
48、><p> process(reset_n,clk_scan,cnt,x) --列數(shù)據(jù)的輸出</p><p> variable index:integer range 0 to L_SZ;</p><p><b> begin</b></p><p> if(reset_n='0')t
49、hen</p><p> data<="0000000000000000";</p><p> elsif(rising_edge(clk_scan))then</p><p> index:=((cnt+x) mod L_SZ);</p><p> data<=ledsj(index);</p&
50、gt;<p><b> end if;</b></p><p> end process;</p><p> 3.4 滾動速度的控制</p><p> 將LED點陣看成一個滑窗。通過這個“滑窗”每次能“看到”32個存儲單元(2個漢字長度)的信息。只讀存儲器ROM中鏈式的存放了若干個漢字的點陣信息,“滑窗”在這若干個漢字點陣
51、信息上面滑動,我們通過“滑窗”看到的就是漢字的滾動顯示。</p><p> 在用VHDL編程的時候,可以定義一個變量x作為“滑窗”在ROM上的起始地址,設(shè)計一個進程按一定的頻率對x進行累加,再設(shè)計一個進程將以x為起始地址的長度為32的ROM中的區(qū)域動態(tài)顯示在LED點陣中。顯然x累加的速度決定了漢字的滾動速度。</p><p> 關(guān)鍵部分的VHDL程序:</p><p
52、> process(reset_n,clk_scan,flag_scan) --x的控制進程</p><p> variable cntx:integer range 0 to 50;</p><p><b> begin</b></p><p> if(reset_n='0')then<
53、/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')then</p><p
54、> if(cntx=n×8 or cntx=cntx'high)then --通過n來控制cntx的計數(shù)范圍</p><p><b> cntx:=0;</b></p><p><b> else</b></p><p> cntx:=cntx+1;</p><p>
55、;<b> end if;</b></p><p> if(cntx=n×8)then --通過n來控制x的增加</p><p> if(x=x'high)then</p><p><b> x<=0;</b></p><p><b
56、> else</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>&
57、lt;/p><p><b> end if;</b></p><p> end process;</p><p> 此進程根據(jù)定義的信號n來控制x遞增的速度,n由外部的按鍵控制。n的范圍為0~7代表了漢字的不同的滾動速度。當n為0時漢字滾動的速度最快,n為7時LED點陣上顯示的漢字靜止。</p><p><b&g
58、t; 3.5存儲模塊</b></p><p> 3.5.1 使用參數(shù)化組件LPM_ROM來實現(xiàn)</p><p> 為提高系統(tǒng)的集成度,本設(shè)計將點陣顯示的圖像數(shù)據(jù)庫建立在EPF10K10的片內(nèi)ROM中。Flex10k10中共有3個嵌入式數(shù)組塊(EAB),每塊大小均為2k,可構(gòu)成2048×1,1024×2,512×4,256×8等4種類
59、型RAM/ROM中的任意一種。更大容量的內(nèi)存可由多個EAB組合在一起。例如兩個256×8的ROM塊可組成一個256×16的ROM,兩個512×4的ROM塊可組合成一個512×8的ROM,如果需要,可以將所有的EAB級聯(lián)成一個RAM/ROM。級聯(lián)是QuartusII軟件自動完成的。</p><p> 本設(shè)計可以選擇2048×16的結(jié)構(gòu),用來構(gòu)成一個能保存128個漢
60、字的只讀存儲器ROM。在FPGA中建立片內(nèi)只讀存儲器ROM,是通過使用美國Altera公司的EDA工具軟件QuartusII,并調(diào)用其中的參數(shù)化組件LPM_ROM來實現(xiàn)的。具體步驟是,首先在MAXPLUSII的圖形編輯器中雙擊空白處,便會出現(xiàn)如圖3.5所示的“Symbol”對話框。點擊該對話框的“Mega Wizard Plug-In Manager”按鈕,并在出現(xiàn)的對話框中選擇storage ->LPM_ROM,就會出現(xiàn)如圖3.
61、6所示的“Mega Wizard Plug-InManager-LMP ROM” 系列對話框。在該系列對話框中設(shè)置輸出數(shù)據(jù)線寬度為11,存儲單元的數(shù)量為2048。并完成相應(yīng)的配置環(huán)節(jié)就獲得了要求的256字節(jié)的只讀存儲器ROM。只讀存儲器ROM中的初始化數(shù)據(jù)就是本系統(tǒng)的漢字數(shù)據(jù)庫數(shù)據(jù)。</p><p> 該初始化數(shù)據(jù)的建立是在上述的LMP_ROM設(shè)計過程中通過指定一個后綴名為.mif的初始化文件來實現(xiàn)的。該文件是
62、設(shè)計者事先在文本編輯器中建立的,其VHDL格式和關(guān)鍵代碼示意如下:</p><p> WIDTH=16;———數(shù)據(jù)線的寬度為16位</p><p> DEPTH=2048;———有2048個字節(jié)存儲單元,對應(yīng)11根地址線寬度</p><p> ADDRESS RADIX=HEX;———以16進制表示</p><p> DATA RAD
63、IX = HEX;</p><p> CONTENTBEGIN</p><p> 00 : 2f;———以16進制表示的ROM內(nèi)的各字節(jié)單元的地址和保存的數(shù)據(jù)</p><p><b> 01 : 6c;</b></p><p><b> 02 : f8;</b></p><
64、;p><b> ……</b></p><p><b> fd : ee;</b></p><p><b> fe : 72;</b></p><p><b> ff : 00;</b></p><p><b> END;</
65、b></p><p> 3.5.2 用FPGA內(nèi)部的邏輯單元設(shè)計一個ROM</p><p> 本系統(tǒng)也可以定義一個常數(shù)數(shù)組來存儲漢字信息。數(shù)組的下標對映ROM的地址。下面是一個容量為L_SZ×16的ROM內(nèi)存的例子,常數(shù)L_SZ決定了ROM的地址空間, ROM的每一個數(shù)據(jù)單元存儲16位數(shù)據(jù),可以很方便的驅(qū)動16×16的LED點陣。定義這個ROM的時侯必須初始化
66、全部存儲單元。</p><p> type array_2 is array(0 to L_SZ)of std_logic_vector(15 downto 0);</p><p> constant ledsj:array_2:=(</p><p> ("0010000000000000"),</p><p>
67、("0010001111111111"),</p><p><b> ……</b></p><p><b> ……</b></p><p> ("0010001000000000"),</p><p> ("0000000000000000&
68、quot;));</p><p> 兩種方案存儲漢字信息,以及輸出數(shù)據(jù)驅(qū)動LED點陣的原理和相差不大,第一種方案是利用了FPGA芯片中的嵌入式數(shù)組塊,可以生成大容量的ROM來存儲較多的漢字信息。第二中方案生成的ROM容量受到了FPGA芯片內(nèi)部邏輯單元數(shù)量的限制,但是它的操作性更好。由于本系統(tǒng)只是驗證可行性的一個設(shè)計,不需要建立大的字庫所以采用第二種方案。</p><p><b>
69、; 4 分頻電路</b></p><p><b> 4.1 解決毛刺</b></p><p> FPGA與單片機相比,一個非常明顯的優(yōu)勢就在于它的高速性。但是因為很多外圍器件的驅(qū)動需要低頻的時鐘(若時鐘頻率太高,則鍵盤掃描容易出錯,數(shù)碼管會閃爍和不穩(wěn)定等),所以需要用到分頻電路。</p><p> 該電路主要包含有一個計數(shù)器
70、模塊和一個譯碼輸出模塊,該電路是通過計數(shù)器模塊實現(xiàn)分頻的。比如要從12MHz的全局時鐘得到100Hz的時鐘,必須進行120000倍分頻。但是這么大的分頻需要仿真時間很久。仿真是一般采用小的分頻來替代,真正下載到電路上時,就需要采用120000分頻了。</p><p> 值的注意的是譯碼器的輸入采用了寄存器鎖存輸出,這是為了消除毛刺。多輸入的組合邏輯電路中,默寫輸入信號在理想情況下應(yīng)該同時發(fā)生變化,但由于延遲路徑
71、不同造成這些輸入信號發(fā)生變化的時間有微小差別(門延遲時間量級),這是得到的是輸出信號就會有毛刺,這些毛刺有可能會給下一級電路帶來,使得整個系統(tǒng)運行不穩(wěn)定。因此,為保證系統(tǒng)的穩(wěn)健性,一般情況下,都應(yīng)該給輸出信號去毛刺,使之變得干凈。在設(shè)計中,譯碼的輸入是計數(shù)器的輸出,計數(shù)器各級輸出延遲是不一樣的,因此譯碼器輸出clk_scan信號波形就會有毛刺(如圖4.1)。</p><p> 4.1.1 改變輸入信號消除毛刺&
72、lt;/p><p> 為了消除毛刺帶來的影響,可以設(shè)法使得組合邏輯電路的輸入每一時刻只有一個發(fā)生變化。對于本電路可以把計數(shù)器從二進制碼計數(shù)器改為格雷碼計數(shù)器。格雷碼計數(shù)器的特點是相鄰的計數(shù)值只有一位不相同,即每次計數(shù)值改變時,只有一位信號會發(fā)生變化。這一點就可以保證沒有毛刺產(chǎn)生。</p><p> 4.1.2 通過D觸發(fā)器消除毛刺</p><p> 把有毛刺的信號
73、通過時鐘采樣,即通過一個D觸發(fā)器也可以消除毛刺。本設(shè)計就是使用這種方法。這種方法的缺點是信號通過一個D觸發(fā)器后,就延遲了一個時鐘周期。對于本設(shè)計這種延遲是允許的,然而在有些電路中延遲是不允許的。該電路的仿真結(jié)果如圖4.2所示。</p><p> 4.2 關(guān)鍵部分VHDL程序</p><p> process(clk) --計數(shù)
74、模塊</p><p> begin </p><p> if(rising_edge(clk))then</p><p> if(cntx=480)then</p><p><b> cntx<=0;</b></p><p><b> else</b&
75、gt;</p><p> cntx<=cntx+1;</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> ----------------------
76、----------</p><p> process(cnt,clk) --譯碼輸出</p><p> begin </p><p> if(rising_edge(clk))then --寄存器鎖存輸出,以消除毛刺</p><p> if(
77、cnt>=cnt'high/2)then</p><p> clk_scan<='1';</p><p><b> else</b></p><p> clk_scan<='0';</p><p><b> end if;</b>&l
78、t;/p><p><b> end if;</b></p><p> end process;</p><p> 圖4.3為分頻電路生成的元件符號。</p><p><b> 5 按鍵掃描電路</b></p><p> 5.1 直接式/矩陣式按鍵</p>
79、<p> 數(shù)字系統(tǒng)中,常用的按鍵有直接式和矩陣式兩種。直接式按鍵十分簡單,一端接地,一端接FPGA的I/O口(設(shè)為輸入)。當按鍵按下時,此接口為高電平,通過對I/O口電平的檢測就可知按鍵是否按下。其優(yōu)點是簡單、易行,連接方便,但每個按鍵要占用一個I/O口,如果系統(tǒng)中需要很多按鍵,那么用這種方法會占用大量的I/O口。而矩陣式鍵盤控制比直接式按鍵要麻煩得多,但其優(yōu)點也是很明顯的,即節(jié)省I/O口。設(shè)矩陣式鍵盤有m行n列,則鍵盤上有
80、(m×n)個按鍵,而它只需要占用(m+n)個I/O口。當需要很多按鍵時,用矩陣式鍵盤顯然比直接式按鍵要合理得多。</p><p> 上圖是一個4×4的矩陣鍵盤的原理圖。它有4行4列共8條線,每個按鍵都連著一條行線和列線。以按鍵0為研究對象,按鍵0的行線連著PC4并且通過一個下拉電阻接地(下拉就是將不確定的信號通過一個電阻嵌位在低電平,下拉反之);其列線接著PC3。將PC3~PC0設(shè)為輸出,P
81、C4~PC7設(shè)為輸入。當PC2~PC0輸出為0,而PC3輸出為1,當按鍵0按下時,因為PC7~PC5沒有輸入,會由于下拉作用穩(wěn)定在低電平,而PC4則由于與PC3接通而呈現(xiàn)高電平。也就是說,當PC3~PC0為0001時,當1鍵按下時,PC7~PC4讀到的電平值為0010。如果3鍵按下那么PC7~PC4讀到的電平值就是0100。以此類推,可以列出一張行列電平值與按鍵的對映關(guān)系表。</p><p> 從表中可以看出,
82、pc3~pc0的輸出在任意時刻總是只有一條線為1,其它線均為0.這很容易理解,若pc3~pc0的輸入在同一時刻有多于一條線為1,則無法判斷究竟是那個鍵按下。例如PC3~PC2同時為1,當按鍵0或者按鍵4被按下,PC7~PC4讀到的值都是0001,這樣根本無法判斷究竟是按鍵0,還是按鍵4被按下。</p><p> 因為無法預(yù)計什么時候有鍵按下,也無法預(yù)測究竟是那一列上的鍵被按下,所以只能對鍵盤的列線(PC3~PC
83、0)進行掃描,同時讀取鍵盤行線(PC7~PC0)的電平值。如表7.2所列,PC3~PC0按下述的4中組合依次輸出,不斷循環(huán):</p><p> 本系統(tǒng)用到的按鍵只有3個:復(fù)位按鍵,控制n增大和減小的兩個按鍵。顯然選擇直接式按鍵的方案。</p><p> 5.2 鍵盤消抖電路</p><p> 鍵盤的按鍵閉合與釋放瞬間,輸入的信號會有毛刺。如果不進行消抖處理,系
84、統(tǒng)會將這些毛刺誤以為是用戶的另一次輸入,導(dǎo)致系統(tǒng)的誤操作。</p><p> 5.2.1 比較法消鍵抖動</p><p> 也叫計數(shù)法,本設(shè)計就是采用這種方法。這個方法很好理解它比較若干個時鐘周期讀取的數(shù)據(jù),當每一次比較都相同時我們認為收到了一個穩(wěn)定的鍵值,否則認為是過渡態(tài)即毛刺。</p><p> 5.2.2 積分法消鍵抖動</p><p
85、> 用一個增減計數(shù)器,當輸入信號為'1'時計數(shù)器遞增計數(shù)直到計數(shù)器全'1'停止計數(shù),否則計數(shù)器遞減計數(shù)直到全'0'停止計數(shù)。那么計數(shù)器 的MSB即為輸入信號的去抖信號。你也可以用時鐘再加上一個速度較慢的使能來對輸入信號計數(shù)。顯然計數(shù)器的位數(shù)要求與要去抖的抖動脈沖寬度的對數(shù)關(guān)系。</p><p> 6 FPGA的頂層設(shè)計</p><p&g
86、t; 6.1 層次化設(shè)計的概念</p><p> 層次化設(shè)計的示意圖如圖6.1所示。</p><p> 從圖中可以看出,層次化設(shè)計的核心思想有兩個,一是模塊化,二是元件重用。</p><p><b> 6.1.1 模塊化</b></p><p> 可以將一個大系統(tǒng)劃分為幾個子模塊,而這些子模塊有分別由更小的模塊
87、組成,如此往下,直至不可再分。這些是自頂向下的設(shè)計方法。圖6.1中,頂層文件所描述的實體A由B、C、D三個實體組成,而實體B和實體C又分別由實體E、F和實體F、G構(gòu)成。每個實體都可以看成上一層實體中的一個模塊或組件,系統(tǒng)就像搭積木一樣一層一層地構(gòu)建。</p><p> 6.1.2 元件重用</p><p> 同一個元件可以被不同的設(shè)計實體調(diào)用,也可以被同一個實體多次調(diào)用。圖6.1中,實
88、體F分別被實體B和實體C調(diào)用,而實體G則被實體C調(diào)用了2次。組件重用不但大大減輕了設(shè)計者的工作量,而且使程序更結(jié)構(gòu)化和具有更高的可讀性。</p><p> 6.2 生成組件符號</p><p> 欲將上述的各個模塊作為上一層設(shè)計實體中的組件,就必須把他們先生成組件符號。具體做法是:在QuartusII中為VHDL語言程序分別建立項目;在編譯、仿真通過,證實邏輯功能正確后,在File菜單
89、下選擇Create/Update項中的Create Symbol Files for Current File即可(如圖6.2)。</p><p> QuartusII會自動為此實體生成一個后綴為.bsf的組件符號文件,以后就可以在圖形編輯器中調(diào)用此組件了。</p><p> 6.3 調(diào)用組件符號</p><p> 6.3.1 建立項目</p>
90、<p> 新建一個頂層檔的項目將上述的各個模塊在QuartusII的圖形編輯器中調(diào)用已經(jīng)生成的組件符號(如圖6.3)。</p><p> 6.3.2 定義輸入/輸出端口與聯(lián)線</p><p> 組件中的輸入/輸出端口需要添加輸入/輸出引腳,做法是:在圖6.3對話框中的pin里選擇Input即可添加輸入引腳;選擇Output即可添加輸出引腳。輸入/輸出引腳上都有一個名字,左鍵
91、雙擊它即可輸入用戶自定的名字。如果要連接兩個組件的端口,</p><p> 左鍵雙擊它即可輸入用戶自定的名字。如果要連接兩個組件的端口,就將鼠標移到其中一個端口上,這時鼠標指示符會自動變?yōu)椤笆毙?;然后按下鼠標左鍵并拖動到第2個端口,松開鼠標即畫好一條線。以圖6.4的關(guān)系構(gòu)成頂層設(shè)計,并編譯下載到FPGA中,即完成了一個基于FPGA的LED點陣顯示系統(tǒng)的全部設(shè)計。</p><p><
92、;b> 7 結(jié)論</b></p><p><b> 7.1 總結(jié)</b></p><p> 本設(shè)計基于EDA技術(shù),以全硬件的方式實現(xiàn)了LED漢字滾動顯示器。主要完成了以下工作:</p><p><b> 對時鐘信號的分頻</b></p><p><b> 對按鍵
93、的消抖動處理</b></p><p> 用FPGA實現(xiàn)只讀存儲器</p><p><b> 對LED點陣的控制</b></p><p> 由于采用了先進的EDA技術(shù),使得系統(tǒng)在具有極高的集成度和穩(wěn)定性的同時,還體現(xiàn)出比傳統(tǒng)設(shè)計方法更大的靈活性,和更高的設(shè)計效率。</p><p><b> 7
94、.2 建議</b></p><p> 由于現(xiàn)有實驗條件的限制,系統(tǒng)的實現(xiàn)選擇了本文2.1所提的方案。該方案雖然實現(xiàn)簡單,但是它的實現(xiàn)原理是直接將存放在ROM中的信息顯示出來。不能改變這些信息。</p><p> 對于本文2.2所提出的方案雖然沒有采用,但是筆者認為它是這是一個很具創(chuàng)新的方法。它將LED點陣完全抽象成了一個二維數(shù)組,對這個數(shù)組進行的所有操作直接反映到LED點陣
95、上。因此,設(shè)計者可以設(shè)計出很多復(fù)雜的方法來操作數(shù)組,使得LED點陣除了能夠滾動顯示外還能增加其他的顯示效果。但是在FPGA中對數(shù)組的處理全部是通過硬件來實現(xiàn)的,所以該方案對邏輯單元的消耗是十分驚人的。筆者認為可以考慮采用單片機或DSP來實現(xiàn)該方案的運算部分,然后在聯(lián)合FPGA構(gòu)成整個系統(tǒng)的設(shè)計。</p><p><b> 謝 辭</b></p><p> 四年的大
96、學(xué)生活不知不覺中就要結(jié)束了,在這段難忘的生活中,有我許多美好的回憶。在這份大學(xué)的最后一頁里,我要感謝的人很多。</p><p> 首先要感謝我的學(xué)校,感謝在這四年中交給我的做人道理,讓我從一個懵懂的高中生變成一個成熟的青年。還要感謝王章瑞教授,因為畢業(yè)設(shè)計是在王章瑞的悉心指導(dǎo)下完成的。王老師淵博的專業(yè)知識,嚴謹?shù)闹螌W(xué)態(tài)度,精益求精的工作作風(fēng)對我影響深遠。他的循循善誘的教導(dǎo)和不拘一格的思路給予我無盡的啟迪,他的嚴
97、謹細致、一絲不茍的作風(fēng),將一直是我工作、學(xué)習(xí)中的榜樣。還要感謝的是在做畢業(yè)設(shè)計期間所有和我一起討論過的同學(xué),使我對所學(xué)的知識掌握得更加牢固。當然,還要感謝寢室的兄弟們在我完成論文的過程中給予我的幫助和鼓勵,也是他們陪我度過這四年的生活。此外我還要特別感謝許多網(wǎng)絡(luò)上的不知名的朋友,他們豐富的實踐經(jīng)驗和熱心、耐心的教導(dǎo)讓我少走了許多彎路。最后要感謝的就是我的父母、朋友,對于他們我更是有千言萬語,還是匯聚成一句話:感謝你們一直都伴隨著我。&l
98、t;/p><p> 現(xiàn)在即將揮別我的學(xué)校、老師、同學(xué),還有我四年的大學(xué)生活,雖然依依不舍,但是對未來的路,我充滿了信心。最后,感謝在大學(xué)期間認識我和我認識的所有人,有你們伴隨,才有我大學(xué)生活的豐富多彩,絢麗多姿!</p><p><b> 參考文獻</b></p><p> [1] 求是科技.CPLD/FPGA應(yīng)用開發(fā)技術(shù)與工程實際.北京:人
99、民郵電出版社,2005</p><p> [2] 齊洪喜等.VHDL電路設(shè)計使用教程.北京:清華大學(xué)出版社,2004</p><p> [3] 黃任.VHDL入門·解惑·經(jīng)典實例·經(jīng)驗總結(jié).北京:北京航空航天大學(xué)出版社,2005</p><p> [4] 鄭亞民等.可編程邏輯器件開發(fā)軟件QuartusⅡ.北京:國防工業(yè)出版社,20
100、06</p><p> [5] 楊曉慧,楊永健.基于FPGA的EDA/SOPC技術(shù)與VHDL.北京:國防工業(yè)出版社,2007</p><p> [6] 王彥主.基于FPGA的工程設(shè)計與應(yīng)用.西安:西安電子科技大學(xué)出版社,2007</p><p> [7] 李洪偉, 袁斯華.基于Quartus Ⅱ的FPGA/CPLD設(shè)計.北京:電子工業(yè)出版社,2006</
101、p><p> [8] 王開軍,姜宇柏等. 面向CPLD/FPGA的VHDL設(shè)計.北京:機械工業(yè)出版社,2007</p><p> [9] 王道憲.CPLD/FPGA可編程邏輯器件應(yīng)用與開發(fā).北京:國防工業(yè)出版社,2004</p><p> [10] 羅朝霞, 高書莉.CPLD/FPGA設(shè)計及應(yīng)用.北京:人民郵電出版社,2007</p><p&g
102、t; [11] 褚振勇,翁木云.FPGA設(shè)計及應(yīng)用.西安:西安電子科技大學(xué)出版社,2002,2007</p><p> [12] David R.Coehl The VHDL handbook.Kluwer Academic Pubishers,1989</p><p> 附錄:系統(tǒng)各個模塊的VHDL程序</p><p><b> 分頻模塊程序:&
103、lt;/b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p
104、> entity fenpin is</p><p><b> port(</b></p><p> clk:in std_logic;--輸入的500KHz信號</p><p> clk_scan:out std_logic; --800hz的點陣動態(tài)掃描信號</p><p> cl
105、k_key:out std_logic;--1KHz的鍵盤掃描信號</p><p> reset_n:in std_logic</p><p><b> );</b></p><p> end fenpin;</p><p> architecture abc of fenpin is</p>
106、<p><b> begin</b></p><p> process(reset_n,clk)--產(chǎn)生clk_scan和clk_key信號</p><p> --下載用下面這兩條語句</p><p> variable cnt_scan:integer range 0 to 300;</p>&l
107、t;p> variable cnt_key:integer range 0 to 480;</p><p> --仿真用下面這兩條語句</p><p> --variable cnt_scan:integer range 0 to 30;</p><p> --variable cnt_key:integer range 0 to 24;</
108、p><p><b> begin</b></p><p> if(reset_n='0')then</p><p> cnt_scan:=0;</p><p> cnt_key:=0;</p><p> elsif(rising_edge(clk))then</p>
109、;<p> if(cnt_scan=cnt_scan'high)then</p><p> cnt_scan:=0;</p><p><b> else</b></p><p> cnt_scan:=cnt_scan+1;</p><p><b> end if;</b&g
110、t;</p><p> if(cnt_key=cnt_key'high)then</p><p> cnt_key:=0;</p><p><b> else</b></p><p> cnt_key:=cnt_key+1;</p><p><b> end if;&l
111、t;/b></p><p> if(cnt_scan>(cnt_scan'high/2))then</p><p> clk_scan<='1';</p><p><b> else</b></p><p> clk_scan<='0';</p
112、><p><b> end if;</b></p><p> if(cnt_key>(cnt_key'high/2))then</p><p> clk_key<='1';</p><p><b> else</b></p><p>
113、 clk_key<='0';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p><b> end abc;</b></p>
114、<p><b> 掃描模塊程序:</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_un
115、signed.all;</p><p> entity mnscan is</p><p><b> port(</b></p><p> clk_scan:in std_logic;</p><p> scan:out std_logic_vector(4 downto 0);</p><p
116、> data:out std_logic_vector(15 downto 0);</p><p> dis_n:out std_logic_vector(6 downto 0); --不需要小數(shù)點(7位)</p><p> key1,key2:in std_logic;</p><p> reset_n:in std_logic</p>
117、;<p><b> );</b></p><p> end mnscan;</p><p> architecture abc of mnscan is</p><p> constant L_SZ:integer:=223;</p><p> constant L_DZ:integer:=31;
118、</p><p> signal cnt:integer range 0 to L_DZ; --和點陣屏的列一樣大</p><p> signal n:integer range 0 to 7;--控制速度</p><p> signal flag_scan:std_logic;</p><p>
119、 signal x:integer range 0 to L_SZ;</p><p> --創(chuàng)建一個可以存儲2唯數(shù)據(jù)的數(shù)據(jù)類型 array_2</p><p> type array_2 is array(0 to L_SZ)of std_logic_vector(15 downto 0);</p><p> constant ledsj:array_2:=(
120、</p><p> ("1111111111111111"),</p><p> ("0000001000000000"),</p><p><b> ……</b></p><p> ("0000011000000000"),</p>&l
121、t;p> ("0010001000000000")</p><p><b> );</b></p><p><b> begin</b></p><p> process(reset_n,clk_scan) --cnt計數(shù)及flag_scan的產(chǎn)生<
122、;/p><p><b> begin</b></p><p> if(reset_n='0')then</p><p><b> cnt<=31;</b></p><p> elsif(rising_edge(clk_scan))then</p><p&
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 用vhdl設(shè)計led+漢字滾動顯示器畢業(yè)設(shè)計
- 用vhdl設(shè)計led+漢字滾動顯示器畢業(yè)設(shè)計
- 用eda設(shè)計led漢字滾動顯示器
- 基于單片機led滾動漢字顯示器設(shè)計畢業(yè)論文
- led顯示器畢業(yè)設(shè)計論文
- 畢業(yè)設(shè)計----led字符顯示器
- 畢業(yè)設(shè)計---led旋轉(zhuǎn)顯示器的設(shè)計
- 畢業(yè)設(shè)計---led旋轉(zhuǎn)顯示器的設(shè)計
- 畢業(yè)設(shè)計--led旋轉(zhuǎn)顯示器的設(shè)計
- 旋轉(zhuǎn)led顯示器的設(shè)計畢業(yè)設(shè)計
- 畢業(yè)設(shè)計---led旋轉(zhuǎn)顯示器的設(shè)計
- led立方體顯示器設(shè)計【畢業(yè)設(shè)計】
- 畢業(yè)設(shè)計---室內(nèi)溫度、濕度、時間滾動顯示器設(shè)計
- led漢字點陣顯示系統(tǒng)的設(shè)計【畢業(yè)設(shè)計】
- 畢業(yè)設(shè)計---基于單片機led滾動顯示系統(tǒng)設(shè)計
- 畢業(yè)設(shè)計---基于單片機的led點陣字符顯示器的設(shè)計
- 顯示器支架沖壓模畢業(yè)設(shè)計
- 顯示器支架沖壓模畢業(yè)設(shè)計
- 顯示器支架沖壓模畢業(yè)設(shè)計
- 畢業(yè)設(shè)計----顯示器支架沖壓模
評論
0/150
提交評論