前 言
隨著人類社會的高速發展,電子行業也隨之迅猛的發展,這也使得人們越來越想方設法的是自己更加方便、輕松的生活,例如:自從有了電視遙控器開啟電視,更改電視頻道,我們再也不用跑來跑去用手改換頻道;自從有了全自動洗衣機,我們再也不用半自動洗衣機或者人工搓衣板去清洗衣服;自從有了交通燈,不僅省去了很多人力去指揮交通,而且使交通更加井然有序。當然,當具有定時、顯示、加減分等多功能性的搶答器擺在我們面前時,我想人們不會用舉手的方式或者舉牌的方式進行搶答了。
如今無論是什么場合,只要舉辦搶答比賽,我們都能見到搶答器的使用,因為它以客觀的電子電路進行狀態判斷,避免了競賽中出現的人為的失誤,或者由于某些原因造成的不公平。搶答器能夠準確、公正的判斷誰是第一搶答者,并且直觀的指出誰是第一搶答者。由于其附加的定時、加減分等功能則能夠省去部分人力,且更準確的規范時間。
現在市面上也存在著各種各樣的搶答器,但主要流行的是單片機搶答器和數字搶答器,雖然這兩款搶答器都能實現搶答器的基本功能,但是都或多或少的存在著一些缺點。
單片機搶答器的設計?刂葡到y主要由單片機應用電路、存儲器接口電路、顯示接口電路組成。其中單片機89C51是系統工作的核心,它主要負責控制各個部分協調工作.。雖然單片機實現起來相當靈活,但隨著搶答器數組的增加則存在著I/O口不足的問題。這就不能為以后進行搶答器組數的增加進行改進了。
數字搶答器的設計。數字搶答器電路主要是由電子元器件組成,數字搶答器由主體電路與擴展電路組成。雖然數字電路主要有元器件組成,成本較為便宜,且小規模數字邏輯設計思路簡單,但是電路實現起來比較麻煩:進行電路規劃,用protel99畫出電路的PCB板,硬件的焊接與調試等等程序步驟。總之硬件設計不僅工作量大,而且要求也高。
介于上面兩款搶答器的不足點,本次設計則采用FPGA現場可編程技術,這樣就避免了硬件的焊接與調試,同時由于FPGA的I/O端口豐富,可以在設計的基礎上略加修改實現多組輸入的搶答器,增強了系統的靈活性。
本文介紹了一種采用EDA技術,基于FPGA并在QuartusⅡ工具軟件環境下使用Verilog硬件描述語言編寫的數碼管顯示4路搶答器的電路設計、設計思路以及實現功能。
本次設計以EP2C8Q208為核心,完成主持人的控制與參賽隊伍的搶答功能;使用Quartus II軟件用Verilog HDL完成代碼編寫,然后用Quartus II軟件實現正確的波形仿真作為主要的技術指標。
根據本次設計的技術要求,特設計了以下各種模塊來實現搶答器的基本功能:搶答判別模塊,計時模塊,分頻器模塊,計分模塊,鎖存器模塊,數碼管驅動模塊等等。經過編譯及其仿真所設計的程序,該設計的搶答器基本能夠實現此次設計的要求,從而完成了搶答器應具備的功能。
EDA是電子設計自動化(Electronic DesignAutomation)的縮寫,在20世紀90年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發展而來的。
EDA技術是指以計算機為工作平臺,融合了應用電子技術、計算機技術、信息處理及智能化技術的最新成果,進行電子產品的自動設計。
利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程的計算機上自動處理完成。
EDA工具軟件可大致可分為芯片設計輔助軟件、可編程芯片輔助設計軟件、系統設計輔助軟件等三類。
目前進入我國并具有廣泛影響的EDA軟件是系統設計軟件輔助類和可編程芯片輔助設計軟件:Protel、Altium Designer、PSPICE、multisim12(原EWB的最新版本)、OrCAD、PCAD、LSIIogic、MicroSim、ISE、modelsim、Matlab等等。這些工具都有較強的功能,一般可用于幾個方面,例如很多軟件都可以進行電路設計與仿真,同時還可以進行PCB自動布局布線,可輸出多種網表文件與第三方軟件接口。
利用EDA技術進行電子系統的設計,具有以下特點:
- 用軟件的方式設計硬件;用軟件方式設計的系統到硬件系統的轉換是由有關的考法軟件自動完成的;
- 設計過程中可用有關軟件進行各種仿真;
- 系統可現場編輯,在線升級;
- 整個系統可集中在一個芯片上,體積小、功耗低、可靠性高;
- 從以前的“組合設計”轉向真正的“自由設計”;
- 設計的移植性好,效率高;
- 非常適合分工設計,團體協作。
因此,EDA技術是現代電子設計的發展趨勢。
現行的搶答的實現方案主要有兩種:一種則是使用單片機,另一種是小規模數字邏輯芯片和觸發器。
單片機搶答器的設計?刂葡到y主要由單片機應用電路、存儲器接口電路、顯示接口電路組成。其中單片機AT89C51是系統工作的核心,它主要負責控制各個部分協調工作.。然而現如今單片機組成的搶答器也存在著一些缺點,或者應該說是不足點,雖然單片機實現起來相當靈活,但隨著搶答器數組的增加則存在著I/O口不足的問題。這就不能為以后進行搶答器組數的增加進行改進了。
數字搶答器的設計。數字搶答器電路主要是由電子元器件組成,數字搶答器由主體電路與擴展電路組成。優先編碼器、鎖存器、譯碼電路將參賽隊的輸入信號在顯示器上輸出;用控制電路和主持人開關啟動報警電路,以上兩部分組成主體電路。通過定時電路和譯碼電路將脈沖產生的信號在顯示器上輸出實現計時功能,構成擴展電路。雖然數字電路主要有元器件組成,成本較為便宜,且小規模數字邏輯設計思路簡單,但是電路實現起來比較麻煩:進行電路規劃,用protel99畫出電路的PCB板,硬件的焊接與調試等等程序步驟?傊布O計不僅工作量大,而且要求也高。
現存的搶答器設計方案雖然都能實現搶答器的功能,但是又由于它們自身缺點的限制,有些方面很難或者說很麻煩實現。然而由于FPGA本身一些的特點、優點能夠使基于FPGA制作的搶答器克服這些問題。FPGA作為新技術具有以下優點:
(1) FPGA的管腳多,容易實現大規模系統。
(2) FPGA的運行速度快。
(3) FPGA內部程序并行運行,有處理更復雜的功能。
(4) FPGA有大量的軟核,能夠進行二次開發。
所以學習FPGA并利用FPGA進行搶答器的設計是十分必要的。
本次設計的搶答器能夠同時供應4位選手或者4個代表隊進行搶答比賽,分別使用4個按鈕a,b,c,d表示。同時需要設置系統復位和搶答控制開關,這需由主持人控制。主持人在允許搶答的情況下,計時器開始從30s開始倒計時,直到有人搶答成功后,由鎖存器將時間鎖存住,此時數碼管上將顯示剩余時間及搶答成功選手號碼,同時對應選手的LED燈也被點亮。在判別選手是否回答正確后,由主持人控制加減按鈕進行給分。在一輪比賽結束后,主持人按下復位按鈕,則除了計分模塊外,其他模塊都復位為初始時刻,為下一輪的比賽做好準備。
FPGA(Field-Programmable Gate Array),即現場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發展的產物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現的,既解決了定制電路的不足,又克服了原有可編程器件門電路數有限的缺點。
其主要特點如下:
- 采用FPGA設計ASIC電路(專用集成電路),用戶不需要投片生產,就能得到合用的芯片。
- FPGA可做其它全定制或半定制ASIC電路的中試樣片。
- FPGA內部有豐富的觸發器和I/O引腳。
- FPGA是ASIC電路中設計周期最短、開發費用最低、風險最小的器件之一。
- FPGA采用高速CMOS工藝,功耗低,可以與CMOS、TTL電平兼容。
可以說,FPGA芯片是小批量系統提高系統集成度、可靠性的最佳選擇之一。
FPGA是由存放在片內RAM中的程序來設置其工作狀態的,因此,工作時需要對片內的RAM進行編程。用戶可以根據不同的配置模式,采用不同的編程方式。
加電時,FPGA芯片將EPROM中數據讀入片內編程RAM中,配置完成后,FPGA進入工作狀態。掉電后,FPGA恢復成白片,內部邏輯關系消失,因此,FPGA能夠反復使用。FPGA的編程無須專用的FPGA編程器,只須用通用的EPROM、PROM編程器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片FPGA,不同的編程數據,可以產生不同的電路功能。因此,FPGA的使用非常靈活。
目前以硬件描述語言(Verilog HDL或 VHDL)所完成的電路設計,可以經過簡 單的綜合與布局,快速的燒錄至FPGA上進行測試,是現代IC設計驗證的技術主流。這些可編輯元件可以被用來實現一些基本的邏輯門電路(比如AND、OR、XOR、NOT)或者更復雜一些的組合功能比如解碼器或數學方程式。在大多數的FPGA里面,這些可編輯的元件里也包含記憶元件例如觸發器(Flip-flop)或者其他更加完整的記憶塊。
FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復雜的設計,但是功耗較低。但是他們也有很多的優點比如可以快速成品,可以被修改來改正程序中的錯誤和更便宜的造價。廠商也可能會提供便宜的但是編輯能力差的FPGA。因為這些芯片有比較差的可編輯能力,所以這些設計的開發是在普通的FPGA上完成的,然后將設計轉移到一個類似于ASIC的芯片上。另外一種方法是用CPLD(復雜可編程邏輯器件備)。
根據市場上對FPGA的需要,則FPGA的主要分類有以下幾種:
1) 按邏輯功能塊的大小分類
可編程邏輯塊是FPGA的基本邏輯構造單元。按照邏輯功能塊的大小不同,可將FPGA分為細粒度結構和粗粒度結構兩類。
細粒度FPGA的邏輯功能塊一般較小,僅由很小的幾個晶體管組成,非常類似于半定制門陣列的基本單元,其優點是功能塊的資源可以被完全利用,缺點是完成復雜的邏輯功能需要大量的連線和開關,因而速度慢;粗粒度FPGA的邏輯塊規模大,功能強,完成復雜邏輯只需較少的功能塊和內部連線,因而能獲得較好的性能,缺點是功能塊的資源有時不能被充分利用。
近年來隨著工藝的不斷改進,FPGA的集成度不斷提高,硬件描述語言(HDL)的設計方法得到了廣泛應用。由于大多數邏輯綜合工具是針對門陣列的結構開發的,細粒度的FPGA較粗粒度的FPGA可以得到更好的邏輯綜合結果,因此許多廠家開發出了一些具有更高集成度的細粒度FPGA,如Xilinx公司采用MicroVia技術的一次編程反熔絲結構的XC8100系列,GateField公司采用閃速EPROM 控制開關元件的可再編程GF100K系列等,它們的邏輯功能塊規模相對都較小。
2) 按互連結構分類
根據FPGA內部的連線結構不同,可將其分為分段互連型和連續互連型兩類。
分段互連型FPGA中有不同長度的多種金屬線,各金屬線段之間通過開關矩陣或反熔絲編程連接。這種連線結構走線靈活,有多種可行方案,但走線延時與布局布線的具體處理過程有關,在設計完成前無法預測,設計修改將引起延時性能發生變化。
連續互連型FPGA是利用相同長度的金屬線,通常是貫穿于整個芯片的長線來實現邏輯功能塊之間的互連,連接與距離遠近無關。在這種連線結構中,不同位置邏輯單元的連接線是確定的,因而布線延時是固定和可預測的。
3) 按編程特性分類
根據采用的開關元件的不同,FPGA可分為一次編程型和可重復編程型兩類。
一次編程型FPGA采用反熔絲開關元件,其工藝技術決定了這種器件具有體積小、集成度高、互連線特性阻抗低、寄生電容小及可獲得較高的速度等優點;此外,它還有加密位、反拷貝、抗輻射抗干擾、不需外接PROM或EPROM等特點。但它只能一次編程,一旦將設計數據寫入芯片后,就不能再修改設計,因此比較適合于定型產品及大批量應用。
可重復編程型FPGA采用SRAM開關元件或快閃EPROM控制的開關元件。FPGA芯片中,每個邏輯塊的功能以及它們之間的互連模式由存儲在芯片中的SRAM或快閃EPROM中的數據決定。SRAM型開關的FPGA是易失性的,每次重新加電,FPGA都要重新裝入配置數據。SRAM型FPGA的突出優點是可反復編程,系統上電時,給FPGA加載不同的配置數據,即可令其完成不同的硬件功能。這種配置的改變甚至可以在系統的運行中進行,實現系統功能的動態重構。采用快閃EPROM控制開關的FPGA具有非易失性和可重復編程的雙重優點,但在再編程的靈活性上較SRAM型FPGA差一些,不能實現動態重構。此外,其靜態功耗較反熔絲型及SRAM型的FPGA高。
FPGA采用了邏輯單元陣列LCA(Logic Cell Array)這樣一個概念,內部包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內部連線(Interconnect)三個部分。 現場可編程門陣列(FPGA)是可編程器件,與傳統邏輯電路和門陣列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的結構。FPGA利用小型查找表(16×1RAM)來實現組合邏輯,每個查找表連接到一個D觸發器的輸入端,觸發器再來驅動其他邏輯電路或驅動I/O,由此構成了既可實現組合邏輯功能又可實現時序邏輯功能的基本邏輯單元模塊,這些模塊間利用金屬連線互相連接或連接到I/O模塊。FPGA的邏輯是通過向內部靜態存儲單元加載編程數據來實現的,存儲在存儲器單元中的值決定了邏輯單元的邏輯功能以及各模塊之間或模塊與I/O間的聯接方式,并最終決定了FPGA所能實現的功能,FPGA允許無限次的編程。
FPGA是在PAL、GAL、EPLD、CPLD等可編程器件的基礎上進一步發展的產物。它是作為ASIC領域中的一種半定制電路而出現的,即解決了定制電路的不足,又克服了原有可編程器件門電路有限的缺點。
由于FPGA需要被反復燒寫,它實現組合邏輯的基本結構不可能像ASIC那樣通過固定的與非門來完成,而只能采用一種易于反復配置的結構。查找表可以很好地滿足這一要求,目前主流FPGA都采用了基于SRAM工藝的查找表結構,也有一些軍品和宇航級FPGA采用Flash或者熔絲與反熔絲工藝的查找表結構。通過燒寫文件改變查找表內容的方法來實現對FPGA的重復配置。
根據數字電路的基本知識可以知道,對于一個n輸入的邏輯運算,不管是與或非運算還是異或運算等等,最多只可能存在2n種結果。所以如果事先將相應的結果存放于一個存貯單元,就相當于實現了與非門電路的功能。FPGA的原理也是如此,它通過燒寫文件去配置查找表的內容,從而在相同的電路情況下實現了不同的邏輯功能。
查找表(Look-Up-Table)簡稱為LUT,LUT本質上就是一個RAM。目前FPGA中多使用4輸入的LUT,所以每一個LUT可以看成一個有4位地址線的 的RAM。 當用戶通過原理圖或HDL語言描述了一個邏輯電路以后,PLD/FPGA開發軟件會自動計算邏輯電路的所有可能結果,并把真值表(即結果)事先寫入RAM,這樣,每輸入一個信號進行邏輯運算就等于輸入一個地址進行查表,找出地址對應的內容,然后輸出即可。
目前主流的FPGA仍是基于查找表技術的,已經遠遠超出了先前版本的基本性能,并且整合了常用功能(如RAM、時鐘管理和DSP)的硬核(ASIC型)模塊。FPGA芯片主要由7部分完成,分別為:可編程輸入輸出單元、基本可編程邏輯單元、完整的時鐘管理、嵌入塊式RAM、豐富的布線資源、內嵌的底層功能單元和內嵌專用硬件模塊。
每個模塊功能如下:
1) 可編程輸入輸出單元(IOB)
可編程輸入/輸出單元簡稱I/O單元,是芯片與外界電路的接口部分,完成不同電氣特性下對輸入/輸出信號的驅動與匹配要求,FPGA內的I/O按組分類,每組都能夠獨立地支持不同的I/O標準。通過軟件的靈活配置,可適配不同的電氣標準與I/O物理特性,可以調整驅動電流的大小,可以改變上、下拉電阻。
外部輸入信號可以通過IOB模塊的存儲單元輸入到FPGA的內部,也可以直接輸入FPGA 內部。當外部輸入信號經過IOB模塊的存儲單元輸入到FPGA內部時,其保持時間(Hold Time)的要求可以降低,通常默認為0。為了便于管理和適應多種電器標準,FPGA的IOB被劃分為若干個組(bank),每個bank的接口標準由其接口電壓VCCO決定,一個bank只能有 一種VCCO,但不同bank的VCCO可以不同。只有相同電氣標準的端口才能連接在一起,VCCO電壓相同是接口標準的基本條件。
2) 可配置邏輯塊(CLB)
CLB是FPGA內的基本邏輯單元。CLB的實際數量和特性會依器件的不同而不同,但是每個CLB都包含一個可配置開關矩陣,此矩陣由4或6個輸入、一些選型電路(多路復用器等)和觸發器組成。開關矩陣是高度靈活的,可以對其進行配置以便處理組合邏輯、移位寄存器或RAM。數字時鐘管理模塊(DCM)。
業內大多數FPGA均提供數字時鐘管理(Xilinx的全部FPGA均具有這種特性)。Xilinx推出最先進的FPGA提供數字時鐘管理和相位環路鎖定。相位環路鎖定能夠提供精確的時鐘綜合,且能夠降低抖動,并實現過濾功能。
3) 豐富的布線資源
布線資源連通FPGA內部的所有單元,而連線的長度和工藝決定著信號在連線上的驅動能力和傳輸速度。FPGA芯片內部有著豐富的布線資源,根據工藝、長度、寬度和分布位置的不同而劃分為4類不同的類別。第一類是全局布線資源,用于芯片內部全局時鐘和全局復位/置位的布線;第二類是長線資源,用以完成芯片 Bank間的高速信號和第二全局時鐘信號的布線;第三類是短線資源,用于完成基本邏輯單元之間的邏輯互連和布線;第四類是分布式的布線資源,用于專有時鐘、復位等控制信號線。
4) 底層內嵌功能單元
內嵌功能模塊主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等軟處理核(SoftCore),F在越來越豐富的內嵌功能單元,使得單片FPGA成為了系統級的設計工具,使其具備了軟硬件聯合設計的能力,逐步向SOC平臺過渡。
5) 內嵌專用硬核
內嵌專用硬核是相對底層嵌入的軟核而言的,指FPGA處理能力強大的硬核(Hard Core),等效于ASIC電路。為了提高FPGA性能,芯片生產商在芯片內部集成了一些專用的硬核。
6) 嵌入式塊RAM(BRAM)
大多數FPGA都具有內嵌的塊RAM,這大大拓展了FPGA的應用范圍和靈活性。塊RAM可被配置為單端口RAM、雙端口RAM、內容地址存儲器 (CAM)以及FIFO等常用存儲結構。RAM、FIFO是比較普及的概念,在此就不冗述。CAM存儲器在其內部的每個存儲單元中都有一個比較邏輯,寫入 CAM中的數據會和內部的每一個數據進行比較,并返回與端口數據相同的所有數據的地址,因而在路由的地址交換器中有廣泛的應用。除了塊RAM,還可以將 FPGA中的LUT靈活地配置成RAM、ROM和FIFO等結構。在實際應用中,芯片內部塊RAM的數量也是選擇芯片的一個重要因素。
單片塊RAM的容量為18k比特,即位寬為18比特、深度為1024,可以根據需要改變其位寬和深度,但要滿足兩個原則:首先,修改后的容量(位寬 深度)不能大于18k比特;其次,位寬最大不能超過36比特。當然,可以將多片塊RAM級聯起來形成更大的RAM,此時只受限于芯片內塊RAM的數量,而 不再受上面兩條原則約束。
7) 數字時鐘管理模塊(DCM)
業內大多數FPGA均提供數字時鐘管理(Xilinx的全部FPGA均具有這種特性)。Xilinx推出最先進的FPGA提供數字時鐘管理和相位環路鎖定。相位環路鎖定能夠提供精確的時鐘綜合,且能夠降低抖動,并實現過濾功能。
一般來說,完整的FPGA/CPLD設計流程包括:
(1) 電路功能設計,系統設計之前,首要的是方案論證、系統設計和FPGA芯片選擇等準備工作。一般采用自頂向下的設計方法將系統分成若干基本單元,然后將基本單元劃分成下一層的基本單元,一直這樣就行下去,直到可以直接使用EDA元件庫為止。
(2) 設計輸入,常用的方法是硬件描述語言和原理圖輸入方式。
(3) 功能仿真,驗證設計電路的邏輯功能。
(4) 綜合優化(synthesis),綜合優化是指將HDL語言、原理圖等設計輸入翻譯成由與、或、非門、RAM、觸發器等基本邏輯單元組成的邏輯網表,并根據目標與要求(約束條件)優化生成的邏輯網表,輸出edf和edn等文件,供FPGA/CPLD廠家的布局布線器進行實現。
(5) 綜合后仿真,檢查綜合結果是否與原設計一致,仿真時把綜合生成
的標準延時文件反標注到綜合仿真模型中,可估計門延時帶來的影響。但這一步驟不能估計線延時,因此和布線后的仿真情況還有一定的差距,并不十分準確。
(6) 實現(Implementation),實現是將綜合生成的邏輯網表配置到具體的FPGA芯片上,Xilinx的實現過程分為翻譯(Translate)、映射(Map)、和布局布線(Place&Route)。布局布線是其中最重要的過程,布局是將邏輯網表中的硬件原語和底層單元合理得配置到芯片內部的硬件結構上,并且需要在速度最優和面積最優之間做出選擇。布線時根據布局的拓撲結構,利用芯片內部的各種連線資源合理準確的連接各個元件。
(7) 時序仿真與驗證,將布局布線后的延時信息反標注到網表中用來檢測時序工作情況,時序仿真包括的延時信息最全,也最精確,能較好的反映芯片的實際工作情況。有是為了保證設計的可靠性,在時序仿真后還要做一些驗證,可以用ISE內嵌的時序分析工具完成靜態時序分析(STA,Static Timing Analyzer),也可以用第三方驗證工具(如Synopsys的Formality驗證工具,PrimeTime靜態時序分析工具等)進行驗證?梢杂肐SE內嵌的FPGA Editor和Chip Viewer觀察芯片內部的連接于配置情況,或者使用ISE內嵌的ChipScope Pro進行在線邏輯分析。
(8) 調試與加載配置,就是在線調試或者將生成的配置文件寫入芯片中進行測試。在ISE中對應的工具就是iMPACT。
FPGA設計流程圖如圖2-1所示。
圖2-1 FPGA設計流程圖
FPGA軟件設計可分為兩大塊:編程語言和編程工具。編程語言主要有VHDL和Verilog兩種硬件描述語言;編程工具主要是兩大廠家Altera和Xilinx的集成綜合EDA軟件QuartusII以及第三方工具。具體的設計輸入方式有以下幾種:
(1) HDL語言方式。HDL既可以描述底層設計,也可以描述頂層的設計,
但它不容易做到較高的工作速度和芯片利用率。用這種方式描述的項目最后所能達到的性能與設計人員的水平、經驗以及綜合軟件有很大的關系。
(2) 圖形方式?梢苑譃殡娐吩韴D描述,狀態機描述和波形描述3種
形式。電路原理圖方式描述比較直觀和高效,對綜合軟件的要求不高;狀態機描述主要用來設計基于狀態機思想的時序電路;波形描述方式是基于真值表的一種圖形輸入方式,直接描述輸入與輸出的波形關系。
FPGA的應用可分為三個層面:電路設計,產品設計,系統設計。
1) 電路設計中FPGA的應用
連接邏輯,控制邏輯是FPGA早期發揮作用比較大的領域也是FPGA應用的基石.事實上在電路設計中應用FPGA的難度還是比較大的這要求開發者要具備相應的硬件知識(電路知識)和軟件應用能力(開發工具)這方面的人才總是緊缺的,往往都從事新技術,新產品的開發成功的產品將變成市場主流基礎產品供產品設計者應用在不遠的將來,通用和專用IP的設計將成為一個熱門行業!搞電路設計的前提是必須要具備一定的硬件知識.在這個層面,干重于學,當然,快速入門是很重要的,越好的位子越不等人電路開發是黃金飯碗。
2) 產品設計
把相對成熟的技術應用到某些特定領域如通訊,視頻,信息處理等等開發出滿足行業需要并能被行業客戶接受的產品這方面主要是FPGA技術和專業技術的結合問題,另外還有就是與專業客戶的界面問題產品設計還包括專業工具類產品及民用產品,前者重點在性能,后者對價格敏感產品設計以實現產品功能為主要目的,FPGA技術是一個實現手段在這個領域,FPGA因為具備接口,控制,功能IP,內嵌CPU等特點有條件實現一個構造簡單,固化程度高,功能全面的系統產品設計將是FPGA技術應用最廣大的市場,具有極大的爆發性的需求空間產品設計對技術人員的要求比較高,路途也比較漫長不過現在整個行業正處在組建"首發團隊"的狀態,只要加入,前途光明產品設計是一種職業發展方向定位,不是簡單的愛好就能做到的!產品設計領域會造就大量的企業和企業家,是一個近期的發展熱點和機遇。
3) 系統級應用
系統級的應用是FPGA與傳統的計算機技術結合,實現一種FPGA版的計算機系統如用Xilinx V-4, V-5系列的FPGA,實現內嵌POWER PC CPU, 然后再配合各種外圍功能,實現一個基本環境,在這個平臺上跑LINIX等系統這個系統也就支持各種標準外設和功能接口(如圖象接口)了這對于快速構成 FPGA大型系統來講是很有幫助的。這種"山寨"味很濃的系統早期優勢不一定很明顯,類似ARM系統的境況但若能慢慢發揮出FPGA的優勢,逐漸實現一些特色系統也是一種發展方向。若在系統級應用中,開發人員不具備系統的擴充開發能力,只是搞搞編程是沒什么意義的,當然設備驅動程序的開發是另一種情況,搞系統級應用看似起點高,但不具備深層開發能力,很可能會變成愛好者,就如很多人會做網頁但不能稱做會編程類似以上是幾點個人開發,希望能幫助想學FPGA 但很茫然無措的人理一理思路。這是一個不錯的行業,有很好的個人成功機會。但也肯定是一個競爭很激烈的行業,關鍵看的就是速度和深度當然還有市場適應能力。
Verilog HDL是目前應用最為廣泛的硬件描述語言,適合算法級,寄存器級,邏輯級,門級和版圖級等各個層次的設計和描述,優點是其工藝無關性.這使得工程師在功能設計,邏輯驗證階段可以不必過多考慮門級及工藝實現的具體細節,只需根據系統設計的要求施加不同的約束條件。
Verilog HDL 是一種硬件描述語言,用于從算法級、門級到開關級的多種抽象設計層次的數字系統建模。被建模的數字系統對象的復雜性可以介于簡單的門和完整的電子數字系統之間。數字系統能夠按層次描述,并可以在相同描述中顯示的進行時序建模。
這種語言具有下述描述能力:設計的行為特性、設計的數據流特性、設計的結構組成以及包含響應監控和設計驗證方面的時延和波形產生機制。所有這些都使用同一種建模語言、此外,Verilog HDL語言提供了編程語言接口,通過該接口可以在模擬、驗證期間從設計外部訪問設計,包括模擬的具體控制和運行。
這種硬件語言不僅定義了語法。而且對每個語法結構都定義了清晰的模擬、仿真語義。因此,用這種語言編寫的模型能夠使用Verilog仿真器進行驗證。語言從C編程語言中繼承了多種操作符和結構。Verilog HDL提供了擴展的建模能力,其中許多擴展最初很難理解。但是,Verilog HDL語言的核心子集非常易于學習和使用,這對大多數建模應用來說已經足夠。當然,完整的硬件描述語言足以對從最復雜的芯片到完整的電子系統進行描述。
Verilog HDL語言最初是于1983年由Gateway Design Automation公司為其模擬器產品開發的硬件建模語言。那時它只是一種專用語言。由于他們的模擬、仿真器產品的廣泛使用,Verilog HDL 作為一種便于使用且實用的語言逐漸為眾多設計者所接受。在一次努力增加語言普及性的活動中,Verilog HDL語言于1990年被推向公眾領域。 Open Verilog International (OVI)是促進Verilog發展的國際性組織。1992年,OVI決定致力于推廣Verilog OVI標準成為IEEE標準。這一努力最后獲得成功,Verilog HDL于1995年成為IEEE標準,稱為IEEE Std 1364-1995。完整的標準在Verilog硬件描述語言參考手冊中有詳細描述。
- 基本邏輯門,例如and、or和nand等都內置在語言中。
- 用戶定義原語(UDP)創建的靈活性。用戶定義的原語既可以是組
合邏輯原語,也可以是時序邏輯原語。
- 開關級基本結構模型,例如pmos 和nmos等也被內置在語言中。
- 提供顯式語言結構指定設計中的端口到端口的時延及路徑時延和設
計的時序檢查。
- 可采用三種不同方式或混合方式對設計建模。這些方式包括:行為
描述方式—使用過程化結構建模;數據流方式—使用連續賦值語句方式建模;結構化方式—使用門和模塊實例語句描述建模。
Verilog HDL和VHDL作為描述硬件電路設計的語言,其共同特點在于:能形式化地抽象表示電路的行為和結構;支持邏輯設計中層次與范圍的描述;可借用高級語言的精巧結構來簡化電路行為的描述;具有電路仿真與驗證機制以保證設計的正確性;支持電路描述由高層到低層的綜合轉換;硬件描述與實現工藝無關(有關工藝參數可通過語言提供的屬性包括進去);便于文檔管理;易于理解和設計重用。但是,兩者又有著各自的特點:
Verilog HDL和VHDL最大的差別在語法上,Verilog HDL是一種類C語言,而VHDL是一種ADA(Action Data Automation,行動數據自動化)語言。由于C語言簡單易用且應用廣泛,因此也使得Verilog HDL語言容易學習,如果有C語言學習的基礎,很快就能夠掌握;相比之下,VHDL語句較為晦澀,使用難度較大。
由于Verilog HDL早在1983年就已推出,至今已有20多年的應用歷史,因而Verilog HDL擁有更加廣泛的設計群體,成熟的資源也比VHDL豐富。
傳統觀念認為Verilog HDL在系統級抽象方面較弱,不太適合大型的系統;VHDL側重于系統描述,從而更多地為系統級設計人員所采用;Verilog HDL側重于電路級描述,從而更多地為電路設計人員所采用。但這兩種語言仍處于不斷完善之中,都在朝著更高級、更強大描述語言的方向前進。其中,經過IEEE Verilog HDL 2001標準補充之后,Verilog HDL 語言的系統級描述性能和可綜合性能有了大幅度提高。
綜上所述,Verilog HDL 語言作為學習HDL設計方法入門和基礎是非常合適的。掌握了Verilog HDL 語言建模、綜合和仿真技術,不僅可以增加對數字電路設計的深入了解,還可以為后續高級階段的高級學習打好基礎 ,包括數字信號處理和數字通信的FPGA實現、IC設計等領域。本文的設計中,采用Verilog HDL語言。
本次設計的搶答器,其系統芯片主要采用EP2C8Q208,由搶答判別模塊,計時模塊,分頻器模塊,計分模塊,鎖存器模塊,數碼管驅動模塊組成。搶答器結構簡圖如圖2-3所示。
圖2-3 搶答器結構簡圖
由圖2-3我們很清楚的看到系統都有哪些外圍電路組成,而且還能很快就能明白這次設計目的與原理。
分頻器主要是運用計數器的功能,由于實際上我們使用的是50HZ的頻率,所以我將設計計數器,其在每個脈沖的上升沿來臨時,就會加1,直到加到25時,則會使輸出脈沖致1,在下一個25時,則會使輸出脈沖致0。這樣就能夠實現將50HZ的脈沖變成1HZ的脈沖,用于控制計時模塊。
計時模塊運用的是計數器的減法運算,當外部條件滿足時,計時器就會從30S開始計時,一直計到零時,計數器停止,直到主持人按下復位按鈕,計數器復位,才能使下次搶答時能夠從頭開始。
數碼管驅動主要是將4位變8位,即當外部條件滿足時,就會將輸入的4位數據轉變成7位,從而能夠使其能夠在數碼管上顯示出來。
鎖存器在外部信號沒要求進行鎖存操作時,則會跟著輸入的變化而變化,然而當外部要求進行鎖存時,就是立即鎖存住當前的數據,即輸出保持當前的數據不再變化。
搶答判別模塊是實現搶答器搶答功能的核心元件了,通過搶答判別模塊來鑒別搶答的先后,其中設計的這個模塊中自帶鎖存功能,即當其中一人或者一組搶答成功后,其余人或者組都不能再搶答了。該模塊還能夠進行判別誰進行了搶答,當主持人還沒有說開始搶答時,就有人開始搶答時,該人或者該組面前的LED燈就會被點亮,對應的報警器也會響起,同時數碼管這時也會顯示出提前搶答的組號,從而杜絕了一些不公平的元素。
其流程圖如圖3-1。
圖3-1 搶答判別流程圖
我們通過對FPGA以及硬件語言Verilo HDL的學習,只通過對系統的編程就滿足了該模塊的要求,能實現判別,鎖存,顯示,報警等功能。
搶答判別模塊的輸入有en,clr,a,b,c,d,而輸出端為led_a,led_b.led_c,led_d以及4位led_f,4位led_t。其中en表示使能端,只有主持人按下這個按鈕,才能允許參賽選手進行搶答;clr表示復位信號,當主持人按下這個按鈕后,所有的狀態都將恢復成初始狀態,為下次搶答做好準備;a,b,c,d表示四組搶答選手;led_a,led_b.led_c,led_d分別表示對應小組的LED燈,用來顯示選手們的搶答情況;led_f表示報警信號,當有選手提前搶答時,該對應的報警器將會響起;led_t表示顯示選手號碼的信號,當有選手搶答時,就會通過led_t輸出的信號使其組號在數碼管上顯示出來。
該模塊的邏輯框圖如圖3-2所示。
圖3-2 搶答判別模塊邏輯框圖
數碼管按段數可分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、3位、4位、5位、6位、7位等數碼管。
按發光二極管單元連接方式可分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極(COM)的數碼管,共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極(COM)的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。
數碼管要正常顯示,就要用驅動電路來驅動數碼管的各個段碼,從而顯示出我們要的數字,因此根據數碼管的驅動方式的不同,可以分為靜態式和動態式兩類。
- 靜態顯示驅動。靜態驅動也稱直流驅動。靜態驅動是指每個數碼管
的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。靜態驅動的優點是編程簡單,顯示亮度高,缺點是占用I/O端口多,如驅動5個數碼管靜態顯示則需要5×8=40根I/O端口來驅動,要知道一個89S51單片機可用的I/O端口才32個),實際應用時必須增加譯碼驅動器進行驅動,增加了硬件電路的復雜性。
- 動態顯示驅動。動態驅動是將所有數碼管8個顯示筆"a,b,c,d,e,f,g,dp"
的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是哪個數碼管會顯示出字形,取決于單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。
數碼管驅動模塊就是將輸入的2進制代碼以7段譯碼方式輸出,其對應的表格如表3-1。
表3-1 2進制與7段譯碼對應表
數碼管驅動模塊的輸入是4位2進制數,輸出則是7位譯碼數據,F其邏輯框圖如3-3所示。
圖3-3 數碼管驅動模塊邏輯框圖
該模塊主要是規定搶答時間,當主持人按下搶答按鈕后,該模塊就會從30s開始倒計時,直到有人搶答成功后,通過鎖存模塊的作用使得在數碼管上顯示的時間不變。
計時模塊電路中,clk為計時脈沖信號;sign為計時使能端,由主持人控制,當主持人按下這個按鈕后,計時功能才能實現;reset為復位信號,也由主持人控制,按下復位按鈕,計時模塊重新計時,這為下一次的搶答計時做準備。
其中計時模塊需要的計時脈沖信號應該是1HZ的,而實際上我們所使用的頻率大部分都是50HZ的,這就需要分頻器的作用,分頻模塊將在下面給與介紹。
計時模塊運用的是計數器的減法運算,當外部條件滿足時,計時器就會從30s開始計時,一直計到零時,計數器停止,直到主持人按下復位按鈕,計數器復位,才能使下次搶答時能夠從頭開始。計時模塊在搶答器中的作用就是計時作用,超時搶答則為無效。
現其邏輯框圖如3-4所示。
圖3-4 計時模塊邏輯框圖
分頻器主要是運用計數器的功能,由于實際上我們使用的是50HZ的頻率,所以我將設計計數器,其在每個脈沖的上升沿來臨時,就會加1,直到加到24時,則會使輸出脈沖致1,在下一個24時,則會使輸出脈沖致0。這樣就能夠實現將50HZ的脈沖變成1HZ的脈沖,用于控制計時模塊。
其中clk為頻率輸入,大部分表示50HZ;div表示通過分頻的作用后所產生的新的頻率。
現其邏輯框圖如3-5所示。
圖3-5 分頻器模塊邏輯框圖
計分模塊中加法、減法系統,計分系統等系統組成。add_sub是計分的使能端,只有這個信號為高電平時,才允許進行計分;cont_sign1為加分按鈕,cont_sign2為減分按鈕,clk為脈沖信號。運行模塊是首先設定周期脈沖,定時的加減1,有搶答判別模塊的輸出給chos決定了哪組的計分,其中a1[3..0],a2[3..0]分別表示a組分數的個位與十位,b1[3..0],b2[3..0]分別表示b組分數的個位與十位,c1[3..0],c2[3..0]分別表示c組分數的個位與十位,d1[3..0],d2[3..0]分別表示d組分數的個位與十位。
現其邏輯框圖如3-6所示。
圖3-6 計分模塊邏輯框圖
鎖存器(Latch)是一種對脈沖電平敏感的存儲單元電路,它們可以在特定輸入脈沖電平作用下改變狀態。鎖存,就是把信號暫存以維持某種電平狀態。鎖存器的最主要作用是緩存,其次完成高速的控制其與慢速的外設的不同步問題,再其次是解決驅動的問題,最后是解決一個I/O口既能輸出也能輸入的問題。
此次設計的鎖存模塊既有鎖存作用,又有伴隨作用,只有當鎖存信號來臨時才進行鎖存,在沒有鎖存信號下的時候,則輸出跟著輸入變化。
鎖存模塊中,g表示鎖存信號,a[3..0]表示輸入信號,b[3..0]表示輸出信號,F其邏輯框圖如3-7所示。
圖3-7 鎖存器模塊邏輯框圖
通過對各個模塊的搭建,我們可以完成對整體搶答器的硬件設計,如圖3-8所示為系統整體原理圖。
圖3-8 系統整體原理圖
Module
qiang_da_pan_bie(clr,en,a,b,c,d,led_a,led_b,led_c,led_d,led_t,led_f);
input clr,en,a,b,c,d;
output led_a,led_b,led_c,led_d;
output [3:0] led_t;
output [3:0] led_f;
reg [3:0] states;
reg led_a,led_b,led_c,led_d;
reg [3:0] led_t;
reg [3:0] led_f;
以上程序描述了搶答判別模塊的實體部分,其中qiang_da_pan_bie是模塊的文件名;input定義的是模塊的輸入端口,即clr,en,a,b,c,d為模塊的輸入端;output定義的是模塊的輸出端口,即led_a,led_b,led_c,led_d,led_t,led_f為輸出端口;states被定義成reg型,用于暫時存放輸入端a,b,c,d的狀態;led_t被定義成reg型,表示搶答組號的號碼。
if(en==0)
begin
if (states==4'b0001)
begin
{led_d,led_c,led_b,led_a}<=states;
led_f<=states;
led_t<=4'b0001;
end
end
這段程序表示在主持人還沒有說開始搶答時,判別是否有人提前搶答,若有人提前搶答了,則就會判斷哪個人或者哪一組提前搶答了,這時搶答者前面的led燈將會被點亮,對應的報警器也會響起,同時將提前搶答者的組號通過數碼管顯示出來。
搶答判別模塊的波形仿真如圖4-1與4-2。

圖4-1 en=0時搶答判別模塊的波形仿真圖
在圖4-1中,我們看出在搶答允許使能端en=0的情況下,b組率先搶答,這是違規的,因此,led_b為1,即與a組對應的LED燈亮起;led_f為0010,即表示b的報警器將會響起;led_t為0010,即數碼管顯示的是第二組(b組)搶答的。
圖4-2 en=1時搶答判別模塊的波形仿真圖
在圖4-2中,我們看出在搶答允許使能端en=1的情況下,a組率先搶答,這是合理的,因此,led_a為1,即與a組對應的LED燈亮起;led_f為0000,即表示所有的報警器都不會響起;led_t為0001,即數碼管顯示的是第一組(a組)搶答的。
module decode47(a , D);
output [7:0] a;
input [3:0] D;
reg [7:0] a;
以上程序描述的是數碼管驅動模塊的實體部分,其中decode47是模塊的文件名;input定義的是模塊的輸入端口,即D為模塊的輸入端;output定義的是模塊的輸出端口,即a為輸出端口,reg是a端口的類型。
case(D)
4'd0: a<=7'b1111110;
4'd1: a<=7'b0110000;
4'd2: a<=7'b1101101;
4'd3: a<=7'b1111001;
4'd4: a<=7'b0110011;
4'd5: a<=7'b1011011;
4'd6: a<=7'b1011111;
4'd7: a<=7'b1110000;
4'd8: a<=7'b1111111;
4'd9: a<=7'b1111011;
endcase
以上程序運用case語句進行譯碼,當輸入端口D滿足條件時,就會輸出與之相對應的情況,如當D=4’b0011時,輸出a<=7’b1111001,然后接到數碼管上,就會顯示3,從而完成驅動數碼管的作用。
數碼管驅動模塊的波形仿真如圖4-3。
圖4-3 數碼管驅動模塊的波形仿真圖
如圖4-3所示,由于運行程序時有一定的延時,故輸出總是落后與輸入的。如當D=6時,這是a=1011111,與實際結果一樣。
module ji_shi_mo_kuai(clk,sign,reset,a2,a1,g);
input clk,sign,reset,g;
output a2,a1;
reg [3:0] a2;
reg [3:0] a1;
reg a;
以上程序描述的是計時模塊的實體部分,其中ji_shi_mo_kuai是模塊的文件名;input定義的是模塊的輸入端口,即clk,sign,reset,g為模塊的輸入端;output定義的是模塊的輸出端口,即a2,a1為輸出端口,a,a2,a1端口的類型是reg。clk為時鐘信號;sign是使能信號,只有在使能信號成立的條件下,程序才能夠運行;reset為復位信號,當復位按鍵被按下時,系統將會從頭計時,為下一輪的搶答做好準備。
if (reset==1)
begin
a2<=4'b0011;
a1<=4'b0000;
end
以上程序為復位程序,當這段程序起作用時,a1將會被賦值為4'b0000,a2將會被賦值為4'b0011,即系統將會重新從30S開始倒計時。
if (a2!=4'b0000 && a1==4'b0000)
begin
a2<=a2-1;a1<=4'b1001;
end
if (a2!=4'b0000 && a1!=4'b0000)
begin
a2<=a2;a1<=a1-1;
end
if (a2==4'b0000 && a1!=4'b0000)
begin
a2<=a2;a1<=a1-1;
end
if (a2==4'b0000 && a1==4'b0000)
begin
a2<=4'b0000;a1<=4'b0000;
end
以上程序為計時程序,首先分情況進行判斷:當a2不為0,而a1為0時,a2將自減1,a1變成9;當a2不為0,a1不為0時,a2不變,a1自減1;當a2為0,a1不為0時,a2不變,a1自減1;當a2為0,a1為0時,這是將a2,a1都賦值為0。
計時模塊的波形仿真如圖4-4與圖4-5。
圖4-4 計時模塊的波形仿真圖
圖4-4所示,先按下復位按鍵reset,這時a2=3,a1=0,然后在按下計數使能端sign后,計時模塊開始工作,計時時間從30S一直倒計時至0S后,不在計時了,只有等到復位后,才能重新計時。
圖4-5計時模塊的波形仿真圖
圖4-5中,在一輪計時結束后,開始下一輪的搶答,這是主持人需要再次按下reset鍵,這時計時模塊重新計時,即又開始從30S開始倒計時,依次循環,這樣就為比賽的順利進行做好了準備。
Module fen_pin_qi(clk,div,cnt);
input clk;
output div,cnt;
reg [4:0] cnt;
reg div;
以上程序描述的是分頻模塊的實體部分,其中fen_pin_qi是模塊的文件名;input定義的是模塊的輸入端口,即clk為模塊的輸入端;output定義的是模塊的輸出端口,即div,cnt為輸出端口,div,cnt端口的類型是reg。clk為時鐘信號,通常輸入的是50HZ。
if (cnt==5'b11000)
begin
div<=~div;
cnt<=5'b0000;
end
else
begin
cnt<=cnt+1;
end
以上程序為計數程序,首先進行判斷,若cnt沒有達到24時,則進行自加1的操作,直到cnt達到24時,div將會取反,這樣的程序將會一直進行下去。這里之所以判斷cnt是否達到24,是因為實際中我們使用的頻率是50HZ,所以根據實際的情況,在這里設定24的界限。
分頻模塊的波形仿真如圖4-6。
圖4-6 分頻模塊的波形仿真圖
圖4-6所示,隨著clk的變化,cnt從0開始往上加1,直到加到24時,div發生偏轉,即由0變為1,隨后cnt又開始從0開始加1直至24,div又發生偏轉,即由1變為0。如此循環下去,就起到了分頻的作用。
Module ji_fen_mo_kuai(add_sub,cont_sign1,cont_sign2,chos,a2,a1,b2,b1,c2,c1,d2,d1,clk);
input add_sub, cont_sign1,cont_sign2,chos,clk;
output a2,a1,b2,b1,c2,c1,d2,d1;
wire [3:0] chos;
reg [3:0] a2;
reg [3:0] a1;
reg [3:0] b2;
reg [3:0] b1;
reg [3:0] c2;
reg [3:0] c1;
reg [3:0] d2;
reg [3:0] d1;
以上程序描述的是計分模塊的實體部分,其中ji_fen_mo_kuai是模塊的文件名;input定義的是模塊的輸入端口,即add_sub,cont_sign1,cont_sign2,chos,clk為模塊的輸入端;output定義的是模塊的輸出端口,即a2,a1,b2,b1,c2,c1,d2,d1為輸出端口。clk為時鐘信號;add_sub表示計分使能端;cont_sign1表示加法使能端,按下這個按鍵后,計數器開始進行加法運算;cont_sign2表示加法使能端,按下這個按鍵后,計數器開始進行減法運算,即減分操作;a2,a1,b2,b1,c2,c1,d2,d1則表示每組分數的十位,個位。
if (cont_sign1==1)
begin
if (chos==4'b1000)
begin
if (a2==4'b1001 && a1==4'b1001)
begin
a1<=4'b0000;
a2<=4'b0000;
end
else if (a2!=4'b1001 && a1==4'b1001)
begin
a1<=4'b0000;
a2<=a2+1;
end
else if (a2!=4'b1001 && a1!=4'b1001)
begin
a1<=a1+1;
a2<=a2;
end
end
end
以上程序只是加法程序中的一部分,首先,加法使能端口cont_sign1有效后,就要判斷哪一組進行加分運算,然后就要根據情況進行討論:當a2,a1都為9時,a2,a1都要變成0;當a2不為9,a1為9時,a2將自加1,a1變成0;當a2,a1都不為9時,a2不變,a1自加1。
if(cont_sign2==1)
begin
if (chos==4'b1000)
begin
if (a2==4'b0000 && a1==4'b0000)
begin
a1<=4'b1001;
a2<=4'b1001;
end
else if (a2!=4'b0000 && a1==4'b0000)
begin
a1<=4'b1001;
a2<=a2-1;
end
else if (a2!=4'b0000 && a1!=4'b0000)
begin
a1<=a1-1;
a2<=a2;
end
else if (a2==4'b0000 && a1!=4'b0000)
begin
a1<=a1-1;
a2<=a2;
end
end
end
以上程序只是減法程序中的一部分,首先,加法使能端口cont_sign2有效后,就要判斷哪一組進行加分運算,然后就要根據情況進行討論:當a2,a1都為0時,a2,a1都要變成9;當a2不為0,a1為0時,a2將自加1,a1變成9;當a2,a1都不為0時,a2不變,a1自減1;當a2為0,a1不為0時,a2不變,a1自減1。計分模塊的波形仿真如圖4-7與圖4-8。
圖4-7計分模塊的波形仿真圖
圖4-7所示,add_sub為1,即允許計分運算。首先第四組(d組)搶答成功并回答正確,則應給與加分,即d1由0變為1,在由圖知,在給d組加分的時候,由于干擾,此時a組也發來加分信號,但是并不給予a組加分,這樣避免了干擾。第二輪搶答中,d組又回答正確,在給予加分,此時d1由1變為2。然而在第三輪中d組回答錯誤,應給予d組減分,此時d1由2變成1。
圖4-8計分模塊的波形仿真圖
圖4-8所示,add_sub為1,即允許計分運算。首先第四組(d組)搶答成功并回答正確,則應給與加分,即d1由0變為1;第二輪搶答中,b組回答正確,給予加分,此時b1由1變為2。然而在第三輪中d組回答錯誤,應給予d組減分,此時d1由1變成0。
module suo_cun_qi(g,a,b);
input g;
input [3:0] a;
output [3:0] b;
reg [3:0] b;
以上程序描述的是鎖存模塊的實體部分,其中suo_cun_qi是模塊的文件名;input定義的是模塊的輸入端口,即g,a為模塊的輸入端;output定義的是模塊的輸出端口,即b為輸出端口。其中g表示搶答成功信號。
if (g==1)
begin
b<=b;
end
else
begin
b<=a;
end
以上程序為鎖存程序,如程序中所示,只有在g這個信號有效的情況下,鎖存模塊才開始起作用,否則其輸出b將隨著輸入a的變化而變化。
鎖存模塊的波形仿真如圖4-9。
圖4-9 鎖存模塊的波形仿真圖
在圖4-9中,我們看見在g信號無效的時候,輸出b跟隨著輸入a的變化而變化,當g信號有效的時候,輸出b就會不再變化了,實現了應有的功能。在圖中我們看見,輸出b出現了一點誤差,這是因為仿真所給的頻率過小,且仿真程序有一定的延遲,這樣就造成了輸入信號之間有一定的重疊,因此會出現這樣的差錯,當增大仿真頻率到一定程度后,就不會出現這樣的情況。
結 論
將程序進行編譯仿真后進行分析仿真圖可證明本設計所用的基于FPGA的在Quarters II軟件平臺上實現的搶答器是完全可行的。
這次畢業設計介紹了一種采用EDA技術,基于FPGA并在QuartusⅡ工具軟件環境下使用Verilog硬件描述語言編寫的數碼管顯示4路搶答器的電路設計、設計思路以及實現功能,經過仿真驗證符合搶答器的基本功能要求。
為了實現搶答器的基本功能,本次系統芯片主要采用EP2C8Q208,并設計了搶答判別模塊,計時模塊,分頻器模塊,計分模塊,鎖存器模塊,數碼管驅動模塊等等。經過仿真都可以驗證各個模塊的功能都能滿足搶答器的基本要求。
這次設計的系統主要有以下幾個功能:
(1) 可以使四組選手同時進行搶答,并鎖存搶答成功的那一組。
(2) 可以計算四組選手的得分情況。
(3) 可以計算提前搶答的選手,顯示其組號,并給予報警提醒。
(4) 可以通過LED顯示出搶答成功的組別。
(5) 可以顯示答題時間,搶答剩余時間。
沒有解決的問題是按鍵防抖動模塊的設計,接下來的研究和學習就是要解決這個問題。
此次畢業設計通過查資料和收集有關的文獻,培養了自學能力和動手能力。并且由原先的別動的接受知識轉化為主動的尋求知識,這可以說是學習方法上的一個很大的突破。在以往的傳統的學習模式下,我們可能會記住很多的書本知識,但是通過畢業論文,我們學會了如何將學到的知識轉化為自己的東西,學會了怎么更好地處理知識和實踐相結合的問題。
任何涉及的控制系統都要經過試驗和實踐的考驗方能得到完善,我們做畢業設計也是一樣,這畢業設計是對我們所學主頁知識的考驗,更是對我們應用專業知識解決實際生產問題能力的考驗。通過畢業設計,我更加堅信只有擁有一定的毅力,認真的學習態度,豐富的日常積累,正確處理問題的能力,才能在以后的工作及生活中經的住考驗。