verilog大作業6頁word_第1頁
verilog大作業6頁word_第2頁
verilog大作業6頁word_第3頁
verilog大作業6頁word_第4頁
verilog大作業6頁word_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、西安電子科技大學Verilog大作業一自動售郵票機院系:電子工程學院姓名: 李巖學號: 1202121468專業:電子與通信工程自動售郵票機1.題目介紹本設計主要以程序為主,并通過波形仿真來驗證程序功能的實現。當選擇好 郵票并投幣后,數碼管顯示所選郵票價格及投入錢幣價格;按下確認付款開關, 交易成功,數碼管顯示應找多少錢,蜂鳴器響,對應商品 LEW亮。若所投錢幣 不足所選商品價格,對應警告錢幣不足的 LED燈亮;當繼續投入錢幣直到達到所 選郵票價格,按下確認付款開關,交易同樣成功。具體設計要求如下:(1)機器有一個投幣孔,每次只能投入一枚硬幣。機器能自動識別硬幣金 額,最大為1元,最小為1角。

2、購票者可選擇的郵票面值有1元和5角兩種, 每次售出1枚郵票。(2)燈亮時表示該郵票售出。(3)用開關分別模擬1角、5角硬幣和1元硬幣投入,可以用幾只發光二極管 分別代表找回剩余的硬幣。(4)每次只能售出一種郵票,當所投硬幣達到或超過購買者所選面值時,售 出貨物并找回剩余的硬幣,回到初始狀態;(5) 當所投硬幣值不足面值時,可通過一個復位鍵退回所投硬幣,回到初始狀態。2. 程序狀態框圖3 程序介紹首先聲明,本程序具有完全自主知識產權,是經過多次嘗試以及錯誤之后的成果。本程序的核心是利用我們最近剛學的狀態機來實現機器不同狀態之前的轉換。由于沒有實驗板,只能使用波形仿真,所以最后的 function

3、s ( led 顯示函數)注釋起來了,但程序還是保留了數碼管動態掃描部分。程序基本可以分為三大模塊:( 1) 狀態機模塊, 這是程序的核心部分。 在寫程序之前看過網上的一些現有例程, 但都沒有解決一個我認為的核心問題, 那就是如何解決連續投幣問題。 后 來經過不斷地試錯,發現可以使用狀態機完美地解決這個問題。( 2) 數碼管動態掃描部分,它的作用是按照給定時鐘來回點亮四個數碼管 (兩個 dis_money, 兩個 dis_price ) , 使數碼管在人的肉眼看來一直是亮的。這部分由于沒有實驗板,所以看不出其發揮出來的功能。( 3) 數碼管顯示函數,用函數的方法可以避免重復, 使程序看起來簡潔

4、明了,從而最大程度提高程序編寫效率。4 源程序module work(clk,rst,dis_mony_d,dis_mony_g,dis_price_d,dis_price_g, btn_ok,btn_mon,btn_sell,warn,beep);input clk,rst,btn_ok;input 2:0 btn_mon;/ 選擇放入的錢input 1:0 btn_sell;/ 選擇商品output warn;/錢不足,指示燈output 3:0 dis_mony_d,dis_mony_g;/兩個數碼管顯示投入面值,個位和十位output 3:0 dis_price_d,dis_price

5、_g;/H個數碼管顯示價錢,同上output beep;/扃電平交易成功reg warn;/警告放入錢不足reg 3:0 dis_mony_d,dis_mony_g;reg 3:0 dis_price_d,dis_price_g;reg 3:0 money,money_all,price;reg 1:0 flag = 2'b00;/數碼管顯示標志位reg beep=0;reg 2:0 state;parameter IDLE='d0,A='d1,B='d2;always (negedge rst or posedge clk)beginif(!rst)/初始化b

6、eginprice=0;money=0;state<=IDLE;money_all=0;warn = 0;beep = 0;endelsebegin/E£種面值case(btn_mon)3'b001: money = 1;3'b010: money = 5;3'b100: money = 10;default:money = 0;endcasecase(btn_sell) /兩種/ 郵票2'b01: price = 5;2'b10: price = 10;default: price= 0;endcasecasex(state)IDLE:

7、if(btn_sell)beginmoney_all = money_all +money;state<=A;endA: if(btn_ok =0)beginmoney_all = money_all +money;endelsebeginmoney_all = money_all +money;state<=B;endB: if(money_all >=price)beginmoney_all = money_all-price;beep = 1;warn=0;state<=IDLE;endelsebeginwarn = 1;state<=A;enddefaul

8、t: state<=IDLE;endcaseendend/* 將時鐘給數碼管, 數碼管分別顯示放入錢多少 、 郵票 價格 */always (posedge clk)begincase(flag)2'b00:begindis_mony_d <=money_all%10;dis_price_d <=price%10;flag = 2'b01;end2'b01:begindis_mony_g <= money_all/10;dis_price_g <=price/10;flag = 2'b00;endendcaseend/* 數碼管段碼

9、function 6:0 led7;input 3:0 dis_input;begincase (dis_input)0 : led7 = 7'b111_1110;1 : led7 = 7'b011_0000;2 : led7 = 7'b110_1101;3 : led7 = 7'b111_1001;4 : led7 = 7'b011_0011;5 : led7 = 7'b101_1011;6 : led7 = 7'b101_1111;7 : led7 = 7'b111_0000;8 : led7 = 7'b111_111

10、1;9 : led7 = 7'b111_0011;default : led7 = 7'b111_1111;endcaseendendfunction */endmodule仿真分析:( 1)按下 1 元郵票選擇鍵( 2'b10 ) ,當連續兩次投入5 角( 3'b 010)并按下ok鍵時,beep變為高電平,交易成功,找零 dis_money為零。波形仿真如下 圖:( 2)按下 1 元郵票選擇鍵( 2'b10 ) ,當一次投入5 角( 3'b 010 )并按下 ok鍵時,warn變為高電平,交易失敗,找零 dis_money為投入的5角。波形仿

11、真 如下圖:( 3)按下 1 元郵票選擇鍵( 2'b10 ) ,當一次投入5 角( 3'b 010 )并按下 ok鍵時, warn 變為高電平,交易失敗。繼續投入 5 角( 3'b 010)并按下ok 鍵時,beep變為高電平,交易成功,找零 dis_money為零。波形仿真如下圖:5 總結本次大作業斷斷續續持續了兩個星期, 但我覺得這個時間值得。 通過本次大作業的編寫,我對verilog HDL語言有了更深刻的了解,能夠比較靈活地運用它來實現我所想要實現的功能。 在程序編寫中, 我也遇到了很多挫折, 甚至想放棄這個題目,但是我還是堅持下來了。發現問題(連續投幣)所在之后想了很多方法,甚至是C語言的

溫馨提示

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

評論

0/150

提交評論