基于VHDL的洗衣機控制器設計_第1頁
基于VHDL的洗衣機控制器設計_第2頁
基于VHDL的洗衣機控制器設計_第3頁
基于VHDL的洗衣機控制器設計_第4頁
基于VHDL的洗衣機控制器設計_第5頁
已閱讀5頁,還剩49頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于VHDL的洗衣機控制器設計作者:田駿祎指導老師:嚴世勝(海南師范大學物理與電子工程學院,海口,571158)摘要:隨著科技的不斷發展,洗衣機作為日常家庭生活中不可或缺的電器設備,其自動化、智能化和高效化的需求日益凸顯,因此,對洗衣機控制器的設計優化與性能提升顯得尤為重要。傳統的洗衣機控制器基本都是采用超大規模集成電路或者單片機來實現,單片機設計存在著調試復雜的問題,專用集成電路一旦設計出現問題就要完全廢棄。而用FPGA設計需要更新時無需更改硬件,只需軟件進行升級更新即可。因此論文設計的洗衣機控制器基于FPGA技術和QuartusII開發平臺設計。利用自上而下的設計方式,將洗衣機控制器分為4個模塊進行設計,并用頂層文件進行連接。使用硬件描述語言來描述各個模塊,并將產生的文件下載到FPGA芯片EP4CE10F17C8中。結果表明,該設計基本實現了洗衣機所需的全自動控制過程,包括洗衣機洗衣強度顯示、電機模擬波輪洗衣機運轉、水流強度可選等功能,通過實驗測試,驗證了所設計的控制器的穩定性和可靠性,并可以運用到實際生活當中去。關鍵詞:洗衣機控制器;VHDL;FPGA;QuartusII1引言1.1研究意義洗衣機控制器是洗衣機的重要組成部分,基于VHDL語言對洗衣機控制器進行設計,其研究意義主要體現在以下幾個方面:(1)提高控制性能:VHDL是一種硬件描述語言,被廣泛應用于數字電路設計,它使得數字系統中各個模塊的功能和行為得以方便地被描述。在洗衣機控制器的設計中應用VHDL語言,可以確保設計的準確性和可靠性,且性能穩定抗干擾能力強[1],從而提高控制器的性能,保障洗衣機系統的正常運行。(2)使設計更加靈活:將VHDL應用于洗衣機控制器的設計,不僅可以實現洗衣過程的自動化,還可以通過描述控制器的行為,更加精確地實現各項功能。使用FPGA實現硬件設計,使得控制器更具靈活性和可擴展性。(3)推動家電智能化:通過這一研究,可以加深對硬件描述語言的理解與應用,為家電行業提供一種新的設計思路和方法,有助于提升家電產品的智能化和自動化水平,為此應用領域做出貢獻。1.2研究現狀目前洗衣機控制器通常采用數字電路進行設計[2],傳統的數字電路設計方法,基于超大規模集成電路進行,其結構較為復雜,功耗較高,速度較低,且出現問題整個設計就要完全廢棄,故不作為經常被選用的方案。在國內,利用單片機作為主控制器設計洗衣機系統是一種比較常見的設計方案[3],該類設計先由STC89C51單片機構成最小系統,再結合外圍電路控制電機[4],具有效率高、設計周期短的特點,但其電路較為復雜。在國外,智能洗衣機同樣是諸多學者關注的熱點,他們有關于洗衣機模糊控制器的研究,有學者提出了采用模糊邏輯控制確定洗衣機轉速值和電機轉速穩定性的系統[5],但模糊控制存在不足,即沒有學習能力,從而使模糊控制產品難以積累經驗。因此基于EDA技術研究一套能選擇不同工作模式自動完成洗衣功能的智能洗衣機控制器[6]更加有實用意義。2洗衣機控制器方案的選擇洗衣機控制器有許多設計方法,可以采用單片機電路、模糊技術控制、現場可編程門陣列FPGA等方案來實現。如果使用單片機電路進行設計,其優點為體積小、質量輕、價格便宜,控制功能靈活[7],而且由于其高度的集成性和優化性能,可以提高生產效率并降低維護成本;此外,利用單片機進行設計可靠性高、運行穩定且易于維護,單片機具備強大的控制和處理能力,可以方便地實現洗衣機的自動化和智能化控制。缺點為在單片機開發過程中可能需要進行復雜的調試和優化工作,以確保控制器的穩定性和可靠性;需要大量的硬件接口和外部設備,設計布線工作量大;單片機控制器對工作環境和電磁干擾的敏感性較高[8],如果工作環境惡劣或電磁干擾較強,可能會影響控制器的正常運行。如果使用模糊控制電路進行設計,其優點為能靈活地根據洗衣機的洗滌參數做出改變[9],有利于水電資源的節省。同時設計模糊控制器所需的時間較為短暫,大大地提高了項目開發效率,模糊控制器根據專業人員總結的規則進行控制量大小轉變,能適應洗衣機的非線性、時變、大延遲的特性。缺點為模糊產品難以積累經驗,而且在機器上的控制比較呆板,不能做到隨機應變,有很大的局限性。如果以FPGA為基礎,用VHDL語言實現洗衣機控制器的設計,其優點為具有高度的可編程性[10],FPGA可以根據不同的洗滌模式、水位、轉速等需求進行快速配置,滿足各種復雜的控制要求;降低能耗和成本,通過精確控制洗衣機的各項功能,FPGA可以幫助減少不必要的能源浪費,從而降低能耗成本;高效的并行處理能力,FPGA采用并行處理的方式,可以同時處理多個任務,從而提高了洗衣機的整體性能。缺點為較高的技術門檻,FPGA編程需要一定的專業知識和經驗,包括硬件描述語言的掌握和電路設計技能,這使得非專業人員難以進行FPGA控制器的設計與維護。與傳統的設計方案相比,采用FPGA設計方案的設計的優點有:實時性和靈活性:FPGA可以根據洗衣機的實際運行需求靈活調整控制邏輯,實現實時控制和精確管理各個洗衣步驟,且能夠快速響應不同模式下的工作要求。可靠性增強:FPGA可以在單一芯片上集成多種功能,減少對外部元件的依賴,從而提高系統的可靠性和穩定性,降低故障率。標準化與統一平臺:使用FPGA設計洗衣機控制器可以簡化供應鏈管理,因為同一系列的FPGA可以用于多個型號的洗衣機產品,只需要不同的軟件配置即可滿足不同產品的差異化需求。總之,采用FPGA設計洗衣機控制器,相較于傳統設計方案,在設計初期調研、硬件結構定型、功能仿真調試、模塊重復利用、功能修改等方面優勢明顯[11],系統開發周期大大縮短,開發成本大大降低,可以實現更為精準、高效的控制系統,具有實時性、靈活性、更強的可靠性與標準化、平臺統一化的優點。這些優點使得FPGA設計方案成為洗衣機控制器設計領域的理想選擇,有助于提升洗衣機的性能和用戶體驗。3整體設計論述3.1FPGA簡介FPGA,即現場可編程門陣列(Field-ProgrammableGateArray),是一種以數字電路為主的集成芯片,屬于可編程邏輯器件(ProgrammableLogicDevice,PLD)的一種。它是一種基于可編程邏輯和可編程連接的集成電路器件,采用可編程的邏輯單元和可編程互連電路,具有很高的靈活性[12]和可重構性,可以通過編程來定義其內部邏輯結構,根據不同的需求進行實時配置。本文的洗衣機控制器使用了FPGA芯片EP4CE10F17C8,并對其進行了詳細的分析。3.2洗衣機控制器的原理和結構3.2.1洗衣機控制器的原理本文設計的洗衣機控制器為波輪全自動洗衣機,能實現全自動的洗滌、漂洗、脫水的流程,倒計時時間數字的顯示、按鍵控制洗衣強度設置及顯示,還具有電機模擬洗衣機正反轉的演示功能。洗衣機控制器作為洗衣機的核心模塊,洗衣機能否實現洗衣功能主要取決于對洗衣機控制器的設計是否完善。在進行日常觀察分析和瀏覽相關資料得知,洗衣機控制器的設計能夠實現洗滌、漂洗、脫水的全自動化流程[13]。首先需要按鍵設置洗衣強度,有三種洗衣強度可以選擇:強洗、標準與輕柔模式。對于強洗模式,洗衣狀態為正轉5秒,停2秒,反轉5秒,停2秒;對于標準模式,洗衣狀態為正轉3.5秒,停1.5秒,反轉3.5秒;對于輕柔模式,洗衣狀態為正轉2.5秒,停1.5秒,反轉2.5秒。選擇完洗衣強度后點啟動按鈕,進水閥打開,到達一定水位后水位開關閉合,進水完成,此時進水閥關閉,洗滌燈亮,電機按照選擇的強度進行正反轉,洗滌過程進行20分鐘后,洗滌燈滅,排水閥打開,此時電機停轉,到達一定水位后水位開關關閉,排水完成,此時脫水燈亮,表示開始脫水,電機只正轉,脫水時長為5分鐘。脫水結束后,脫水燈滅,排水閥關閉。緊接著進水閥打開,到達一定水位后水位開關閉合,進水完成,進水閥關閉,第一次漂洗燈亮,電機按照選擇的強度進行正反轉,漂洗過程進行10分鐘后,第一次漂洗燈滅,排水閥打開,表示正在排水,此時電機停轉,到達一定水位后水位開關關閉,排水完成,此時脫水燈亮,電機正轉5分鐘后脫水結束,脫水燈滅,排水閥關閉。之后進行二次漂洗,進水閥打開,到達一定水位后水位開關閉合,進水完成,進水閥關閉,二次漂洗燈亮,漂洗10分鐘后,二次漂洗燈滅,排水閥打開,到達一定水位后水位開關關閉,排水完成,脫水燈亮,開始脫水,脫水5分鐘后脫水燈滅,排水閥關閉。綜上所述,整個洗衣流程所需時長為55分鐘。同時,利用VHDL對洗衣機控制器的功能進行了合理的設計,保證了洗衣機工作的精確次序和切換的時刻。3.2.2洗衣機控制器的結構本文設計的洗衣機控制器的結構主要包括四個模塊,即時鐘計數模塊、按鍵控制模塊、電機控制模塊、工作狀態顯示模塊,用頂層文件將他們連接起來。首先外部信號clk給時鐘計數模塊提供50MHz的外部時鐘,時鐘計數模塊為按鍵控制模塊、電機控制模塊、工作狀態顯示模塊提供同步的工作時鐘信號,同時為頂層文件中關于進水閥及排水閥閉合或斷開的控制部分與洗滌燈、漂洗燈及脫水燈亮滅的控制部分提供同步的工作時鐘信號。按鍵輸入信號將按鍵狀態的變化信息送入按鍵控制模塊,按鍵控制模塊為電機控制模塊提供去抖動處理后的按鍵脈沖信號,電機控制模塊控制開發板外部電機運轉。工作狀態模塊控制數碼管顯示的剩余時間和洗衣強度,水位開關能起到控制進水閥及排水閥閉合或斷開與洗滌燈、漂洗燈及脫水燈亮滅的作用。根據洗衣機控制器結構的設計要求,最后繪制了如圖1所示的系統框圖。圖1控制系統框圖3.3洗衣機控制器ASM圖在洗衣機控制器的設計中,要求實現全自動洗衣過程,即按下啟動按鈕后,洗衣機自動完成洗滌、漂洗、二次漂洗、脫水等流程。流程中的狀態會根據水位開關的關斷或工作時間來進行切換。該洗衣機控制器的ASM圖如圖2,由圖可以看出,該洗衣機控制器主要設置了13個基本狀態,由狀態轉移電路來在滿足判斷條件時分別轉向不同的狀態。本文所設計的洗衣機控制器共有強洗、標準、輕柔三種洗衣強度,因為這三種強度差異之處只在電機正反轉設置中,故三者的ASM圖完全一致。狀態S1:設置完洗衣強度并啟動按鍵,進水閥打開,水位開關撥上;狀態S2:進水閥關閉,洗滌燈亮,電機正反轉,洗滌20分鐘;狀態S3:洗滌燈滅,排水閥打開,電機停轉,斷開水位開關;狀態S4:脫水燈亮,電機只正轉,脫水時長為5分鐘;狀態S5:脫水結束后,脫水燈滅,排水閥關閉,進水閥打開;狀態S6:水位開關撥上,進水閥關閉,第一次漂洗燈亮,電機正反轉;狀態S7:漂洗10分鐘以后,第一次漂洗燈滅,排水閥打開,電機停轉,斷開水位開關;狀態S8:脫水燈亮,電機正轉;狀態S9:5分鐘后,脫水燈滅,排水閥關閉,進入二次漂洗,進水閥打開;狀態S10:水位開關撥上,進水閥關閉,二次漂洗燈亮;狀態S11:漂洗10分鐘后二次漂洗燈滅,排水閥打開;狀態S12:水位開關斷開,脫水燈亮,電機正轉;狀態S13:脫水5分鐘后脫水燈滅,排水閥關閉,洗衣結束。圖2洗衣機控制器ASM圖4主要功能模塊設計洗衣機控制器所要實現的功能分別在時鐘計數模塊、按鍵控制模塊、電機控制模塊、工作狀態顯示模塊這四個模塊中分別進行設計,最后用頂層文件將各個模塊連接起來。4.1時鐘計數模塊設計在洗衣機控制器的設計中,需要系統根據設定的程序來自動控制洗衣機的工作時間與狀態切換。因此,為了防止計時出現混亂導致洗衣機不能正常實現功能,所設計的洗衣機控制器需要一個穩定的時鐘來支持其正常的工作。其中時鐘計數電路模塊圖如圖3:圖3時鐘計數電路模塊圖由該硬件模塊圖可知clk為輸入信號,由外部信號提供50MHz的時鐘信號;rst_n為輸入的負邊沿復位信號,當rst_n為低電平時,計數器清零,若rst_n是高電平且計數器達到最大值,則產生一個脈沖信號sec_1_r,并將其賦值給輸出端口sec_1;該時鐘計數電路模塊主要是負責產生穩定的1s脈沖信號,為按鍵控制模塊、電機控制模塊、工作狀態顯示模塊提供同步的工作時鐘信號。為了保證計時準確,我們根據50MHz外部輸入時鐘設定計數器的最大值為24999999,用于生成一個1秒的時間間隔。這個值是根據所使用的時鐘頻率和所需的時間間隔來計算得出的。對于一個50MHz的時鐘頻率,如果要生成一個1秒的時間間隔,需要進行50000000次計數。本文設計計數器的范圍是從0到最大值,所以最大值的值需要減去1。因此最大值被設置為24999999,以確保在計數到24999999時生成一個1秒的脈沖信號。部分VHDL程序如下:entitytime_countisPort(clk:inSTD_LOGIC;--時鐘,50MHZrst_n:inSTD_LOGIC;--復位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號entitytime_countisPort(clk:inSTD_LOGIC;--時鐘,50MHZrst_n:inSTD_LOGIC;--復位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計數寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計時器process(clk)beginarchitectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計數寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計時器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”這個進程描述了生成1秒脈沖信號的邏輯。它在每個時鐘下降沿檢測時鐘信號。如果復位信號rst_n是高電平且計數器達到MAX_NUM,則產生一個脈沖信號。“sec_1<=sec_1_r;”這條語句將內部生成的1秒脈沖信號sec_1_r賦值給輸出端口sec_1。至此就實現了一個簡單的1秒脈沖信號發生器。4.2按鍵控制模塊設計當按鍵信號變化時,可能會出現抖動,即信號在短時間內多次變化,假如不做消抖處理,系統將會識別到很多抖動的信號,即識別到很多次按鍵按下,會對洗衣機控制器的正常工作帶來極大干擾。為了避免抖動,需要通過按鍵消抖實現輸出一個脈沖,這樣就保證每次按下按鍵只會產生一個脈沖。按鍵控制模塊實現了一個按鍵的去抖動機制和脈沖檢測。按鍵控制模塊圖如圖4:圖4按鍵控制模塊圖由該硬件模塊圖可知clk為一個輸入端口,由外部提供50MHz的時鐘信號;key_in為一輸入端口,用于檢測按鍵狀態的變化,并觸發相應的動作,如去抖動處理和脈沖檢測;rstn為一輸入端口,表示復位信號,下降沿有效;key_pulse為輸出信號,用于表示經過去抖動處理后的按鍵脈沖信號,以便系統能夠正確地識別按鍵的按下或釋放動作。部分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中。當沒有復位信號(rstn)時,將key_rst和key_rst_pre設置為高電平,確保在復位期間不產生誤觸發信號。如果有復位信號,將按鍵信號(key_in)賦值給key_rst和key_rst_pre。使用key_rst_pre和key_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);--檢測前后一個時鐘周期的按鍵信號之間的差異接下來檢測到上升沿后,啟動一個計數器cnt,在每個時鐘周期上升沿到來時遞增。如果沒有復位信號,計數器將一直遞增,直到達到設定的脈沖周期(PULSE_PERIOD),然后重置為零。一旦計數器達到設定的脈沖周期,將按鍵信號賦值給key_sec,表示檢測到一個脈沖。key_sec_pre用于存儲前一個時鐘周期中key_sec的狀態。最后就實現了輸出信號key_pulse通過檢測前一個時鐘周期的按鍵信號和當前時鐘周期的按鍵信號之間的差異來產生脈沖信號。4.3電機控制模塊設計電機控制模塊主要通過步進電機四個引腳的電平切換來控制電機旋轉的方向和啟停,并輸出了一個周期性的脈沖信號。電機控制模塊根據時鐘信號、使能信號和方向信號,周期性地更新輸出的控制信號,用于控制電機的運動。電機控制模塊圖如圖5:圖5電機控制模塊由該硬件模塊圖可知clk為輸入50MHz的時鐘信號,dir為電機運動方向信號,en為使能信號,ctrl_out為輸出信號,是一個4位向量,用于控制電機。電機控制模塊將電機狀態控制寄存器ctrl_reg里的值賦給ctrl_out,輸出電機控制信號。部分VHDL設計程序如下:entityservorisport(clk:instd_logic;en:instd_logic;--電機使能信號dir:instd_logic;--電機運動方向信號ctrl_out:outstd_logic_vector(3downto0));--輸出4位控制電機信號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在上段代碼中,當時鐘信號clk上升沿到來時,檢查計數器clk_cnt_servor的值是否小于90000。90000代表一個計數閾值。這個值用來控制產生脈沖信號的時鐘周期數量。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);--反轉elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正轉endif;endif;endif;endprocess;endarchitectureBehavioral;如果小于90000,則計數器遞增并保持脈沖生成標志信號servor_pulse為低電平,否則計數器歸零,并將servor_pulse設置為高電平,表示產生了一個脈沖信號。當時鐘信號clk上升沿到來時,同時也檢查servor_pulse和使能信號en是否都為高電平。如果是,則根據方向信號dir的值,更新ctrl_reg的值,實現了電機控制邏輯正轉或反轉。4.4工作狀態顯示模塊設計在洗衣機控制器進行工作時,如果不知道洗衣當前選擇的模式及洗衣當前狀態的剩余時間,用戶只能一直等待,這樣就會過多浪費用戶的時間。如果有模式顯示與倒計時時間顯示允許用戶知道洗衣機當前處于哪種模式、完成當前洗滌周期還需要多長時間。這樣,用戶可以合理安排自己的時間,等待洗衣機完成并及時取出洗好的衣物,避免浪費時間。因此,工作狀態顯示模塊最主要的功能就是根據按鍵輸入信號顯示當前洗衣模式,以及根據當前洗衣進度顯示當前狀態的剩余時間。工作狀態顯示模塊圖如圖6: 圖6工作狀態顯示模塊由該硬件模塊圖可知clk為輸入時鐘信號,rst_n為復位信號,time_remain為剩余時間輸入信號,washer_mode為洗衣機模式選擇輸入信號,washer_power為洗衣機強度選擇輸入信號。sgm_bit為位選輸出信號,sgm_bit為段選輸出信號。工作狀態顯示部分VHDL程序如下: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;這段代碼根據計數器cnt_sel的值來選擇要顯示的數碼管的位,并將相應的數字或字符發送到段選端口,實現了位選原理。當cnt_sel等于0時,選擇顯示最低位的數碼管,并將剩余時間的秒數的個位數發送到該數碼管,同時設置小數點使能信號為0;當cnt_sel等于1時,選擇顯示次低位的數碼管,并將剩余時間的秒數的十位數發送到該數碼管,同時設置小數點使能信號為0。當cnt_sel等于2時,選擇顯示次中間位的數碼管,并將剩余時間的分鐘數的個位數發送到該數碼管,同時設置小數點使能信號為1。當cnt_sel等于3時,選擇顯示中間位的數碼管,并將剩余時間的分鐘數的十位數發送到該數碼管,同時設置小數點使能信號為0。當cnt_sel等于4時,選擇顯示次高位的數碼管,并將洗衣機的強度狀態發送到該數碼管,并在顯示數字前加上兩個零,表示空位,同時設置小數點使能信號為1。當cnt_sel等于5時,選擇顯示最高位的數碼管,并將洗衣機的模式狀態發送到該數碼管,并在顯示數字前加上兩個零,表示空位,同時設置小數點使能信號為1。對于其他情況,將所有數碼管的段選信號設置為全高電平,同時關閉小數點使能信號。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,用于控制小數點的顯示狀態。當dp_en為低電平時,dp_bit為高電平,表示小數點關閉;當dp_en為高電平時,dp_bit為低電平,表示小數點開啟。接著根據輸入的data_in值控制七段數碼管的段選,以顯示相應的數字,并根據dp_en控制小數點的顯示狀態。4.5頂層電路設計頂層電路的設計主要就是把時鐘計數模塊、按鍵控制模塊、電機控制模塊、工作狀態顯示模塊這四個模塊用元件例化語句連接起來構成一個完整電路。工作狀態顯示部分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);--輸出電機控制信號sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0);led_water_in:outstd_logic;--進水燈led_water_out:outstd_logic;--排水燈led_washer:outstd_logic;--洗滌燈led_pure_washer:outstd_logic;--漂洗燈led_drop:outstd_logic--脫水燈);endtop;architectureBehavioraloftopissignalruning:std_logic:='0';--正在運行標志signalwasher_power:std_logic_vector(1downto0):="00";--洗衣強度模式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;--半秒計數器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;頂層連接部分的代碼主要包括對這四個模塊的聲明、按鍵處理、主洗衣機工作進程控制、洗衣機狀態顯示燈控制,以及對u_key_start、u_key_power、u_key_mode三個屬于按鍵控制模塊的分模塊的實例化,對時鐘計數模塊、工作狀態顯示模塊、電機控制模塊的實例化。5實物測試與仿真5.1主要模塊仿真5.1.1時鐘計數模塊仿真模塊仿真使用了Modelsim進行仿真。為方便觀看波形,時鐘信號的周期并未嚴格按實際要求設置,仿真前先將程序中的MAX_NUM數值改小為49(代碼中為24999999),否則仿真會因為仿真時間過長而失敗。clk為輸入信號,rst_n為系統內部自復位信號,當rst_n為低電平時,系統內部信號復位。由仿真圖11可以看出,系統可以提供穩定的1s脈沖。當rst_n為高電平時,當計數器cnt_1達到最大值MAX_NUM,則產生一個脈沖信號sec_1r,并賦值給sec_1輸出一個1s脈沖。圖11時鐘計數模塊仿真圖5.1.2按鍵控制模塊仿真clk為輸入信號,提供50MHz的時鐘信號,key_in為一輸入端口,檢測按鍵的變化,rst_n為復位信號,key_pulse為經過去消抖處理后的按鍵脈沖信號。從圖中可以看出,當沒有復位信號(rst_n)時,將key_rst和key_rst_pre設置為高電平,如果有復位信號,將按鍵信號(key_in)賦值給key_rst和key_rst_pre。接下來使用key_rst_pre和key_rst進行邊緣檢測,確定按鍵信號的上升沿檢測到上升沿后,啟動一個計數器cnt,在每個時鐘周期上升沿到來時遞增。如果沒有復位信號,計數器將一直遞增,直到達到設定的脈沖周期(PULSE_PERIOD),然后重置為零。一旦計數器達到設定的脈沖周期,將按鍵信號賦值給key_sec,表示檢測到一個脈沖。key_sec_pre用于存儲前一個時鐘周期中key_sec的狀態。最后輸出信號key_pulse通過檢測前一個時鐘周期的按鍵信號和當前時鐘周期的按鍵信號之間的差異來產生脈沖信號。圖12按鍵控制模塊仿真圖5.1.3電機控制模塊仿真clk為輸入50MHz的時鐘信號,dir為電機運動方向信號,en為使能信號,ctrl_out為輸出信號,是一個4位向量,用于控制電機。從圖中可以看出,當時鐘信號clk上升沿到來時,檢查計數器clk_cnt_servor的值是否小于31。代碼中用的值是90000,為了方便仿真設置為31。如果小于31,則計數器遞增并保持脈沖生成標志信號servor_pulse為低電平,否則計數器歸零,并將servor_pulse設置為高電平,表示產生了一個脈沖信號。當時鐘信號clk上升沿到來時,同時也檢查servor_pulse和使能信號en是否都為高電平。如果是,則根據方向信號dir的值,更新ctrl_reg的值,實現電機控制邏輯正轉或反轉。圖13電機控制模塊仿真圖5.1.4工作狀態顯示模塊仿真clk為輸入時鐘信號,rst_n為復位信號,time_remain為剩余時間輸入信號,washer_mode為洗衣機模式選擇輸入信號,washer_power為洗衣機強度選擇輸入信號。sgm_bit為位選輸出信號,sgm_bit為段選輸出信號。從圖中可以看出,數碼管實現了位選與段選。圖14工作狀態顯示模塊仿真圖5.2實驗結果將電機、驅動板與開發板之間用導線進行引腳連接,通過下載器往芯片中燒入程序后即可正常運行。程序可以正常開始運行,點擊復位按鈕RESET,數碼管顯示整體剩余時間,按下KEY1一下,數碼管第二位顯示1,再按一下顯示2,再按一下顯示0,如此循環,這是按鍵選擇洗衣機的強度模式,0代表強洗,1代表標準,2代表輕柔。圖中為強洗模式,按下啟動按鍵KEY0后,數碼管開始倒計時,DS0亮起,表示進水閥打開。如圖15所示,以強洗強度為例:圖15強洗模式下進水閥打開水位開關閉合,進水閥關閉,即DS0滅,洗滌燈DS2亮,如圖16所示,以強洗強度為例:圖16強洗模式下洗滌燈亮洗滌完成后洗滌燈DS2滅,排水閥打開,即DS1亮,如圖17所示:圖17強洗模式下洗滌完排水斷開水位開關,脫水燈亮,如圖18所示:圖18進行脫水脫水結束后脫水燈排水燈滅,排水閥關閉,DS1滅,進水閥打開,即DS0亮,水位開關閉合后,進水閥關閉,即DS0滅,第一次漂洗燈亮,即DS3亮,如圖19所示:圖19進水后開始第一次漂洗漂洗結束,第一次漂洗燈滅,即DS3滅,排水閥打開,即DS1亮,如圖21所示:圖20第一次漂洗結束,開始排水水位開關斷開,脫水燈亮,脫水結束后脫水燈排水燈滅,排水閥關閉,DS1滅,進水閥打開,即DS0亮,之后開始進行第二次漂洗,與第一次漂洗過程完全相同。最后第二次漂洗脫水結束后脫水燈排水燈滅,排水閥關閉,即DS1滅,洗衣結束,所有led燈全滅,倒計時停止。如圖21所示:圖21洗衣結束6總結本設計是基于VHDL語言進行編程,以實現整體預期的洗衣機控制功能,描述洗衣機控制器的模塊以及其中使用的數據可以根據實際情況進行配置。目標器件是FPGA芯片,采用分層設計方法完成各模塊的連接,通過仿真和實物測試驗證,證明能夠實現洗衣機控制器的主要功能。同時也還存在問題:編寫的程序能夠實現主要的洗衣功能但是代碼過于繁瑣,尤其是頂層文件使用例化語句調用并連接各個模塊時,代碼過于繁雜,不如用原理圖連接更為簡潔方便。該設計僅能初步實現一種可選擇三種洗衣強度的基本的洗衣機的流程,模式太過于單一,存在局限性。參考文獻朱偉.全自動直筒洗衣機FPGA控制器的開發設計[J].科技創新與應用,2017,(14):50.成超,任峻.基于VHDL的洗衣機控制器的設計[J].電子設計工程,2014,22(04):92-94+98.閆晶晶,張尚宇,王冰.基于單片機的全自動洗衣機控制系統設計[J].中國高新科技,2023,(13):19-21.王曉冬,陳紅友.基于單片機的全自動洗衣機控制系統設計[J].科技創新與應用,2017,(09):88.NWulandari,AGAbdullah.DesignandSimulationofWashingMachineusingFuzzyLogicController(FLC)[J].IOPConferenceSeries:MaterialsScienceandEngineering,2018,384(1).孫浩,付一含,趙根,徐棟義,王穎.基于Verilog的洗衣機控制電路設計[J].電腦知識與技術,2019,15(07):244-245.高學群.單片機控制的全自動洗衣機系統[J].時代農機,2015,42(06):57+59.李彩容.淺談單片機系統的電磁干擾與抗干擾措施[J].黑龍江科技信息,2011,(32):82.張繼東.自動控制技術在全自動洗衣機的應用[J].中國設備工程,2017,(05):110-111.郭忠,李濤,李勇,等.基于FPGA的洗衣機控制系統設計[J].電子設計工程,2012,20(13):190-192.DOI:10.14022/ki.dzsjgc.2012.13.017.陳飛云.基于VerilogHDL語言的全自動洗衣機控制器的設計與仿真[J].應用技術學報,2017,17(03):257-261.杜強.基于FPGA的智能洗衣機控制器的研究與仿真設計[D].哈爾濱理工大學,2016.梅江龍.波輪全自動洗衣機模塊化平臺的設計研究[J].日用電器,2021,(11):69-75.附錄1、時鐘計數模塊: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;--復位信號,下降沿有效,negativesec_1:outSTD_LOGIC--1s輸出一個脈沖信號);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--記最大數1s,50,000,000次--constantMAX_NUM:natural:=49;--記最大數1s,50,000,000次signalcnt_1:naturalrange0toMAX_NUM:=0;--計數寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s計時器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;--當右邊改變,立馬賦值給左邊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、電機控制模塊: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);--反轉elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正轉endif;endif;endif;endprocess;endarchitectureBehavioral;5、工作狀態顯示模塊: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論