劉錫鋒,朱劉寧
(1.江蘇信息職業技術學院 江蘇 無錫 214153;2.馬鞍山職業技術學院 安徽 馬鞍山 243031)
隨著集成電路產業的迅速發展,集成電路芯片的規模越來越大,集成度越來越高,一塊芯片上所實現的功能也越來越多,集成的元器件也動輒百萬、千萬計。對于這種大規模、超大規模集成電路的芯片設計,特別是在數字集成電路方面,采用計算機輔助設計和電子設計的智能自動化來進行集成電路設計已經是一種趨勢[1]。VHDL、Verilog等硬件描述語言近年由于其在芯片設計自動化方面出色的表現被越來越多地應用在超大規模集成電路設計領域。用VHDL硬件描述語言進行芯片設計并不涉及底層電路具體電路結構,而只需要給出各單元功能描述和單元電路之間的連接關系,這種設計方法一方面使得設計者能夠專注于頂層結構設計從而使芯片整體性能更優,另一方面由于通過語句描述來自動實現具體電路結構節省了電路設計的時間提高了設計效率[4]。同時由于生成的電路是自動生成的標準化電路,也提高了電路設計的正確性。
自動售貨機是常用的街頭自動販賣設備,它的核心運作部件是一塊集成電路控制芯片,由這塊芯片來控制、判斷商品的選擇、買賣,貨幣辨別、交易和找零等工作。以往的自動售貨機芯片對售賣商品的類型選擇偏少,對投入貨幣的限制也較多,很多自動售貨機僅僅能允許投入1元硬幣。此外受芯片設計限制,相應的找零環節也不完善,有的甚至沒有,這些問題對商品的售賣交易和商品價格的合理定位產生了一定的影響[5]。在做了需求分析的基礎上,提出并設計了一種基于VHDL實現的自動售貨機芯片設計。該芯片能夠完成多種商品的售賣,允許多種紙質和硬幣現金使用,能夠完成多種貨幣的找零,對價格控制更加合理精確,各種售賣中可能發生的情況也考慮周全,并做了相應設計[6]。
該售貨機的主要要求是:投幣可投10元、5元紙幣和1元硬幣。出售百事可樂、話梅、瓜子三種商品,可樂售價2元每瓶,話梅售價1元每包,瓜子2元5角(投幣種類數目和出售商品數目可繼續在程序中添加,這里只各以3種為例)。
整個程序總的輸入有:投幣(3輸入端)、選擇商品(3輸入端)、時鐘、執行按鍵一共8端輸入。
總的輸出有:總投入貨幣顯示、選擇商品現實(3端)、退幣(1元硬幣、5角硬幣兩端)、商品輸出(三端)一共9端。
根據以上要求,整體設計共由6個子模塊(6進程)和一個與非門構成。總體設計如圖1所示。

圖1 設計總體結構圖Fig.1 Structure diagram of the automat
1)貨幣投入和計算進程:該模塊允許投入10元5元紙幣,紙幣上限為1,超過部分不計,(此外可以設定超過1給出1個訊號來關閉投幣口來防止繼續投幣,本程序中未給出此訊號),1元硬幣的上限為5個,超出部分不計。經過該模塊處理,輸出投入總貨幣數(以5角為一個單位)到下一進程。該模塊有一個reset訊號,如reset為高電平則所有輸入輸出清零。以下為該子模塊部分程序(總體程序較長,由于篇幅原因,下面只給出第一第二子程序的部分主要程序,如需要全部程序可向作者咨詢)。
cashin:process(cash10,cash5,coin1,feedback)
variable c10t,c5t,c1t:integer range 0 to 255;
variable total_cash:integer range 0 to 255;
begin
if(cash10'event and cash10='1')then
if feedback='0'then
c10t:=c10t+20;
if(c10t>=20)then
c10t:=20;
end if;
else
c10t:=0;
end if;
end if;
。。。
2)物品選擇進程:該模塊輸入部分為3個按鈕,每按一次相應商品的按鈕即選擇商品數目加一,每種商品選擇上限都是5,超過5將按5計算。輸出7個訊號,3種商品各有1個顯示輸出,以顯示給顧客選擇的商品總數,3條按5角為一單位的商品訊號輸出給物品送出進程使用。還有1個選購商品總價值輸出。此模塊也有1個reset訊號,如reset為高電平則所有輸入輸出清零。
itemselect:process(judge,pesi,plum,mseed)
variable pnumber,lnumber,mnumber:integer range 0 to 255;
variable pnumber2,lnumber2,mnumber2:integer range 0 to 255;
variable pc,lc,mc:integer range 0 to 255;
variable tv:integer range 0 to 255;
begin
if(pesi'event and pesi='1')then
if judge='0'then
pnumber:=pnumber+1;pnumber2:=pnumber2+2;pc:=pc+4;
if(pc>=20)then
pnumber:=5;pnumber2:=10;pc:=20;
end if;
else
pnumber:=0;pnumber2:=0;pc:=0;
end if;
end if;
。。。
3)剩余貨幣計算進程:該模塊將上2個進程的總貨幣數和總商品價值數相減計算出剩余貨幣數輸出給找零進程使用,同時判斷總貨幣數是否小于總商品價值,如果是給出高電平訊號,如果否則給出低電平訊號。該訊號送給執行使能進程使用同時作為物品選擇進程的復位端使用。
4)執行使能進程:該進程有3個輸入,如果剩余貨幣判斷訊號為低電平同時找零進程給出的反饋訊號也為低電平,此時如果執行按鍵按動一下,則輸出高電平使能訊號,且只要剩余貨幣判斷訊號和反饋訊號不變,則一直輸出高電平。如上述2個訊號有任意一個為低電平,則輸出改為低電平。
5)找零進程:該進程只有在使能訊號為高電平時方有效,如使能訊號為低電平,則所有輸出清零。該進程將輸入的剩余貨幣轉化成1元的硬幣的脈沖訊號輸出,每次脈沖對應找出1個1元硬幣,同時根據是否輸入單數的瓜子來判斷是否需要找出5角硬幣。在找零完成后,同時大于5個脈沖時間 (為了保證在找零脈沖小于5個脈沖時間時商品輸出時間足夠)后給出高電平反饋訊號。該訊號供給剩余貨幣計算進程使用,同時作為貨幣投入和計算進程的復位端使用。
6)商品輸出進程:該進程只有在使能訊號為高電平時方有效,如使能訊號為低電平,則所有輸出清零。該進程將物品選擇進程給出的商品數目按脈沖輸出。每次脈沖對應出1件商品。同時當所有商品輸出完成后給出高電平反饋訊號(此訊號在本程序中保留,不起作用)。
為了驗證該設計的功能,對該設計進行了仿真分析。圖2是該設計在MAXPLUS II下進行仿真的波形圖,該仿真中采用周期為35 ns的時鐘。

圖2 仿真測試結果圖Fig.2 Result chart of simulation of automat
上圖中c11為1元硬幣輸出,c00為5毛硬幣輸出。可以看到當輸入商品、1元硬幣超過5個時仍以5計算。當總選擇商品價值超過投入的總貨幣數時,程序自動將選擇商品數目清零,但輸入的貨幣不變,只有選擇商品正確以后按了執行鍵,機器才按照給定數目輸出商品和找零,當全部完成后將貨幣和商品清零。
由仿真結果分析,設計滿足要求,能夠完成多種商品的售賣,允許多種紙質和硬幣現金使用,能夠完成多種貨幣的找零,對價格控制更加合理精確,執行售賣功能全面,可以滿足實際生產使用。
[1]夏宇聞.Verilog數字系統設計教程[M].3版,北京:北京航空航天大學出版社,2013.
[2]楊志忠.數字電子技術[M].北京:高等教育出版社,2008.
[3]閻石.數字電子技術基礎 [M].北京:高等教育出版社,2006.
[4]韓雁,洪慧.集成電路設計制造中EDA工具實用教程[M].杭州:浙江大學出版社,2007.
[5]劉明業.集成電路/計算機硬件描述語言VHDL高等教材[M].北京:清華大學出版社,2003.
[6]姜雪松.硬件描述語言VHDL教程[M].西安:西安交通大學出版社,2004.