Verilog實現(xiàn)智能電梯控制器_第1頁
Verilog實現(xiàn)智能電梯控制器_第2頁
Verilog實現(xiàn)智能電梯控制器_第3頁
Verilog實現(xiàn)智能電梯控制器_第4頁
Verilog實現(xiàn)智能電梯控制器_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2007-2008學年度第二學期電子技術(shù)基礎(chǔ)課程設(shè)計-智能電梯控制器目 錄0 序- 3 -1 原理與系統(tǒng)設(shè)計- 4 -1.1 思想來源:- 4 -1.2 付諸實施:- 4 -2 模塊設(shè)計- 6 -2.1 模塊示意圖和輸入輸出描述- 6 -2.2 模塊設(shè)計過程- 8 -2.3 波形仿真- 8 -3智能電梯綜合后的整體電路圖- 14 -4 基于sd卡的數(shù)碼音樂播放器程序設(shè)計與注釋- 14 -5 帶有l(wèi)cd驅(qū)動的智能電梯控制器源碼與注釋- 19 -5.1 分頻模塊- 19 -5.2 智能電梯主控制器模塊- 20 -5.3 數(shù)碼管譯碼模塊- 28 -5.4 數(shù)碼管時間譯碼模塊- 29 -5.5 lcd

2、仲裁器- 30 -5.6 lcd驅(qū)動模塊- 30 -5.7 lcd控制模塊- 32 -5.8 lcd顯示模塊- 34 -6 智能電梯控制器管腳分配- 40 -7 心得體會與建議_- 41 -0 序本學期初我們有為期一個月的電子技術(shù)課程設(shè)計,由電信系的曾喻江老師輔導。到第二周時,我選了基于sd卡的數(shù)碼音樂播放器和智能電梯控制器兩個課設(shè)題目,當時是滿懷信心的,不過實際是,我沒有更多的時間去同時做好兩個任務。首先說一下基于sd卡的數(shù)碼音樂播放器,我主要做了一個工作,就是了解并且熟悉的nios軟核處理器的設(shè)計的基本流程,其實我在大二的時候一直想找一段時間去學習一下nios嵌入式系統(tǒng)的開發(fā)方面的知識,只

3、不過由于其他的諸多原因一直沒有著手。而這次曾老師提供de的板子為我學習nios提供的基礎(chǔ)平臺。除了看了許多有關(guān)sopc和nios軟核處理器設(shè)計方面的書外,我也編寫了一些sd卡數(shù)碼音樂播放方面的c語言程序(見“基于sd卡的數(shù)碼音樂播放器程序設(shè)計與注釋”),可以完成播放一首英文歌曲并且可以在lcd上基本同步顯示歌詞。不過方法可能有些不好。然后我講一下智能電梯的編寫。智能電梯的編寫的過程也不是一帆風順的。而且我試過好多種方法去實現(xiàn)電梯的狀態(tài)的轉(zhuǎn)移。起初我想到的肯定是有限狀態(tài)機。不過由于開始我想到只有六個請求(分別為16樓),后來在老師的啟發(fā)下和東十二樓的電梯實際運行情況我發(fā)現(xiàn),6個按鈕肯定是不夠的,

4、所以我又加了5個向上的請求按鈕和5個向下的請求按鈕,這樣總共就有16個按鈕了,由于當時我沒有想到用信號并置的方法,所以需要分析的情況實在是太多了,我也沒有信心了。不過問題始終都是要得到解決的,后來我在我們寢室的一個同學的參考書上看到了一個用vhdl語言編寫的智能電梯控制器的程序,不過很不完整,它給我的最大的啟發(fā)就是“信號并置的算法”,我才發(fā)現(xiàn)這樣一來的話,我的工作量就大大減少了。當時我不僅采用“信號并置的算法”外,還采納了它的“以樓層為電梯的狀態(tài)轉(zhuǎn)移的依據(jù)”的思想,這確實是一個不錯的方法,不過當時我一直沒有任何進展,一是它是用vhdl語言編寫的,而且我對這個語言不是很熟悉所以不是特別理解。后來

5、竟然干起了把vhdl語言翻譯成verilog語言的工作,這樣沒有任何含金量的工作讓我浪費了不少時間?,F(xiàn)在想起來,我才發(fā)現(xiàn)我竟然迷失了自己,我原先自己的算法已經(jīng)被丟失了,留下了的僅僅是一些他人的程序。“以樓層為電梯的狀態(tài)轉(zhuǎn)移的依據(jù)”的編程方法讓我沒有得到任何進展,我放棄的這種處理多種狀態(tài)的方法,繼而轉(zhuǎn)向了我原先的“有限狀態(tài)機”的方法。使用三段式的有限狀態(tài)機的方法也花了很多時間去修正和改善。實現(xiàn)了基本的功能,當時一遇到比較復雜的情況時(比喻同時有幾個人在請求或者是同時有兩個在不同樓層的請求時電梯該如何運行呢,這些特殊情況我在當時一直沒有找到合適和有效的方法去解決。)。在這里我想感謝ei hust

6、bripengandre ,這位編程高手給我們展示了應該怎樣用有限狀態(tài)機去處理比較復雜的輸入和狀態(tài)轉(zhuǎn)移的情況。我的程序中難免會有一些他的原創(chuàng),這一點請讀者原諒,由他的啟發(fā),我才發(fā)現(xiàn)我們應該學會利用強大的邏輯處理技巧去分析問題和解決問題。不同的狀態(tài)歸根結(jié)底是不同的二進制數(shù)的變化。而且一系列的慣性思維讓我們有時候是作繭自縛,比如一說到樓層的變化,我們首先會想到加1或減1這樣的算術(shù)運算,但是有時一個簡單的右移和左移也能輕松的達到目的?,F(xiàn)在再想起來我覺得用“有限狀態(tài)機(finite state machine)”去實現(xiàn)多狀態(tài)的電梯是一個不可超越的方法了。希望以后還有這樣的機會去做一個硬件課程設(shè)計,鍛煉

7、編程能力。1 原理與系統(tǒng)設(shè)計1.1 思想來源:平時我們上課或者是上自習都去過東十二樓或者去過科技樓、南一樓,免不了坐坐電梯,對它的基本工作原理我們有知道多少了,這次我們要制作一個智能電梯控制器,必須對它的工作原理有十分清晰的了解。我們設(shè)計的智能電梯控制器應該可以實時接受各樓層的上下請求信號及電梯內(nèi)部的停靠請求,然后根據(jù)這些請求實現(xiàn)對電梯正確的控制:1、除了頂層和底層外,各樓層均設(shè)有上下請求開關(guān),頂層和底層分別設(shè)有下降和上升請求開關(guān),這一點應該不難理解;電梯內(nèi)設(shè)有乘客到達層次的請求開關(guān)。2、電梯每1s上升或下降一層3、電梯到達有停站請求的樓層后,經(jīng)過1s后電梯門打開,開門指示燈亮,開門5s后電梯

8、指示燈滅,電梯繼續(xù)運行,直至運行完最后一個請求后停靠在當前層。以上是我們所應實現(xiàn)的基本功能。我在序言中也講到了,“應用有限狀態(tài)機”實現(xiàn)電梯的實時控制是最好不過的方法了,通過我的分析以及參考圖書館的有關(guān)書籍,也少不了參照一些網(wǎng)上的程序,最后總結(jié)出了電梯正常運行的七個狀態(tài):上升、下降、上升的過程中途停止、下降的過程中途停止、開門、關(guān)門、等待狀態(tài)。電梯在上述七個狀態(tài)間的轉(zhuǎn)移是通過三段式狀態(tài)機來實現(xiàn)的,各狀態(tài)間的轉(zhuǎn)移大體與生活中的電梯運轉(zhuǎn)一致,有如下的基本原則:1、方向為第一優(yōu)先準則,這就是曾老師給我們的技術(shù)指標。電梯在運轉(zhuǎn)時先響應同方向上的請求,只有當同方向上的請求響應完后,才能轉(zhuǎn)而響應不同方向上的

9、請求。2、初始化狀態(tài)為1樓等待門是關(guān)閉的。這個就不用多解釋了。除了我對電梯的運行規(guī)律做出如上的分析外,我的另一個選擇開發(fā)智能電梯控制器的原因是我想鍛煉一下自己的邏輯思維和分析復雜問題的能力。1.2 付諸實施:題目既然選定了,我就要開始收集資料了。最開始我根據(jù)de2板子所能提供的資源,把樓層數(shù)設(shè)為6層。從我查閱的書籍中我總結(jié)了兩點是我可以借鑒的。首先,是怎樣處理數(shù)量繁多的電梯輸入信號,如果采用分情況討論的話,程序一路寫完,復雜度肯定是不堪設(shè)想,而且我還不敢保證是否分析到所有的情況了。always (call_up_1 or call_up_2 or call_up_3 or call_up_4

10、or call_up_5) up_all=1b0, call_up_5, call_up_4, call_up_3, call_up_2, call_up_1; /將各下降請求信號實時地合并(1樓為底層,無下降請求,考慮到通用性,將第1位填零) always (call_down_2 or call_down_3 or call_down_4 or call_down_5 or call_down_6) down_all=call_down_6, call_down_5, call_down_4, call_down_3, call_down_2, 1b0;/將各??空埱笮盘枌崟r地合并 alw

11、ays (request_1 or request_2 or request_3 or request_4 or request_5 or request_6) request_all=request_6, request_5, request_4, request_3, request_2, request_1;以上這一段程序就是我采用的信號并置處理很多輸入信號的一種行之有效的方法。其次,我從資料中學習到的方法就是如何把信號并置的方法和有限狀態(tài)機聯(lián)系起來。這一點從下面的參數(shù)定義中可以窺見一二。 parameter wait=7b0000001, up=7b0000010, down=7b00

12、00100, upstop=7b0001000 , downstop=7b0010000, opendoor=7b0100000, closedoor=7b1000000;/定義樓層的符號常量 parameterfloor1=6b000001,floor2=6b000010,floor3=6b000100, floor4=6b001000, floor5=6b010000, floor6=6b100000; parameter true=1b1, false=1b0;/定義門打開和門關(guān)閉的符號常量 parameter open=1b1, closed=1b0;/定義電梯上升,下降和靜止的符號常

13、量 parameter upflag=2b01,dnflag=2b10,static=2b00;這里采用了七個狀態(tài)實現(xiàn)了有限狀態(tài)機。waitupupstopdownopendoordownstopclosedoor以上是我分析的兩種基本的電梯狀態(tài)轉(zhuǎn)換圖:黑線:wait to up to upstop to opendoor to closedoor to wait粉紅線:wait to down to downstop to opendoor to closedoor to wait 由于狀態(tài)轉(zhuǎn)換的輸入條件實在太多,在此我不畫出,讀者可以自行在程序(附有詳細注釋)中領(lǐng)會。我的程序中采用的是標準

14、的mealy型狀態(tài)狀態(tài)機。而且是老師建議的三段式的結(jié)構(gòu)來寫的。不過我有一點不明白的就是為什么在我的quartus7.1中運用rtl view不能顯示出這個三段式的有限狀態(tài)機。不過我會繼續(xù)努力一下的,目前我智能用圖形框來表示這個狀態(tài)的流程了。2 模塊設(shè)計2.1 模塊示意圖和輸入輸出描述(1) 電梯主控制器模塊elevator_controller:端口聲明:input port:call_up_1, call_up_2, call_up_3, call_up_4, call_up_5分別為1-5樓的上行請求信號,call_down_2, call_down_3, call_down_4, cal

15、l_down_5, call_down_6則分別為2-6樓的下行請求信號request_1, request_2, request_3, request_4, request_5, request_6則分別為電梯內(nèi)部的???-6樓的請求上述各端口均為有請求時,輸入為高電平,否則為低電平;clk分別為狀態(tài)轉(zhuǎn)移時鐘,reset為復位信號output port:posout輸出當前電梯所在的樓層,doorflag為開門標志,updnflag為電梯上下標志liftstate輸出當前電梯的狀態(tài).posout取值可為6b000001,6b000010,6b000100,6001000,6b010000,6

16、b100000分別代表電梯處在1,2,3,4,5,6樓。這樣編碼的話,有利于后面的比較判斷。doorflag取值可為1b0,1b1,分別代表當前門是關(guān)閉和當前門是打開的。updnflag取值可為2b00,2b01,2b10,分別代表當前電梯是上升的,下降的和靜止的。liftstate7b0000001,7b0000010,7b0000100,7b0001000,7b0010000,7b0100000,7b1000000,分別電梯處于等待模式、上升模式、下降模式、上升停止,下降停止、開門和關(guān)門等7個狀態(tài)。(2)分頻模塊frequence_div:端口說明:input ports:cp_50m;o

17、utput ports:cp_1;(3)電梯狀態(tài)仲裁器arbitrator:端口說明:input ports:elevator_state;count_in;output ports:output open_enable,stop_enable,up_enable,down_enable,close_enable;(4)lcd驅(qū)動模塊de2_default:端口說明:input ports:input open_enable,stop_enable,up_enable,down_enable,close_enable;inputclock_50;/50 mhzinput key;output

18、ports:inout7:0lcd_data;/lcd data bus 8 bitsoutputlcd_on;/lcd power on/offoutputlcd_blon;/lcd back light on/offoutputlcd_rw;/lcd read/write select, 0 = write, 1 = readoutputlcd_en;/lcd enableoutputlcd_rs;/lcd command/dataselect, 0= command, 1 = data2.2 模塊設(shè)計過程現(xiàn)在我簡要的說明一下我的模塊的設(shè)計過程:(1)電梯主控制器模塊elevator_co

19、ntroller:此段智能電梯控制器由三個重要部分組成的。(a)信號并置部分,完成對5路向上請求、5路向下請求、6路內(nèi)部請求的信號并置,化繁為簡。(b)三段式有限狀態(tài)機部分。在有請求的情況下,電梯控制器還要根據(jù)電梯的當前狀態(tài)和當前的樓層去判斷電梯的下一步該如何運作。(c)計數(shù)器部分。完成電梯的開門、關(guān)門的時間管理。(2)分頻模塊frequence_div:這段分頻器完成對50mhz的1分頻操作。采用傳統(tǒng)的“一半就翻轉(zhuǎn)”的計數(shù)技巧。(3)電梯狀態(tài)仲裁器arbitrator:完成電梯信號到lcd控制的信號轉(zhuǎn)換。其中也采用了“電梯主控制器”中的信號并置的思想。這一點可以在我的程序中十分清楚的看到,在

20、此我不再贅述。(4)lcd驅(qū)動模塊de2_default:這個模塊我是采用“ 拿來主義”的。因為是de2板子提供的源程序,所以編寫起來還算比較輕松。就只加了一個“ 根據(jù)不同的輸入產(chǎn)生不同的輸出 ”的模塊。中途還遇到了字符型液晶不能更新的問題,不過在同學的幫助下,最終還是解決了。(5)數(shù)碼管譯碼模塊:(6)數(shù)碼管時間譯碼模塊:以上兩個模塊一起講比較合適,因為它們都是采用了同樣的譯碼原則,只不過條件不一樣而已。我們可以針對不同的輸入根據(jù)自己的意愿把它譯成同樣的數(shù)碼顯示。 以上的模塊設(shè)計過程說的比較的簡約。主要是大概的介紹了我的各個模塊的基本設(shè)計原理,希望讀者能從程序中仔細體會這種原理。2.3 波形

21、仿真(1)當電梯處于初始狀態(tài)時,電梯在高層有向下的請求時:(2)lcd的顯示由于數(shù)據(jù)太多,所以單獨顯示如下:首先顯示:“ it is static. ”隨后會顯示:以上的字符發(fā)送到液晶顯示模塊之后,可以顯示“ door is rising. ”隨后會顯示:可以顯示“ it is static. ”以上的字符發(fā)送到液晶顯示模塊之后,可以顯示“ door is opening. ”隨后會顯示:以上的字符發(fā)送到液晶顯示模塊之后,可以顯示“ it is closing. ”最后會顯示下列字符,電梯重新回到初始等待狀態(tài):以上可以顯示“ it is static. ” 說明:由于lcd顯示波形會占用比較多

22、的空間,所以以上我僅以在高層有向下的請求為例來說明,電梯的狀態(tài)完全可以通過lcd來正確地顯示出來。鑒于此,我的下面的波形將不展示lcd顯示部分的波形圖。(3)當電梯停在6樓處于等待狀態(tài)時,在1樓和2樓同時有向上的請求時:(4)當電梯停在1樓處于等待狀態(tài)時,在6樓和5樓同時有向下的請求時:(5)當電梯停在6樓時,有在5樓的向下的請求時,電梯應該先到五樓,電梯內(nèi)部請求到1樓,如果電梯在下降的過程中,有在2樓的向上的請求時,電梯應該先相應內(nèi)部請求,然后相應外部請求:(6)電梯的強制運行按鈕forbid: 說明:由于電梯在實際運行的過程中,會遇到的情況種類很多,所以我在此不會一一例舉,在上面,我以幾種

23、的典型的情況展示了我設(shè)計的智能電梯控制器的運行狀態(tài)的正確轉(zhuǎn)換。如果讀者想要試試其它的幾種情況,可以自己運行一下我的程序(附下或已打包)。3智能電梯綜合后的整體電路圖4 基于sd卡的數(shù)碼音樂播放器程序設(shè)計與注釋#include basic_io.h#include lcd.h#include sd_card.h#include stdio.hint main(void) uint16 i=0,tmp1=0,tmp2=0,k=0,count; float stamp38=10,15,20,26, 32,37,44,48, 49, 55,60,67,71, 72,78,84,89, 95,102,1

24、06,107, 112,118,125,148, 153,158,164,171, 175,176,181,187, 194,199,204,210, 217;/ 這個數(shù)組我是根據(jù)“千千靜聽”軟件中所/提供的歌詞時間戳來記錄的,就是指不同/的時間點對應于不同的歌詞。其中的標準/參照時間我是根據(jù)首次放歌經(jīng)驗校準的。 uint32 j=720; byte buffer512=0;/設(shè)置緩存 while(sd_card_init()/sd初始化 usleep(500000);/延時 lcd_test();/lcd顯示 for(count=0;count38;count+) stampcount=(s

25、tampcount)/(10)*3748; while(1) sd_read_lba(buffer,j,1); while(i512) if(!iord(audio_0_base,0) tmp1=(bufferi+18)|bufferi; iowr(audio_0_base,0,tmp1); i+=2; if(k=1000) / usleep(50000); lcd_init(); lcd_line2(); lcd_show_text(huangboxue); /顯示作者 if(k=2000) /usleep(50000); / lcd_init(); lcd_line2(); lcd_sho

26、w_text( ); lcd_line2(); lcd_show_text(and duanbing); /顯示合作者 if(k=(uint16)stamp0) /usleep(50000); lcd_init(); lcd_show_text(hoobastank ); lcd_line2(); lcd_show_text(the reason); /顯示歌名和歌手 if(k=(uint16)stamp1) /usleep(50000); lcd_init(); lcd_show_text(im not a ); lcd_line2(); lcd_show_text(perfect pers

27、on); /顯示歌詞 if(k=(uint16)stamp2) /usleep(50000); lcd_init(); lcd_show_text(as many things i); lcd_line2(); lcd_show_text(wish i didnt do); /顯示歌詞 if(k=(uint16)stamp3) /usleep(50000); lcd_init(); lcd_show_text(but i continue); lcd_line2(); lcd_show_text(learning); /顯示歌詞 if(k=(uint16)stamp4) /usleep(500

28、00); lcd_init(); lcd_show_text(i never meant to); lcd_line2(); lcd_show_text(do those things); /顯示歌詞 if(k=(uint16)stamp4+1000) lcd_init(); lcd_show_text(to you); /顯示歌詞 if(k=(uint16)stamp5) /usleep(50000); lcd_init(); lcd_show_text(and so i have to); lcd_line2(); lcd_show_text(say before i go); /顯示歌詞

29、 if(k=(uint16)stamp6) /usleep(50000); lcd_init(); lcd_show_text(that i just ); lcd_line2(); lcd_show_text(want you to know); /顯示歌詞 if(k=(uint16)stamp7) /usleep(50000); lcd_init(); lcd_show_text( ); lcd_line2(); lcd_show_text( ); /顯示歌詞 if(k=(uint16)stamp8) /usleep(50000); lcd_init(); lcd_show_text(iv

30、e found a); lcd_line2(); lcd_show_text(reason for me); /顯示歌詞 if(k=(uint16)stamp9) /usleep(50000); lcd_init(); lcd_show_text(to change who ); lcd_line2(); lcd_show_text(i used to be); /顯示歌詞 if(k=(uint16)stamp10) /usleep(50000); lcd_init(); lcd_show_text(a reason to ); lcd_line2(); lcd_show_text(start

31、 over new); /顯示歌詞 if(k=(uint16)stamp11) /usleep(50000); lcd_init(); lcd_show_text(and the reason); lcd_line2(); lcd_show_text( is you); /顯示歌詞 if(k=(uint16)stamp12) /usleep(50000); lcd_init(); lcd_show_text( ); lcd_line2(); lcd_show_text( ); /顯示歌詞 if(k=(uint16)stamp13) /usleep(50000); lcd_init(); lcd

32、_show_text(im sorry that); lcd_line2(); lcd_show_text(i hurt you); /顯示歌詞 if(k=(uint16)stamp14) /usleep(50000); lcd_init(); lcd_show_text(its something i ); lcd_line2(); lcd_show_text(must live with); /顯示歌詞 if(k=(uint16)stamp14+1000) lcd_init(); lcd_show_text(everyday); /顯示歌詞 if(k=(uint16)stamp15) /u

33、sleep(50000); lcd_init(); lcd_show_text(and all the pain); lcd_line2(); lcd_show_text(i put you); /顯示歌詞 if(k=(uint16)stamp15+1000) lcd_init(); lcd_show_text( through); /顯示歌詞 if(k=(uint16)stamp16) /usleep(50000); lcd_init(); lcd_show_text(i wish that i ); lcd_line2(); lcd_show_text(could take it); /顯

34、示歌詞 if(k=(uint16)stamp16+1000) lcd_init(); lcd_show_text(all away); /顯示歌詞 if(k=(uint16)stamp17) /usleep(50000); lcd_init(); lcd_show_text(and be the one ); lcd_line2(); lcd_show_text(who catches all); /顯示歌詞 if(k=(uint16)stamp17+1000) lcd_init(); lcd_show_text( your tears); /顯示歌詞 if(k=(uint16)stamp18

35、) /usleep(50000); lcd_init(); lcd_show_text(thats why i need); lcd_line2(); lcd_show_text(you to hear); if(k=(uint16)stamp19) /usleep(50000); lcd_init(); lcd_show_text( ); lcd_line2(); lcd_show_text( ); /顯示歌詞 if(k=(uint16)stamp20) /usleep(50000); lcd_init(); lcd_show_text(ive found a ); lcd_line2();

36、 lcd_show_text(resaon for me); /顯示歌詞 if(k=(uint16)stamp21) /usleep(50000); lcd_init(); lcd_show_text(to change who); lcd_line2(); lcd_show_text(i used to be); /顯示歌詞 if(k=(uint16)stamp22) /usleep(50000); lcd_init(); lcd_show_text(a reason to ); lcd_line2(); lcd_show_text(start over new); /顯示歌詞 if(k=(

37、uint16)stamp23) /usleep(50000); lcd_init(); lcd_show_text(and the reason); lcd_line2(); lcd_show_text( is you ); /顯示歌詞 if(k=(uint16)stamp24) /usleep(50000); lcd_init(); lcd_show_text( ); lcd_line2(); lcd_show_text( ); /顯示歌詞 if(k=(uint16)stamp25) /usleep(50000); lcd_init(); lcd_show_text(im not a );

38、lcd_line2(); lcd_show_text(perfect person); /顯示歌詞 if(k=(uint16)stamp26) /usleep(50000); lcd_init(); lcd_show_text(i never meant); lcd_line2(); lcd_show_text(to do those); /顯示歌詞 if(k=(uint16)stamp26+1000) lcd_init(); lcd_show_text(things to you); /顯示歌詞 if(k=(uint16)stamp27) /usleep(50000); lcd_init()

39、; lcd_show_text(and so i have to); lcd_line2(); lcd_show_text(say before i go); /顯示歌詞 if(k=(uint16)stamp28) /usleep(50000); lcd_init(); lcd_show_text(that i just ); lcd_line2(); lcd_show_text(want you to know); if(k=(uint16)stamp29) /usleep(50000); lcd_init(); lcd_show_text( ); lcd_line2(); lcd_show

40、_text( ); /顯示歌詞 if(k=(uint16)stamp30) /usleep(50000); lcd_init(); lcd_show_text(ive found a); lcd_line2(); lcd_show_text(reason for me); /顯示歌詞 if(k=(uint16)stamp31) /usleep(50000); lcd_init(); lcd_show_text(to change who ); lcd_line2(); lcd_show_text(i used to be); /顯示歌詞 if(k=(uint16)stamp32) /uslee

41、p(50000); lcd_init(); lcd_show_text(a reason to ); lcd_line2(); lcd_show_text(start over new); /顯示歌詞 if(k=(uint16)stamp33) /usleep(50000); lcd_init(); lcd_show_text(and the reason); lcd_line2(); lcd_show_text(is you); /顯示歌詞 if(k=(uint16)stamp34) /usleep(50000); lcd_init(); lcd_show_text(ive found a

42、); lcd_line2(); lcd_show_text(reason to show); /顯示歌詞 if(k=(uint16)stamp35) /usleep(50000); lcd_init(); lcd_show_text(a side of me ); lcd_line2(); lcd_show_text(you didnt know); /顯示歌詞 if(k=(uint16)stamp36) /usleep(50000); lcd_init(); lcd_show_text(a reason for ); lcd_line2(); lcd_show_text(all that i

43、 do); /顯示歌詞 if(k=(uint16)stamp37) /usleep(50000); lcd_init(); lcd_show_text(and the reason); lcd_line2(); lcd_show_text(is you); /顯示歌詞 /* if(j%64=0) tmp2=tmp1*tmp1; iowr(led_red_base,0,tmp2); iowr(led_green_base,0,tmp1); */ iowr(seg7_display_base,0,j); j+; k+; i=0; return 0;/-/*總而言之,由于時間的關(guān)系,我的同步顯示歌詞

44、沒有采用讀取“歌詞文件”的方法來做,這個也許是我的小小遺憾,不過我覺得做些力所能及得事情總比不做來的強。盡管這個方法連我自己也覺得比較笨_。*/5 帶有l(wèi)cd驅(qū)動的智能電梯控制器源碼與注釋 5.1 分頻模塊module frequence_div(cp_50m,cp_1); input cp_50m;/板子提供的最高時鐘 output cp_1;/要求得到的秒脈沖 reg 27:0 counter_1;/計數(shù)器 reg cp_1;/類型聲明 always(posedge cp_50m) begin if(counter_1=28h17d7840)/50m的一半到了,秒脈沖翻轉(zhuǎn) begin cp

45、_1=cp_1;/翻轉(zhuǎn) counter_1=28h0000000; end else counter_1=counter_1+1b1;/否則加1 endendmodule5.2 智能電梯主控制器模塊module elevator_controller(/input ports: cp_50m,clk,reset,forbid,call_up_1, call_up_2, call_up_3, call_up_4, call_up_5,call_down_2, call_down_3, call_down_4, call_down_5,call_down_6,request_1, request_

46、2, request_3, request_4, request_5, request_6, /output ports:out,liftstate,over_alarm,count_out,count); /output ports: output 6:0out;/輸出樓層 output 6:0 liftstate;/輸出電梯狀態(tài) output over_alarm;/出錯 output 6:0count_out;/計數(shù)器輸出,便于我控制開關(guān)門的狀態(tài)顯示 output 2:0count;/計數(shù)器 /input ports: input cp_50m; input clk,reset,call_up_1,call_up_2,call_up_3,call_up_4,call_up_5,call_down_2,call_down_3,call_down_4,call_down_5,call_down_6,request_1,request_2,request_3,request_4,request_5,request_6;input forbid;/pos與posout的關(guān)系:當前狀態(tài)一改變,pos立即作相應改變,而posout則是當前狀態(tài)在要變到下一狀

溫馨提示

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

評論

0/150

提交評論