【正文】
概念是VHDL系統(tǒng)設(shè)計的基本點。歸納起來,VHDL 語言主要具有以下優(yōu)點[4]:(1)VHDL 語言功能強大,設(shè)計方式多樣 VHDL 語言具有強大的語言結(jié)構(gòu),只需采用簡單明確的VHDL語言程序就可以描述十分復(fù)雜的硬件電路。此外,VHDL 語言能夠同時支持同步電路、異步電路和隨機電路的設(shè)計實現(xiàn),這是其他硬件描述語言所不能比擬的。 (2)VHDL 語言具有強大的硬件描述能力 VHDL 語言具有多層次的電路設(shè)計描述功能,既可描述系統(tǒng)級電路,也可以描述門級電路;描述方式既可以采用行為描述、寄存器傳輸描述或者結(jié)構(gòu)描述,也可以采用三者的混合描述方式。VHDL 語言的強大描述能力還體現(xiàn)在它具有豐富的數(shù)據(jù)類型。 (3) VHDL 語言具有很強的移植能力 VHDL 語言很強的移植能力主要體現(xiàn)在對于同一個硬件電路的 VHDL 語言描述,它可以從一個模擬器移植到另一個模擬器上、從一個綜合器移植到另一個綜合器上或者從一個工作平臺移植到另一個工作平臺上去執(zhí)行。這樣做的好處是可以使設(shè)計人員集中精力進行電路設(shè)計的優(yōu)化,而不需要考慮其他的問題。 (5) VHDL 語言程序易于共享和復(fù)用 VHDL 語言采用基于庫 ( library) 的設(shè)計方法。這些模塊可以預(yù)先設(shè)計或者使用以前設(shè)計中的存檔模塊,將這些模塊存放在庫中,就可以在以后的設(shè)計中進行復(fù)用。自頂向下設(shè)計方法的有效應(yīng)用必須基于功能強大的EDA工具,具備集系統(tǒng)描述、行為描述和結(jié)構(gòu)描述功能為一體的VHDL硬件描述語言,以及先進的ASIC制造工藝和FPGA開發(fā)技術(shù)。自頂向下的設(shè)計方法使系統(tǒng)被分解為各個模塊的集合之后,可以對設(shè)計的每個獨立模塊指派不同的工作小組,其在不同地點工作,分屬不同的單位,最后將不同模塊集成為一個系統(tǒng)模型,并對其進行綜合測試與評價。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設(shè)計的復(fù)雜性、加快了設(shè)計速度。此外,Quartus II 通過和DSP Builder工具與Matlab/Simulink相結(jié)合,可以方便地實現(xiàn)各種DSP應(yīng)用系統(tǒng);支持Altera的片上可編程系統(tǒng)(SOPC)開發(fā),集系統(tǒng)級設(shè)計、嵌入式軟件開發(fā)、可編程邏輯設(shè)計于一體,是一種綜合性的開發(fā)平臺。Altera在Quartus II 中包含了許多諸如SignalTap II、Chip Editor和RTL Viewer的設(shè)計輔助工具,集成了SOPC和HardCopy設(shè)計流程。Quartus II提供了完全集成且與電路結(jié)構(gòu)無關(guān)的開發(fā)包環(huán)境,具有數(shù)字邏輯設(shè)計的全部特性,包括[5]:(1)可利用原理圖、結(jié)構(gòu)框圖、VerilogHDL、AHDL和VHDL完成電路描述,并將其保存為設(shè)計實體文件;(2)芯片(電路)平面布局連線編輯;(3)LogicLock增量設(shè)計方法,用戶可建立并優(yōu)化系統(tǒng),然后添加對原始系統(tǒng)的性能影響較小或無影響的后續(xù)模塊;(4)功能強大的邏輯綜合工具;(5)完備的電路功能仿真與時序邏輯仿真工具;(6)定時/時序分析與關(guān)鍵路徑延時分析;(7)可使用SignalTap II邏輯分析工具進行嵌入式的邏輯分析;(8)支持軟件源文件的添加和創(chuàng)建,并將它們鏈接起來生成編程文件;(9)使用組合編譯方式可一次完成整體設(shè)計流程;(10)自動定位編譯錯誤以及高效的期間編程與驗證工具;(11)可讀入標準的EDIF網(wǎng)表文件、VHDL網(wǎng)表文件和Verilog網(wǎng)表文件也能生成第三方EDA軟件使用的VHDL網(wǎng)表文件和Verilog網(wǎng)表文件。并對QuartusII開發(fā)軟件進行了概述。本設(shè)計中的乒乓游戲機是由9個發(fā)光二極管代表乒乓球臺,中間3個發(fā)光二極管兼作球網(wǎng),用點亮的發(fā)光二極管按一定方向移動來表示球的運動方向。甲開始發(fā)球時,靠近甲方的第一個發(fā)光二極管亮,然后發(fā)光二極管由甲向乙依次點亮,代表乒乓球的移動。若乙方提前擊球或沒有擊中球,則判乙方失分,甲方的記分牌自動加一分。然后重新發(fā)球,比賽繼續(xù)進行。Hit1Hit2Sevre0Sevre1Light[8..0]乒乓球游戲機計分器2計分器1本設(shè)計由譯碼顯示器、按鍵去抖、狀態(tài)機/球臺控制器等部分所組成。FPGA最小系統(tǒng)擊球、發(fā)球按鍵FPGA各組電源計分顯示電路LED燈顯示球路徑圖2 乒乓球游戲機的組成示意圖圖3 系統(tǒng)結(jié)構(gòu)圖本設(shè)計由+5V供電,輸出+、50MHz有源晶振模塊、AS下載端口撥碼開關(guān)控制LED燈顯示模塊、數(shù)碼管計分顯示模塊及芯片EP2C5T144C8N組成。由于開發(fā)板的時鐘信號頻率是50MHz,直接作為二極管點亮頻率和數(shù)碼管掃描頻率過大,不符合設(shè)計要求,如下圖5所示為50MHz有源晶振電路圖。圖5 50MHz有源晶振電路圖部分時鐘分頻源程序:p1:process(count,clk) 25000000 倍分頻,發(fā)光二極管begin if clk39。139。 if count=25000000 then tmp=39。 count=0。039。 end if。 p2:process(couny) 5000000倍分頻,數(shù)碼管 begin if clk39。139。 if couny=5000000 then tmg=39。 couny=0。039。 end if。狀態(tài)機設(shè)置了7個狀態(tài),分別是等待發(fā)球狀態(tài)(waitserve)、第一盞燈亮狀態(tài)(light1on)、第七盞燈亮狀態(tài)(light7on)、球向乙移動狀態(tài)(ballmoveto2)、球向甲移動狀態(tài)(ballmoveto1)、允許甲擊球狀態(tài)(allow1hit)和允許乙擊球狀態(tài)(allow2hit)如表1所示。開始的時候處于“等待發(fā)球狀態(tài)”,若甲發(fā)球則狀態(tài)轉(zhuǎn)移到“第一盞燈亮狀態(tài)”,若乙發(fā)球則轉(zhuǎn)移到“第七盞燈亮狀態(tài)”,具體說明以乙球為例。若在“球向甲移動狀態(tài)”甲仍然沒有提前擊球,狀態(tài)就轉(zhuǎn)移到“允許甲擊球狀態(tài)”,在此狀態(tài)下,如果甲擊球了,那么狀態(tài)就轉(zhuǎn)移到“ 球向乙移動狀態(tài)”。狀態(tài)轉(zhuǎn)移規(guī)則都是一樣的。狀態(tài)機是種很重要的時序電路,也是本設(shè)計的核心部件。在本設(shè)計中,狀態(tài)機用兩個信號表示狀態(tài):STATE表示當前狀態(tài),I表示下一個狀態(tài)。其中SCORE11[6..0]、SCORE12[6..0]、SCORE21[6..0]、SCORE22[6..0]用七段BCD碼譯碼器顯示得分情況,而SCORESCORE2用二進制進行加分,由記分器反饋回來。此時時鐘決定了球移動的速度, 可根據(jù)實際需要調(diào)整。 when 10 = i=1。 when 01 = i=7。 when 11 = i=0。 end case。 light1on狀態(tài)下 進程處于第一盞燈亮狀態(tài) if hit2=39。 then i=0。state=waitserve。end if。 light7on狀態(tài)下 進程處于第八盞燈亮狀態(tài) if hit1=39。 then i=0。state=waitserve。 end if。139。 count2=count2+1。 elsif i=2 then i=1。 else i=i1。 when ballmoveto2 = 進程處于球向1移動狀態(tài) if hit2=39。 then i=0。state=waitserve。 state=allow2hit。 end if。139。 state=ballmoveto2。i=0。 end if。139。state=ballmoveto1。i=0。 end if。 end if。end process。數(shù)碼管的動態(tài)掃描顯示就是指我們采用分時的方法,輪流控制各個顯示器的公共端,使各個顯示器輪流點亮。如圖8數(shù)碼管顯示電路圖,圖中1K電阻起限流作用,保護發(fā)光二極管。同理,當乙發(fā)球,點甲(開關(guān)5)擊球。其按鍵閉合與釋放瞬間,輸入的信號會有毛刺。防抖電路有很多種,最簡單、最容易理解的就是計數(shù)法。圖9 按鍵控制LED燈基于計數(shù)法的防抖電路部分源程序: p1:process(pre,nex,din) 按鍵去抖狀態(tài)機 begin case pre is when s0=dout=39。 if din=39。 then nex=s0。 end if。139。139。 else nex=s2。 when s2=dout=39。 if din=39。 then nex=s0。 end if。039。139。 else nex=s3。 end case。 end one。首先考慮輸入端口,一般都應(yīng)該設(shè)置一個異步置位端口reset,用于在系統(tǒng)不正常時回到初始狀態(tài);兩個發(fā)球輸入端serve0和serve1,邏輯‘1’分別表示甲方和乙方的發(fā)球;兩個擊球輸入端hit1和hit2,邏輯‘1’分別表示甲擊球和乙擊球;一個開始游戲按鈕start,處于邏輯‘1’表示可以游戲;還得有一個時鐘輸入端口clk。 reset是記分牌清零信號 clk: in std_logic。 Start控制游戲是否開始 serve: in std_logic_vector(0 to 1)。 擊球鍵 light: out std_logic_vector(0 to 6)。 tmp,tmg為輸入輸出類型,作為分頻后的信號,供給 數(shù)碼管掃描和發(fā)光二極管點亮使用 tmg: buffer std_logic。end game。u1: myd port map(count2,score21,score22)。 本章小結(jié) 本章主要介紹了基于FPGA的乒乓球游戲機設(shè)計的模塊及實現(xiàn)功能,其中包括時鐘分頻設(shè)計、狀態(tài)機/球臺控制器、記分牌譯碼顯示器、按鍵去抖和乒乓球路徑顯示電路、頂層實體描述的介紹。4系統(tǒng)的調(diào)試、仿真、下載、測試 調(diào)試FPGA在調(diào)試FPGA電路時要遵循一定的原則和技巧,才能減少調(diào)試時間,避免誤操作損壞電路。 (1)首先在焊接硬件電路時,只焊接電源部分。 (2)然后連接好FPGA及相關(guān)的下載電路