【正文】
pid development of the trend is increasingly the engine of progress and improvement of the ASIC design techniques, AISC chip has a low price, small size, high reliability, and is currently in electronic products has been widely used, VHDL is a digital logic system used to describe the programming language, which acts by direct description of the hardware to the physical implementation of the hardware, the hardware design represents the current direction of development. This article is based on the VHDL design for vending machines to achieve its basic functions, using Altera39。 VHDL 是一種用來描述數(shù)字邏輯系統(tǒng)的“編程語言”,它通過對硬件行為的直接描述來實現(xiàn)對硬件的物理實現(xiàn),代表了當(dāng)今硬件設(shè)計的發(fā)展方向。 第四, VHDL 性能評估能力:非依賴器件的設(shè)計和可移植能力允許設(shè)計者采用不同的器件結(jié)構(gòu)和不同的綜合工具來評估設(shè)計,在設(shè)計者開始設(shè)計之前,無需了解將采用何種器件,設(shè)計者可以進行一個完整的設(shè)計描述,并且對其進行綜合,生成選定的器件結(jié)構(gòu)的邏輯功能,然后評估結(jié)果,選用最合適你設(shè)計需求的器件,為了衡量綜合的質(zhì)量,同樣可以用不同的綜合工具所得到的綜合結(jié)果來進行分析和評估。 設(shè)計方案比較與選擇: 本文是在 VHDL 的基礎(chǔ)上對自動售貨機進行設(shè)計來實現(xiàn)其基本功能的。 2. 自動售貨機給出 30 秒的選擇時間,時間倒計時到 系統(tǒng)進入停止狀態(tài),放棄購買操作。 4. 通過啟動 /取消復(fù)合按鍵,來啟動購買和取消購買,每按一次狀態(tài)轉(zhuǎn)換一次。 主控制器模塊( main_control):它是自動售貨機的主控制電路,控制商品種類選擇,商品數(shù)量選擇,啟動 /取消操作,和確認購買操作,以及對其它模塊的工作控制。 找零出貨模塊( change_deliver) :在對商品的實際金額和顧客投入的金額比較,判斷投入金額是否大于商品實際金額后,若大于則出貨并找零;若小于則 推出顧客 投入的金額。 主控制器的輸入信號和輸出信號如上述的結(jié) 構(gòu)框圖,分別敘述如下: ( 1) 輸入信號: reset:上電復(fù)位輸入; sysclk:系統(tǒng)時鐘輸入; start_cancel:啟動與取消按鍵輸入; quantity_sel:商品數(shù)量選擇按鍵輸入; type_sel:商品種類選擇按鍵輸入; timer_down: 選擇定時到信號輸入。 商品金額計算模塊是根據(jù)主控制器輸出的商品種類和商品數(shù)量信號,來計算選購商品的總金額,其輸入和輸出信號分別如下: ( 1) 輸入信號: ok_buy:確定購買商品按鍵輸入信號; reset:復(fù)位信號; sysclk:系統(tǒng)時鐘輸入信號; start_in:啟動與取消操作信號; timer_down:選擇倒計時到輸入信號; type1_in:商品種類 1 的輸入信號; type2_in:商品種類 2 的輸入信號; type3_in:商品種類 1 的輸入信號; quan1_in:商品 數(shù)量 1 的輸入信號; quan2_in:商品數(shù)量 2 的輸入信號; quan3_in:商品數(shù)量 3 的輸入信號。 ( 2) 輸出信號: deliver:出貨信號; change:找零金額輸出信號。通過類似的操作和判斷,該狀態(tài)機可在商品 1,商品 2,商品 3 三種狀態(tài)下循環(huán)選擇和工作,并送出相應(yīng)的狀態(tài)信號,具體的VHDL 代碼框圖如下圖中的圖(一)。 啟動 /取消多功能按鍵流程圖 2. 選擇定時模塊 選擇定時模塊有 23 種狀態(tài):停止狀態(tài)( IDLE),和計時狀態(tài)( INCCOUNT), VHDL 代碼框圖如 倒計時 程序框 圖。 系統(tǒng)中確認按鍵也能影響定時器的計數(shù),所以也要判斷它的狀態(tài),當(dāng)確認后,定時器計數(shù)值清零, 定時器也回到等待再次啟動狀態(tài)。 : Type_sel 為商品種類選擇按鍵,復(fù)位時系統(tǒng)默認 type1 及 type1_out 為高電平, type_sel 每按一次種類的選擇轉(zhuǎn)換一次; quantity_sel 為商品數(shù)量選擇,它的分析與 type_sel 一致 ; start_out為啟動 /取消同步輸出信號,當(dāng)啟動時 start_out 輸出高電平,當(dāng)取消時 start_out 輸出低電平;timer_down 為倒計時時間,時間到系統(tǒng)復(fù)位,等待再次啟動。 : 16 系統(tǒng)在啟動狀態(tài),倒計時未到且確認購買時,系統(tǒng)根據(jù)輸入的投幣信號,輸出顧客投入的金額。 17 第 六 章 自動售貨機控制電路的 具體 VHDL 描述 LIBRARY IEEE。 clk :OUT STD_LOGIC)。 SIGNAL div3:STD_LOGIC_VECTOR(3 DOWNTO 0)。EVENT AND sysclk=39。 END PROCESS。139。 END IF。EVENT AND clk2=39。 END IF。 div_3:PROCESS(clk3)IS BEGIN IF(clk339。 ELSE div4=div4+1。 clk=div4(1)。 USE 。 quan1_out,quan2_out,quan3_out:OUT STD_LOGIC)。 TYPE state3TYPE IS(s_start,s_cancel)。 SIGNAL start_cancel_rising,start_cancel_dlayed,setstart,clrstart:STD_LOGIC。 BEGIN typesel_rising=type_sel AND (NOT type_sel_dlayed)。 type_ctr:PROCESS(typesel_rising,state1,timer_down)IS BEGIN set_type1=39。set_type3=39。 IF(timer_down=39。nextstate1=s_type1。 ELSE set_type1=39。 WHEN s_type2=set_type2=39。)THEN set_type2=39。039。nextstate1=s_type3。 IF(timer_down=39。nextstate1=s_type1。 ELSE set_type3=39。 END CASE。set_quan2=39。 CASE state2 IS WHEN s_quan1=set_quan1=39。)THEN set_quan1=39。039。nextstate2=s_quan2。 IF(timer_down=39。nextstate2=s_quan1。 ELSE set_quan2=39。 WHEN s_quan3=set_quan3=39。)THEN set_quan3=39。039。nextstate2=s_quan1。 start_ctr:PROCESS(start_cancel_rising,state3,timer_down)IS 21 BEGIN setstart=39。 CASE state3 IS WHEN s_cancel= IF(start_cancel_rising=39。139。 END IF。139。)THEN nextstate3=s_cancel。 END IF。039。 ELSIF(sysclk39。state2=nextstate2。)THEN type1_out=39。END IF。139。 IF(set_type3=39。ELSE type3_out=39。139。039。)THEN quan2_out=39。END IF。139。 IF(timer_down_rising=39。 ELSIF(clrstart=39。 ELSIF(setstart=39。 END IF。 timer_down_dlayed=timer_down。 LIBRARY IEEE。 ENTITY timer_count IS PORT(reset,sysclk,clk,start_in,ok_buy:IN STD_LOGIC。 SIGNAL state,nextstate:stateTYPE。 SIGNAL timerdown_rising,timerdown_dlayed,clk_rising,clk_dlayed:STD_LOGIC。 count1:PROCESS(clk_rising,state,start_in,count,ok_buy_rising)IS BEGIN setdown=39。count_inc=39。 CASE state IS WHEN idle=clrdown=39。 IF(start_in=39。)THEN nextstate=incount。039。 ELSE IF(clk_rising=39。)THEN IF(count/=count_u)THEN count_inc=39。039。139。 END IF。039。clk_dlayed=39。 ELSIF(sysclk39。 IF(clrdown=39。ELSIF(setdown=39。END IF。 ELSIF(count_clr=39。 timerdown_dlayed=timer_down。 timer_down_out=timer_down。 USE 。 type1_in,type2_in,type3_in,quan1_in,quan2_in,quan3_in:IN STD_LOGIC。 SIGNAL timer_down_rising,timer_down_dlayed:STD_LOGIC。 VARIABLE uu:STD_LOGIC。139。 ELSIF(sysclk39。039。 ELSE uu:=39。)THEN 25 money_sum_tmpe:=0。139。 AND quan2_in=39。139。 ELSIF(type2_in=39。)THEN money_sum_tmpe:=2*1。139。 AND quan3_in=39。139。 ELSIF(type3_in=39。)THEN money_sum_tmpe:=3*2。139。 ok_buy_dlayed=ok_buy。 END PROCESS。 USE 。 money_2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))。 BEGIN ok_buy_rising=ok_buy AND (NOT ok_buy_dlayed)。 BEGIN IF(reset=39。)THEN money:=0。EVENT AND sysclk=39。 AND mm=39。139。 ELSIF(give_1yuan=39。139。)THEN money:=10。 timer_down_dlayed=timer_down。 END ARCHITECTURE rtl。 USE 。 change:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))。 SIGNAL cc,bb:INTEGER。 VARIABLE vv:STD_LOGIC。039。deliver=39。vv:=39。EVENT AND sysclk=39。 AND vv=39。 change=money_2。 change=CONV_STD_LOGIC_VECTOR(tmpe,4)。039。 timer_down_dlayed=timer_down。 END ARCHITECTURE rtl。 USE 。 deliver:OUT STD_LOGIC。 clk :OUT STD_LOGIC)。 quan1_out,quan2_out,quan3_out:OUT STD_LOGIC)。 END COMPONENT。 END COMPONENT。 END COMPONENT。 change:out STD_LOGIC_VECTOR(3 DOWNTO 0))。 BEGIN u1:sysclk_div PORT MAP(sysclk,v2)。 u5:give_moneyPORTMAP(reset,sysclk,v7,ok_buy,give_1yuan,give_5yuan, give_10yuan,v3,vv