【正文】
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)的“編程語言”,它通過對硬件行為的直接描述來實(shí)現(xiàn)對硬件的物理實(shí)現(xiàn),代表了當(dāng)今硬件設(shè)計(jì)的發(fā)展方向。 第四, VHDL 性能評估能力:非依賴器件的設(shè)計(jì)和可移植能力允許設(shè)計(jì)者采用不同的器件結(jié)構(gòu)和不同的綜合工具來評估設(shè)計(jì),在設(shè)計(jì)者開始設(shè)計(jì)之前,無需了解將采用何種器件,設(shè)計(jì)者可以進(jìn)行一個(gè)完整的設(shè)計(jì)描述,并且對其進(jìn)行綜合,生成選定的器件結(jié)構(gòu)的邏輯功能,然后評估結(jié)果,選用最合適你設(shè)計(jì)需求的器件,為了衡量綜合的質(zhì)量,同樣可以用不同的綜合工具所得到的綜合結(jié)果來進(jìn)行分析和評估。 設(shè)計(jì)方案比較與選擇: 本文是在 VHDL 的基礎(chǔ)上對自動(dòng)售貨機(jī)進(jìn)行設(shè)計(jì)來實(shí)現(xiàn)其基本功能的。 2. 自動(dòng)售貨機(jī)給出 30 秒的選擇時(shí)間,時(shí)間倒計(jì)時(shí)到 系統(tǒng)進(jìn)入停止?fàn)顟B(tài),放棄購買操作。 4. 通過啟動(dòng) /取消復(fù)合按鍵,來啟動(dòng)購買和取消購買,每按一次狀態(tài)轉(zhuǎn)換一次。 主控制器模塊( main_control):它是自動(dòng)售貨機(jī)的主控制電路,控制商品種類選擇,商品數(shù)量選擇,啟動(dòng) /取消操作,和確認(rèn)購買操作,以及對其它模塊的工作控制。 找零出貨模塊( change_deliver) :在對商品的實(shí)際金額和顧客投入的金額比較,判斷投入金額是否大于商品實(shí)際金額后,若大于則出貨并找零;若小于則 推出顧客 投入的金額。 主控制器的輸入信號和輸出信號如上述的結(jié) 構(gòu)框圖,分別敘述如下: ( 1) 輸入信號: reset:上電復(fù)位輸入; sysclk:系統(tǒng)時(shí)鐘輸入; start_cancel:啟動(dòng)與取消按鍵輸入; quantity_sel:商品數(shù)量選擇按鍵輸入; type_sel:商品種類選擇按鍵輸入; timer_down: 選擇定時(shí)到信號輸入。 商品金額計(jì)算模塊是根據(jù)主控制器輸出的商品種類和商品數(shù)量信號,來計(jì)算選購商品的總金額,其輸入和輸出信號分別如下: ( 1) 輸入信號: ok_buy:確定購買商品按鍵輸入信號; reset:復(fù)位信號; sysclk:系統(tǒng)時(shí)鐘輸入信號; start_in:啟動(dòng)與取消操作信號; timer_down:選擇倒計(jì)時(shí)到輸入信號; 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)機(jī)可在商品 1,商品 2,商品 3 三種狀態(tài)下循環(huán)選擇和工作,并送出相應(yīng)的狀態(tài)信號,具體的VHDL 代碼框圖如下圖中的圖(一)。 啟動(dòng) /取消多功能按鍵流程圖 2. 選擇定時(shí)模塊 選擇定時(shí)模塊有 23 種狀態(tài):停止?fàn)顟B(tài)( IDLE),和計(jì)時(shí)狀態(tài)( INCCOUNT), VHDL 代碼框圖如 倒計(jì)時(shí) 程序框 圖。 系統(tǒng)中確認(rèn)按鍵也能影響定時(shí)器的計(jì)數(shù),所以也要判斷它的狀態(tài),當(dāng)確認(rèn)后,定時(shí)器計(jì)數(shù)值清零, 定時(shí)器也回到等待再次啟動(dòng)狀態(tài)。 : Type_sel 為商品種類選擇按鍵,復(fù)位時(shí)系統(tǒng)默認(rèn) type1 及 type1_out 為高電平, type_sel 每按一次種類的選擇轉(zhuǎn)換一次; quantity_sel 為商品數(shù)量選擇,它的分析與 type_sel 一致 ; start_out為啟動(dòng) /取消同步輸出信號,當(dāng)啟動(dòng)時(shí) start_out 輸出高電平,當(dāng)取消時(shí) start_out 輸出低電平;timer_down 為倒計(jì)時(shí)時(shí)間,時(shí)間到系統(tǒng)復(fù)位,等待再次啟動(dòng)。 : 16 系統(tǒng)在啟動(dòng)狀態(tài),倒計(jì)時(shí)未到且確認(rèn)購買時(shí),系統(tǒng)根據(jù)輸入的投幣信號,輸出顧客投入的金額。 17 第 六 章 自動(dòng)售貨機(jī)控制電路的 具體 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