基于VHDL的洗衣機(jī)控制器設(shè)計(jì)_第1頁
基于VHDL的洗衣機(jī)控制器設(shè)計(jì)_第2頁
基于VHDL的洗衣機(jī)控制器設(shè)計(jì)_第3頁
基于VHDL的洗衣機(jī)控制器設(shè)計(jì)_第4頁
基于VHDL的洗衣機(jī)控制器設(shè)計(jì)_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于VHDL的洗衣機(jī)控制器設(shè)計(jì)作者:田駿祎指導(dǎo)老師:嚴(yán)世勝(海南師范大學(xué)物理與電子工程學(xué)院,???,571158)摘要:隨著科技的不斷發(fā)展,洗衣機(jī)作為日常家庭生活中不可或缺的電器設(shè)備,其自動化、智能化和高效化的需求日益凸顯,因此,對洗衣機(jī)控制器的設(shè)計(jì)優(yōu)化與性能提升顯得尤為重要。傳統(tǒng)的洗衣機(jī)控制器基本都是采用超大規(guī)模集成電路或者單片機(jī)來實(shí)現(xiàn),單片機(jī)設(shè)計(jì)存在著調(diào)試復(fù)雜的問題,專用集成電路一旦設(shè)計(jì)出現(xiàn)問題就要完全廢棄。而用FPGA設(shè)計(jì)需要更新時無需更改硬件,只需軟件進(jìn)行升級更新即可。因此論文設(shè)計(jì)的洗衣機(jī)控制器基于FPGA技術(shù)和QuartusII開發(fā)平臺設(shè)計(jì)。利用自上而下的設(shè)計(jì)方式,將洗衣機(jī)控制器分為4個模塊進(jìn)行設(shè)計(jì),并用頂層文件進(jìn)行連接。使用硬件描述語言來描述各個模塊,并將產(chǎn)生的文件下載到FPGA芯片EP4CE10F17C8中。結(jié)果表明,該設(shè)計(jì)基本實(shí)現(xiàn)了洗衣機(jī)所需的全自動控制過程,包括洗衣機(jī)洗衣強(qiáng)度顯示、電機(jī)模擬波輪洗衣機(jī)運(yùn)轉(zhuǎn)、水流強(qiáng)度可選等功能,通過實(shí)驗(yàn)測試,驗(yàn)證了所設(shè)計(jì)的控制器的穩(wěn)定性和可靠性,并可以運(yùn)用到實(shí)際生活當(dāng)中去。關(guān)鍵詞:洗衣機(jī)控制器;VHDL;FPGA;QuartusII1引言1.1研究意義洗衣機(jī)控制器是洗衣機(jī)的重要組成部分,基于VHDL語言對洗衣機(jī)控制器進(jìn)行設(shè)計(jì),其研究意義主要體現(xiàn)在以下幾個方面:(1)提高控制性能:VHDL是一種硬件描述語言,被廣泛應(yīng)用于數(shù)字電路設(shè)計(jì),它使得數(shù)字系統(tǒng)中各個模塊的功能和行為得以方便地被描述。在洗衣機(jī)控制器的設(shè)計(jì)中應(yīng)用VHDL語言,可以確保設(shè)計(jì)的準(zhǔn)確性和可靠性,且性能穩(wěn)定抗干擾能力強(qiáng)[1],從而提高控制器的性能,保障洗衣機(jī)系統(tǒng)的正常運(yùn)行。(2)使設(shè)計(jì)更加靈活:將VHDL應(yīng)用于洗衣機(jī)控制器的設(shè)計(jì),不僅可以實(shí)現(xiàn)洗衣過程的自動化,還可以通過描述控制器的行為,更加精確地實(shí)現(xiàn)各項(xiàng)功能。使用FPGA實(shí)現(xiàn)硬件設(shè)計(jì),使得控制器更具靈活性和可擴(kuò)展性。(3)推動家電智能化:通過這一研究,可以加深對硬件描述語言的理解與應(yīng)用,為家電行業(yè)提供一種新的設(shè)計(jì)思路和方法,有助于提升家電產(chǎn)品的智能化和自動化水平,為此應(yīng)用領(lǐng)域做出貢獻(xiàn)。1.2研究現(xiàn)狀目前洗衣機(jī)控制器通常采用數(shù)字電路進(jìn)行設(shè)計(jì)[2],傳統(tǒng)的數(shù)字電路設(shè)計(jì)方法,基于超大規(guī)模集成電路進(jìn)行,其結(jié)構(gòu)較為復(fù)雜,功耗較高,速度較低,且出現(xiàn)問題整個設(shè)計(jì)就要完全廢棄,故不作為經(jīng)常被選用的方案。在國內(nèi),利用單片機(jī)作為主控制器設(shè)計(jì)洗衣機(jī)系統(tǒng)是一種比較常見的設(shè)計(jì)方案[3],該類設(shè)計(jì)先由STC89C51單片機(jī)構(gòu)成最小系統(tǒng),再結(jié)合外圍電路控制電機(jī)[4],具有效率高、設(shè)計(jì)周期短的特點(diǎn),但其電路較為復(fù)雜。在國外,智能洗衣機(jī)同樣是諸多學(xué)者關(guān)注的熱點(diǎn),他們有關(guān)于洗衣機(jī)模糊控制器的研究,有學(xué)者提出了采用模糊邏輯控制確定洗衣機(jī)轉(zhuǎn)速值和電機(jī)轉(zhuǎn)速穩(wěn)定性的系統(tǒng)[5],但模糊控制存在不足,即沒有學(xué)習(xí)能力,從而使模糊控制產(chǎn)品難以積累經(jīng)驗(yàn)。因此基于EDA技術(shù)研究一套能選擇不同工作模式自動完成洗衣功能的智能洗衣機(jī)控制器[6]更加有實(shí)用意義。2洗衣機(jī)控制器方案的選擇洗衣機(jī)控制器有許多設(shè)計(jì)方法,可以采用單片機(jī)電路、模糊技術(shù)控制、現(xiàn)場可編程門陣列FPGA等方案來實(shí)現(xiàn)。如果使用單片機(jī)電路進(jìn)行設(shè)計(jì),其優(yōu)點(diǎn)為體積小、質(zhì)量輕、價格便宜,控制功能靈活[7],而且由于其高度的集成性和優(yōu)化性能,可以提高生產(chǎn)效率并降低維護(hù)成本;此外,利用單片機(jī)進(jìn)行設(shè)計(jì)可靠性高、運(yùn)行穩(wěn)定且易于維護(hù),單片機(jī)具備強(qiáng)大的控制和處理能力,可以方便地實(shí)現(xiàn)洗衣機(jī)的自動化和智能化控制。缺點(diǎn)為在單片機(jī)開發(fā)過程中可能需要進(jìn)行復(fù)雜的調(diào)試和優(yōu)化工作,以確??刂破鞯姆€(wěn)定性和可靠性;需要大量的硬件接口和外部設(shè)備,設(shè)計(jì)布線工作量大;單片機(jī)控制器對工作環(huán)境和電磁干擾的敏感性較高[8],如果工作環(huán)境惡劣或電磁干擾較強(qiáng),可能會影響控制器的正常運(yùn)行。如果使用模糊控制電路進(jìn)行設(shè)計(jì),其優(yōu)點(diǎn)為能靈活地根據(jù)洗衣機(jī)的洗滌參數(shù)做出改變[9],有利于水電資源的節(jié)省。同時設(shè)計(jì)模糊控制器所需的時間較為短暫,大大地提高了項(xiàng)目開發(fā)效率,模糊控制器根據(jù)專業(yè)人員總結(jié)的規(guī)則進(jìn)行控制量大小轉(zhuǎn)變,能適應(yīng)洗衣機(jī)的非線性、時變、大延遲的特性。缺點(diǎn)為模糊產(chǎn)品難以積累經(jīng)驗(yàn),而且在機(jī)器上的控制比較呆板,不能做到隨機(jī)應(yīng)變,有很大的局限性。如果以FPGA為基礎(chǔ),用VHDL語言實(shí)現(xiàn)洗衣機(jī)控制器的設(shè)計(jì),其優(yōu)點(diǎn)為具有高度的可編程性[10],F(xiàn)PGA可以根據(jù)不同的洗滌模式、水位、轉(zhuǎn)速等需求進(jìn)行快速配置,滿足各種復(fù)雜的控制要求;降低能耗和成本,通過精確控制洗衣機(jī)的各項(xiàng)功能,F(xiàn)PGA可以幫助減少不必要的能源浪費(fèi),從而降低能耗成本;高效的并行處理能力,F(xiàn)PGA采用并行處理的方式,可以同時處理多個任務(wù),從而提高了洗衣機(jī)的整體性能。缺點(diǎn)為較高的技術(shù)門檻,F(xiàn)PGA編程需要一定的專業(yè)知識和經(jīng)驗(yàn),包括硬件描述語言的掌握和電路設(shè)計(jì)技能,這使得非專業(yè)人員難以進(jìn)行FPGA控制器的設(shè)計(jì)與維護(hù)。與傳統(tǒng)的設(shè)計(jì)方案相比,采用FPGA設(shè)計(jì)方案的設(shè)計(jì)的優(yōu)點(diǎn)有:實(shí)時性和靈活性:FPGA可以根據(jù)洗衣機(jī)的實(shí)際運(yùn)行需求靈活調(diào)整控制邏輯,實(shí)現(xiàn)實(shí)時控制和精確管理各個洗衣步驟,且能夠快速響應(yīng)不同模式下的工作要求??煽啃栽鰪?qiáng):FPGA可以在單一芯片上集成多種功能,減少對外部元件的依賴,從而提高系統(tǒng)的可靠性和穩(wěn)定性,降低故障率。標(biāo)準(zhǔn)化與統(tǒng)一平臺:使用FPGA設(shè)計(jì)洗衣機(jī)控制器可以簡化供應(yīng)鏈管理,因?yàn)橥幌盗械腇PGA可以用于多個型號的洗衣機(jī)產(chǎn)品,只需要不同的軟件配置即可滿足不同產(chǎn)品的差異化需求??傊捎肍PGA設(shè)計(jì)洗衣機(jī)控制器,相較于傳統(tǒng)設(shè)計(jì)方案,在設(shè)計(jì)初期調(diào)研、硬件結(jié)構(gòu)定型、功能仿真調(diào)試、模塊重復(fù)利用、功能修改等方面優(yōu)勢明顯[11],系統(tǒng)開發(fā)周期大大縮短,開發(fā)成本大大降低,可以實(shí)現(xiàn)更為精準(zhǔn)、高效的控制系統(tǒng),具有實(shí)時性、靈活性、更強(qiáng)的可靠性與標(biāo)準(zhǔn)化、平臺統(tǒng)一化的優(yōu)點(diǎn)。這些優(yōu)點(diǎn)使得FPGA設(shè)計(jì)方案成為洗衣機(jī)控制器設(shè)計(jì)領(lǐng)域的理想選擇,有助于提升洗衣機(jī)的性能和用戶體驗(yàn)。3整體設(shè)計(jì)論述3.1FPGA簡介FPGA,即現(xiàn)場可編程門陣列(Field-ProgrammableGateArray),是一種以數(shù)字電路為主的集成芯片,屬于可編程邏輯器件(ProgrammableLogicDevice,PLD)的一種。它是一種基于可編程邏輯和可編程連接的集成電路器件,采用可編程的邏輯單元和可編程互連電路,具有很高的靈活性[12]和可重構(gòu)性,可以通過編程來定義其內(nèi)部邏輯結(jié)構(gòu),根據(jù)不同的需求進(jìn)行實(shí)時配置。本文的洗衣機(jī)控制器使用了FPGA芯片EP4CE10F17C8,并對其進(jìn)行了詳細(xì)的分析。3.2洗衣機(jī)控制器的原理和結(jié)構(gòu)3.2.1洗衣機(jī)控制器的原理本文設(shè)計(jì)的洗衣機(jī)控制器為波輪全自動洗衣機(jī),能實(shí)現(xiàn)全自動的洗滌、漂洗、脫水的流程,倒計(jì)時時間數(shù)字的顯示、按鍵控制洗衣強(qiáng)度設(shè)置及顯示,還具有電機(jī)模擬洗衣機(jī)正反轉(zhuǎn)的演示功能。洗衣機(jī)控制器作為洗衣機(jī)的核心模塊,洗衣機(jī)能否實(shí)現(xiàn)洗衣功能主要取決于對洗衣機(jī)控制器的設(shè)計(jì)是否完善。在進(jìn)行日常觀察分析和瀏覽相關(guān)資料得知,洗衣機(jī)控制器的設(shè)計(jì)能夠?qū)崿F(xiàn)洗滌、漂洗、脫水的全自動化流程[13]。首先需要按鍵設(shè)置洗衣強(qiáng)度,有三種洗衣強(qiáng)度可以選擇:強(qiáng)洗、標(biāo)準(zhǔn)與輕柔模式。對于強(qiáng)洗模式,洗衣狀態(tài)為正轉(zhuǎn)5秒,停2秒,反轉(zhuǎn)5秒,停2秒;對于標(biāo)準(zhǔn)模式,洗衣狀態(tài)為正轉(zhuǎn)3.5秒,停1.5秒,反轉(zhuǎn)3.5秒;對于輕柔模式,洗衣狀態(tài)為正轉(zhuǎn)2.5秒,停1.5秒,反轉(zhuǎn)2.5秒。選擇完洗衣強(qiáng)度后點(diǎn)啟動按鈕,進(jìn)水閥打開,到達(dá)一定水位后水位開關(guān)閉合,進(jìn)水完成,此時進(jìn)水閥關(guān)閉,洗滌燈亮,電機(jī)按照選擇的強(qiáng)度進(jìn)行正反轉(zhuǎn),洗滌過程進(jìn)行20分鐘后,洗滌燈滅,排水閥打開,此時電機(jī)停轉(zhuǎn),到達(dá)一定水位后水位開關(guān)關(guān)閉,排水完成,此時脫水燈亮,表示開始脫水,電機(jī)只正轉(zhuǎn),脫水時長為5分鐘。脫水結(jié)束后,脫水燈滅,排水閥關(guān)閉。緊接著進(jìn)水閥打開,到達(dá)一定水位后水位開關(guān)閉合,進(jìn)水完成,進(jìn)水閥關(guān)閉,第一次漂洗燈亮,電機(jī)按照選擇的強(qiáng)度進(jìn)行正反轉(zhuǎn),漂洗過程進(jìn)行10分鐘后,第一次漂洗燈滅,排水閥打開,表示正在排水,此時電機(jī)停轉(zhuǎn),到達(dá)一定水位后水位開關(guān)關(guān)閉,排水完成,此時脫水燈亮,電機(jī)正轉(zhuǎn)5分鐘后脫水結(jié)束,脫水燈滅,排水閥關(guān)閉。之后進(jìn)行二次漂洗,進(jìn)水閥打開,到達(dá)一定水位后水位開關(guān)閉合,進(jìn)水完成,進(jìn)水閥關(guān)閉,二次漂洗燈亮,漂洗10分鐘后,二次漂洗燈滅,排水閥打開,到達(dá)一定水位后水位開關(guān)關(guān)閉,排水完成,脫水燈亮,開始脫水,脫水5分鐘后脫水燈滅,排水閥關(guān)閉。綜上所述,整個洗衣流程所需時長為55分鐘。同時,利用VHDL對洗衣機(jī)控制器的功能進(jìn)行了合理的設(shè)計(jì),保證了洗衣機(jī)工作的精確次序和切換的時刻。3.2.2洗衣機(jī)控制器的結(jié)構(gòu)本文設(shè)計(jì)的洗衣機(jī)控制器的結(jié)構(gòu)主要包括四個模塊,即時鐘計(jì)數(shù)模塊、按鍵控制模塊、電機(jī)控制模塊、工作狀態(tài)顯示模塊,用頂層文件將他們連接起來。首先外部信號clk給時鐘計(jì)數(shù)模塊提供50MHz的外部時鐘,時鐘計(jì)數(shù)模塊為按鍵控制模塊、電機(jī)控制模塊、工作狀態(tài)顯示模塊提供同步的工作時鐘信號,同時為頂層文件中關(guān)于進(jìn)水閥及排水閥閉合或斷開的控制部分與洗滌燈、漂洗燈及脫水燈亮滅的控制部分提供同步的工作時鐘信號。按鍵輸入信號將按鍵狀態(tài)的變化信息送入按鍵控制模塊,按鍵控制模塊為電機(jī)控制模塊提供去抖動處理后的按鍵脈沖信號,電機(jī)控制模塊控制開發(fā)板外部電機(jī)運(yùn)轉(zhuǎn)。工作狀態(tài)模塊控制數(shù)碼管顯示的剩余時間和洗衣強(qiáng)度,水位開關(guān)能起到控制進(jìn)水閥及排水閥閉合或斷開與洗滌燈、漂洗燈及脫水燈亮滅的作用。根據(jù)洗衣機(jī)控制器結(jié)構(gòu)的設(shè)計(jì)要求,最后繪制了如圖1所示的系統(tǒng)框圖。圖1控制系統(tǒng)框圖3.3洗衣機(jī)控制器ASM圖在洗衣機(jī)控制器的設(shè)計(jì)中,要求實(shí)現(xiàn)全自動洗衣過程,即按下啟動按鈕后,洗衣機(jī)自動完成洗滌、漂洗、二次漂洗、脫水等流程。流程中的狀態(tài)會根據(jù)水位開關(guān)的關(guān)斷或工作時間來進(jìn)行切換。該洗衣機(jī)控制器的ASM圖如圖2,由圖可以看出,該洗衣機(jī)控制器主要設(shè)置了13個基本狀態(tài),由狀態(tài)轉(zhuǎn)移電路來在滿足判斷條件時分別轉(zhuǎn)向不同的狀態(tài)。本文所設(shè)計(jì)的洗衣機(jī)控制器共有強(qiáng)洗、標(biāo)準(zhǔn)、輕柔三種洗衣強(qiáng)度,因?yàn)檫@三種強(qiáng)度差異之處只在電機(jī)正反轉(zhuǎn)設(shè)置中,故三者的ASM圖完全一致。狀態(tài)S1:設(shè)置完洗衣強(qiáng)度并啟動按鍵,進(jìn)水閥打開,水位開關(guān)撥上;狀態(tài)S2:進(jìn)水閥關(guān)閉,洗滌燈亮,電機(jī)正反轉(zhuǎn),洗滌20分鐘;狀態(tài)S3:洗滌燈滅,排水閥打開,電機(jī)停轉(zhuǎn),斷開水位開關(guān);狀態(tài)S4:脫水燈亮,電機(jī)只正轉(zhuǎn),脫水時長為5分鐘;狀態(tài)S5:脫水結(jié)束后,脫水燈滅,排水閥關(guān)閉,進(jìn)水閥打開;狀態(tài)S6:水位開關(guān)撥上,進(jìn)水閥關(guān)閉,第一次漂洗燈亮,電機(jī)正反轉(zhuǎn);狀態(tài)S7:漂洗10分鐘以后,第一次漂洗燈滅,排水閥打開,電機(jī)停轉(zhuǎn),斷開水位開關(guān);狀態(tài)S8:脫水燈亮,電機(jī)正轉(zhuǎn);狀態(tài)S9:5分鐘后,脫水燈滅,排水閥關(guān)閉,進(jìn)入二次漂洗,進(jìn)水閥打開;狀態(tài)S10:水位開關(guān)撥上,進(jìn)水閥關(guān)閉,二次漂洗燈亮;狀態(tài)S11:漂洗10分鐘后二次漂洗燈滅,排水閥打開;狀態(tài)S12:水位開關(guān)斷開,脫水燈亮,電機(jī)正轉(zhuǎn);狀態(tài)S13:脫水5分鐘后脫水燈滅,排水閥關(guān)閉,洗衣結(jié)束。圖2洗衣機(jī)控制器ASM圖4主要功能模塊設(shè)計(jì)洗衣機(jī)控制器所要實(shí)現(xiàn)的功能分別在時鐘計(jì)數(shù)模塊、按鍵控制模塊、電機(jī)控制模塊、工作狀態(tài)顯示模塊這四個模塊中分別進(jìn)行設(shè)計(jì),最后用頂層文件將各個模塊連接起來。4.1時鐘計(jì)數(shù)模塊設(shè)計(jì)在洗衣機(jī)控制器的設(shè)計(jì)中,需要系統(tǒng)根據(jù)設(shè)定的程序來自動控制洗衣機(jī)的工作時間與狀態(tài)切換。因此,為了防止計(jì)時出現(xiàn)混亂導(dǎo)致洗衣機(jī)不能正常實(shí)現(xiàn)功能,所設(shè)計(jì)的洗衣機(jī)控制器需要一個穩(wěn)定的時鐘來支持其正常的工作。其中時鐘計(jì)數(shù)電路模塊圖如圖3:圖3時鐘計(jì)數(shù)電路模塊圖由該硬件模塊圖可知clk為輸入信號,由外部信號提供50MHz的時鐘信號;rst_n為輸入的負(fù)邊沿復(fù)位信號,當(dāng)rst_n為低電平時,計(jì)數(shù)器清零,若rst_n是高電平且計(jì)數(shù)器達(dá)到最大值,則產(chǎn)生一個脈沖信號sec_1_r,并將其賦值給輸出端口sec_1;該時鐘計(jì)數(shù)電路模塊主要是負(fù)責(zé)產(chǎn)生穩(wěn)定的1s脈沖信號,為按鍵控制模塊、電機(jī)控制模塊、工作狀態(tài)顯示模塊提供同步的工作時鐘信號。為了保證計(jì)時準(zhǔn)確,我們根據(jù)50MHz外部輸入時鐘設(shè)定計(jì)數(shù)器的最大值為24999999,用于生成一個1秒的時間間隔。這個值是根據(jù)所使用的時鐘頻率和所需的時間間隔來計(jì)算得出的。對于一個50MHz的時鐘頻率,如果要生成一個1秒的時間間隔,需要進(jìn)行50000000次計(jì)數(shù)。本文設(shè)計(jì)計(jì)數(shù)器的范圍是從0到最大值,所以最大值的值需要減去1。因此最大值被設(shè)置為24999999,以確保在計(jì)數(shù)到24999999時生成一個1秒的脈沖信號。部分VHDL程序如下:entitytime_countisPort(clk:inSTD_LOGIC;--時鐘,50MHZrst_n:inSTD_LOGIC;--復(fù)位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號entitytime_countisPort(clk:inSTD_LOGIC;--時鐘,50MHZrst_n:inSTD_LOGIC;--復(fù)位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數(shù)1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計(jì)數(shù)寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計(jì)時器process(clk)beginarchitectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數(shù)1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計(jì)數(shù)寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計(jì)時器process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thencnt_1<=0;elsifcnt_1=MAX_NUMthencnt_1<=0;elsecnt_1<=cnt_1+1;endif;endif;endprocess;“if

falling_edge(clk)

then”這個進(jìn)程描述了生成1秒脈沖信號的邏輯。它在每個時鐘下降沿檢測時鐘信號。如果復(fù)位信號rst_n是高電平且計(jì)數(shù)器達(dá)到MAX_NUM,則產(chǎn)生一個脈沖信號?!皊ec_1<=sec_1_r;”這條語句將內(nèi)部生成的1秒脈沖信號sec_1_r賦值給輸出端口sec_1。至此就實(shí)現(xiàn)了一個簡單的1秒脈沖信號發(fā)生器。4.2按鍵控制模塊設(shè)計(jì)當(dāng)按鍵信號變化時,可能會出現(xiàn)抖動,即信號在短時間內(nèi)多次變化,假如不做消抖處理,系統(tǒng)將會識別到很多抖動的信號,即識別到很多次按鍵按下,會對洗衣機(jī)控制器的正常工作帶來極大干擾。為了避免抖動,需要通過按鍵消抖實(shí)現(xiàn)輸出一個脈沖,這樣就保證每次按下按鍵只會產(chǎn)生一個脈沖。按鍵控制模塊實(shí)現(xiàn)了一個按鍵的去抖動機(jī)制和脈沖檢測。按鍵控制模塊圖如圖4:圖4按鍵控制模塊圖由該硬件模塊圖可知clk為一個輸入端口,由外部提供50MHz的時鐘信號;key_in為一輸入端口,用于檢測按鍵狀態(tài)的變化,并觸發(fā)相應(yīng)的動作,如去抖動處理和脈沖檢測;rstn為一輸入端口,表示復(fù)位信號,下降沿有效;key_pulse為輸出信號,用于表示經(jīng)過去抖動處理后的按鍵脈沖信號,以便系統(tǒng)能夠正確地識別按鍵的按下或釋放動作。部分VHDL程序如下:entitykeyisgeneric(N:integer:=1;PULSE_PERIOD:integer:=262143);Port(clk:inSTD_LOGIC;rstn:inSTD_LOGIC;key_in:inSTD_LOGIC;key_pulse:outSTD_LOGIC);endkey;architectureBehavioralofkeyissignalkey_rst_pre,key_rst,key_edge,key_sec_pre,key_sec:STD_LOGIC;signalcnt:STD_LOGIC_VECTOR(17downto0):=(others=>'0');beginprocess(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_rst<='1';key_rst_pre<='1';elsekey_rst<=key_in;key_rst_pre<=key_rst;endif;endif;endprocess;key_edge<=key_rst_preand(notkey_rst);上段程序首先檢測按鍵信號的邊緣變化(上升沿),并將其存儲在key_rst_pre和key_rst中。當(dāng)沒有復(fù)位信號(rstn)時,將key_rst和key_rst_pre設(shè)置為高電平,確保在復(fù)位期間不產(chǎn)生誤觸發(fā)信號。如果有復(fù)位信號,將按鍵信號(key_in)賦值給key_rst和key_rst_pre。使用key_rst_pre和key_rst進(jìn)行邊緣檢測,確定按鍵信號的上升沿。process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thencnt<=(others=>'0');elsifkey_edge='1'thencnt<=(others=>'0');elsecnt<=cnt+'1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec<='1';elsifcnt=PULSE_PERIODthenkey_sec<=key_in;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec_pre<='1';elsekey_sec_pre<=key_sec;endif;endif;endprocess;key_pulse<=key_sec_preand(notkey_sec);--檢測前后一個時鐘周期的按鍵信號之間的差異接下來檢測到上升沿后,啟動一個計(jì)數(shù)器cnt,在每個時鐘周期上升沿到來時遞增。如果沒有復(fù)位信號,計(jì)數(shù)器將一直遞增,直到達(dá)到設(shè)定的脈沖周期(PULSE_PERIOD),然后重置為零。一旦計(jì)數(shù)器達(dá)到設(shè)定的脈沖周期,將按鍵信號賦值給key_sec,表示檢測到一個脈沖。key_sec_pre用于存儲前一個時鐘周期中key_sec的狀態(tài)。最后就實(shí)現(xiàn)了輸出信號key_pulse通過檢測前一個時鐘周期的按鍵信號和當(dāng)前時鐘周期的按鍵信號之間的差異來產(chǎn)生脈沖信號。4.3電機(jī)控制模塊設(shè)計(jì)電機(jī)控制模塊主要通過步進(jìn)電機(jī)四個引腳的電平切換來控制電機(jī)旋轉(zhuǎn)的方向和啟停,并輸出了一個周期性的脈沖信號。電機(jī)控制模塊根據(jù)時鐘信號、使能信號和方向信號,周期性地更新輸出的控制信號,用于控制電機(jī)的運(yùn)動。電機(jī)控制模塊圖如圖5:圖5電機(jī)控制模塊由該硬件模塊圖可知clk為輸入50MHz的時鐘信號,dir為電機(jī)運(yùn)動方向信號,en為使能信號,ctrl_out為輸出信號,是一個4位向量,用于控制電機(jī)。電機(jī)控制模塊將電機(jī)狀態(tài)控制寄存器ctrl_reg里的值賦給ctrl_out,輸出電機(jī)控制信號。部分VHDL設(shè)計(jì)程序如下:entityservorisport(clk:instd_logic;en:instd_logic;--電機(jī)使能信號dir:instd_logic;--電機(jī)運(yùn)動方向信號ctrl_out:outstd_logic_vector(3downto0));--輸出4位控制電機(jī)信號endservor;architectureBehavioralofservorissignalclk_cnt_servor:integer:=0;signalservor_pulse:std_logic:='0';signalctrl_reg:std_logic_vector(3downto0):="0001";beginctrl_out<=ctrl_reg;process(clk)beginifrising_edge(clk)then在上段代碼中,當(dāng)時鐘信號clk上升沿到來時,檢查計(jì)數(shù)器clk_cnt_servor的值是否小于90000。90000代表一個計(jì)數(shù)閾值。這個值用來控制產(chǎn)生脈沖信號的時鐘周期數(shù)量。ifclk_cnt_servor<90000thenclk_cnt_servor<=clk_cnt_servor+1;servor_pulse<='0';elseclk_cnt_servor<=0;servor_pulse<='1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifservor_pulse='1'anden='1'thenifdir='1'thenctrl_reg<=ctrl_reg(2downto0)&ctrl_reg(3downto3);--反轉(zhuǎn)elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正轉(zhuǎn)endif;endif;endif;endprocess;endarchitectureBehavioral;如果小于90000,則計(jì)數(shù)器遞增并保持脈沖生成標(biāo)志信號servor_pulse為低電平,否則計(jì)數(shù)器歸零,并將servor_pulse設(shè)置為高電平,表示產(chǎn)生了一個脈沖信號。當(dāng)時鐘信號clk上升沿到來時,同時也檢查servor_pulse和使能信號en是否都為高電平。如果是,則根據(jù)方向信號dir的值,更新ctrl_reg的值,實(shí)現(xiàn)了電機(jī)控制邏輯正轉(zhuǎn)或反轉(zhuǎn)。4.4工作狀態(tài)顯示模塊設(shè)計(jì)在洗衣機(jī)控制器進(jìn)行工作時,如果不知道洗衣當(dāng)前選擇的模式及洗衣當(dāng)前狀態(tài)的剩余時間,用戶只能一直等待,這樣就會過多浪費(fèi)用戶的時間。如果有模式顯示與倒計(jì)時時間顯示允許用戶知道洗衣機(jī)當(dāng)前處于哪種模式、完成當(dāng)前洗滌周期還需要多長時間。這樣,用戶可以合理安排自己的時間,等待洗衣機(jī)完成并及時取出洗好的衣物,避免浪費(fèi)時間。因此,工作狀態(tài)顯示模塊最主要的功能就是根據(jù)按鍵輸入信號顯示當(dāng)前洗衣模式,以及根據(jù)當(dāng)前洗衣進(jìn)度顯示當(dāng)前狀態(tài)的剩余時間。工作狀態(tài)顯示模塊圖如圖6: 圖6工作狀態(tài)顯示模塊由該硬件模塊圖可知clk為輸入時鐘信號,rst_n為復(fù)位信號,time_remain為剩余時間輸入信號,washer_mode為洗衣機(jī)模式選擇輸入信號,washer_power為洗衣機(jī)強(qiáng)度選擇輸入信號。sgm_bit為位選輸出信號,sgm_bit為段選輸出信號。工作狀態(tài)顯示部分VHDL程序如下:process(cnt_sel)begincasecnt_selis--位選when0=>--顯示最低位的數(shù)碼管sgm_sel<="111110";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60mod10,4));dp_en<='0';--剩余時間的秒數(shù)的個位數(shù)when1=>--顯示次低位的數(shù)碼管sgm_sel<="111101";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60/10,4));dp_en<='0';--剩余時間的秒數(shù)的十位數(shù)when2=>--顯示次中間位的數(shù)碼管sgm_sel<="111011";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60mod10,4));dp_en<='1';--剩余時間的分鐘數(shù)的個位數(shù)when3=>--顯示中間位的數(shù)碼管sgm_sel<="110111";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60/10,4));dp_en<='0';--剩余時間的分鐘數(shù)的十位數(shù)when4=>--顯示次高位的數(shù)碼管sgm_sel<="101111";sgm_data<="00"&washer_power;dp_en<='1';--洗衣強(qiáng)度when5=>顯示最高位的數(shù)碼管sgm_sel<="011111";sgm_data<="00"&washer_mode;--洗衣模式dp_en<='1';whenothers=>sgm_sel<="111111";dp_en<='0';endcase;endprocess;這段代碼根據(jù)計(jì)數(shù)器cnt_sel的值來選擇要顯示的數(shù)碼管的位,并將相應(yīng)的數(shù)字或字符發(fā)送到段選端口,實(shí)現(xiàn)了位選原理。當(dāng)cnt_sel等于0時,選擇顯示最低位的數(shù)碼管,并將剩余時間的秒數(shù)的個位數(shù)發(fā)送到該數(shù)碼管,同時設(shè)置小數(shù)點(diǎn)使能信號為0;當(dāng)cnt_sel等于1時,選擇顯示次低位的數(shù)碼管,并將剩余時間的秒數(shù)的十位數(shù)發(fā)送到該數(shù)碼管,同時設(shè)置小數(shù)點(diǎn)使能信號為0。當(dāng)cnt_sel等于2時,選擇顯示次中間位的數(shù)碼管,并將剩余時間的分鐘數(shù)的個位數(shù)發(fā)送到該數(shù)碼管,同時設(shè)置小數(shù)點(diǎn)使能信號為1。當(dāng)cnt_sel等于3時,選擇顯示中間位的數(shù)碼管,并將剩余時間的分鐘數(shù)的十位數(shù)發(fā)送到該數(shù)碼管,同時設(shè)置小數(shù)點(diǎn)使能信號為0。當(dāng)cnt_sel等于4時,選擇顯示次高位的數(shù)碼管,并將洗衣機(jī)的強(qiáng)度狀態(tài)發(fā)送到該數(shù)碼管,并在顯示數(shù)字前加上兩個零,表示空位,同時設(shè)置小數(shù)點(diǎn)使能信號為1。當(dāng)cnt_sel等于5時,選擇顯示最高位的數(shù)碼管,并將洗衣機(jī)的模式狀態(tài)發(fā)送到該數(shù)碼管,并在顯示數(shù)字前加上兩個零,表示空位,同時設(shè)置小數(shù)點(diǎn)使能信號為1。對于其他情況,將所有數(shù)碼管的段選信號設(shè)置為全高電平,同時關(guān)閉小數(shù)點(diǎn)使能信號。dp_bit<=notdp_en;process(data_in)begincasedata_inis--段選when"0000"=>bit_out<=dp_bit&"1000000";when"0001"=>bit_out<=dp_bit&"1111001";when"0010"=>bit_out<=dp_bit&"0100100";when"0011"=>bit_out<=dp_bit&"0110000";when"0100"=>bit_out<=dp_bit&"0011001";when"0101"=>bit_out<=dp_bit&"0010010";when"0110"=>bit_out<=dp_bit&"0000010";when"0111"=>bit_out<=dp_bit&"1111000";when"1000"=>bit_out<=dp_bit&"0000000";when"1001"=>bit_out<=dp_bit&"0010000";when"1010"=>bit_out<=dp_bit&"0111111";whenothers=>bit_out<="11111111";endcase;endprocess;這段代碼將dp_en的邏輯反值賦給dp_bit,用于控制小數(shù)點(diǎn)的顯示狀態(tài)。當(dāng)dp_en為低電平時,dp_bit為高電平,表示小數(shù)點(diǎn)關(guān)閉;當(dāng)dp_en為高電平時,dp_bit為低電平,表示小數(shù)點(diǎn)開啟。接著根據(jù)輸入的data_in值控制七段數(shù)碼管的段選,以顯示相應(yīng)的數(shù)字,并根據(jù)dp_en控制小數(shù)點(diǎn)的顯示狀態(tài)。4.5頂層電路設(shè)計(jì)頂層電路的設(shè)計(jì)主要就是把時鐘計(jì)數(shù)模塊、按鍵控制模塊、電機(jī)控制模塊、工作狀態(tài)顯示模塊這四個模塊用元件例化語句連接起來構(gòu)成一個完整電路。工作狀態(tài)顯示部分VHDL程序如下:entitytopisPort(clk:instd_logic;rst_n:instd_logic;key_start_in:instd_logic;key_water_in:instd_logic;key_power_in:instd_logic;servor_out:outstd_logic_vector(3downto0);--輸出電機(jī)控制信號sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0);led_water_in:outstd_logic;--進(jìn)水燈led_water_out:outstd_logic;--排水燈led_washer:outstd_logic;--洗滌燈led_pure_washer:outstd_logic;--漂洗燈led_drop:outstd_logic--脫水燈);endtop;architectureBehavioraloftopissignalruning:std_logic:='0';--正在運(yùn)行標(biāo)志signalwasher_power:std_logic_vector(1downto0):="00";--洗衣強(qiáng)度模式signalwasher_finished:std_logic;signalkey_start_pulse:std_logic;signalkey_power_pulse:std_logic;signalkey_water_in_pulse:std_logic;--按鍵脈沖信號signalrunning_state:std_logic_vector(3downto0);signalhalf_sec_pulse:std_logic;--半秒的定時信號signalhalf_sec_cnt:integer:=0;signalroll_half_sec_cnt:integer:=0;--半秒計(jì)數(shù)器signalservor_en:std_logic;signalservor_dir:std_logic;signaltime_remain:integer:=0;componentkeyisport(clk:instd_logic;rstn:instd_logic;key_in:instd_logic;key_pulse:outstd_logic--按鍵脈沖輸出信號);endcomponent;componentsgm_topisport(clk:instd_logic;rst_n:instd_logic;time_remain:integer;washer_mode:instd_logic_vector(1downto0);washer_power:instd_logic_vector(1downto0);sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0));endcomponent;componentservorisport(clk:instd_logic;en:instd_logic;dir:instd_logic;ctrl_out:outstd_logic_vector(3downto0));endcomponent;頂層連接部分的代碼主要包括對這四個模塊的聲明、按鍵處理、主洗衣機(jī)工作進(jìn)程控制、洗衣機(jī)狀態(tài)顯示燈控制,以及對u_key_start、u_key_power、u_key_mode三個屬于按鍵控制模塊的分模塊的實(shí)例化,對時鐘計(jì)數(shù)模塊、工作狀態(tài)顯示模塊、電機(jī)控制模塊的實(shí)例化。5實(shí)物測試與仿真5.1主要模塊仿真5.1.1時鐘計(jì)數(shù)模塊仿真模塊仿真使用了Modelsim進(jìn)行仿真。為方便觀看波形,時鐘信號的周期并未嚴(yán)格按實(shí)際要求設(shè)置,仿真前先將程序中的MAX_NUM數(shù)值改小為49(代碼中為24999999),否則仿真會因?yàn)榉抡鏁r間過長而失敗。clk為輸入信號,rst_n為系統(tǒng)內(nèi)部自復(fù)位信號,當(dāng)rst_n為低電平時,系統(tǒng)內(nèi)部信號復(fù)位。由仿真圖11可以看出,系統(tǒng)可以提供穩(wěn)定的1s脈沖。當(dāng)rst_n為高電平時,當(dāng)計(jì)數(shù)器cnt_1達(dá)到最大值MAX_NUM,則產(chǎn)生一個脈沖信號sec_1r,并賦值給sec_1輸出一個1s脈沖。圖11時鐘計(jì)數(shù)模塊仿真圖5.1.2按鍵控制模塊仿真clk為輸入信號,提供50MHz的時鐘信號,key_in為一輸入端口,檢測按鍵的變化,rst_n為復(fù)位信號,key_pulse為經(jīng)過去消抖處理后的按鍵脈沖信號。從圖中可以看出,當(dāng)沒有復(fù)位信號(rst_n)時,將key_rst和key_rst_pre設(shè)置為高電平,如果有復(fù)位信號,將按鍵信號(key_in)賦值給key_rst和key_rst_pre。接下來使用key_rst_pre和key_rst進(jìn)行邊緣檢測,確定按鍵信號的上升沿檢測到上升沿后,啟動一個計(jì)數(shù)器cnt,在每個時鐘周期上升沿到來時遞增。如果沒有復(fù)位信號,計(jì)數(shù)器將一直遞增,直到達(dá)到設(shè)定的脈沖周期(PULSE_PERIOD),然后重置為零。一旦計(jì)數(shù)器達(dá)到設(shè)定的脈沖周期,將按鍵信號賦值給key_sec,表示檢測到一個脈沖。key_sec_pre用于存儲前一個時鐘周期中key_sec的狀態(tài)。最后輸出信號key_pulse通過檢測前一個時鐘周期的按鍵信號和當(dāng)前時鐘周期的按鍵信號之間的差異來產(chǎn)生脈沖信號。圖12按鍵控制模塊仿真圖5.1.3電機(jī)控制模塊仿真clk為輸入50MHz的時鐘信號,dir為電機(jī)運(yùn)動方向信號,en為使能信號,ctrl_out為輸出信號,是一個4位向量,用于控制電機(jī)。從圖中可以看出,當(dāng)時鐘信號clk上升沿到來時,檢查計(jì)數(shù)器clk_cnt_servor的值是否小于31。代碼中用的值是90000,為了方便仿真設(shè)置為31。如果小于31,則計(jì)數(shù)器遞增并保持脈沖生成標(biāo)志信號servor_pulse為低電平,否則計(jì)數(shù)器歸零,并將servor_pulse設(shè)置為高電平,表示產(chǎn)生了一個脈沖信號。當(dāng)時鐘信號clk上升沿到來時,同時也檢查servor_pulse和使能信號en是否都為高電平。如果是,則根據(jù)方向信號dir的值,更新ctrl_reg的值,實(shí)現(xiàn)電機(jī)控制邏輯正轉(zhuǎn)或反轉(zhuǎn)。圖13電機(jī)控制模塊仿真圖5.1.4工作狀態(tài)顯示模塊仿真clk為輸入時鐘信號,rst_n為復(fù)位信號,time_remain為剩余時間輸入信號,washer_mode為洗衣機(jī)模式選擇輸入信號,washer_power為洗衣機(jī)強(qiáng)度選擇輸入信號。sgm_bit為位選輸出信號,sgm_bit為段選輸出信號。從圖中可以看出,數(shù)碼管實(shí)現(xiàn)了位選與段選。圖14工作狀態(tài)顯示模塊仿真圖5.2實(shí)驗(yàn)結(jié)果將電機(jī)、驅(qū)動板與開發(fā)板之間用導(dǎo)線進(jìn)行引腳連接,通過下載器往芯片中燒入程序后即可正常運(yùn)行。程序可以正常開始運(yùn)行,點(diǎn)擊復(fù)位按鈕RESET,數(shù)碼管顯示整體剩余時間,按下KEY1一下,數(shù)碼管第二位顯示1,再按一下顯示2,再按一下顯示0,如此循環(huán),這是按鍵選擇洗衣機(jī)的強(qiáng)度模式,0代表強(qiáng)洗,1代表標(biāo)準(zhǔn),2代表輕柔。圖中為強(qiáng)洗模式,按下啟動按鍵KEY0后,數(shù)碼管開始倒計(jì)時,DS0亮起,表示進(jìn)水閥打開。如圖15所示,以強(qiáng)洗強(qiáng)度為例:圖15強(qiáng)洗模式下進(jìn)水閥打開水位開關(guān)閉合,進(jìn)水閥關(guān)閉,即DS0滅,洗滌燈DS2亮,如圖16所示,以強(qiáng)洗強(qiáng)度為例:圖16強(qiáng)洗模式下洗滌燈亮洗滌完成后洗滌燈DS2滅,排水閥打開,即DS1亮,如圖17所示:圖17強(qiáng)洗模式下洗滌完排水?dāng)嚅_水位開關(guān),脫水燈亮,如圖18所示:圖18進(jìn)行脫水脫水結(jié)束后脫水燈排水燈滅,排水閥關(guān)閉,DS1滅,進(jìn)水閥打開,即DS0亮,水位開關(guān)閉合后,進(jìn)水閥關(guān)閉,即DS0滅,第一次漂洗燈亮,即DS3亮,如圖19所示:圖19進(jìn)水后開始第一次漂洗漂洗結(jié)束,第一次漂洗燈滅,即DS3滅,排水閥打開,即DS1亮,如圖21所示:圖20第一次漂洗結(jié)束,開始排水水位開關(guān)斷開,脫水燈亮,脫水結(jié)束后脫水燈排水燈滅,排水閥關(guān)閉,DS1滅,進(jìn)水閥打開,即DS0亮,之后開始進(jìn)行第二次漂洗,與第一次漂洗過程完全相同。最后第二次漂洗脫水結(jié)束后脫水燈排水燈滅,排水閥關(guān)閉,即DS1滅,洗衣結(jié)束,所有l(wèi)ed燈全滅,倒計(jì)時停止。如圖21所示:圖21洗衣結(jié)束6總結(jié)本設(shè)計(jì)是基于VHDL語言進(jìn)行編程,以實(shí)現(xiàn)整體預(yù)期的洗衣機(jī)控制功能,描述洗衣機(jī)控制器的模塊以及其中使用的數(shù)據(jù)可以根據(jù)實(shí)際情況進(jìn)行配置。目標(biāo)器件是FPGA芯片,采用分層設(shè)計(jì)方法完成各模塊的連接,通過仿真和實(shí)物測試驗(yàn)證,證明能夠?qū)崿F(xiàn)洗衣機(jī)控制器的主要功能。同時也還存在問題:編寫的程序能夠?qū)崿F(xiàn)主要的洗衣功能但是代碼過于繁瑣,尤其是頂層文件使用例化語句調(diào)用并連接各個模塊時,代碼過于繁雜,不如用原理圖連接更為簡潔方便。該設(shè)計(jì)僅能初步實(shí)現(xiàn)一種可選擇三種洗衣強(qiáng)度的基本的洗衣機(jī)的流程,模式太過于單一,存在局限性。參考文獻(xiàn)朱偉.全自動直筒洗衣機(jī)FPGA控制器的開發(fā)設(shè)計(jì)[J].科技創(chuàng)新與應(yīng)用,2017,(14):50.成超,任峻.基于VHDL的洗衣機(jī)控制器的設(shè)計(jì)[J].電子設(shè)計(jì)工程,2014,22(04):92-94+98.閆晶晶,張尚宇,王冰.基于單片機(jī)的全自動洗衣機(jī)控制系統(tǒng)設(shè)計(jì)[J].中國高新科技,2023,(13):19-21.王曉冬,陳紅友.基于單片機(jī)的全自動洗衣機(jī)控制系統(tǒng)設(shè)計(jì)[J].科技創(chuàng)新與應(yīng)用,2017,(09):88.NWulandari,AGAbdullah.DesignandSimulationofWashingMachineusingFuzzyLogicController(FLC)[J].IOPConferenceSeries:MaterialsScienceandEngineering,2018,384(1).孫浩,付一含,趙根,徐棟義,王穎.基于Verilog的洗衣機(jī)控制電路設(shè)計(jì)[J].電腦知識與技術(shù),2019,15(07):244-245.高學(xué)群.單片機(jī)控制的全自動洗衣機(jī)系統(tǒng)[J].時代農(nóng)機(jī),2015,42(06):57+59.李彩容.淺談單片機(jī)系統(tǒng)的電磁干擾與抗干擾措施[J].黑龍江科技信息,2011,(32):82.張繼東.自動控制技術(shù)在全自動洗衣機(jī)的應(yīng)用[J].中國設(shè)備工程,2017,(05):110-111.郭忠,李濤,李勇,等.基于FPGA的洗衣機(jī)控制系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程,2012,20(13):190-192.DOI:10.14022/ki.dzsjgc.2012.13.017.陳飛云.基于VerilogHDL語言的全自動洗衣機(jī)控制器的設(shè)計(jì)與仿真[J].應(yīng)用技術(shù)學(xué)報,2017,17(03):257-261.杜強(qiáng).基于FPGA的智能洗衣機(jī)控制器的研究與仿真設(shè)計(jì)[D].哈爾濱理工大學(xué),2016.梅江龍.波輪全自動洗衣機(jī)模塊化平臺的設(shè)計(jì)研究[J].日用電器,2021,(11):69-75.附錄1、時鐘計(jì)數(shù)模塊:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytime_countisPort(clk:inSTD_LOGIC;--時鐘,50MHZrst_n:inSTD_LOGIC;--復(fù)位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數(shù)1s,50,000,000次--constantMAX_NUM:natural:=49;--記最大數(shù)1s,50,000,000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計(jì)數(shù)寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計(jì)時器process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thencnt_1<=0;elsifcnt_1=MAX_NUMthencnt_1<=0;elsecnt_1<=cnt_1+1;endif;endif;endprocess;--1s脈沖信號process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thensec_1_r<='0';elsifcnt_1=MAX_NUMthensec_1_r<='1';elsesec_1_r<='0';endif;endif;endprocess;sec_1<=sec_1_r;--當(dāng)右邊改變,立馬賦值給左邊assign和always并行endBehavioral;2、按鍵控制模塊:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitykeyisgeneric(N:integer:=1;PULSE_PERIOD:integer:=262143--PULSE_PERIOD:integer:=10);Port(clk:inSTD_LOGIC;rstn:inSTD_LOGIC;key_in:inSTD_LOGIC;key_pulse:outSTD_LOGIC);endkey;architectureBehavioralofkeyissignalkey_rst_pre,key_rst,key_edge,key_sec_pre,key_sec:STD_LOGIC;signalcnt:STD_LOGIC_VECTOR(17downto0):=(others=>'0');beginprocess(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_rst<='1';key_rst_pre<='1';elsekey_rst<=key_in;key_rst_pre<=key_rst;endif;endif;endprocess;key_edge<=key_rst_preand(notkey_rst);process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thencnt<=(others=>'0');elsifkey_edge='1'thencnt<=(others=>'0');elsecnt<=cnt+'1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec<='1';elsifcnt=PULSE_PERIODthenkey_sec<=key_in;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec_pre<='1';elsekey_sec_pre<=key_sec;endif;endif;endprocess;key_pulse<=key_sec_preand(notkey_sec);endBehavioral;3、電機(jī)控制模塊:libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;entityservorisport(clk:instd_logic;en:instd_logic;dir:instd_logic;ctrl_out:outstd_logic_vector(3downto0));endservor;architectureBehavioralofservorissignalclk_cnt_servor:integer:=0;signalservor_pulse:std_logic:='0';signalctrl_reg:std_logic_vector(3downto0):="0001";beginctrl_out<=ctrl_reg;process(clk)beginifrising_edge(clk)thenifclk_cnt_servor<90000thenclk_cnt_servor<=clk_cnt_servor+1;servor_pulse<='0';elseclk_cnt_servor<=0;servor_pulse<='1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifservor_pulse='1'anden='1'thenifdir='1'thenctrl_reg<=ctrl_reg(2downto0)&ctrl_reg(3downto3);--反轉(zhuǎn)elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正轉(zhuǎn)endif;endif;endif;endprocess;endarchitectureBehavioral;5、工作狀態(tài)顯示模塊:libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;useieee.std_logic_unsigned.all;useieee.numeric_std.all;entitysgm_topisport(clk:instd_logic;rst_n:instd_logic;time_remain:integer;washer_mode:instd_logic_vector(1downto0);washer_power:instd_logic_vector(1downto0);sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0));endsgm_top;architectureBehavioralofsgm_topissignalsgm_data:std_logic_vector(3downto0);signaldp_en:std_logic;signalclk_cnt_ms:integer;signalclk_pulse_1ms:std_logic;signalcnt_sel:integer;componentsgmisport(data_in:instd_logic_vector(3downto0);dp_en:instd_logic;bit_out:outstd_logic_vector(7downto0));endcomponent;beginprocess(clk)beginifrising_edge(clk)thenifrst_n='0'thenclk_cnt_ms<=0;clk_pulse_1ms<='0';elseifclk_cnt_ms<49999thenclk_cnt_ms<=clk_cnt_ms+1;clk_pulse_1ms<='0';elseclk_cnt_ms<=0;clk_pulse_1ms<='1';endif;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifrst_n='0'thencnt_sel<=0;elseifclk_pulse_1ms='1'thenif(cnt_sel<5)thencnt_sel<=cnt_sel+1;elsecnt_sel<=0;endif;endif;endif;endif;endprocess;process(cnt_sel)begincasecnt_selis--位選when0=>--顯示最低位sgm_sel<="111110";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60mod10,4));dp_en<='0';when1=>sgm_sel<="111101";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60/10,4));dp_en<='0';when2=>sgm_sel<="111011";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60mod10,4));dp_en<='1';when3=>sgm_sel<="110111";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60/10,4));dp_en<='0';when4=>sgm_sel<="101111";sgm_data<="00"&washer_power;dp_en<='1';when5=>sgm_sel<="011111";sgm_data<="00"&washer_mode;dp_en<='1';whenothers=>sgm_sel<="111111";dp_en<='0';endcase;endprocess;u_sgm:sgmportmap(data_in=>sgm_data,dp_en=>dp_en,bit_out=>sgm_bit);endarchitectureBehavioral;libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;useieee.std_logic_unsigned.all;entitysgmisPort(data_in:instd_logic_vector(3downto0);dp_en:instd_logic;bit_out:outstd_logic_vector(7downto0));endsgm;architectureBehavioralofsgmissignaldp_bit:std_logic;begindp_bit<=notdp_en;process(data_in)begincasedata_inis--段選when"0000"=>bit_out<=dp_bit&"1000000";when"0001"=>bit_out<=dp_bit&"1111001";when"0010"=>bit_out<=dp_bit&"0100100";when"0011"=>bit_out<=dp_bit&"0110000";when"0100"=>bit_out<=dp_bit&"0011001";when"0101"=>bit_out<=dp_bit&"0010010";when"0110"=>

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論