電梯控制器報告(Verilog實現)_第1頁
電梯控制器報告(Verilog實現)_第2頁
電梯控制器報告(Verilog實現)_第3頁
電梯控制器報告(Verilog實現)_第4頁
電梯控制器報告(Verilog實現)_第5頁
已閱讀5頁,還剩90頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

華華中科技大學課程設計報告數字電路與邏輯設計課程設計報告題目:電梯控制器的設計與實現專業:計算機科學與技術班級:學號:姓名:電話:郵件:974985526@分組:完成日期:2015.10.8指導教師:

不建議采用本報告所采用的設計方案(異步時序),因為這樣的實現過于復雜且難以調試。建議僅采用統一的CLK作為always語句的更新條件,以實現同步時序的電路。

目錄TOC\o"1-3"\h\u1 課程設計概述 51.1 課設目的 51.2 課設要求 51.3 課設任務 51.4 實驗環境 52 基本方案設計 72.1 設計需求 72.2 總體結構設計 82.2.1 時鐘分頻 82.2.2 七段譯碼器顯示模塊 82.2.3 電梯請求控制模塊 82.2.4 電梯開關門控制模塊 92.2.5 電梯運行總控模塊 92.2.6 電梯單次運行模塊 92.2.7 LED燈控制模塊 92.3 詳細設計 102.3.1 時鐘分頻 102.3.2 七段譯碼器顯示 102.3.3 電梯請求控制模塊 102.3.4 電梯開關門控制模塊 122.3.5 電梯運行總控模塊 142.3.6 電梯單次運行模塊 142.3.7 LED燈控制模塊 142.4 實驗過程與調試 152.4.1 仿真結果 152.4.2 主要故障與調試 322.4.3 模塊內部圖 332.5 功能測試 422.5.1 手動開關門測試 422.5.1 重置功能測試 442.5.1 常規使用測試 463 總結與心得 503.1 課設總結 503.2 課設心得 50參考文獻 52附錄(源程序) 53課程設計概述課設目的通過硬件描述語言Verilog的編程,深入了解并掌握可編程芯片PLD的設計技術,加強學生對《數字邏輯》課程所學知識綜合利用的能力。培養學生創造性思維能力和獨立解決實際問題的能力。課設要求(1)能夠全面地應用課程中所學的基本理論和基本方法,完成從設計邏輯電路到設計簡單數字系統的過渡。(2)能力獨立思考、獨立查閱資料,獨立設計規定的系統。(3)能夠獨立地完成實施過程,包括安裝、布線、測試和排除故障。課設任務(1)制定出詳細設計方案;(2)通過VerilogHDL完成規定的設計任務,然后進行編譯和仿真,保證設計的正確性;(3)生成熔絲圖文件,下載到Basys2開發板,通過實際線路進行驗證;(4)對復雜系統的設計采取模塊化、層次化的設計方法;(5)撰寫設計報告,并對存在的問題進行分析、提出改進意見。實驗環境(1)開發環境ISEProjectNavigatorISE是使用XILINX的FPGA的必備的設計工具。目前官方提供下載的最新版本是14.4。它可以完成FPGA開發的全部流程,包括設計輸入、仿真、綜合、布局布線、生成BIT文件、配置以及在線調試等,功能非常強大。ISE除了功能完整,使用方便外,它的設計性能也非常好,拿ISE9.x來說,其設計性能比其他解決方案平均快30%,它集成的時序收斂流程整合了增強性物理綜合優化,提供最佳的時鐘布局、更好的封裝和時序收斂映射,從而獲得更高的設計性能。先進的綜合和實現算法將動態功耗降低了10%。(2)Basys2開發板Basys2開發板是一個電路設計實現平臺,任何人都可以通過它來搭建一個真正的數字電路。Basys2是圍繞著一個XilinxSpartan-3EFPGA芯片和一個AtmelAT90USBUSB控制器搭建的,它提供了完整、隨時可以使用的硬件平臺,并且它適合于從基本邏輯器件到復雜控制器件的各種主機電路。Basys2板上集成了大量的I/O設備和FPGA所需的支持電路,讓用戶能夠構建無數的設計而不需要其他器件。用戶設計可以不局限于Basys2板本身,還可以通過四個標準的擴展連接口延伸到面包板、用戶自定義電路或Pmod模板中。所有6針接口上的信號都受到ESD和短路保護,從而確保在任何環境中的使用壽命。Basys2開發板兼容所有版本的XilinxISE工具。Basys2附帶一個用于供電和編程的USB下載線,所以就不需要其他供電器件或編程下載線。基本方案設計設計需求輸入:reset(脈沖),電源(總開關),電梯內部樓層按鈕(4個,開關),樓層外部的上下按鈕(3樓和6樓的用開關,1樓和8樓的用脈沖),開關門(1個,脈沖);輸出:樓層顯示數碼管,計時數碼管;電梯運行指示燈(電源),電梯上下指示燈,到達樓層指示燈,開關門狀態指示燈電源開關作為電路總清零信號,初始狀態為Off;撥動“電源開關”,電梯電路進入工作狀態;初態為電梯在1樓;電梯可上可下,如果到達某一層需要停下,則開門后停5s,若停5s期間,按關門鍵,則立刻關門,否則5s后自動關門。在樓層數碼管顯示電梯當前所在的樓層;并用時間數碼管顯示倒計時;不運行時不顯示時間;電梯正在上行或下行時,開關門鍵失效。電梯處于某層時,可以選擇要到達的樓層,選擇本樓層則開門。選其他層時,點擊啟動按鈕,則電梯開始運行。每次reset撥到0時,電梯正常運行到1樓停止運行;電源打開,電源指示燈亮;電梯門開時,開關門指示燈亮,否則,滅;電梯上行時,上行指示燈亮,下行指示燈滅;電梯下行時,下行指示燈亮,上行指示燈滅;某一樓層內部有請求時,該樓層led燈亮,當電梯處于該層時,led燈滅,其他情況滅;相鄰兩層運行時間為9s,并用時間數碼管顯示倒計時;電梯升降的規律:原則1:樓層設置優先。每個選擇的樓層都要停止5秒,然后繼續運行。原則2:就近原則。電梯運行時,按照就近原則來定義電梯的運行方向,例如,電梯在3樓,2樓有乘客要下樓,則電梯下行到2樓,在二樓設置樓層為1樓后,下降到1樓;原則3:先上后下。當上下樓層都有請求時,以及同一樓層既有上又有下請求時,先上后下;總體結構設計本控制器為電梯控制器,主要可分為以下七個模塊時鐘分頻本模塊根據隊友及自己的需求自行分頻。詳參隊友報告。七段譯碼器顯示模塊本模塊由隊友完成。詳參隊友報告。電梯請求控制模塊本模塊負責生成用戶請求鏈、向LHCM模塊發送新一輪活動開始信號和確定系統是否在重置狀態。本模塊的輸入如下:UserOutsideRequestF1、UserOutsideRequestF8、UserOutsideRequestUpF3、UserOutsideRequestUpF6、UserOutsideRequestDownF3、UserOutsideRequestDownF6、UserInsideRequestF1、UserInsideRequestF3、UserInsideRequestF6、UserInsideRequestF8等負責樓層請求的開關/脈沖;rst,重置按鈕信號;CLK_1o20,20HZ的時鐘;LiftDirectionUp,電梯運行的方向狀態,1表示向上,0表示向下;LiftIsStop,電梯是否處于停止運行狀態,1表示停止、0表示運行;LiftCurrentFloor,電梯當前樓層狀態,輸入共八位,低位到高位的每一位都與低到高樓層一一對應,比如八樓即’b10000000;LFCMRequireNewRound,來自LFCM的請求新一輪的脈沖信號;DoorStateChangedFlag,電梯開關門標志脈沖信號,其中DoorStateChangedFlag[0]是開門脈沖,DoorStateChangedFlag[1]是關門脈沖;DoorStateOpen,電梯是否出于開門狀態,1表示開門中,0表示關門中。本模塊的輸出如下:LFCMStartNewRound,使LFCM開始新輪活動的脈沖信號;UserOutsideUpSelection_True,用戶外部向上請求鏈,低位到高位與低到高樓層一一對應;UserOutsideDownSelection_True,用戶外部向下請求鏈,低位到高位與低到高樓層一一對應;UserInsideSelection_True,用戶內部請求鏈,低位到高位與低到高樓層一一對應;電梯開關門控制模塊本模塊負責控制電梯門的開關及進行相關動作時輸出門的狀態和開/關門的標志脈沖信號。本模塊的輸入如下:UserOutsideRequestF1、UserOutsideRequestF8、UserOutsideRequestUpF3、UserOutsideRequestUpF6、UserOutsideRequestDownF3、UserOutsideRequestDownF6等外部用戶請求開關/脈沖;UserDoorClose,開/關門按鈕脈沖信號;CLK_1o20,20HZ的時鐘;LiftIsStop,電梯是否處于停止運行狀態,1表示停止、0表示運行;LiftCurrentFloor,電梯當前樓層狀態,輸入共八位,低位到高位的每一位都與低到高樓層一一對應,比如八樓即’b10000000;LERMRequireDoorOpen,來自LERM的請求開門信號。本模塊的輸出如下:DoorStateChangedFlag,電梯開關門標志脈沖信號,其中DoorStateChangedFlag[0]是開門脈沖,DoorStateChangedFlag[1]是關門脈沖;DoorStateOpen,電梯是否出于開門狀態,1表示開門中,0表示關門中。電梯運行總控模塊本模塊由隊友完成。詳參隊友報告。電梯單次運行模塊本模塊由隊友完成。詳參隊友報告。LED燈控制模塊本模塊根據隊友及自己各自負責模塊的顯示需求合作完成。詳參隊友報告。詳細設計本電梯控制器由主模塊和7個子模塊構成,七個子模塊是并行的,除了外部輸入,其他由網線連接,可以互換傳遞參數。圖2.1系統整體模塊框圖時鐘分頻流程說明及框圖詳見隊友報告。七段譯碼器顯示流程說明及框圖詳見隊友報告。電梯請求控制模塊 本模塊響應用戶的請求控制,根據電梯的實際運行狀況決定是否將對應請求加入請求鏈中,并在電梯門打開時在請求鏈中清除需要被清除的請求。此外,當模塊接收到來自LHCM的請求新輪活動的信號時,當序列鏈中加入新的請求后即回饋給LHCM開始新輪活動的信號。 圖2.2電梯請求控制模塊框圖電梯開關門控制模塊本模塊整合用戶的外部請求控制、來自LERM的開門信號、用戶開/關門信號,整合出一個統一的供內部模塊使用的開門信號,該信號使電梯門打開或在電梯門打開時刷新電梯關門倒計時,并使程序輸出開門信號;模塊內部在時鐘作用下當門開時不斷倒計時,倒計時結束或受到用戶的關門按鈕信號即關門,并發送關門信號。計時期間會輸出倒計時。圖2.2電梯開關門控制模塊框圖電梯運行總控模塊流程說明及框圖詳見隊友報告。電梯單次運行模塊流程說明及框圖詳見隊友報告。LED燈控制模塊本模塊根據外部電路的運行情況,結合需求,點亮或者熄滅對應的燈。控制邏輯如圖所示。圖2.3LED燈控制模塊框圖實驗過程與調試仿真結果此處給出主模塊在多種可能的用戶請求下主模塊常規請求仿真主模塊有13個輸入,10個輸出。其中輸入依次為:時鐘(CLK_Ori)、用戶外部一樓請求(UserOutsideRequestF1)、用戶外部八樓請求(UserOutsideRequestF8)、用戶外部三樓向上請求(UserOutsideRequestUpF3)、用戶外部三樓向下請求(UserOutsideRequestDownF3)、用戶外部六樓向上請求(UserOutsideRequestUpF6)、用戶外部六樓向下請求(UserOutsideRequestDownF6)、用戶內部一樓請求(UserInsideRequestF1)、用戶內部三樓請求(UserInsideRequestF3)、用戶內部六樓請求(UserInsideRequestF6)、用戶內部八樓請求(UserInsideRequestF8)、開關門按鍵(UserDoorClose)、重置按鍵(rst)。其中輸出依次為:七段譯碼器數位接口(d1_wx)、七段譯碼器數字接口(d1_out)、電源燈(LightPower)、開門狀態燈(LightDoorOpen)、電梯下行指示燈(LightDirectionDown)、電梯上行指示燈(LightDirectionUp)、一樓指示燈(LightF1)、三樓指示燈(LightF3)、六樓指示燈(LightF6)、八樓指示燈(LightF8)。為了方便說明,仿真程序中顯示的中間寄存器有:電梯當前樓層(LiftCurrentFloor)、電梯關門倒計時(DoorCloseCountdown)、電梯運行倒計時(LiftMoveCountdown)、電梯外部向上請求鏈(UserOutsideUpSelection_True)、電梯外部向下請求鏈(UserOutsideDownSelection_True)、電梯內部請求鏈(UserInsideSelection_True)。仿真程序2.1moduleMain_Test; //Inputs regCLK_Ori; regUserOutsideRequestF1; regUserOutsideRequestF8; regUserOutsideRequestUpF3; regUserOutsideRequestUpF6; regUserOutsideRequestDownF3; regUserOutsideRequestDownF6; regUserInsideRequestF1; regUserInsideRequestF3; regUserInsideRequestF6; regUserInsideRequestF8; regUserDoorClose; regrst; //Outputs wire[3:0]d1_wx; wire[7:0]d1_out; wireLightPower; wireLightDoorOpen; wireLightDirectionDown; wireLightDirectionUp; wireLightF1; wireLightF3; wireLightF6; wireLightF8; //InstantiatetheUnitUnderTest(UUT) mainuut( .CLK_Ori(CLK_Ori), .UserOutsideRequestF1(UserOutsideRequestF1), .UserOutsideRequestF8(UserOutsideRequestF8), .UserOutsideRequestUpF3(UserOutsideRequestUpF3), .UserOutsideRequestUpF6(UserOutsideRequestUpF6), .UserOutsideRequestDownF3(UserOutsideRequestDownF3), .UserOutsideRequestDownF6(UserOutsideRequestDownF6), .UserInsideRequestF1(UserInsideRequestF1), .UserInsideRequestF3(UserInsideRequestF3), .UserInsideRequestF6(UserInsideRequestF6), .UserInsideRequestF8(UserInsideRequestF8), .UserDoorClose(UserDoorClose), .rst(rst), .d1_wx(d1_wx), .d1_out(d1_out), .LightPower(LightPower), .LightDoorOpen(LightDoorOpen), .LightDirectionDown(LightDirectionDown), .LightDirectionUp(LightDirectionUp), .LightF1(LightF1), .LightF3(LightF3), .LightF6(LightF6), .LightF8(LightF8) ); initialbegin //InitializeInputs CLK_Ori=0; UserOutsideRequestF1=0; UserOutsideRequestF8=0; UserOutsideRequestUpF3=0; UserOutsideRequestUpF6=0; UserOutsideRequestDownF3=0; UserOutsideRequestDownF6=0; UserInsideRequestF1=0; UserInsideRequestF3=0; UserInsideRequestF6=0; UserInsideRequestF8=0; UserDoorClose=0; rst=0; //Wait100nsforglobalresettofinish #100 UserDoorClose=0; #5 UserOutsideRequestF1=1; UserOutsideRequestF8=1; UserOutsideRequestUpF3=1; UserOutsideRequestUpF6=1; UserOutsideRequestDownF3=1; UserOutsideRequestDownF6=1; UserInsideRequestF1=1; UserInsideRequestF3=1; UserInsideRequestF6=1; UserInsideRequestF8=1; end always #1CLK_Ori=~CLK_Ori;endmodule數據全部初始化為0,而后按下開關門鍵,再啟用所有樓層選擇請求。等待程序開始。仿真圖如圖2.4所示。圖2.4主模塊常規仿真測試圖-1圖2.5主模塊常規仿真測試圖-2圖2.6主模塊常規仿真測試圖-3圖2.7主模塊常規仿真測試圖-4 以上波形表明程序開始運行時,按開關門鍵把門倒計時時間由5直接設置為0,并使門關閉,使門狀態指示燈熄滅。稍后系統錄入九個請求信號后,可以看見請求信號被寫入相應請求序列表中。電梯由于在一樓,關門時收到一樓的外部信號,電梯響應開門。關門倒計時結束后,進入運行倒計時,九秒后電梯向上運行,到達二樓。二樓沒有任何請求,因此在二樓不停,重新進行九秒倒計時。電梯到達第三層,開門后清除了電梯內部和電梯外部向上的三樓請求,而保留內部向下的三樓請求。……電梯到達八樓后,在電梯關門清除了八樓的所有序列后判斷反向有序列,因此轉向而向下運行。……電梯到達第三層,開門后清除最后一個請求;待關門倒計時結束后關門,關門時判定沒有任何請求。電梯停止運行。主模塊重置請求仿真主模塊有13個輸入,10個輸出。其中輸入依次為:時鐘(CLK_Ori)、用戶外部一樓請求(UserOutsideRequestF1)、用戶外部八樓請求(UserOutsideRequestF8)、用戶外部三樓向上請求(UserOutsideRequestUpF3)、用戶外部三樓向下請求(UserOutsideRequestDownF3)、用戶外部六樓向上請求(UserOutsideRequestUpF6)、用戶外部六樓向下請求(UserOutsideRequestDownF6)、用戶內部一樓請求(UserInsideRequestF1)、用戶內部三樓請求(UserInsideRequestF3)、用戶內部六樓請求(UserInsideRequestF6)、用戶內部八樓請求(UserInsideRequestF8)、開關門按鍵(UserDoorClose)、重置按鍵(rst)。其中輸出依次為:七段譯碼器數位接口(d1_wx)、七段譯碼器數字接口(d1_out)、電源燈(LightPower)、開門狀態燈(LightDoorOpen)、電梯下行指示燈(LightDirectionDown)、電梯上行指示燈(LightDirectionUp)、一樓指示燈(LightF1)、三樓指示燈(LightF3)、六樓指示燈(LightF6)、八樓指示燈(LightF8)。為了方便說明,仿真程序中顯示的中間寄存器有:電梯當前樓層(LiftCurrentFloor)、電梯關門倒計時(DoorCloseCountdown)、電梯運行倒計時(LiftMoveCountdown)、電梯外部向上請求鏈(UserOutsideUpSelection_True)、電梯外部向下請求鏈(UserOutsideDownSelection_True)、電梯內部請求鏈(UserInsideSelection_True)。仿真程序2.2moduleMain_Test; //Inputs regCLK_Ori; regUserOutsideRequestF1; regUserOutsideRequestF8; regUserOutsideRequestUpF3; regUserOutsideRequestUpF6; regUserOutsideRequestDownF3; regUserOutsideRequestDownF6; regUserInsideRequestF1; regUserInsideRequestF3; regUserInsideRequestF6; regUserInsideRequestF8; regUserDoorClose; regrst; //Outputs wire[3:0]d1_wx; wire[7:0]d1_out; wireLightPower; wireLightDoorOpen; wireLightDirectionDown; wireLightDirectionUp; wireLightF1; wireLightF3; wireLightF6; wireLightF8; //InstantiatetheUnitUnderTest(UUT) mainuut( .CLK_Ori(CLK_Ori), .UserOutsideRequestF1(UserOutsideRequestF1), .UserOutsideRequestF8(UserOutsideRequestF8), .UserOutsideRequestUpF3(UserOutsideRequestUpF3), .UserOutsideRequestUpF6(UserOutsideRequestUpF6), .UserOutsideRequestDownF3(UserOutsideRequestDownF3), .UserOutsideRequestDownF6(UserOutsideRequestDownF6), .UserInsideRequestF1(UserInsideRequestF1), .UserInsideRequestF3(UserInsideRequestF3), .UserInsideRequestF6(UserInsideRequestF6), .UserInsideRequestF8(UserInsideRequestF8), .UserDoorClose(UserDoorClose), .rst(rst), .d1_wx(d1_wx), .d1_out(d1_out), .LightPower(LightPower), .LightDoorOpen(LightDoorOpen), .LightDirectionDown(LightDirectionDown), .LightDirectionUp(LightDirectionUp), .LightF1(LightF1), .LightF3(LightF3), .LightF6(LightF6), .LightF8(LightF8) ); initialbegin //InitializeInputs CLK_Ori=0; UserOutsideRequestF1=0; UserOutsideRequestF8=0; UserOutsideRequestUpF3=0; UserOutsideRequestUpF6=0; UserOutsideRequestDownF3=0; UserOutsideRequestDownF6=0; UserInsideRequestF1=0; UserInsideRequestF3=0; UserInsideRequestF6=0; UserInsideRequestF8=0; UserDoorClose=0; rst=0;#5 UserOutsideRequestF8=1; #1 UserOutsideRequestF8=0; #2000 rst=1; #1 rst=0; #5000 rst=1; #1 rst=0; UserOutsideRequestUpF3=1; end always #1CLK_Ori=~CLK_Ori;endmodule數據全部初始化為0,而后按下外部八樓按鍵,等待十秒后按下重置鍵,再等待二十五秒,按下重置鍵,將外部三樓向上開關撥好。等待程序開始。圖2.8主模塊重置仿真測試圖-1圖2.9主模塊重置仿真測試圖-2圖2.10主模塊重置仿真測試圖-3 以上波形表明程序開始運行時,由于接受到外部的向八樓運行的請求。因此電梯在等待門關閉之后即向上運行。 電梯在運行到二樓時接受到重置信號,此時電梯繼續向上運行直至到了三樓,然后就開始下行,直至回到一樓。 待一切就緒后,電梯接到重置信號,電梯恢復正常。電梯在收到運行至三樓的信號后即刻出發至三樓。主要故障與調試(1)故障1問題描述:在主模塊中使用了各模塊的實例后,在仿真時發現各模塊間不能進行通信。問題分析:由于verilog語言生成的模塊對應實際中的硬件,因此從實際出發,我認為問題可能出現在verilog并沒有自動為我的各模塊走線。經查資料后發現模塊間需要用線網進行通信。解決方法:在主模塊中加入大量必要的Wire類型變量。(2)故障2問題描述:請求控制模塊使用電平作為敏感信號時,電梯會在沒有任何輸入的情況下自動上升至八樓。問題分析:從程序運行邏輯出發,我認為是請求鏈在開始時即有了初值。這樣問題不是出現在了請求鏈的初始化上,就是出現在了初始觸發電平變化上。經過排查,發現問題出在后者。寄存器在進行初始化時由高阻初始化得到一個確定的值,而這一過程被電路認為是敏感信號被觸發,因此出現上述問題。解決方法:對輸入請求改為上升沿取樣。(3)故障3問題描述:在和隊友嘗試實現重置功能的時候,發現單次運行模塊沒有按照預設的邏輯,先沿著原本的方向完成當前樓層,再于下一樓層不間斷地返回一樓,而是在運行倒計時結束后直接轉向,因此甚至導致出現了一樓在向二樓爬升時突然轉向跑到“零”樓的事故。問題分析:從程序運行邏輯出發,程序是沒有問題的,仿真結果也支持了我的想法。那么當程序仿真結果和實際運行結果不一致的時候相比就是電路的綜合過程出了問題。果然,在翻閱warning表的時候我讀到了這一條語句“WARNING:Xst:905-"LiftEachRunModule.v"line95:Oneormoresignalsaremissinginthesensitivitylistofalwaysblock.ToenablesynthesisofFPGA/CPLDhardware,XSTwillassumethatallnecessarysignalsarepresentinthesensitivitylist.Pleasenotethattheresultofthesynthesismaydifferfromtheinitialdesignspecification.Themissingsignalsare:<Rst_Triggered>”。原來ISE在對源程序進行綜合的時候認為我的語句不可綜合,就為原敏感變量表添加了一個敏感變量。在將這條邏輯考慮后,我遇到的問題得到了合理的解釋。解決方法:對源程序不同always的邏輯進行部分合并,并將電平觸發改為上升沿觸發。(4)故障4問題描述:請求控制模塊在經過同時具有外部上/下請求的樓層并繼續移動后,若電梯會轉向,則不會在上述樓層開門。問題分析:電梯不會無故忽略具有合理請求控制的樓層,那么唯一的解釋就是請求鏈在電梯到達同時具有外部上/下請求的樓層后,電梯同時清除了這兩個請求。程序在仿真的時候并未出現方才描述的問題,因此,在排除程序內部邏輯的問題后,可能的原因還有兩個,1、ISE在綜合電路時未遵循預設邏輯;2、程序邏輯中存在競爭險象。經過核查,發現verilog在綜合電路時所發出的警告中并未提及對我所設計的電路的自動修改情況,在考慮到verilog的口碑的情況下,我更愿意相信是程序邏輯中存在競爭險象。經檢查,果然是這樣。開門后,三條請求鏈的值都有可能會被修改,而這些請求鏈又彼此作為對方修改請求鏈的判定條件,因此程序中存在競爭險象!解決方法:在開門時,用讀取三條請求鏈的副本作為判定條件的方式,取代了之前的直接讀取請求鏈作為判定條件的方式。請求鏈被修改的1/20秒后更新請求鏈的副本,使之與最新的請求鏈同步。問題解決!模塊內部圖(1)主模塊圖2.11主模塊圖輸入:CLK_Ori:其中輸入依次為:時鐘UserOutsideRequestF1:用戶外部一樓請求UserOutsideRequestF8:用戶外部八樓請求UserOutsideRequestUpF3:用戶外部三樓向上請求UserOutsideRequestDownF3:用戶外部三樓向下請求UserOutsideRequestUpF6:用戶外部六樓向上請求UserOutsideRequestDownF6:用戶外部六樓向下請求UserInsideRequestF1:用戶內部一樓請求UserInsideRequestF3:用戶內部三樓請求UserInsideRequestF6:用戶內部六樓請求UserInsideRequestF8:用戶內部八樓請求UserDoorClose:開關門按鍵rst:重置按鍵輸出:d1_wx:七段譯碼器數位接口d1_out:七段譯碼器數字接口LightPower:電源燈LightDoorOpen:開門狀態燈LightDirectionDown:電梯下行指示燈LightDirectionUp:電梯上行指示燈LightF1:一樓指示燈LightF3:三樓指示燈LightF6:六樓指示燈LightF8:八樓指示燈(2)分頻模塊圖2.12分頻模塊圖輸入CLK:系統時鐘輸出SecClk:1HZ時鐘OutClk:七段譯碼器顯示時鐘CLK_1o20:20HZ時鐘(3)電梯請求控制模塊圖2.13電梯請求控制模塊圖輸入rst:重置按鈕信號CLK_1o20:20HZ的時鐘UserOutsideRequestF1:用戶外部一樓請求UserOutsideRequestF8:用戶外部八樓請求UserOutsideRequestUpF3:用戶外部三樓向上請求UserOutsideRequestUpF6:用戶外部六樓向上請求UserOutsideRequestDownF3:戶外部三樓向下請求UserOutsideRequestDownF6:用戶外部六樓向下請求UserInsideRequestF1:用戶內部一樓請求UserInsideRequestF3:用戶內部三樓請求UserInsideRequestF6:用戶內部六樓請求UserInsideRequestF8:用戶內部八樓請求LiftDirectionUp:電梯的運行方向,1表示向上[1:0]DoorStateChangedFlag:電梯開關門信號,[0]是開門信號DoorStateOpen:電梯門狀態,1表示開門LiftIsStop:電梯運行狀態,1表示停止[7:0]LiftCurrentFloor:電梯當前樓層LFCMRequireNewRound:來自LFCM的請求新輪的信號輸出LFCMStartNewRound:令LFCM開始新一輪的信號[7:0]UserOutsideUpSelection_True:用戶外部向上請求鏈[7:0]UserOutsideDownSelection_True:用戶外部向下請求鏈[7:0]UserInsideSelection_True:用戶內部請求鏈Rst_Triggered:重置狀態值,0表示重置中(4)電梯門開關控制模塊圖2.14電梯門開關請求控制模塊圖輸入CLK_1o20:20HZ的時鐘UserOutsideRequestF1:用戶外部一樓請求UserOutsideRequestF8:用戶外部八樓請求UserOutsideRequestUpF3:用戶外部三樓向上請求UserOutsideRequestUpF6:用戶外部六樓向上請求UserOutsideRequestDownF3:用戶外部三樓向下請求UserOutsideRequestDownF6:用戶外部六樓向下請求UserDoorClose:開關門按鍵[7:0]LiftCurrentFloor:電梯當前樓層LiftIsStop:電梯運行狀態,1表示停止LERMRequireDoorOpen:來自LERM的請求開門信號輸出[1:0]DoorStateChangedFlag:電梯開關門標志脈沖,其中[0]是開門脈沖,[1]是關門脈沖。DoorStateOpen:電梯是否出于開門狀態,1表示開門中,0表示關門中。[3:0]DoorCloseCountdown:關門倒計時。(5)LED燈控制模塊圖2.15LED燈控制模塊圖輸入RstReady_DirectionToDown_n:電梯方向強制扭轉向下信號,0表示生效LiftIsStop:電梯是否處于停止運行狀態,1表示停止、0表示運行DoorStateOpen:電梯是否出于開門狀態,1表示開門中,0表示關門中[7:0]LiftCurrentFloor:電梯當前樓層狀態,輸入共八位,低位到高位的每一位都與低到高樓層一一對應[1:0]DoorStateChangedFlag:電梯開關門信號,[0]是開門信號LiftDirectionUp:電梯的運行方向,1表示向上CLK_Ori:系統時鐘輸出UpLight:上行燈,1表示亮DownLight:下行燈,1表示亮Floor1Light:一樓指示燈,1表示亮Floor3Light:三樓指示燈,1表示亮Floor6Light:六樓指示燈,1表示亮Floor8Light:八樓指示燈,1表示亮PowerLight:電源燈,1表示亮DoorLight:門開關指示燈,1表示亮(6)電梯運行總控模塊此部分由隊友完成,詳參隊友報告。(7)電梯每次運行模塊此部分由隊友完成,詳參隊友報告。(8)七段譯碼器顯示模塊此部分由隊友完成,詳參隊友報告。功能測試手動開關門測試電梯停在六樓且門關閉時,撥動六樓外部向上/向下請求鍵;按動開門鍵一次;再按動開門鍵一次。圖2.16開關門測試圖-開門圖2.17開關門測試圖-關門無論是撥動六樓外部向上/向下請求鍵中的哪一個,電梯門均會打開,即關門倒計時從五開始每秒自減,且表示開門的指示燈點亮;此時按下開關門按鈕后,計時清零,表示開門的指示燈熄滅;再按下開關門按鈕后電梯門再次打開。重置功能測試在電梯靜止在一樓時,按下外部八樓按鍵,等待電梯運行到二樓后按下重置鍵。待電梯面板沒有任何變化后再次按下重置鍵,然后按下外部八樓按鍵。圖2.18重置測試圖-二樓圖2.19重置測試圖-三樓按下外部八樓請求后電梯即開始九秒運行倒計時,然后等待計時結束后升至二樓。此時按下重置按鍵。電梯繼續向上運行,然后到達三樓。此時電梯方向燈改為顯示電梯向下運行。電梯在倒計時結束后到達二樓,然后到達一樓。等待電梯面板無變化后按下外部八樓請求,此時電梯開始九秒倒計時,開始爬向八樓。常規使用測試在電梯停在一樓且不處于重置狀態時撥動三樓外部向上和三樓外部向下開關,然后在電梯運行至二樓時撥動內部一樓開關和內部八樓開關。圖2.20常規使用測試圖-向上三樓開門圖2.21常規使用測試圖-八樓關門后換向圖2.22常規使用測試圖-向下至三樓開門按下外部三樓向上/向下請求后電梯即開始九秒運行倒計時,然后等待計時結束后升至二樓。此時撥動一樓/八樓內部請求開關。電梯繼續向上運行,然后到達三樓,開門,關門,繼續運行。電梯連續運行到八樓后開門關門,電梯轉向,繼續連續運行直至到達三樓。此時電梯開門、關門,并停止運行。總結與心得課設總結為了實現電梯控制器的功能要求,作了如下幾點工作:產生用戶請求鏈控制電梯開關門協調各模塊之間的通信課設心得在本次verilog程式設計實驗中,我似乎遇到了所有的我可能會遇到的情況。現在想來想必是我們比較“奇葩”的設計模式所決定的。是的,不同于很多同學的以寄存器的值作為模塊間的通信根據的做法——即在每個時鐘周期,在模塊內部根據寄存器的值作為判定依據進行適宜操作的做法,我們的程序模塊大多是采用信號驅動的,即根據信號的定位、以寄存器的值作為輔助執行預設的邏輯。在程序中的體現就是:我們的程序的敏感變量表中有很多非CLK的電平/上升沿,而別人的程序中大多主要以CLK作為敏感變量。正是因為敏感變量表的不一致,我們很難做到將多個內部模塊進行合并——一個寄存器只能在一個always中改變并賦值,這是verilog為了避免競爭/冒險的一種優化措施,若違反這一規則,則會產生一個錯誤通知,使代碼無法綜合。正是如此,我們為了實現模塊之間/內部的通訊,不得不采用大量的寄存器、繁復的控制邏輯。這些使得電路體積日益臃腫,對細節的把握的要求也越來越高。然而也正是如此,這次課設為我帶來了巨大的收獲,因為我付出了更多、思考了更多,我擁有了更多的失敗的教訓。這次實驗的心得可歸結為如下幾點:警惕競爭/冒險:在讀取寄存器中的值的時候,當這個值可能會在被讀取的瞬間改變時,就會出現競爭/冒險的情況。多使用鐘控觸發器:時序邏輯電路更容易受到電平波動的影響,因此可能會帶來很多難以預測的問題。使用更加安全的鐘控觸發器可以很好地避免這一問題。多使用狀態而非脈沖:狀態比短脈沖更容易產生、維護和使用!脈沖更多是用在觸發器中,而這樣就不可避免地帶來更多的模塊、更多的代碼量、更難以維護的代碼(說明見本小節)。程序員之間的合作不等于一加一:一個程序員一個星期可以完成的任務,由兩個程序合作完成可能需要兩個星期。我們需要討論出使兩個人都信服的方案,我們的任務分配要公平合理,我們在寫程序的時候需要討論具體細節,而這些都需要額外的精力。在我書寫自己的代碼的時候,我經常假定我同伴輸送給我的狀態/信號是符合我預期的。隊友的代碼主體上由于之前的集中討論,并無大礙,可是具體實現細節上有時就會與我之前的假設偏離甚至相悖。這就導致我的程序為了配合隊友,需要進行大量微調,甚至是大改,這也是合作效率并不簡單地等于一加一的原因之一。解決的方法很簡單:討論出更加細致的模塊設計方案!盡量減低模塊之間的耦合程度!給出明確、沒有歧義且經過雙方共同確認的接口表文檔!如果我們團隊當初這么做,定能在開發過程中少走更多彎路。參考文獻無附錄(源程序)主模塊`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company://Engineer:////CreateDate:06:47:4509/27/2015//DesignName://ModuleName:main//ProjectName://TargetDevices://Toolversions://Description:////Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments:////////////////////////////////////////////////////////////////////////////////////modulemain(inputCLK_Ori,inputUserOutsideRequestF1_Ex,inputUserOutsideRequestF8_Ex,inputUserOutsideRequestUpF3_Ex,inputUserOutsideRequestUpF6_Ex,inputUserOutsideRequestDownF3_Ex,inputUserOutsideRequestDownF6_Ex,inputUserInsideRequestF1_Ex,inputUserInsideRequestF3_Ex,inputUserInsideRequestF6_Ex,inputUserInsideRequestF8_Ex,inputUserDoorClose_Ex,inputrst_Ex,output[3:0]d1_wx,output[7:0]d1_out,outputLightPower,outputLightDoorOpen,outputLightDirectionDown,outputLightDirectionUp,outputLightF1,outputLightF3,outputLightF6,outputLightF8);//引腳IBUFGIBUFG_UserOutsideRequestF1(.I(UserOutsideRequestF1_Ex),.O(UserOutsideRequestF1));IBUFGIBUFG_UserOutsideRequestF8(.I(UserOutsideRequestF8_Ex),.O(UserOutsideRequestF8));IBUFGIBUFG_UserOutsideRequestUpF3(.I(UserOutsideRequestUpF3_Ex),.O(UserOutsideRequestUpF3));IBUFGIBUFG_UserOutsideRequestUpF6(.I(UserOutsideRequestUpF6_Ex),.O(UserOutsideRequestUpF6));IBUFGIBUFG_UserOutsideRequestDownF3(.I(UserOutsideRequestDownF3_Ex),.O(UserOutsideRequestDownF3));IBUFGIBUFG_UserOutsideRequestDownF6(.I(UserOutsideRequestDownF6_Ex),.O(UserOutsideRequestDownF6));IBUFGIBUFG_UserInsideRequestF1(.I(UserInsideRequestF1_Ex),.O(UserInsideRequestF1));IBUFGIBUFG_UserInsideRequestF3(.I(UserInsideRequestF3_Ex),.O(UserInsideRequestF3));IBUFGIBUFG_UserInsideRequestF6(.I(UserInsideRequestF6_Ex),.O(UserInsideRequestF6));IBUFGIBUFG_UserInsideRequestF8(.I(UserInsideRequestF8_Ex),.O(UserInsideRequestF8));IBUFGIBUFG_UserDoorClose(.I(UserDoorClose_Ex),.O(UserDoorClose));IBUFGIBUFG_rst(.I(rst_Ex),.O(rst));//內部線路wireSecClk;wireOutClk;wireCLK_1o20;wireLFCMStartNewRound;wire[1:0]DoorStateChangedFlag;//0開,1關wireDoorStateOpen;//1開,0關wire[3:0]DoorCloseCountdownwire[7:0]LiftCurrentFloor;wireLERMRequireDoorOpen;wire[3:0]LiftMoveCountdown;wire[3:0]DoorCloseCountdown;wire[3:0]LiftCurrentFloor_4;wireLiftDirectionUp;wireLFCMRequireNewRound;wireLiftIsStop;wireUpLight;wireDownLight;wireFloor1Light;wireFloor3Light;wireFloor6Light;wireFloor8Light;wirePowerLight;wireRst_Triggered;wireRstReady_DirectionToDown_n;wireDoorLight;wire[7:0]UserInsideSelection_True;wire[7:0]UserOutsideUpSelection_True;wire[7:0]UserOutsideDownSelection_True;//1.系統時鐘分頻模塊DivideModuleDivideModule_Main(.CLK(CLK_Ori),.SecClk(SecClk),.OutClk(OutClk),.CLK_1o20(CLK_1o20));//2.電梯內外請求鏈控制模塊LiftRequestControlModuleLiftRequestControlModule_Main(.rst(rst),.Rst_Triggered(Rst_Triggered),.CLK_1o20(CLK_1o20),.CLK_Ori(CLK_Ori),.UserOutsideRequestF1(UserOutsideRequestF1),.UserOutsideRequestF8(UserOutsideRequestF8),.UserOutsideRequestUpF3(UserOutsideRequestUpF3),.UserOutsideRequestUpF6(UserOutsideRequestUpF6),.UserOutsideRequestDownF3(UserOutsideRequestDownF3),.UserOutsideRequestDownF6(UserOutsideRequestDownF6),.UserInsideRequestF1(UserInsideRequestF1),.UserInsideRequestF3(UserInsideRequestF3),.UserInsideRequestF6(UserInsideRequestF6),.UserInsideRequestF8(UserInsideRequestF8),.LiftDirectionUp(LiftDirectionUp),.DoorStateChangedFlag(DoorStateChangedFlag),.DoorStateOpen(DoorStateOpen),.LiftIsStop(LiftIsStop),.LiftCurrentFloor(LiftCurrentFloor),.LFCMRequireNewRound(LFCMRequireNewRound),.LFCMStartNewRound(LFCMStartNewRound),.UserInsideSelection_True(UserInsideSelection_True),.UserOutsideUpSelection_True(UserOutsideUpSelection_True),.UserOutsideDownSelection_True(UserOutsideDownSelection_True));//3.電梯門開關控制模塊LiftDoorControlModuleLiftDoorControlModule_main(.CLK_1o20(CLK_1o20), .Rst_Triggered(Rst_Triggered),.UserOutsideRequestF1(UserOutsideRequestF1),.UserOutsideRequestF8(UserOutsideRequestF8),.UserOutsideRequestUpF3(UserOutsideRequestUpF3),.UserOutsideRequestUpF6(UserOutsideRequestUpF6),.UserOutsideRequestDownF3(UserOutsideRequestDownF3),.UserOutsideRequestDownF6(UserOutsideRequestDownF6),.UserDoorClose(UserDoorClose),.LiftCurrentFloor(LiftCurrentFloor),.LiftIsStop(LiftIsStop),.LERMRequireDoorOpen(LERMRequireDoorOpen),.DoorStateChangedFlag(DoorStateChangedFlag),.DoorStateOpen(DoorStateOpen),.DoorCloseCountdown(DoorCloseCountdown));//4.電梯單次運行模塊LiftEachRunModuleLiftEachRunModule_Main(.DoorStateOpen(DoorStateOpen),.Rst_Triggered(Rst_Triggered),.RstReady_DirectionToDown_n(RstReady_DirectionToDown_n),.LiftIsStop(LiftIsStop),.SecClk(SecClk),.LiftDirectionUp(LiftDirectionUp),.LiftCurrentFloor(LiftCurrentFloor),.UserInsideSelection_True(UserInsideSelection_True),.UserOutsideUpSelection_True(UserOutsideUpSelection_True),.UserOutsideDownSelection_True(UserOutsideDownSelection_True),.LERMRequireDoorOpen(LERMRequireDoorOpen),.LiftMoveCountdown(LiftMoveCountdown),.LiftCurrentFloor_4(LiftCurrentFloor_4));//5.電梯運行總控模塊LiftHeadCountraMouleLiftHeadCountraMoule_Main(.LFCMStartNewRound(LFCMStartNewRound),.DoorStateChangedFlag(DoorStateChangedFlag),.UserInsideSelection_True(UserInsideSelection_True),.UserOutsideUpSelection_True(UserOutsideUpSelection_True),.UserOutsideDownSelection_True(UserOutsideDownSelection_True),.LiftCurrentFloor(LiftCurrentFloor),.LiftDirectionUp(LiftDirectionUp),.LFCMRequireNewRound(LFCMRequireNewRound),.LiftIsStop(LiftIsStop));//6.LED燈控制模塊LightShowModuleLightShowModule_Main(.CLK_Ori(CLK_Ori),.DoorStateOpen(DoorStateOpen),.LiftCurrentFloor(LiftCurrentFloor),.DoorStateChangedFlag(DoorStateChangedFlag),.LiftDirectionUp(LiftDirectionUp),.LERMRequireDoorOpen(LERMRequireDoorOpen),.UpLight(LightDirectionUp),.LiftIsStop(LiftIsStop),.DownLight(LightDirectionDown),.Floor1Light(LightF1),.Floor3Light(LightF3),.Floor6Light(LightF6),.Floor8Light(LightF8),.PowerLight(LightPower),.DoorLight(LightDoorOpen),.RstReady_DirectionToDown_n(RstReady_DirectionToDown_n));//7.七段譯碼器顯示模塊YiMAQiXianShiModuleYiMAQiXianShiModule(.CLK_Ori(CLK_Ori),.MCLK9(OutClk),.d_num_CurrentFloor(LiftCurrentFloor_4),.d_num_DoorCloseCountDown(DoorCloseCountdown),.d_num_LiftMoveCountDown(LiftMoveCountdown),.d1_wx(d1_wx),.d1_out(d1_out));endmodule時鐘分頻模塊`timescale1ns/1ps////////////////////////////////////////////////////////////////////////////////////Company://Engineer:////CreateDate:21:25:4709/23/2015//DesignName://ModuleName:DivideModule//ProjectName://TargetDevices://Toolversions://Description:////Dependencies:////Revision://Revision0.01-FileCreated//AdditionalComments:////////////////////////////////////////////////////////////////////////////////////moduleDivideModule(CLK,SecClk,OutClk,CLK_1o20);inputCLK;outputregSecClk;outputregOutClk;outputregCLK_1o20;reg[30:0]count1,count2,count4;initialbegincount1=0; count2=0; count4=0; SecClk=0; OutClk=0; CLK_1o20=0;end//只改變一次always@(posedgeCLK) //if(count1==6250000)//1/4 if(count1==12500000)//一半//if(count1==25000000) //if(count1==20) //仿真 begincount1=0;SecClk=~SecClk; end else count1=count1+1; always@(posedgeCLK) if(count2==20000) begincount2=0;OutClk=~OutClk; end else count2=count2+1; //分頻,1/20Secalways@(posedgeCLK)begin //if(count4==312500)begin//1/4 if(count4==625000)begin//一半 //if(co

溫馨提示

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

評論

0/150

提交評論