主要利用FPGA作為主控。
以FPGA為核心,設(shè)計(jì)一個(gè)交通燈控制器,每個(gè)路口都有紅、黃、綠三盞燈。該交通信號(hào)燈控制器由一條車道A和一條車道B匯合成十字路口,在每個(gè)入口處設(shè)置紅、綠、黃三色信號(hào)燈,紅燈亮禁止通行,綠燈亮允許通行,黃燈亮則給行駛中的車輛有時(shí)間停在禁行線外。用紅、綠、黃發(fā)光二極管作信號(hào)燈。
1.2要求(1)東西、南北兩個(gè)方向的信號(hào)燈必須交替工作且兩個(gè)方向通行時(shí)間不同; (2)顯示采用LED光柱或數(shù)碼管倒計(jì)時(shí)的方式。 (3)遇有緊急情況可人為將兩個(gè)方向都置為紅燈。 (4)每個(gè)路口用2個(gè)七段數(shù)碼管倒計(jì)時(shí)顯示。
2. FPGA模塊方案論證及選擇各模塊端口及信號(hào)連接如下圖所示: 
由上圖可知,F(xiàn)PGA部分包括四個(gè)模塊,頂層模塊(top_traffic)、交通燈控制模塊(traffic_light)、數(shù)碼管顯示模塊(seg_led)、led燈控制模塊(led)。在頂層模塊中完 成對(duì)其它三個(gè)模塊的例化,并實(shí)現(xiàn)各模塊之間的數(shù)據(jù)傳遞。 頂層模塊(top_traffic):頂層模塊完成了對(duì)其它三個(gè)子模塊的例化、實(shí)現(xiàn)了子模塊間 的信號(hào)連接、并將led燈和數(shù)碼管的驅(qū)動(dòng)信號(hào)輸出給外接設(shè)備(交通信號(hào)燈外設(shè))。 交通燈控制模塊(traffic_light):交通燈控制模塊是本次實(shí)驗(yàn)的核心代碼,這個(gè)模塊 控制信號(hào)燈的狀態(tài)轉(zhuǎn)換,將實(shí)時(shí)的狀態(tài)信號(hào)state[1:0]輸出給led燈控制模塊(led),同時(shí)將 東西和南北方向的實(shí)時(shí)時(shí)間數(shù)據(jù)ew_time[5:0]和sn_time[5:0]輸出給數(shù)碼管顯示模塊 (seg_led)。 數(shù)碼管顯示模塊(seg_led):接收交通燈控制模塊傳遞過(guò)來(lái)的東西和南北方向的實(shí)時(shí)時(shí)間數(shù)據(jù)ew_time[5:0]和sn_time[5:0],并以此驅(qū)動(dòng)對(duì)應(yīng)的數(shù)碼管,將數(shù)據(jù)顯示出來(lái)。 led燈控制模塊(led):根據(jù)接收到的實(shí)時(shí)狀態(tài)信號(hào)state[1:0],驅(qū)動(dòng)?xùn)|西和南北方向的led發(fā)光。
3. 原理設(shè)計(jì)
3.1基本原理點(diǎn)FPGA開(kāi)發(fā)板上左邊的P6擴(kuò)展口可以用來(lái)外接交通信號(hào)燈擴(kuò)展模塊,交通信號(hào) 燈擴(kuò)展模塊的原理圖如圖 38.3.1所示。  圖 38.3.1 交通信號(hào)燈原理圖
由上圖可知,交通信號(hào)燈擴(kuò)展模塊四個(gè)方向共12個(gè)LED燈,而我們使用6個(gè)LED控制信號(hào)來(lái) 驅(qū)動(dòng)12個(gè)LED燈,這是因?yàn)闁|西方向或者南北方向LED燈的亮滅狀態(tài)總是一致的,所以我們將東西方向或者南北方向顏色相同的LED燈并聯(lián)在一起,這樣設(shè)計(jì)的好處是減少了交通信號(hào)燈擴(kuò)展模塊LED控制信號(hào)的引腳。 上圖中四個(gè)共陽(yáng)型數(shù)碼管分別對(duì)應(yīng)四個(gè)路口,每個(gè)路口用兩位數(shù)碼管顯示當(dāng)前狀態(tài)的剩余 時(shí)間。我們知道,在十字路口中,東西方向或者南北方向數(shù)碼管顯示的時(shí)間總是一樣的。以東西方向?yàn)槔驗(yàn)檫@兩個(gè)方向顯示的時(shí)間一致,所以這兩個(gè)方向的數(shù)碼管,它們的十位可以用同一個(gè)位選信號(hào)來(lái)控制,個(gè)位用另一個(gè)位選信號(hào)來(lái)控制,這樣的話,就可以實(shí)現(xiàn)兩個(gè)位選信號(hào)控制東西方向共4位數(shù)碼管的亮滅,南北方向的數(shù)碼管同理。這樣設(shè)計(jì)的好處是減少了交通信號(hào)燈擴(kuò)展模塊位選信號(hào)的引腳。 數(shù)碼管由PNP型三極管驅(qū)動(dòng),當(dāng)三極管的基極為低電平時(shí),數(shù)碼管相應(yīng)的位被選通,所以交通信號(hào)燈擴(kuò)展模塊的位選信號(hào)是低電平有效的。 3.2系統(tǒng)組成框圖交通燈控制模塊將需要顯示的時(shí)間數(shù)據(jù)連接到數(shù)碼管顯示模塊,同時(shí)將狀態(tài)信號(hào)連接到led燈控制模塊,然后數(shù)碼管顯示模塊和led燈控制模塊驅(qū)動(dòng)交通信號(hào)燈外設(shè)工作。系統(tǒng)總體框架圖如圖 38.4.1所示,
3.3單元電路設(shè)計(jì)3.3.1 FPGA最小系統(tǒng) FPGA最小系統(tǒng)包括:FPGA芯片、下載電路、外部時(shí)鐘、復(fù)位電路和電源。 如果使用NIOS II軟嵌入式處理器還要包括SDRAM和Flash。
圖3-3 FPGA最小系統(tǒng) 3.3.2 數(shù)碼管顯示電路 采用簡(jiǎn)單的4組2位共陽(yáng)極數(shù)碼管數(shù)碼管由PNP型三極管驅(qū)動(dòng),當(dāng)三極管的基極為低電平時(shí),數(shù)碼管相應(yīng)的位被選通,所以交通信號(hào)燈擴(kuò)展模塊的位選信號(hào)是低電平有效的。
 圖3-4數(shù)碼管顯示電路
3.4總體電路圖交通燈控制模塊將需要顯示的時(shí)間數(shù)據(jù)連接到數(shù)碼管顯示模塊,同時(shí)將狀態(tài)信號(hào)連接到led燈控制模塊,然后數(shù)碼管顯示模塊和 led燈控制模塊驅(qū)動(dòng)交通信號(hào)燈外設(shè)工作。 總體電路圖如下圖所示:
圖3-6整體電路 3.5 程序設(shè)計(jì)3-7 系統(tǒng)軟件流程圖 3.6元件列表發(fā)光二極管(紅綠黃) | 12個(gè) | 2.54單排針1*40 | 2排 | 三極管8550 | 4個(gè) | 排母 | 2排 | 數(shù)碼管2位共陽(yáng) | 4組 | FPGA模塊 | 1塊 |
4.方案實(shí)現(xiàn)與測(cè)試(或調(diào)試)實(shí)現(xiàn)題上已給要求,在程序調(diào)試花費(fèi)時(shí)間較多。  交通燈成品及實(shí)驗(yàn)現(xiàn)象
課題二:電梯1、設(shè)計(jì)的目的與要求 1.1目的設(shè)計(jì)以8952單片機(jī)、AVR或ARM和步進(jìn)電機(jī)為核心,設(shè)計(jì)電梯控制器。假設(shè)電梯安裝一個(gè)樓層為4樓的樓上。其人機(jī)接口包括顯示器、鍵盤、喇叭、指示燈。 1.2要求 每層樓電梯口都有上樓、下樓兩個(gè)按鈕,一個(gè)7段數(shù)碼顯示器作為電梯當(dāng)前層指示燈。兩個(gè)發(fā)光二極管作為電梯運(yùn)行方向的指示燈;進(jìn)入電梯里面,按數(shù)字鍵選擇要去的樓層,一個(gè)7段數(shù)碼管顯示當(dāng)前層顯示,兩個(gè)發(fā)光二極管作為電梯上行和下行指示燈。步進(jìn)電機(jī)正轉(zhuǎn),上行,反轉(zhuǎn),表示下行。啟動(dòng)按鈕按下去表示電梯控制系統(tǒng)可以運(yùn)行。緊急停止按鈕按下,電機(jī)停止運(yùn)動(dòng)。報(bào)警按鈕按下,啟動(dòng)蜂鳴器和閃爍紅色報(bào)警燈。 1.3 分工 馬浩寧:電路設(shè)計(jì)、程序調(diào)試 張曉涵:刻板、焊電路 王春燕:寫(xiě)論文、查找資料 2、方案論證及選擇 2.1 總體設(shè)計(jì)方案設(shè)計(jì)的基本思想是采用STM32F103C8T6單片機(jī)作為核心采用8位LED靜態(tài)顯示來(lái)實(shí)時(shí)顯示電梯所在樓層。采用行列式鍵盤矩陣作為外呼內(nèi)選電路,由于是4層樓,故選用4×4矩陣鍵盤,鍵盤矩陣共16個(gè)按鍵,其中6個(gè)按鍵是各層樓外呼按鍵,2個(gè)表示電梯啟動(dòng)和停止的控制按鍵,電梯狀態(tài)是通過(guò)3個(gè)發(fā)光二極管顯示的,綠燈亮表示電梯在向上運(yùn)行,黃燈亮表示電梯在向下運(yùn)行,紅燈亮表示電梯故障急停狀態(tài)總體方框圖如圖2-1所示: 總體方框下圖所示:
2.2 主控芯片選擇 方案一:多片單片機(jī)控制方案。這種方案是使用多片單片機(jī),其中一片是作為主控制器,另外設(shè)置了轎廂控制系統(tǒng),每層的控制系統(tǒng)分別由一個(gè)單片機(jī)控制,然后通過(guò)主控制器和副控制器之間的通訊,實(shí)現(xiàn)電梯系統(tǒng)的控制。這種方案的控制系統(tǒng)的結(jié)構(gòu)簡(jiǎn)單明了,各個(gè)系統(tǒng)之間相互獨(dú)立便于維護(hù)和修檢。所以根據(jù)功能要求需要選用1片STM32單片機(jī)就能可以實(shí)現(xiàn)該電梯的功能。不過(guò)單片機(jī)之間的通訊較多,在目前通訊是個(gè)難點(diǎn),可能導(dǎo)致電梯運(yùn)行過(guò)程不穩(wěn)定。 方案二:一片單片機(jī)為主控制器的方案。MCU采用一個(gè)單片機(jī)控制所有的按鍵、屏幕顯示、電動(dòng)機(jī)的轉(zhuǎn)動(dòng)等,并對(duì)以上所有信號(hào)進(jìn)行處理。這種方案的控制系統(tǒng)相對(duì)復(fù)雜,只適用于較簡(jiǎn)單的電梯控制系統(tǒng),因?yàn)檫@次的設(shè)計(jì)是四層電梯控制系統(tǒng),所以選用這種方案。單片機(jī)技術(shù)目前較為成熟,自身資源豐富,硬件設(shè)計(jì)簡(jiǎn)單,成本低,可靠性高,結(jié)合軟件完全可以實(shí)現(xiàn)電梯運(yùn)行狀況的簡(jiǎn)單模擬。 權(quán)衡以上二種方案方案分析,采用方案二。 2.3 樓層顯示選擇方案一:采用點(diǎn)陣式的液晶顯示器(LCD)來(lái)顯示各種相關(guān)的數(shù)據(jù)以及相關(guān)的信息。點(diǎn)陣式的液晶顯示器雖然屬于低功耗的器件,但其價(jià)格比較貴。 方案二:采用傳統(tǒng)的八段數(shù)碼管(LED)顯示電梯實(shí)時(shí)所到的樓層。雖功耗大,但其軟件驅(qū)動(dòng)相對(duì)比較簡(jiǎn)單,硬件電路調(diào)試也比較方便,價(jià)格便宜,亮度大,能滿足本設(shè)計(jì)的要求。 以上兩種方案中,選擇方案一。 2.4 電動(dòng)機(jī)驅(qū)動(dòng)模塊選擇方案一:步進(jìn)電機(jī)作為設(shè)計(jì)的執(zhí)行部件,在定位性能的步進(jìn)電機(jī)是非常優(yōu)越的。步進(jìn)電機(jī)和普通電機(jī)的區(qū)別主要在于其脈沖驅(qū)動(dòng)形式,步進(jìn)電機(jī)不需要A/D 轉(zhuǎn)換,能夠直接將數(shù)字脈沖信號(hào)轉(zhuǎn)化為角位移。常用的步進(jìn)電機(jī)每轉(zhuǎn)一步,角度轉(zhuǎn)1.8°,在應(yīng)用中,步進(jìn)電機(jī)可以同時(shí)來(lái)完成兩個(gè)工作,一個(gè)是傳遞轉(zhuǎn)矩,第二個(gè)是傳遞信息,在本設(shè)計(jì)中作為傳遞信息用。 方案二:直流電機(jī)作為執(zhí)行元件的設(shè)計(jì),直流電機(jī)的功能是讓線圈總是交替地處于穩(wěn)定狀態(tài)和不穩(wěn)定的平衡狀態(tài),通過(guò)兩個(gè)半圓環(huán)形電樞將穩(wěn)定平衡線圈消除。這樣一個(gè)載流線圈總是降低磁場(chǎng)。直流電機(jī)中常用的系統(tǒng),高轉(zhuǎn)矩,高扭矩,低慣量。 以上兩種方案采用方案一。 利用DXP畫(huà)圖軟件構(gòu)建原理圖如下圖所示:
3、 原理設(shè)計(jì) 3.1 STM32F103C8T6功能簡(jiǎn)介 STM32F103C8T6是一款基于ARM Cortex-M 內(nèi)核STM32系列的32位的微控制器,程序存儲(chǔ)器容量是64KB,需要電壓2V~3.6V,具有高達(dá)1MB的Flash、電機(jī)控制、USB和CAN,該系列利用一流的外設(shè)和低功耗、低壓操作實(shí)現(xiàn)了高性能,同時(shí)還以可接受的價(jià)格、利用簡(jiǎn)單的架構(gòu)和簡(jiǎn)便易用的工具實(shí)現(xiàn)了高集成度。從以上3種方案,很容易看出,采用方案3,電路設(shè)計(jì)比較簡(jiǎn)潔,軟件設(shè)計(jì)也比較簡(jiǎn)單,故采用方案3。STM32F103C8T6實(shí)物圖以及引腳結(jié)構(gòu)圖如圖:
圖3-1 STM32原理圖
圖 3-1 STM32F103C8T6實(shí)物圖
3.2 單片機(jī)最小系統(tǒng)最小系統(tǒng)包括復(fù)位電路和時(shí)鐘電路兩部分,其中復(fù)位電路采用上電自動(dòng)復(fù)位,如圖3-2所示: 圖3-2 單片機(jī)最小系統(tǒng)
3.3 按鍵電路本電路采用了13個(gè)按鍵。分別利用了P2和P3 端口,單片機(jī)采用行和列掃描法來(lái)判別這些按鍵中哪個(gè)鍵按下, S1-S13為微動(dòng)按鍵,分別控制電梯的啟動(dòng)、停止、急停及電梯樓層呼叫開(kāi)關(guān),然后可根據(jù)每個(gè)按鍵的功能來(lái)通過(guò)單片機(jī)控制電梯的運(yùn)行。
圖 3-3 矩陣按鍵原理圖
圖3-4 矩陣按鍵
各按鈕開(kāi)關(guān)說(shuō)明: 電梯內(nèi):K4:緊急停止 K5:終止停止 K14:關(guān)門 K9:選擇一樓 K10:選擇二樓 K11:選擇三樓 K12:選擇四樓 電梯外:K1:一樓電梯上行 K2:二樓電梯上行 K3:三樓電梯上行 K6:二樓電梯下行 K7:三樓電梯下行 K8:四樓電梯下行 K15:啟動(dòng) K16:停止 3.4報(bào)警電路設(shè)計(jì)報(bào)警電路接單片機(jī)P35口,當(dāng)端口變成低電平時(shí), VCC電壓加載到蜂鳴器使其發(fā)聲、報(bào)警發(fā)光二極管亮,如圖3-5。  圖3-5 報(bào)警電路 3.5顯示電路設(shè)計(jì)采用點(diǎn)陣式的液晶顯示器(LCD12864)來(lái)顯示各種相關(guān)的數(shù)據(jù)以及相關(guān)的信息。點(diǎn)陣式的液晶顯示器屬于低功耗的器件,顯示清晰便利 如圖3.7,采用LCD12864顯示電路,VCC接3.3V,RS接單片機(jī)A5,RW接單片機(jī)A6, EN接單片機(jī)A7口,當(dāng)有輸出時(shí),直接在lcd 屏幕上進(jìn)行顯示。
圖3-6 顯示電路設(shè)計(jì)
4、方案實(shí)現(xiàn)與調(diào)試 4.1 軟件設(shè)計(jì)思想設(shè)計(jì)采用微動(dòng)按鍵來(lái)代替外呼按鈕,而電梯的運(yùn)行方向和電梯啟動(dòng)和停止是根據(jù)這些呼叫按鍵和選擇按鍵來(lái)決定的,所以單片機(jī)通過(guò)掃描鍵盤來(lái)獲取各層呼叫狀態(tài),從而控制電梯的運(yùn)行。故按鍵掃描是本系統(tǒng)軟件設(shè)計(jì)中的重要一部分,另外要把鍵盤掃描到的各層的按鍵信息存儲(chǔ)起來(lái),然后和電梯的運(yùn)行狀態(tài)比較,判斷是否響應(yīng)各層呼叫,當(dāng)電梯到達(dá)目的樓層時(shí)電機(jī)停止,可隨意選擇去哪一層,然后電梯選擇判斷去哪一層,繼續(xù)運(yùn)行。 由于本設(shè)計(jì)采用單片機(jī)實(shí)現(xiàn)自動(dòng)控制,主要完成了整個(gè)系統(tǒng)系統(tǒng)如數(shù)碼管的顯示,按鍵的響應(yīng),轉(zhuǎn)動(dòng)電機(jī)的控制,延時(shí)等均由相應(yīng)的子程序來(lái)完成。 軟件設(shè)計(jì)思想:使用模塊化的C語(yǔ)言編程,軟件系統(tǒng)的功能層次化設(shè)計(jì)方法,包括多個(gè)單一功能的子程序的。通過(guò)調(diào)用不同的子程序,實(shí)現(xiàn)復(fù)雜的控制功能。這是方便調(diào)試,修改。軟件編程是一種多功能,智能化,操作簡(jiǎn)便。在本設(shè)計(jì)中,可以把程序的各部分相互結(jié)合起來(lái),達(dá)到完成各項(xiàng)設(shè)計(jì)的功能。 4.2 電梯主程序
根據(jù)任務(wù)要求,電梯的程序應(yīng)滿足以下要求: (1)初始化程序使LCD顯示“1”表示電梯處在一樓,等待人進(jìn)入電梯; (2)主程序主要包括: ①判斷電梯選擇去哪一層,根據(jù)判斷情況來(lái)控制電梯運(yùn)行,相應(yīng)的指示燈顯示運(yùn)行方向,到達(dá)目標(biāo)樓層后相應(yīng)的數(shù)碼管顯示電梯所在樓層; ②電梯在運(yùn)行過(guò)程中要不斷的掃描鍵盤,從而來(lái)判斷各樓層是否有其他呼叫請(qǐng)求; ③設(shè)置電梯啟動(dòng)、停止及緊急功能按鍵; ④實(shí)時(shí)顯示電梯所在位置及運(yùn)行狀態(tài)(上行/下行); ⑤緊急按鈕是用于電梯出現(xiàn)意外時(shí),用來(lái)報(bào)警求救; 圖4-1 主程序流程圖
電梯的整個(gè)軟件設(shè)計(jì)包括一下幾部分:電梯邏輯控制模塊、電梯運(yùn)行模塊、鍵盤模塊、樓層顯示模塊。
電梯的整個(gè)軟件設(shè)計(jì)包括一下幾部分:電梯邏輯控制模塊、電梯運(yùn)行模塊、鍵盤模塊、樓層顯示模塊。 4.3 按鍵方式鍵盤是獨(dú)立按鍵,采用的是查詢方式,即外接獨(dú)立按鍵的時(shí)候,是按鍵的一端接地,另一端與I/O引腳相連,當(dāng)按鍵按下的時(shí)候,引腳輸入的是低電平,而按鍵未按下的時(shí)候,引腳輸入的是高電平[6]。利用C語(yǔ)言編程時(shí)只要用檢測(cè)高低電平來(lái)判斷是否有按鍵按下就可以了。其程序源代碼見(jiàn)附錄1。 4.4 顯示系統(tǒng) 顯示屏12864顯示全部 4.5 電機(jī)演示系統(tǒng)采用步進(jìn)電機(jī)作為本設(shè)計(jì)的執(zhí)行元件,步進(jìn)電機(jī)在定位性能方面十分優(yōu)越。步進(jìn)電機(jī)和普通電機(jī)的區(qū)別主要就在于其脈沖驅(qū)動(dòng)的形式,步進(jìn)電機(jī)不需要A/D 轉(zhuǎn)換,能夠直接將數(shù)字脈沖信號(hào)轉(zhuǎn)化為角位移。常用的步進(jìn)電機(jī)每轉(zhuǎn)一步,角度轉(zhuǎn)1.8°,在應(yīng)用中,步進(jìn)電機(jī)可以同時(shí)完成兩個(gè)工作,其一是傳遞轉(zhuǎn)矩,其二是傳遞信息,在本設(shè)計(jì)中作為傳遞信息用,步進(jìn)電機(jī)使用的是28BYJ-5V。電梯運(yùn)行前按啟動(dòng)按鈕,步進(jìn)電機(jī)8個(gè)節(jié)拍循環(huán)旋轉(zhuǎn),電梯每上升或下降一層電機(jī)順時(shí)針或者逆時(shí)針轉(zhuǎn)動(dòng)40度。 4.6軟件編譯調(diào)試在軟件調(diào)試中,采用keil仿真軟件進(jìn)行程序調(diào)試。首先分別調(diào)試各個(gè)功能程序,再對(duì)整個(gè)程序進(jìn)行調(diào)試,以便修改錯(cuò)誤碼。具體的調(diào)試方法如下: 首先在keil軟件中選擇AT89C52作為CPU,因?yàn)樵撥浖袥](méi)有STC89C52RC,但是基本功能和之差不多,將晶振頻率設(shè)置為11.0592MHZ,然后新建一個(gè)文件,將各個(gè)功能程序錄入,先檢查程序有無(wú)明顯錯(cuò)誤,保存過(guò)后編譯程序,如果有錯(cuò)誤時(shí)就根據(jù)提示加以修改,當(dāng)各個(gè)功能程序編譯完成后,再對(duì)整個(gè)程序全速執(zhí)行,查看程序有哪些地方出現(xiàn)錯(cuò)誤,對(duì)應(yīng)錯(cuò)誤的提示來(lái)調(diào)整程序,糾正錯(cuò)誤直到程序正確無(wú)誤,調(diào)試結(jié)束后軟件調(diào)試界面如下圖5-1所示: 圖5-1 軟件調(diào)試界面 4.7 實(shí)物制作及系統(tǒng)測(cè)試 在原理圖及原材料確定好的基礎(chǔ)上直接進(jìn)行實(shí)物制作,進(jìn)行各部件在電路板上的組配和焊接。
圖3-9 矩陣按鍵實(shí)物圖
圖4-1 報(bào)警電路實(shí)物圖
圖4-2 電機(jī)驅(qū)動(dòng)電路實(shí)物圖
對(duì)系統(tǒng)進(jìn)行測(cè)試,首先啟動(dòng)電機(jī)運(yùn)行,電梯位于一樓,按下二樓按鍵,上行燈點(diǎn)亮,步進(jìn)電機(jī)轉(zhuǎn)動(dòng),到達(dá)目標(biāo)樓層停下,此時(shí)數(shù)碼管顯示當(dāng)前樓層。然后再一次按下三、四樓的按鍵,電梯先后在三樓、四樓停下。最后再按下二樓按鈕,電機(jī)逆時(shí)針旋轉(zhuǎn)停在二樓,最后在一樓停下。而且各指示燈和數(shù)碼管顯示都正常。 通過(guò)上電測(cè)試,電梯在上升或者下降過(guò)程中先響應(yīng)上升或者下降樓層的信號(hào),并對(duì)最近樓層呼叫有優(yōu)先級(jí)的響應(yīng)。系統(tǒng)具有方向優(yōu)先、距離優(yōu)先的功能,基本模擬了實(shí)際電梯運(yùn)行,完成題目設(shè)計(jì)要求。 4.8 元器件清單 | | | | | | | | | 步進(jìn)電機(jī)驅(qū)動(dòng)模塊 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
5、總結(jié) 經(jīng)過(guò)這一段時(shí)間選擇和設(shè)計(jì),完成了一個(gè)具有基本功能的電梯控制系統(tǒng)。系統(tǒng)是一個(gè)四層樓電梯控制系統(tǒng)。它能實(shí)現(xiàn)一個(gè)電梯具有的基本功能,包括:電梯上下運(yùn)行功能,電梯選層功能,樓層顯示功能,電梯的啟動(dòng)和停止及緊急報(bào)警功能,智能初始化功能。并且加入了自我設(shè)計(jì)的電機(jī)模塊,不僅基本達(dá)到了設(shè)計(jì)要求和目的,同時(shí)也不乏自我的創(chuàng)新設(shè)計(jì)。 通過(guò)這次設(shè)計(jì),雖然遇到的困難重重,但是受益匪淺,對(duì)單片機(jī)在實(shí)物中應(yīng)用的能力有一個(gè)很好的了解,這種開(kāi)放式的設(shè)計(jì),我從中學(xué)到的不僅僅是所設(shè)計(jì)方面的知識(shí),更重要的是學(xué)習(xí)方法以及資料查找的技巧,學(xué)會(huì)了利用身邊現(xiàn)有的資源和人緣,作為我去更好學(xué)習(xí)的一個(gè)階梯,雖然這次設(shè)計(jì)時(shí)間并不長(zhǎng),但是我發(fā)現(xiàn)我們對(duì)自主學(xué)習(xí)能力有所提高。學(xué)無(wú)止境,在今后的學(xué)習(xí)生活中,我將把學(xué)到的知識(shí)靈活的運(yùn)用到學(xué)習(xí)、工作和生活當(dāng)中。而且在設(shè)計(jì)過(guò)程中,不僅是在學(xué)習(xí)新知識(shí)這一塊上有了很大的提高,同時(shí)我的意志力也得到了很好的鍛煉。只有你堅(jiān)持,努力了,才能讓自己學(xué)到和收獲更多,才能更好的適應(yīng)這個(gè)社會(huì)。
- module top_traffic(
- input sys_clk , //系統(tǒng)時(shí)鐘信號(hào)
- input sys_rst_n , //系統(tǒng)復(fù)位信號(hào)
-
- output [3:0] sel , //數(shù)碼管位選信號(hào)
- output [7:0] seg_led , //數(shù)碼管段選信號(hào)
- output [5:0] led //LED使能信號(hào)
- );
-
- //wire define
- wire [5:0] ew_time; //東西方向狀態(tài)剩余時(shí)間數(shù)據(jù)
- wire [5:0] sn_time; //南北方向狀態(tài)剩余時(shí)間數(shù)據(jù)
- wire [1:0] state ; //交通燈的狀態(tài),用于控制LED燈的點(diǎn)亮
-
- //*****************************************************
- //** main code
- //*****************************************************
- //交通燈控制模塊
- traffic_light u0_traffic_light(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .ew_time (ew_time),
- .sn_time (sn_time),
- .state (state)
- );
-
- //數(shù)碼管顯示模塊
- seg_led u1_seg_led(
- .sys_clk (sys_clk) ,
- .sys_rst_n (sys_rst_n),
- .ew_time (ew_time),
- .sn_time (sn_time),
- .en (1'b1),
- .sel (sel),
- .seg_led (seg_led)
- );
-
- //led燈控制模塊
- led u2_led(
- .sys_clk (sys_clk ),
- .sys_rst_n (sys_rst_n),
- .state (state ),
- .led (led )
- );
-
- endmodule
- module traffic_light(
- //input
- input sys_clk , //系統(tǒng)時(shí)鐘
- input sys_rst_n , //系統(tǒng)復(fù)位
-
- output reg [1:0] state , //交通燈的狀態(tài),用于控制LED燈的點(diǎn)亮
- output reg [5:0] ew_time , //交通燈東西向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
- output reg [5:0] sn_time //交通燈南北向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
- );
-
- //parameter define
- parameter TIME_LED_Y = 5'd3; //黃燈發(fā)光的時(shí)間
- parameter TIME_LED_R = 5'd30; //紅燈發(fā)光的時(shí)間
- parameter TIME_LED_G = 5'd27; //綠燈發(fā)光的時(shí)間
- parameter WIDTH = 25_000_000; //產(chǎn)生頻率為1hz的時(shí)鐘
-
- //reg define
- reg [4:0] time_cnt; //產(chǎn)生數(shù)碼管顯示時(shí)間的計(jì)數(shù)器
- reg [24:0] clk_cnt; //用于產(chǎn)生clk_1hz的計(jì)數(shù)器
- reg clk_1hz; //1hz時(shí)鐘
-
- //*****************************************************
- //** main code
- //*****************************************************
- //計(jì)數(shù)周期為0.5s的計(jì)數(shù)器
- always @ (posedge sys_clk or negedge sys_rst_n)begin
- if(!sys_rst_n)
- clk_cnt <= 25'b0;
- else if (clk_cnt < WIDTH - 1'b1)
- clk_cnt <= clk_cnt + 1'b1;
- else
- clk_cnt <= 25'b0;
- end
-
- //產(chǎn)生頻率為1hz的時(shí)鐘
- always @(posedge sys_clk or negedge sys_rst_n)begin
- if(!sys_rst_n)
- clk_1hz <= 1'b0;
- else if(clk_cnt == WIDTH - 1'b1)
- clk_1hz <= ~ clk_1hz;
- else
- clk_1hz <= clk_1hz;
- end
-
- //切換交通信號(hào)燈工作的4個(gè)狀態(tài),并產(chǎn)生數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
- always @(posedge clk_1hz or negedge sys_rst_n)begin
- if(!sys_rst_n)begin
- state <= 2'd0;
- time_cnt <= TIME_LED_G ; //狀態(tài)1持續(xù)的時(shí)間
- end
- else begin
- case (state)
- 2'b0: begin //狀態(tài)1
- ew_time <= time_cnt + TIME_LED_Y - 1'b1;//東西方向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
- sn_time <= time_cnt - 1'b1; //南北方向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
- if (time_cnt > 1)begin //time_cnt等于1的時(shí)候切換狀態(tài)
- time_cnt <= time_cnt - 1'b1;
- state <= state;
- end
- else begin
- time_cnt <= TIME_LED_Y; //狀態(tài)2持續(xù)的時(shí)間
- state <= 2'b01; //切換到狀態(tài)2
- end
- end
- 2'b01: begin //狀態(tài)2
- ew_time <= time_cnt - 1'b1;
- sn_time <= time_cnt - 1'b1;
- if (time_cnt > 1)begin
- time_cnt <= time_cnt - 1'b1;
- state <= state;
- end
- else begin
- time_cnt <= TIME_LED_G; //狀態(tài)3持續(xù)的時(shí)間
- state <= 2'b10; //切換到狀態(tài)3
- end
- end
- 2'b10: begin //狀態(tài)3
- ew_time <= time_cnt - 1'b1;
- sn_time <= time_cnt + TIME_LED_Y - 1'b1;
- if (time_cnt > 1)begin
- time_cnt <= time_cnt - 1'b1;
- state <= state;
- end
- else begin
- time_cnt <= TIME_LED_Y; //狀態(tài)4持續(xù)的時(shí)間
- state <= 2'b11; //切換到轉(zhuǎn)態(tài)4
- end
- end
- 2'b11: begin //狀態(tài)4
- ew_time <= time_cnt - 1'b1;
- sn_time <= time_cnt - 1'b1;
- if (time_cnt > 1)begin
- time_cnt <= time_cnt - 1'b1;
- state <= state;
- end
- else begin
- time_cnt <= TIME_LED_G;
- state <= 2'b0; //切換到狀態(tài)1
- end
- end
- default: begin
- state <= 2'b0;
- time_cnt <= TIME_LED_G;
- end
- endcase
- end
- end
-
- endmodule
-
- module seg_led(
- input sys_clk , //系統(tǒng)時(shí)鐘
- input sys_rst_n , //系統(tǒng)復(fù)位
- input [5:0] ew_time , //東西方向數(shù)碼管要顯示的數(shù)值
- input [5:0] sn_time , //南北方向數(shù)碼管要顯示數(shù)值
- input en , //數(shù)碼管使能信號(hào)
- output reg [3:0] sel , //數(shù)碼管位選信號(hào)
- output reg [7:0] seg_led //數(shù)碼管段選信號(hào),包含小數(shù)點(diǎn)
- );
-
- //parameter define
- parameter WIDTH = 50_000; //計(jì)數(shù)1ms的計(jì)數(shù)深度
-
- //reg define
- reg [15:0] cnt_1ms; //計(jì)數(shù)1ms的計(jì)數(shù)器
- reg [1:0] cnt_state; //用于切換要點(diǎn)亮數(shù)碼管
- reg [5:0] num; //數(shù)碼管要顯示的數(shù)據(jù)
-
- //wire define
- wire [5:0] data_ew_0; //東西方向數(shù)碼管的十位
- wire [5:0] data_ew_1; //東西方向數(shù)碼管的各位
- wire [5:0] data_sn_0; //南北方向數(shù)碼管的十位
- wire [5:0] data_sn_1; //南北方向數(shù)碼管的各位
-
- //*****************************************************
- //** main code
- //*****************************************************
- assign data_ew_0 = ew_time / 4'd10; //取出東西向時(shí)間數(shù)據(jù)的十位
- assign data_ew_1 = ew_time % 4'd10; //取出東西向時(shí)間數(shù)據(jù)的個(gè)位
- assign data_sn_0 = sn_time / 4'd10; //取出南北向時(shí)間數(shù)據(jù)的十位
- assign data_sn_1 = sn_time % 4'd10; //取出南北向時(shí)間數(shù)據(jù)的個(gè)位
-
- //計(jì)數(shù)1ms
- always @ (posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n)
- cnt_1ms <= 15'b0;
- else if (cnt_1ms < WIDTH - 1'b1)
- cnt_1ms <= cnt_1ms + 1'b1;
- else
- cnt_1ms <= 15'b0;
- end
-
- //計(jì)數(shù)器,用來(lái)切換數(shù)碼管點(diǎn)亮的4個(gè)狀態(tài)
- always @ (posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n)
- cnt_state <= 2'd0;
- else if (cnt_1ms == WIDTH - 1'b1)
- cnt_state <= cnt_state + 1'b1;
- else
- cnt_state <= cnt_state;
- end
-
- //先顯示東西方向數(shù)碼管的十位,然后是個(gè)位。再顯示南北方向數(shù)碼管的十位,然后個(gè)位
- always @ (posedge sys_clk or negedge sys_rst_n) begin
- if(!sys_rst_n) begin
- sel <= 4'b1111;
- num <= 4'b0;
- end
- else if(en) begin
- case (cnt_state)
- 3'd0 : begin
- sel <= 4'b1110; //驅(qū)動(dòng)?xùn)|西方向數(shù)碼管的十位
- num <= data_ew_0;
- end
- 3'd1 : begin
- sel <= 4'b1101; //驅(qū)動(dòng)?xùn)|西方向數(shù)碼管的個(gè)位
- num <= data_ew_1;
- end
- 3'd2 : begin
- sel <= 4'b1011; //驅(qū)動(dòng)南北方向數(shù)碼管的十位
- num <= data_sn_0;
- end
- 3'd3 : begin
- sel <= 4'b0111; //驅(qū)動(dòng)南北方向數(shù)碼管的個(gè)位
- num <= data_sn_1 ;
- end
- default : begin
- sel <= 4'b1111;
- num <= 4'b0;
- end
- endcase
- end
- else begin
- sel <= 4'b1111;
- num <= 4'b0;
- end
- end
-
- //數(shù)碼管要顯示的數(shù)值所對(duì)應(yīng)的段選信號(hào)
- always @ (posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n)
- seg_led <= 8'b0;
- else begin
- case (num)
- 4'd0 : seg_led <= 8'b1100_0000;
- 4'd1 : seg_led <= 8'b1111_1001;
- 4'd2 : seg_led <= 8'b1010_0100;
- 4'd3 : seg_led <= 8'b1011_0000;
- 4'd4 : seg_led <= 8'b1001_1001;
- 4'd5 : seg_led <= 8'b1001_0010;
- 4'd6 : seg_led <= 8'b1000_0010;
- 4'd7 : seg_led <= 8'b1111_1000;
- 4'd8 : seg_led <= 8'b1000_0000;
- 4'd9 : seg_led <= 8'b1001_0000;
- default : seg_led <= 8'b1100_0000;
- endcase
- end
- end
-
- Endmodule
-
- module led (
- input sys_clk , //系統(tǒng)時(shí)鐘
- input sys_rst_n , //系統(tǒng)復(fù)位
- input [1:0] state , //交通燈的狀態(tài)
- output reg [5:0] led //紅黃綠LED燈發(fā)光使能
- );
-
- //parameter define
- parameter TWINKLE_CNT = 25_000_000; //讓黃燈閃爍的計(jì)數(shù)次數(shù)
-
- //reg define
- reg [24:0] cnt; //讓黃燈產(chǎn)生閃爍效果的計(jì)數(shù)器
-
- //計(jì)數(shù)時(shí)間為0.2s的計(jì)數(shù)器,用于讓黃燈閃爍
- always @(posedge sys_clk or negedge sys_rst_n)begin
- if(!sys_rst_n)
- cnt <= 25'b0;
- else if (cnt < TWINKLE_CNT - 1'b1)
- cnt <= cnt + 1'b1;
- else
- cnt <= 25'b0;
- end
-
- //在交通燈的四個(gè)狀態(tài)里,使相應(yīng)的led燈發(fā)光
- always @(posedge sys_clk or negedge sys_rst_n)begin
- if(!sys_rst_n)
- led <= 6'b100100;
- else begin
- case(state)
- 2'b00:led<=6'b100010; //led寄存器從高到低分別驅(qū)動(dòng):東西向
- //紅綠黃燈,南北向紅綠黃燈
- 2'b01: begin
- led[5:1]<=5'b10000;
- if(cnt == TWINKLE_CNT - 1'b1) //計(jì)數(shù)滿0.2秒讓黃燈的亮滅狀況切換一次
- //產(chǎn)生閃爍的效果
- led[0] <= ~led[0];
- else
- led[0] <= led[0];
- end
- 2'b10:led<=6'b010100;
- 2'b11: begin
- led[5:4]<=2'b00;
- led[2:0]<=3'b100;
- if(cnt == TWINKLE_CNT - 1'b1)
- led[3] <= ~led[3];
- else
- led[3] <= led[3];
- end
- default:led<=6'b100100;
- endcase
- end
- end
-
- endmodule
-
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
基于FPGA的交通燈設(shè)計(jì).7z
(6.47 MB, 下載次數(shù): 81)
2020-4-12 15:53 上傳
點(diǎn)擊文件名下載附件
|