基于VHDL的全自动洗衣机控制器设计
全自動洗衣機控制器設計
- 《數字電子技術》課程設計報告
- 《數字電子技術》課程設計任務書
- 設計內容與要求
- 1.概述
- 1.1EDA簡介
- 1.2開發軟件quartus簡介
- 2.基本原理
- 2.1洗衣機原理
- 2.2定時器原理
- 2.3狀態轉換原理
- 3.設計方案
- 4.設計驗證與測試
- 4.1設計軟件環境搭建
- 4.2定時模塊實現(DSMK.vhd和DSMK.vwf)
- 4.3狀態機實現(ZTJ.vhd和ZTJ.vwf)
- 4.4頂層設計實現(DCSJ.vhd和DCSJ.vwf)
- 5.結論
- 5.1問題與思考
- 5.2完成感想
- 參考文獻
- 附錄
- 1.定時模塊源代碼
- 2.狀態機源代碼
- 3.頂層設計源代碼
????????本文章發布時距離實踐已有些許時間,代碼和相關描述來自存留的作業文檔存根,保證邏輯正確性但不保證一些縮進和其他格式是否出現問題,可根據錯誤提示自行改正。本設計為非專業人士設計,存在效率以及整體規劃不夠理想的缺陷,僅提供參考。
《數字電子技術》課程設計報告
題 目: 全自動洗衣機控制器設計
專業班級: 通信17級
學 號: 000000000000
姓 名: XXXX
指導教師: XXX
完成日期: 2020.6.28
《數字電子技術》課程設計任務書
設計內容與要求
一、設計目的
????????設計全自動洗衣機控制器,學習較復雜的數字系統設計方法。
二、設計原理
????????設計一個簡易的全自動洗衣機控制器,該控制器可以實現全自動洗衣機的定時啟動,自動控制及定時設置等功能。其工作流程為:定時啟動→正轉20s→暫停10s→反轉20s→暫停10s→定時不到,重復上述過程,若定時已到,停止發出音響??刂破鞯脑O計主要是定時器的設計,利用減法計數器,時序控制電路和工作狀態控制電路等組成,可以實現正轉、反轉和暫停等洗衣機的工作過程,并且用四個數碼管可以顯示預置洗滌時間,按倒計時方式對洗滌過程進行計數顯示,直到時間到停機。
三、設計內容及要求
????????根據實驗原理,設計全自動洗衣機控制器的各功能模塊,通過按鍵可以設置預置洗滌時間,三種時間可選:15min,30min和45min,然后系統按洗衣機的工作原理模擬其工作過程,并用三個發光二極管表示正反轉和暫停三個狀態。
四、設計總結報告
????????根據以上的設計內容寫出設計報告,包括設計程序、軟件編譯、仿真波形圖,并做分析總結。
1.概述
1.1EDA簡介
????????EDA是電子設計自動化(Electronic Design Automation)的縮寫,在20世紀90年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發展而來的。
????????20世紀90年代,國際上電子和計算機技術較先進的國家,一直在積極探索新的電子電路設計方法,并在設計方法、工具等方面進行了徹底的變革,取得了巨大成功。在電子技術設計領域,可編程邏輯器件(如CPLD、FPGA)的應用,已得到廣泛的普及,這些器件為數字系統的設計帶來了極大的靈活性。這些器件可以通過軟件編程而對其硬件結構和工作方式進行重構,從而使得硬 件的設計可以如同軟件設計那樣方便快捷。這一切極大地改變了傳統的數字系統設計方法、設計過程和設計觀念,促進了EDA技術的迅速發展。
????????EDA技術就是以計算機為工具,設計者在EDA軟件平臺上,用硬件描述語言HDL完成設計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優化、布局、布線和仿真,直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術的出現,極大地提高了電路設計的效率和可操作性,減輕了設計者的勞動強度。
????????利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程的計算機上自動處理完成。
????????現在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA的應用。目前EDA技術已在各大公司、企事業單位和科研教學部門廣泛使用。例如在飛機制造過程中,從設計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術。
1.2開發軟件quartus簡介
????????Altera Quartus II 作為一種可編程邏輯的設計環境, 由于其強大的設計能力和直觀易用的接口,越來越受到數字系統設計者的歡迎。
????????Altera Quartus II (3.0和更高版本)設計軟件是業界唯一提供FPGA和固定功能HardCopy器件統一設計流程的設計工具。工程師使用同樣的低價位工具對 Stratix FPGA進行功能驗證和原型設計,又可以設計HardCopy Stratix器件用于批量成品。系統設計者現在能夠用Quartus II軟件評估HardCopy Stratix器件的性能和功耗,相應地進行最大吞吐量設計。
????????Altera的Quartus II可編程邏輯軟件屬于第四代PLD開發平臺。該平臺支持一個工作組環境下的設計要求,其中包括支持基于Internet的協作設計。Quartus平臺與Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供應商的開發工具相兼容。改進了軟件的LogicLock模塊設計功能,增添了FastFit編譯選項,推進了網絡編輯性能,而且提升了調試能力。
2.基本原理
2.1洗衣機原理
????????全自動洗衣機具有時間預置、模式選擇、自動控制及狀態顯示等功能。其工作流程為:預置時間→選擇模式→以模式設定程序驅動運轉→定時未到,重復上述過程,若定時已到,停止發出音響??刂破鞯脑O計主要是定時器的設計,利用減法計數器,時序控制電路和工作狀態控制電路等組成,可以實現正轉、反轉和暫停等洗衣機的工作過程,并且用四個數碼管可以顯示預置洗滌時間,按倒計時方式對洗滌過程進行計數顯示,直到時間到停機。其工作過程圖如下圖。
#mermaid-svg-rWYnu3FIogTgUi0A .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-rWYnu3FIogTgUi0A .label text{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .node rect,#mermaid-svg-rWYnu3FIogTgUi0A .node circle,#mermaid-svg-rWYnu3FIogTgUi0A .node ellipse,#mermaid-svg-rWYnu3FIogTgUi0A .node polygon,#mermaid-svg-rWYnu3FIogTgUi0A .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rWYnu3FIogTgUi0A .node .label{text-align:center;fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .node.clickable{cursor:pointer}#mermaid-svg-rWYnu3FIogTgUi0A .arrowheadPath{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-rWYnu3FIogTgUi0A .flowchart-link{stroke:#333;fill:none}#mermaid-svg-rWYnu3FIogTgUi0A .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-rWYnu3FIogTgUi0A .edgeLabel rect{opacity:0.9}#mermaid-svg-rWYnu3FIogTgUi0A .edgeLabel span{color:#333}#mermaid-svg-rWYnu3FIogTgUi0A .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-rWYnu3FIogTgUi0A .cluster text{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-rWYnu3FIogTgUi0A .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rWYnu3FIogTgUi0A text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-rWYnu3FIogTgUi0A .actor-line{stroke:grey}#mermaid-svg-rWYnu3FIogTgUi0A .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-rWYnu3FIogTgUi0A .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-rWYnu3FIogTgUi0A #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-rWYnu3FIogTgUi0A .sequenceNumber{fill:#fff}#mermaid-svg-rWYnu3FIogTgUi0A #sequencenumber{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A #crosshead path{fill:#333;stroke:#333}#mermaid-svg-rWYnu3FIogTgUi0A .messageText{fill:#333;stroke:#333}#mermaid-svg-rWYnu3FIogTgUi0A .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rWYnu3FIogTgUi0A .labelText,#mermaid-svg-rWYnu3FIogTgUi0A .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-rWYnu3FIogTgUi0A .loopText,#mermaid-svg-rWYnu3FIogTgUi0A .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-rWYnu3FIogTgUi0A .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-rWYnu3FIogTgUi0A .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rWYnu3FIogTgUi0A .noteText,#mermaid-svg-rWYnu3FIogTgUi0A .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-rWYnu3FIogTgUi0A .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-rWYnu3FIogTgUi0A .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-rWYnu3FIogTgUi0A .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-rWYnu3FIogTgUi0A .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .section{stroke:none;opacity:0.2}#mermaid-svg-rWYnu3FIogTgUi0A .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-rWYnu3FIogTgUi0A .section2{fill:#fff400}#mermaid-svg-rWYnu3FIogTgUi0A .section1,#mermaid-svg-rWYnu3FIogTgUi0A .section3{fill:#fff;opacity:0.2}#mermaid-svg-rWYnu3FIogTgUi0A .sectionTitle0{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .sectionTitle1{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .sectionTitle2{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .sectionTitle3{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-rWYnu3FIogTgUi0A .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .grid path{stroke-width:0}#mermaid-svg-rWYnu3FIogTgUi0A .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-rWYnu3FIogTgUi0A .task{stroke-width:2}#mermaid-svg-rWYnu3FIogTgUi0A .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .taskText:not([font-size]){font-size:11px}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-rWYnu3FIogTgUi0A .task.clickable{cursor:pointer}#mermaid-svg-rWYnu3FIogTgUi0A .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rWYnu3FIogTgUi0A .taskText0,#mermaid-svg-rWYnu3FIogTgUi0A .taskText1,#mermaid-svg-rWYnu3FIogTgUi0A .taskText2,#mermaid-svg-rWYnu3FIogTgUi0A .taskText3{fill:#fff}#mermaid-svg-rWYnu3FIogTgUi0A .task0,#mermaid-svg-rWYnu3FIogTgUi0A .task1,#mermaid-svg-rWYnu3FIogTgUi0A .task2,#mermaid-svg-rWYnu3FIogTgUi0A .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutside0,#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutside2{fill:#000}#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutside1,#mermaid-svg-rWYnu3FIogTgUi0A .taskTextOutside3{fill:#000}#mermaid-svg-rWYnu3FIogTgUi0A .active0,#mermaid-svg-rWYnu3FIogTgUi0A .active1,#mermaid-svg-rWYnu3FIogTgUi0A .active2,#mermaid-svg-rWYnu3FIogTgUi0A .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-rWYnu3FIogTgUi0A .activeText0,#mermaid-svg-rWYnu3FIogTgUi0A .activeText1,#mermaid-svg-rWYnu3FIogTgUi0A .activeText2,#mermaid-svg-rWYnu3FIogTgUi0A .activeText3{fill:#000 !important}#mermaid-svg-rWYnu3FIogTgUi0A .done0,#mermaid-svg-rWYnu3FIogTgUi0A .done1,#mermaid-svg-rWYnu3FIogTgUi0A .done2,#mermaid-svg-rWYnu3FIogTgUi0A .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-rWYnu3FIogTgUi0A .doneText0,#mermaid-svg-rWYnu3FIogTgUi0A .doneText1,#mermaid-svg-rWYnu3FIogTgUi0A .doneText2,#mermaid-svg-rWYnu3FIogTgUi0A .doneText3{fill:#000 !important}#mermaid-svg-rWYnu3FIogTgUi0A .crit0,#mermaid-svg-rWYnu3FIogTgUi0A .crit1,#mermaid-svg-rWYnu3FIogTgUi0A .crit2,#mermaid-svg-rWYnu3FIogTgUi0A .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-rWYnu3FIogTgUi0A .activeCrit0,#mermaid-svg-rWYnu3FIogTgUi0A .activeCrit1,#mermaid-svg-rWYnu3FIogTgUi0A .activeCrit2,#mermaid-svg-rWYnu3FIogTgUi0A .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-rWYnu3FIogTgUi0A .doneCrit0,#mermaid-svg-rWYnu3FIogTgUi0A .doneCrit1,#mermaid-svg-rWYnu3FIogTgUi0A .doneCrit2,#mermaid-svg-rWYnu3FIogTgUi0A .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-rWYnu3FIogTgUi0A .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-rWYnu3FIogTgUi0A .milestoneText{font-style:italic}#mermaid-svg-rWYnu3FIogTgUi0A .doneCritText0,#mermaid-svg-rWYnu3FIogTgUi0A .doneCritText1,#mermaid-svg-rWYnu3FIogTgUi0A .doneCritText2,#mermaid-svg-rWYnu3FIogTgUi0A .doneCritText3{fill:#000 !important}#mermaid-svg-rWYnu3FIogTgUi0A .activeCritText0,#mermaid-svg-rWYnu3FIogTgUi0A .activeCritText1,#mermaid-svg-rWYnu3FIogTgUi0A .activeCritText2,#mermaid-svg-rWYnu3FIogTgUi0A .activeCritText3{fill:#000 !important}#mermaid-svg-rWYnu3FIogTgUi0A .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-rWYnu3FIogTgUi0A g.classGroup text .title{font-weight:bolder}#mermaid-svg-rWYnu3FIogTgUi0A g.clickable{cursor:pointer}#mermaid-svg-rWYnu3FIogTgUi0A g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rWYnu3FIogTgUi0A g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-rWYnu3FIogTgUi0A .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-rWYnu3FIogTgUi0A .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rWYnu3FIogTgUi0A .dashed-line{stroke-dasharray:3}#mermaid-svg-rWYnu3FIogTgUi0A #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A .commit-id,#mermaid-svg-rWYnu3FIogTgUi0A .commit-msg,#mermaid-svg-rWYnu3FIogTgUi0A .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-rWYnu3FIogTgUi0A g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-rWYnu3FIogTgUi0A g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rWYnu3FIogTgUi0A g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rWYnu3FIogTgUi0A .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rWYnu3FIogTgUi0A .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-rWYnu3FIogTgUi0A .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-rWYnu3FIogTgUi0A .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rWYnu3FIogTgUi0A .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-rWYnu3FIogTgUi0A .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-rWYnu3FIogTgUi0A .edgeLabel text{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rWYnu3FIogTgUi0A .node circle.state-start{fill:black;stroke:black}#mermaid-svg-rWYnu3FIogTgUi0A .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-rWYnu3FIogTgUi0A #statediagram-barbEnd{fill:#9370db}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-state .divider{stroke:#9370db}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-rWYnu3FIogTgUi0A .note-edge{stroke-dasharray:5}#mermaid-svg-rWYnu3FIogTgUi0A .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-rWYnu3FIogTgUi0A .error-icon{fill:#522}#mermaid-svg-rWYnu3FIogTgUi0A .error-text{fill:#522;stroke:#522}#mermaid-svg-rWYnu3FIogTgUi0A .edge-thickness-normal{stroke-width:2px}#mermaid-svg-rWYnu3FIogTgUi0A .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-rWYnu3FIogTgUi0A .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-rWYnu3FIogTgUi0A .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rWYnu3FIogTgUi0A .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rWYnu3FIogTgUi0A .marker{fill:#333}#mermaid-svg-rWYnu3FIogTgUi0A .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-rWYnu3FIogTgUi0A {color: rgba(0, 0, 0, 0.75);font: ;}否是開機預置洗滌時間模式選擇開始洗滌洗滌結束是否再次洗滌結束2.2定時器原理
????????定時器與計時器不同的是定時器是倒計時,而計時器是正計時,因此有一個減法和加法的區別。定時器需要先將輸入的CLK信號分頻到1Hz然后在每個上升沿減一。這就涉及到了減法借位的問題,而且單位是時間,所以需要對每一位單獨設置進制數,最高位為分鐘的十位設為6進制,次位為分鐘的個位設為9進制,再次位為秒鐘的十位設為6進制,最低位為秒鐘的個位設為9進制。預置定時數據輸入后會存在每次計數都會輸入數據,倒計時結束后,還應發出信號并停止計時,因此設置一個變量表示計數狀態是不可或缺的。該變量在開始時置為1,結束時置為零。
2.3狀態轉換原理
????????洗衣機存在正轉、反轉、暫停三個狀態,但是為了方便起見,設置四個狀態,正轉、正轉暫停、反轉、反轉暫停。本設計采用Moore狀態機,在時鐘信號進程下,滿足條件則發生狀態轉移,在當前狀態進程下,當前狀態改變則更新下一個狀態,并且輸入狀態信號,一直到倒計時結束時,停止狀態轉移。
3.設計方案
????????全自動洗衣機可以預置時間,選擇模式,然后開始運行,結束發出信號。其中可選模式有強力洗滌,普通洗滌,甩干三種模式。所有輸入信號有開/關機信號、預置時間信號、模式選擇信號、開始/暫停信號、時鐘源信號(內置);輸出信號有數碼管、二極管、蜂鳴器。考慮到功能眾多,將整體設計劃分為三個部分:定時模塊、狀態機和頂層設計。具體的模塊與信號關系如上圖。
????????定時模塊主要處理輸入的預置時間信號,首先將輸入的CLK信號分頻為1Hz,然后在開始信號到達后將預置信號的信息送入定時器開始倒計時,當倒計時結束后送出分頻信號和倒計時完成信號,還會實時的將時間信息顯示在數碼管上。倒計時的邏輯較為特殊,考慮到狀態機和倒計時的同步性,在狀態機上不加開始運行信號,由倒計時完成信號的高電平期間控制狀態機運行,因此,倒計時開始和結束的瞬間都會改變倒計時結束的信號。
????????狀態機會根據秒鐘信號和模式選擇信號使的洗衣機按照一定的規律運行,并將其狀態顯示在二極管上。狀態機有四個狀態,不同的模式下狀態機運作方式不同,
當處于強力洗滌模式時,正轉20s,正轉暫停10s,反轉20s,反轉暫停10s;當處于普通洗滌模式時,正轉15s,正轉暫停15s,反轉15s,反轉暫停15s;當處于甩干模式時,正轉15s,正轉暫停15s,反轉0s,反轉暫停0s。詳細狀態轉移如下圖。
????????頂層文件設計是將所有模塊組合在一起拼成一個完整的功能電路,將外部信號與內部信號連接在一起完成設計的最后一步。選擇硬件板也是必不可少的一部分,本設計選擇了模式9作為硬件環境,其中含有8個帶有譯碼器的數碼管,以及8個并行輸出二極管和一個蜂鳴器。還有8個單脈沖按鍵,考慮到既滿足必須器件且保持輸入統一化,因此選擇模式9。數碼管的顯示為左到右依次為分鐘十位,分鐘個位,秒鐘十位,秒鐘個位。二極管左到右,全滅為關機狀態,亮滅滅為正轉狀態,滅亮滅為暫停狀態,滅滅亮為反轉狀態,亮亮亮表示當前選擇強力洗滌模式,亮亮滅表示當前選擇甩干模式,滅亮亮表示當前選擇普通洗滌模式。蜂鳴器發出響聲表示洗滌完成。由于選擇了8個脈沖按鍵,因此按鍵驅動程序也變的復雜起來,把單脈沖轉換成需要的信號顯得尤為重要。
4.設計驗證與測試
4.1設計軟件環境搭建
????????本設計使用軟件QUARTUS II開發,硬件使用的GW48-PK3的主板和GW3C40的適配板。開發時選擇目標器件為CycloneIII的EP3C40Q240C8。如下圖所示。新建工程文件命名為keshe并新建DSMK.vhd、ZTJ.vhd、DCSJ.vhd、DSMK.vwf、ZTJ.vwf、DCSJ.vwf文件。
4.2定時模塊實現(DSMK.vhd和DSMK.vwf)
????????定時模塊的輸入有時鐘源信號(CLK)、電源信號(DYXH)、預置時間信號(YZSJ)、開始運行信號(KSYX);輸出信號有秒鐘輸出信號(MZSC)、完成判定信號(WCPD)、時間顯示信號(SJXS)。
????????時鐘源信號輸入為4Hz和方波信號,經過分頻后傳遞給秒鐘輸出信號輸出;電源信號為按鍵輸入的單脈沖信號,需要經過轉化變為每按一次就改變電平。預置時間信號也為單脈沖信號,每按一次改變預置時間:15分鐘→30分鐘→40分鐘,共三種情況,每次按鍵還要使得數碼管上顯示對應的預置時間,該按鍵僅在電源打開,完成判定信號為低電平時有效,且只在按鍵單脈沖上升沿上改變預置時間;開始運行信號能將預置的時間送入倒計時進程,且觸發倒計時,該信號為單脈沖信號,在觸發后第一個秒種上升沿傳遞預置時間并觸發倒計時。
????????秒鐘輸出信號是分頻時鐘源后的信號;完成判定信號是倒計時的一個狀態信號,當倒計時開始的那個秒鐘上升沿變為高電平,在倒計時結束那個秒鐘上升沿變為低電平,其他時間為低電平;時間顯示信號是一個16位數據,其16進制字符表示時間,高位到低位每四位連接一個數碼管,如(1500)16表示15分鐘,當完成判定信號為低電平時顯示預置時間,否則顯示倒計時時間。
????????該模塊進程繁多,實現進程之間的信號傳遞比較繁瑣,需要對進程和信號理解通透,且設置的中間信號較多,須有清楚的邏輯思路。應該熟練運用VHDL語句及QUARTUS II軟件。設計的模塊代碼見附錄,模塊圖如下圖。
????????時序仿真波形圖如圖4-2-2和圖4-2-3,觀察圖4-2-2發現電源信號功能正常,高電平時其他各項都有信號,低電平時,其他各項均無信號;預置時間信號功能正常,能夠改變預置時間,且在倒計時狀態無響應,在未預置時間時進入默認的40分鐘選項;開始運行信號功能正常,能夠送入預置時間且觸發倒計時,并且在倒計時狀態無響應;秒鐘輸出信號功能正常,完成了分頻;完成判定信號能夠在開始倒計時時變為高電平;觀察圖4-2-3可以發現,模塊在關機重啟后顯示的是上次的預置時間,且依舊可以預置時間,而倒計時結束后預置時間點擊開始運行又可以繼續倒計時,無須關機重啟,完成判定信號也在倒計時結束后自動變為低電平。
4.3狀態機實現(ZTJ.vhd和ZTJ.vwf)
????????狀態機的輸入有電源信號(DYXH)、模式輸入信號(MSSR)、秒鐘輸入信號(MZSR)、完成判定信號(WCPD);輸出信號有狀態顯示信號(ZTXS)。
????????電源信號與定時模塊一致,不再贅述;模式輸入信號是一個按鍵發出的單脈沖信號,該信號能夠改變寄存器內所存的18位數據,從高位到低位,前4位是反轉暫停時間秒數,緊跟的5位是反轉時間秒數,再緊跟4位是正轉暫停秒數,最后5位是正轉秒數。秒鐘輸入信號即為定時模塊秒鐘輸出信號,該信號輸入為了讓狀態機在規定的時間點轉移狀態;完成判定信號即為定時模塊的完成判定信號,該信號為高電平時狀態機會轉移狀態,并使顯示信號顯示當前狀態,否則顯示所選模式。
????????狀態顯示信號包含狀態機以及所選模式的信息,是一個3位數據,從高位到低位表示三個二極管的亮/滅情況,當完成判定信號為低電平且電源打開時,狀態顯示信號顯示三種模式,依次為普通洗滌模式(滅亮亮)→強力洗滌模式(亮亮亮)→甩干模式(亮亮滅);當完成判定信號位高電平且電源打開時顯示三種狀態,依次為正轉(亮滅滅)→暫停(滅亮滅)→反轉(滅滅亮);當電源關閉時,輸出全零信號即三燈全滅。
????????設計的模塊代碼見附錄,模塊圖如下圖。
????????時序仿真圖如圖4-3-2、圖4-3-3、圖4-3-4和圖4-3-5。在圖4-3-2中可以看出電源信號功能正常,完成判定信號在定時模塊里跟隨電源會變為低電平,但是這里是手動輸入信號,因此沒有跳變,但電源信號功能不受影響。模式選擇信號未跳變時,程序自己選擇默認模式即普通洗滌模式。完成判定信號功能正常,能夠在指定時間內運行狀態機,并且完成后繼續顯示所選模式。狀態顯示信號功能正常,能夠顯示目標狀態,但是是時序仿真可以看到有延遲和毛刺。從圖4-3-3可以看出模式選擇按鍵功能正常,狀態顯示也正常,統計對應狀態的秒鐘周期數發現與目標要求一致,實現了正轉15s→暫停15s→反轉15s→暫停15s。從圖4-3-4可以看出模式選擇按鍵功能正常,狀態顯示也正常,統計對應狀態的秒鐘周期數發現與目標要求一致,實現了正轉20s→暫停10s→反轉20s→暫停10s。從圖4-3-5可以看出模式選擇按鍵功能正常,狀態顯示也正常,統計對應狀態的秒鐘周期數發現與目標要求一致,實現了正轉15s→暫停15s→正轉15s→暫停15s。
4.4頂層設計實現(DCSJ.vhd和DCSJ.vwf)
????????頂層設計的輸入有時鐘源信號(CLK)、蜂鳴器輸入時鐘(FMQR)、電源信號(DYXH)、預置時間信號(YZSJ)、開始運行信號(KSYX)和模式選擇信號(MSXZ);輸出信號有蜂鳴器輸出信號(FMQC)、狀態顯示信號(ZTXS)、時間顯示信號(SJXS)。
????????時鐘源信號選擇4Hz的方波信號,與定時模塊的時鐘源信號相連接;蜂鳴器輸入時鐘選擇4096Hz的方波信號;電源信號、預置時間信號、開始運行信號和模式選擇信號都是來自按鍵的單脈沖信號分別與定時模塊和狀態機對應信號相連接。
????????蜂鳴器輸出信號使得蜂鳴器在倒計時完成后發出響聲5s;狀態顯示信號來自于狀態機的輸出,時間顯示信號來自于定時模塊的輸出。
????????頂層設計的模塊圖如圖4-4-1,RTL圖如圖4-4-2。代碼見附錄。
????????時序仿真圖如圖4-4-3和圖4-4-4??紤]到設計的三個時間較長,雖然可以提高仿真時鐘源頻率,但是考慮到電腦性能及運行時間,故將15分鐘、30分鐘和40分鐘分別改為1分鐘、2分鐘和4分鐘,并不影響仿真結果。從圖4-4-3中可以看出開機、模式選擇、預置時間和開始運行都實現了目標要求,時間顯示和狀態顯示也很正常。從圖4-4-4可以看出來,蜂鳴器正常工作,倒計時結束后與預置時間和選擇模式可繼續下一次任務,無需關機重啟。
圖 4-4-3 頂層設計(DCSJ)時序仿真圖一 圖 4-4-4 頂層設計(DCSJ)時序仿真圖二????????本次設計選擇模式9,其引腳鎖定圖如圖4-5-1,電路結構圖如圖4-5-2,成功下載到開發板如圖4-5-3。鍵1是開/關電源,按鍵2是預置時間,按鍵3是選擇模式,按鍵4是開始運行;二極管D3、D2、D1顯示當前狀態或所選模式,數碼管4、3、2、1顯示時間。
5.結論
5.1問題與思考
????????雖然完成了該設計但是仍然存在一些問題。在圖4-4-4中可以看見完成最后一秒是“多余”的。這是因為倒計時是按60s到0s共計61秒,導致最后一秒顯得“多余”。事實上第60s還未開始,但是設計程序時由于理解偏差使得從60s開始倒計時。電源信號事實上可以設置為電源線上一個開關,在程序里事實上并未做到真正的關機,因為程序一直在識別電源信號,所以只是顯示的信息與關機一樣而已。查看附錄代碼會發現電源按鍵的進程多次出現,這是由于前期準備不充分,計劃不完善,后期修改程序導致代碼繁瑣效率變低,影響實際的時間延遲。
5.2完成感想
????????經過幾天的思考和測試,程序終于完成了,雖然還有些許瑕疵,但是功能上已經滿了目標需求。整個設計過程比較曲折,前期的學習并沒有使得我對VHDL語言達到熟練使用的地步,所以前期工作顯得異常辛苦,好在對數字電路的理解較為通透,有大致的設計思路和方法,通過查找課本和網絡上的資料,逐漸熟悉VHDL語言的語法,慢慢感受到了它的魅力和精彩之處,對于硬件關系的敘述全面又不失一般性,簡潔卻又功能強大。它里面的信號SIGNAL仿佛一把萬能鑰匙打開了所有進程之間的大門,使得看似無理的電路在時間信號驅動下變得華麗多姿。不過對于我來說真正理解它還是不容易的,這也使得前期我總是為了某個需要的波形絞盡腦汁,走很多彎路,甚至一度篤定不可能出現這種波形,直到后期漸入佳境,改變原本的人的思維,從機器的角度思考問題,深刻理解同步的概念,才獲得了一些進步。事實上距離有限器件內想要什么波形就有什么波形的境界相差甚遠,但只要不斷學習和進步,就一定不會錯。
????????事實上這次我收獲最大的就是進程之間的通信,VHDL語言規定了每個信號或者變量都必須被完整描述,比如在兩個進程內給同一信號無條件賦值就會報錯:該變量不能有多驅動,這就是得一些游走在各個地方需要被賦值的信號總要嚴格的完整描述,而一種簡單方法就是設置多個信號,每個進程內的信號賦值可以由別的信號描述,這樣看似每個信號都被獨立描述,實則相互聯系,可以產生需要的波形。
參考文獻
[1] 潘松,黃繼業.EDA技術實用教程——Verilog HDL版[M].4版.北京:科學出版社,2010.
[2] 潘明,潘松.數字電子技術基礎[M].北京:科學出版社,2008.
[3] 潘松,潘明,黃繼業.現代計算機組成原理[M].2版.北京:科學出版社,2013.
[4] 曾繁泰,侯亞寧,崔元明.可編程器件應用導論[M].北京:清華大學出版社,2001.
[5] Altera Corporation. Altera Digital Library[G]. Altera,2002.
[6] 潘松,黃繼業.EDA技術實用教程——VHDL版[M].5版.北京:科學出版社,2013.
附錄
1.定時模塊源代碼
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DSMK IS--定時模塊PORT ( CLK : IN STD_LOGIC;--時鐘源信號DYXH : IN STD_LOGIC;----電源信號YZSJ : IN STD_LOGIC;--預置時間信號KSYX : IN STD_LOGIC;--開始運行信號MZSC : OUT STD_LOGIC;--秒鐘輸出信號WCPD : OUT STD_LOGIC;--完成判定信號SJXS : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--時間顯示信號 END; ARCHITECTURE one OF DSMK ISSIGNAL CNTX : STD_LOGIC;SIGNAL MZSC_TEMP : STD_LOGIC;SIGNAL WCPD_TEMP : STD_LOGIC;SIGNAL DYXH_TEMP : STD_LOGIC;SIGNAL KSYX_T0 : STD_LOGIC;SIGNAL KSYX_T1 : STD_LOGIC;SIGNAL SJXS_TEMP : STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL SJXS_TMEP : STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL CNT3 : STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL SJXS_0 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SJXS_1 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SJXS_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SJXS_3 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(DYXH) IS --電源按鍵驅動進程BEGINIF DYXH'EVENT AND DYXH = '1' THEN DYXH_TEMP <= NOT DYXH_TEMP;END IF;END PROCESS;PROCESS(KSYX) IS--開始按鍵驅動進程BEGINIF KSYX_T1 = '1' THEN KSYX_T0 <= KSYX_T0 AND (NOT KSYX_T1);ELSE IF KSYX'EVENT AND KSYX = '1' THEN KSYX_T0 <= '1';END IF;END IF;END PROCESS;MZSCJC: PROCESS(CLK) IS--秒鐘輸出進程(4HZ)BEGINIF CLK'EVENT AND CLK = '1' THENCNTX <= NOT CNTX;IF CNTX = '1' THENMZSC_TEMP <= NOT MZSC_TEMP;END IF;END IF;END PROCESS MZSCJC;YZSJJC: PROCESS(YZSJ) IS--預置時間進程BEGINIF DYXH_TEMP = '1' THEN IF SJXS_TEMP <= x"0000" THEN SJXS_TEMP <= x"0400";ELSE IF YZSJ'EVENT AND YZSJ = '1' THENIF WCPD_TEMP = '0' THENCASE(CNT3) ISWHEN "01" => CNT3 <= CNT3 + 1;SJXS_TEMP <= x"0200";WHEN "10" => CNT3 <= "00";SJXS_TEMP <= x"0400";WHEN OTHERS => CNT3 <= CNT3 + 1;SJXS_TEMP <= x"0100";END CASE;END IF;END IF;END IF;END IF;END PROCESS YZSJJC;WCPDJC: PROCESS(MZSC_TEMP) IS--完成判定進程BEGINIF KSYX_T0 = '1' THENIF MZSC_TEMP'EVENT AND MZSC_TEMP = '1' THENKSYX_T1 <= '1';END IF;ELSE KSYX_T1 <= '0';END IF;IF MZSC_TEMP'EVENT AND MZSC_TEMP = '1' THEN--時間顯示IF DYXH_TEMP = '1' THENIF (KSYX_T0 AND (NOT WCPD_TEMP)) = '1' THENCASE(CNT3) ISWHEN "10" => SJXS_3 <= x"0";SJXS_2 <= x"2";SJXS_1 <= x"0";SJXS_0 <= x"0";WHEN "00" => SJXS_3 <= x"0";SJXS_2 <= x"4";SJXS_1 <= x"0";SJXS_0 <= x"0";WHEN OTHERS => SJXS_3 <= x"0";SJXS_2 <= x"1";SJXS_1 <= x"0";SJXS_0 <= x"0";END CASE;WCPD_TEMP <= '1';ELSEIF SJXS_0 = x"0" THENIF SJXS_1 = x"0" THENIF SJXS_2 = x"0" THENIF SJXS_3 = x"0" THEN WCPD_TEMP <= '0';ELSE SJXS_3 <= SJXS_3 - 1;SJXS_2 <= x"9";SJXS_1 <= x"5";SJXS_0 <= x"9";WCPD_TEMP <= '1';END IF;ELSESJXS_2 <= SJXS_2 - 1;SJXS_1 <= x"5";SJXS_0 <= x"9";WCPD_TEMP <= '1';END IF;ELSESJXS_1 <= SJXS_1 - 1;SJXS_0 <= x"9";WCPD_TEMP <= '1';END IF;ELSESJXS_0 <= SJXS_0 - 1;WCPD_TEMP <= '1';END IF;END IF;ELSESJXS_0 <= x"0";SJXS_1 <= x"0";SJXS_2 <= x"0";SJXS_3 <= x"0";WCPD_TEMP <= '0';END IF;END IF;END PROCESS WCPDJC;SJXS <= SJXS_3&SJXS_2&SJXS_1&SJXS_0 WHEN (DYXH_TEMP AND WCPD_TEMP) = '1' ELSE SJXS_TEMP WHEN DYXH_TEMP = '1' ELSE x"0000";WCPD <= WCPD_TEMP;MZSC <= MZSC_TEMP; END;2.狀態機源代碼
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ZTJ IS--狀態機PORT (DYXH : IN STD_LOGIC;----電源信號MSSR : IN STD_LOGIC;--模式輸入信號MZSR : IN STD_LOGIC;--秒鐘輸入信號WCPD : IN STD_LOGIC;--完成判定信號ZTXS : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--狀態顯示信號 END; ARCHITECTURE one OF ZTJ ISSIGNAL DYXH_TEMP : STD_LOGIC;SIGNAL CNT_1 : STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL CNT_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL CNT_3 : STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL CNT_4 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL CNT3 : STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL ZT_TEMP : STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL ZTXS_TEMP : STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL ZTXS_F : STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL MSXZ : STD_LOGIC_VECTOR(17 DOWNTO 0); BEGINPROCESS(DYXH) IS --電源按鍵驅動進程BEGINIF DYXH'EVENT AND DYXH = '1' THEN DYXH_TEMP <= NOT DYXH_TEMP;END IF;END PROCESS;PROCESS(MSSR) IS --模式顯示進程BEGINIF DYXH_TEMP = '1' THENIF WCPD = '0' THENIF ZTXS_F = "000" THEN ZTXS_F <= "011";MSXZ <= "11"&x"DFEE";ELSE IF MSSR'EVENT AND MSSR = '1' THENCASE(CNT3) ISWHEN "01" => CNT3 <= CNT3 + 1;MSXZ <= "10"&x"A953";ZTXS_F <= "111";WHEN "10" => CNT3 <= "00";MSXZ <= "00"&x"01EE";ZTXS_F <= "110";WHEN OTHERS => CNT3 <= CNT3 + 1;MSXZ <= "11"&x"DFEE";ZTXS_F <= "011";END CASE;END IF;END IF;END IF;ELSE ZTXS_F <= "000";END IF;END PROCESS;PROCESS(MZSR) IS--狀態轉移進程BEGINIF DYXH_TEMP = '1' THEN IF MZSR'EVENT AND MZSR = '1' THENIF WCPD = '1' THENIF CNT_1=(MSXZ(4)&MSXZ(3)&MSXZ(2)&MSXZ(1)&MSXZ(0)) THENZT_TEMP <= "001";IF CNT_2 = (MSXZ(8)&MSXZ(7)&MSXZ(6)&MSXZ(5)) THENIF (MSXZ(17) OR MSXZ(10)) = '0' THEN ZT_TEMP <= "000";CNT_1 <= "00000";CNT_2 <= "0000";ELSE ZT_TEMP <= "011";IF CNT_3= (MSXZ(13)&MSXZ(12)&MSXZ(11)&MSXZ(10)&MSXZ(9)) THENZT_TEMP <= "010";IF CNT_4=(MSXZ(17)&MSXZ(16)&MSXZ(15)&MSXZ(14)) THENCNT_1 <= "00000";CNT_2 <= "0000";CNT_3 <= "00000";CNT_4 <= "0000";ZT_TEMP <= "000";ELSE CNT_4 <= CNT_4 + 1;END IF;ELSECNT_3 <= CNT_3 + 1;END IF;END IF;ELSE CNT_2 <= CNT_2 + 1;END IF;ELSE CNT_1 <= CNT_1 + 1;END IF;END IF;END IF;END IF;END PROCESS;PROCESS(ZT_TEMP) IS--狀態顯示進程BEGINIF DYXH_TEMP = '1' THENCASE(ZT_TEMP) ISWHEN "000" => ZTXS_TEMP <= "100";WHEN "001" => ZTXS_TEMP <= "010";WHEN "011" => ZTXS_TEMP <= "001";WHEN "010" => ZTXS_TEMP <= "010";WHEN OTHERS => ZTXS_TEMP <= "100";END CASE;ELSEZTXS_TEMP <= "000";END IF;END PROCESS;ZTXS <= ZTXS_F WHEN WCPD = '0' ELSE ZTXS_TEMP; END;3.頂層設計源代碼
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DCSJ IS--頂層設計PORT ( CLK : IN STD_LOGIC;--時鐘源信號(4HZ)FMQR : IN STD_LOGIC;--蜂鳴器輸入時鐘(4096HZ)DYXH : IN STD_LOGIC;--電源信號(單脈沖按鍵)YZSJ : IN STD_LOGIC;--預置時間信號(單脈沖按鍵)KSYX : IN STD_LOGIC;--開始運行信號(單脈沖按鍵)MSXZ : IN STD_LOGIC;--模式選擇信號(單脈沖按鍵)FMQC : OUT STD_LOGIC;--蜂鳴器輸出信號ZTXS : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);--狀態顯示信號(二極管)SJXS : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--時間顯示信號(數碼管) END; ARCHITECTURE one OF DCSJ ISSIGNAL WCPD : STD_LOGIC;SIGNAL MZSC : STD_LOGIC;SIGNAL TEMP0 : STD_LOGIC;SIGNAL TEMP1 : STD_LOGIC;SIGNAL TEMPD : STD_LOGIC;SIGNAL CNT : INTEGER RANGE 0 TO 4; COMPONENT DSMK IS--定時模塊PORT ( CLK : IN STD_LOGIC;--時鐘源信號DYXH : IN STD_LOGIC;----電源信號YZSJ : IN STD_LOGIC;--預置時間信號KSYX : IN STD_LOGIC;--開始運行信號MZSC : OUT STD_LOGIC;--秒鐘輸出信號WCPD : OUT STD_LOGIC;--完成判定信號SJXS : OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--時間顯示信號 END COMPONENT; COMPONENT ZTJ IS--狀態機 PORT (DYXH : IN STD_LOGIC;----電源信號MSSR : IN STD_LOGIC;--模式輸入信號MZSR : IN STD_LOGIC;--秒鐘輸入信號WCPD : IN STD_LOGIC;--完成判定信號ZTXS : OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--狀態顯示信號 END COMPONENT; BEGINPROCESS(DYXH) IS --電源按鍵驅動進程BEGINIF DYXH'EVENT AND DYXH = '1' THEN TEMPD <= NOT TEMPD;END IF;END PROCESS;PROCESS(WCPD,TEMP1) IS--蜂鳴器驅動進程BEGINIF TEMPD = '1' THEN IF TEMP1 = '0' THENIF WCPD'EVENT AND WCPD = '0' THEN TEMP0 <= '1';END IF;ELSE TEMP0 <= NOT TEMP1;END IF;ELSE TEMP0 <= '0';END IF;END PROCESS;PROCESS(MZSC) IS--蜂鳴器關閉進程BEGINIF MZSC'EVENT AND MZSC = '1' THENIF TEMPD = '1' THENIF TEMP0 = '1' THEN CNT <= CNT + 1;IF CNT = 4 THEN TEMP1 <= '1';END IF;ELSE TEMP1 <= '0';END IF;ELSE TEMP1 <= '0';END IF;END IF;END PROCESS;FMQC <= FMQR WHEN TEMP0 = '1' ELSE '0';U1 : DSMK PORT MAP(CLK => CLK,DYXH => DYXH,YZSJ => YZSJ,KSYX => KSYX,MZSC => MZSC,WCPD => WCPD,SJXS => SJXS);U2 : ZTJ PORT MAP(DYXH => DYXH,MSSR => MSXZ,MZSR => MZSC,WCPD => WCPD,ZTXS => ZTXS); END;總結
以上是生活随笔為你收集整理的基于VHDL的全自动洗衣机控制器设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【单片机】继电器控制
- 下一篇: 执法文书打印的实现(二):基于freem