【正文】
on, wileyInterscience,.[21]Mark Zwolinski. Digital Systerm Design with VHDL[M]. Beijing:Electronic industry Press,2002.致謝致 謝當(dāng)論文寫到這里時(shí),我的大學(xué)本科生活就算結(jié)束了。當(dāng)開始/停止按下之后,里程數(shù)就不斷增加,經(jīng)過故障排除后發(fā)現(xiàn),原來是太陽光直射到光電二極管上才導(dǎo)致出錯(cuò)。在波形仿真圖時(shí),因?yàn)闀r(shí)間參數(shù)大太導(dǎo)致仿真時(shí)間太長,所以在作合理調(diào)整的情況下,順利完成制作任務(wù)。計(jì)費(fèi)模塊花時(shí)間將近四天,所查閱的資料中我都一一進(jìn)行了測試,但是沒達(dá)到我預(yù)期的效果,其中一個(gè)是采用時(shí)鐘脈沖個(gè)數(shù)計(jì)費(fèi)方式給了我很大的啟發(fā)??梢?,利用FPGA可以極大地提高設(shè)計(jì)效率和靈活度并且修改快捷。EDA 技術(shù)是以計(jì)算機(jī)為工具來完成數(shù)字系統(tǒng)的邏輯綜合、布局布線和設(shè)計(jì)仿真等工作,電路設(shè)計(jì)者只需要完成對系統(tǒng)功能的描述,就可由計(jì)算機(jī)軟件進(jìn)行系統(tǒng)處理,得到設(shè)計(jì)結(jié)果,且修改設(shè)計(jì)方案如同修改軟件一樣方便。液晶第一行顯示順序分別是等待時(shí)間,總費(fèi)用,第二行顯示計(jì)費(fèi)單價(jià),總公里數(shù)。在該模塊程序中,將不變的字符固定,同時(shí)將變化的字符位置進(jìn)行掃描周期為500Hz的動(dòng)態(tài)掃描,以減小錯(cuò)誤顯示的概率。該模塊的詳細(xì)代碼請參附錄2。圖519 ram_1602模塊原理圖本模塊采用狀態(tài)機(jī)來描述,共分52個(gè)狀態(tài),時(shí)序邏輯是依據(jù)字符型液晶顯示器資料給定的時(shí)序來制定的。圖517 SF模塊原理圖圖518 SF模塊仿真波形圖 ram_1602模塊的實(shí)現(xiàn)ram_1602 模塊如圖519所示。SF 模塊仿真波形如圖518所示。 sf_out=sf_out_t。 END IF。 THEN sf_out_t=fei2。 ELSIF en2=39。139。 THEN sf_out_t=fei3。下面列出單價(jià)模塊的關(guān)鍵代碼:BEGIN IF t=39。圖516 conv模塊仿真波形圖 SF模塊的實(shí)現(xiàn)SF 模塊如圖517所示。將16位十六進(jìn)制碼譯成16位十進(jìn)制碼。end if。out3=conv_std_logic_vector(q2 rem 10,4)。 thenout1=conv_std_logic_vector(tmp rem 10,4)。event and clk=39。輸入信號(hào)為 clk,in16[15..0],輸出信號(hào)為 out1[3..0],out2[3..0],out3[3..0],out4[3..0]。由 DENDAI模塊輸出的等待時(shí)間計(jì)費(fèi)信號(hào) flag,由 GL模塊輸出的大于3km少于10km內(nèi)每公里計(jì)費(fèi)信號(hào) flag_3_9km,大于或等于10km每公里計(jì)費(fèi)信號(hào) flag_9km,不同的信號(hào)總費(fèi)用累加的額度不同,單個(gè) ,單個(gè) 。 end process che_9。 end if。 then d3:=x0000。 begin if reset=39。 end process che_3_9。 end if。 then d2:=x0000。 begin if reset=39。 end process den。 end if。 then d0:=x0000。 begin if reset=39。下面給出計(jì)費(fèi)的關(guān)鍵代碼: fei_bcd=denfei+chefei_3_9+chefei_9+fei_base 。圖511 DENDAI模塊原理圖圖512 DENDAI模塊仿真波形圖 MONEY 模塊的實(shí)現(xiàn)MONEY 模塊如圖513所示。開始/停止信號(hào) START,暫停信號(hào) PUL。ff=en1。s1。039。hour_l=m0。amp。 hour_h=39。039。039。 END IF。 END IF。 END IF。 END IF。 此IF語句完成分計(jì)數(shù) IF m1=101 THEN m1=000。 IF s1=101 THEN s1=000。 END IF。 IF s1=101 AND s0=1001 THEN s1=000。039。139。s1amp。s0=0100000 OR s1amp。 END IF。此IF語句得到en1使能信號(hào) ELSE en1=39。m0=time_wait THEN en1=39。039。s0=0000。m0=0000。039。039。039。139。下面給出等待模塊的關(guān)鍵代碼: IF CLK_1HZ39。圖510 key_set 模塊仿真圖 DENDAI 模塊的實(shí)現(xiàn)DENDAI 模塊如圖511所示。模塊中按鍵采用防消抖處理電路。key_set 模塊仿真波形如圖510所示。end process。process (clock_50M) 按鍵功能部分begin if rising_edge(clock_50M) then k_debounce=dout1 or dout2 or dout3 。 end if。 dout3=dout2。 then dout1=key。 圖59 key_set 模塊原理圖下面給出按鍵設(shè)計(jì)的核心代碼:begin if rising_edge(clock_50M) then if clk=39。 圖57 int_div 模塊原理圖 圖58 int_div 模塊仿真波形圖 key_set 模塊的實(shí)現(xiàn)key_set 模塊如圖59所示。int_div 模塊仿真波形如圖58所示。CLK500HZ=Temp3 XOR Temp4。END PROCESS。 END IF。 END IF。END IF。 ELSE Counter1=Counter1+1。 IF Counter1=N21 THEN counter1=0。 ELSE Counter=Counter+1。下面給出分頻模塊關(guān)鍵代碼:BEGIN IF RISING_EDGE(CLK_50M) THEN IF Counter=N11 THEN counter=0。 圖55 GL模塊圖 圖56 GL模塊仿真圖形 int_div 模塊的實(shí)現(xiàn)int_div 模塊如圖57所示。當(dāng) PUL為1時(shí),脈沖計(jì)數(shù)有效,否則為暫停時(shí)間,脈沖計(jì)數(shù)無效。大于9KMEND one。小于3KMflag_3_9km=en1 AND en。 else 39。 when en=39。flag_3km=39。 else 39。 when en2=39。flag_9k=39。 else 39。 when en1=39。flag_3_9k=39。 else 39。 when en0=39。flag_3k=39。 else 39。 when en=39。flag_1k=39。glshi=glcount(7 downto 4)。END PROCESS JS。039。039。039。039。 END IF。039。 ELSE glcount(3 DOWNTO 0)=glcount(3 DOWNTO 0) +1 。 ELSE glcount(7 DOWNTO 4)=glcount(7 DOWNTO 4) +1 。 ELSE glcount(11 DOWNTO 8)=glcount(11 DOWNTO 8) +1 。 IF glcount(7 DOWNTO 4)=X5 THEN glcount(7 DOWNTO 4)=X0。 en=39。039。 ELSIF sec39。039。 END IF。en2=39。en1=39。 ELSIF glcount=000010010000 THEN en0=39。en2=39。en1=39。 ELSIF glcount000010010000 AND glcount=000000110000 THEN en0=39。en2=39。en1=39。 THEN IF glcount000000110000 THEN en0=39。 ELSIF START=39。039。輸入信號(hào)為時(shí)鐘信號(hào) CLK_50M,脈沖信號(hào) CP,開始/停止按鍵 START,暫停信號(hào) PUL,復(fù)位信號(hào) RESET,輸出信號(hào)為3km以內(nèi)標(biāo)志信號(hào) flag_3k,大于3km少于10km的標(biāo)志信號(hào) flag_3_9k,大于或等于10km的標(biāo)志信號(hào) flag_9k,大于3km少于10km內(nèi)每公里脈沖信號(hào) flag_3_9km,大于或等于10km每公里脈沖信號(hào) flag_9km,公里十時(shí)制輸出 glbai[3..0],glshi[3..0],glge[3..0]。所得的數(shù)據(jù)送至液晶LCD1602上以及輸出電機(jī)狀態(tài)。三個(gè)按鍵的功能是開始/停止,暫停,加速,還有一個(gè)復(fù)位按鍵。輸入信號(hào)為時(shí)鐘信號(hào) CLK_50M,脈沖信號(hào)CP,復(fù)位信號(hào)SYS_RESET,按鍵開關(guān)KEY[2..0],輸出信號(hào)為液晶顯示信號(hào) lcd_rs,lcd_rw,lcd_e,data[7..0],直流電機(jī)控制端 motoa,motob。LCD 顯示模塊:系統(tǒng)采用字符型液晶顯示數(shù)據(jù),將行駛單價(jià)、總公里、總費(fèi)用以及等待時(shí)間在LCD 上顯示。其中 flag_3_9km 。SF 模塊:四選一,通過對公里狀態(tài)信號(hào) en0,en1,en2,時(shí)間狀態(tài)信號(hào)t 決定輸出計(jì)費(fèi)單價(jià)sf_out[7..0],并將之送入 LCD 顯示模塊。當(dāng)PUL 為1時(shí),開始記錄時(shí)間,并將時(shí)間送入 LCD 模塊。GL 模塊:通過對速度信號(hào)脈沖信號(hào) CP、開關(guān)信號(hào) START、復(fù)位信號(hào) SYS_RESET、暫停信號(hào)PUL的判斷,決定輸出計(jì)數(shù)公里數(shù)和公里狀態(tài)標(biāo)志,即 flag_3k,flag_3_9k,flag_9k和不同公里范圍的每公里脈沖數(shù) flag_3_9km,flag_9km,同時(shí)將公里數(shù)送入 LCD 模塊。其中各模塊的功能是:key_set 模塊:通過對KEY[2..0] 信號(hào)的采樣判斷處理,能夠?qū)EY[2..0]按鍵進(jìn)行消抖處理,防止由于微小震動(dòng)而產(chǎn)生的錯(cuò)誤信號(hào)。 圖52 系統(tǒng)頂層原理圖該原理圖中輸入部分分別是計(jì)價(jià)器啟動(dòng)/停止信號(hào):START;暫停信號(hào):PUL;復(fù)位信號(hào):SYS_RESET,時(shí)鐘信號(hào):CLK_50M,脈沖輸入信號(hào):CP。三個(gè)模塊有機(jī)地結(jié)合在一起,實(shí)現(xiàn)了基于FPGA的多功能計(jì)程車計(jì)價(jià)器的設(shè)計(jì)。計(jì)價(jià)部分又包括兩個(gè)內(nèi)容,一個(gè)是正常車行里程數(shù)這算成價(jià)格費(fèi)用,根據(jù)車行路程的遠(yuǎn)近,還需要增加相應(yīng)的附加費(fèi)用;另一部分是在車行過程中等待紅燈等暫停狀態(tài)下,等候時(shí)間折算成的價(jià)格費(fèi)用。(1) 脈沖生成模塊使整個(gè)系統(tǒng)的同步工作,把系統(tǒng)提供的50M的晶振頻率進(jìn)行分頻,得到我們所需要的秒信號(hào)(便于在以后的計(jì)時(shí)中用到),同時(shí)生成電路工作所需要的500Hz工作脈沖。 系統(tǒng)總體框架系統(tǒng)的頂層框圖如圖51所示。在分層次的設(shè)計(jì)中,配置可以用來把特定的設(shè)計(jì)實(shí)體關(guān)聯(lián)到元件實(shí)例(Component),或把特定的結(jié)構(gòu)關(guān)聯(lián)到一個(gè)實(shí)體。結(jié)構(gòu)體(Architecture)用于描述相應(yīng)實(shí)體的行為、功能或電路結(jié)構(gòu),特別要注意的是結(jié)構(gòu)體與實(shí)體不是一一對應(yīng)的的,一個(gè)實(shí)體可以對應(yīng)多個(gè)結(jié)構(gòu)體,但一個(gè)結(jié)構(gòu)體只能對應(yīng)一個(gè)實(shí)體。實(shí)體(Entity)是VHDL程序的基本單元,用于說明設(shè)計(jì)系統(tǒng)的外部接口信息,相當(dāng)于提供一個(gè)設(shè)計(jì)單元的公共信息。VHDL程序的基本結(jié)構(gòu)一個(gè)完整的VHDL語言程序包括庫的調(diào)用、程序包的調(diào)用、實(shí)體說明、結(jié)構(gòu)體描述和配置5部分。l 支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用。l 具有良好的可讀性,即容易被計(jì)算機(jī)接受,也容易被讀者理解。VHDL語言的優(yōu)點(diǎn)VHDL是一種用形式化方法來描述數(shù)字電路和設(shè)計(jì)數(shù)字邏輯系統(tǒng)的語言,綜合起來講,VHDL語言具有如下優(yōu)點(diǎn):l 覆蓋面廣,描述能力強(qiáng),是一個(gè)多層次的描述語言。 VHDL語言概述VHDL是由美國國防部為描述電子電路所開發(fā)的一種語言,其全稱為(Very High Speed Integrated Circuit) Hardware Description Language。本次軟件設(shè)計(jì)語言采用VHDL。圖411 液晶1602顯示電路 5 出租車計(jì)費(fèi)系統(tǒng)軟件設(shè)計(jì)FPGA程序設(shè)計(jì)主要采用兩種語言:VHDL和Verilog HDL。15腳(BL A):背光顯示器電源+5V。1:LCM可做讀寫操作; 0:LCM不能做讀寫操作。1:讀;0:寫。1:選擇數(shù)據(jù)寄存囂;0:選擇指令寄存器。使用可變電阻調(diào)整,通常接地。10%)V。10%)V或接地。16x2字符型液晶顯示模塊(LCM)的特性:(1)+5V電壓,反視度(明暗對比度)可調(diào)整;(2)內(nèi)含振蕩電路,系統(tǒng)內(nèi)含重置電路;(3)提供各種控制命令,如清除顯示、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;(4)顯示用數(shù)據(jù)DDRAM共有80字節(jié);(5)字符發(fā)生器CGROM有160個(gè)5x7的點(diǎn)陣字型;(6)字符發(fā)生器CGRAM可由使用者自行定義8個(gè)5x7的點(diǎn)陣字型。16x2點(diǎn)陣字符液晶模塊是由點(diǎn)陣字符液晶顯示器件和專用的行、列驅(qū)動(dòng)