基于ISE的數(shù)字秒表的設(shè)計與仿真_第1頁
基于ISE的數(shù)字秒表的設(shè)計與仿真_第2頁
基于ISE的數(shù)字秒表的設(shè)計與仿真_第3頁
基于ISE的數(shù)字秒表的設(shè)計與仿真_第4頁
基于ISE的數(shù)字秒表的設(shè)計與仿真_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)字秒表設(shè)計實驗報告學院(系):專業(yè):

學號:學生姓名:指導教師:電子設(shè)計實驗報告——數(shù)字秒表的設(shè)計目錄摘要 41引言 61.1FPGA的開發(fā) 61.2VHDL語言的使用 71.3ISE簡介 81.4modelsim仿真軟件的使用 82數(shù)字秒表的設(shè)計 92.1時間的概念 92.2實驗任務及要求 92.3系統(tǒng)需求和解決方案 102.3.1分頻器設(shè)計 122.3.2按鍵消抖電路設(shè)計 122.3.3控制器設(shè)計 132.3.4計數(shù)器設(shè)計 132.3.5鎖存器設(shè)計 142.3.6掃描顯示和控制電路設(shè)計 142.3.7模塊綜合 153數(shù)字秒表的仿真結(jié)果 153.1各仿真結(jié)果 163.2分頻器仿真 163.3計數(shù)器仿真 164實驗結(jié)論 16參考文獻 17附錄 17 摘要本次實驗設(shè)計使用的軟件ISE主要功能包括設(shè)計輸入、綜合、仿真、實現(xiàn)和下載,涵蓋了可編程邏輯器件開發(fā)的全過程,從功能上講,完成CPLD/FPGA的設(shè)計流程無需借助任何第三方EDA軟件。而本次設(shè)計目的在于設(shè)計一個可以自動計數(shù)、清零、鎖存、暫停的、顯示范圍為59分59秒,精確度為百分之一秒的數(shù)字秒表并熟練利用modelsim仿真軟件進行仿真并從中不斷檢驗錯誤,修改程序達到學習提高的效果。為達到實驗目的,本設(shè)計分為:分頻器,鎖存器,計數(shù)器,控制器及消抖電路。關(guān)鍵詞:ISE;modelsim仿真;數(shù)字秒表設(shè)計;FPGA可編程邏輯器件;檢驗;學習

Abstract TheISEsoftwareusedinexperimentaldesignthemainfunctionincludingdesign,implementation,integration,simulationanddownload,coversthewholeprocessofthedevelopmentofprogrammablelogicdevices,tellfromthefunction,completedthedesignofCPLD/FPGAwithoutusinganythird-partyEDAsoftware.Andthepurposeofthedesignistodesignanautomaticcounting,reset,latches,suspended,displayareafor59minutesand59seconds,accuracyofonepercentseconddigitalstopwatchandskilleduseofthemodelsimsimulationsoftwaresimulationandcontinuousinspectionerror,modifytheprogramtoimprovelearningeffect.Forthepurposeoftheexperiment,thedesignisdividedinto:frequencydivider,latch,counter,controllerandshakecircuit.Keywords:ISE;modelsim;digitalstopwatch;TheFPGAprogrammablelogicdevices;check;learn1引言在傳統(tǒng)的硬件電路設(shè)計中,主要的設(shè)計文件是電路原理圖,而采用硬件描述語言(VHDL)設(shè)計系統(tǒng)硬件電路時主要使用VHDL編寫源程序。所謂硬件描述語言,就是該語言可以描述硬件電路的功能、信號連接關(guān)系及定時關(guān)系。EDA代表了當今電子設(shè)計技術(shù)發(fā)展的方向,它的基本特征是:設(shè)計人員按照“自頂向下”的設(shè)計方法,對整個系統(tǒng)進行方案設(shè)計和功能劃分系統(tǒng)的關(guān)鍵電路,用一片或幾片專用集成ASI實現(xiàn),然后采用硬件描述語言(HDL)完成系統(tǒng)設(shè)計,最后通過綜合器和適配器生成最終的目標,這樣的設(shè)計方法被稱為高層次的電子設(shè)計。高層次的設(shè)計給我們提供了一種“自頂向下”(Top2Down)的全新設(shè)計方法,這種方法首先從系統(tǒng)入手,在頂層進行功能方框圖的劃分和結(jié)構(gòu)設(shè)計.在方框圖一級進行仿真、糾錯并用硬件描述語言對高層的系統(tǒng)進行描述,在系統(tǒng)一級進行驗證,然后用綜合優(yōu)化工具生成具體的門電路網(wǎng)表。1.1FPGA的開發(fā)使用FPGA(Field-ProgrammableGateArray),即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。FPGA的開發(fā)相對于傳統(tǒng)PC、單片機的開發(fā)有很大不同。FPGA以并行運算為主,以硬件描述語言來實現(xiàn);相比于PC或單片機的順序操作有很大區(qū)別,也造成了FPGA開發(fā)入門較難。FPGA開發(fā)需要從頂層設(shè)計、模塊分層、邏輯實現(xiàn)、軟硬件調(diào)試等多方面著手。一個完整的設(shè)計流程包括電路設(shè)計與輸入、功能方針、設(shè)計綜合、綜合后仿真、設(shè)計實現(xiàn)布線后仿真與下載、實驗板調(diào)試等主要步驟,如下圖(1)示圖(1)FPGA開發(fā)流程FPGA芯片的組成:(1)可編程輸入輸出單元;(2)基本可編程邏輯單元;(3)完整的時鐘管理;(4)嵌入塊式RAM;(5)豐富的布線資源;(6)內(nèi)嵌的底層功能單元和專用硬件模塊。在本實驗中我們采用的實驗板為FPGAxc3s200a-4ft256的板子,此FPGA芯片隸屬于Spartan-3AFPGA芯片系列。Spartan-3A系列延伸平臺融小型器件封裝以及Spartan-3A、Spartan-3ADSP和Spartan-3AN平臺經(jīng)市場驗證的低成本和高性能特點于一體,形成一系列單個的、大容量的FPGA平臺。憑借對業(yè)界最廣泛的I/O標準(26種)的支持、豐富的節(jié)電配置功能和防克隆安全優(yōu)勢,賽靈思Spartan系列已經(jīng)成為目前全球應用最廣泛的低成本FPGA。與同類低成本FPGA解決方案相比,賽靈思Spartan-3A延伸FPGA解決方案可降低高達50%的總體系統(tǒng)成本。眾多系統(tǒng)功能的集成減少了對外部元器件的需要,降低了靜態(tài)功耗并且提供了更為強大的低成本安全系統(tǒng),這一優(yōu)勢對于系統(tǒng)設(shè)計人員來說極具吸引力。Spartan-3A系列FPGA主要技術(shù)特征如下表示:型號系統(tǒng)門數(shù)SLICE數(shù)目分布式RAM容量塊RAM容量專用乘法器數(shù)DCM數(shù)目最大可用I/O數(shù)最大差分I/O對數(shù)XC3S50A50k86411k54k3214464XC3S200A200k201628k288k164248112XC3S400A400k403256k360k204311142XC3S700A700k662492k360k208372165XC3S1400A1400k12672176k576k3285022271.2VHDL語言的使用VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與句法是十分類似于一般的計算機高級語言。VHDL的程序結(jié)構(gòu)特點是將一項工程設(shè)計,或稱設(shè)計實體(可以是一個元件,一個電路模塊或一個系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實體的內(nèi)部功能和算法完成部分。在對一個設(shè)計實體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計就可以直接調(diào)用這個實體。這種將設(shè)計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計的基本點。VHDL語言能夠成為標準化的硬件描述語言并獲得廣泛應用,它自身必然具有很多其他硬件描述語言所不具備的優(yōu)點。歸納起來,VHDL語言主要具有以下優(yōu)點:(1)VHDL語言功能強大,設(shè)計方式多樣。(2)VHDL語言具有強大的硬件描述能力。(3)VHDL語言具有很強的移植能力。(4)VHDL語言的設(shè)計描述與器件無關(guān)。(5)VHDL語言程序易于共享和復用。VHDL程序結(jié)構(gòu)特點是將一個電路模塊或一個系統(tǒng)分成端口和內(nèi)部功能算法實現(xiàn)兩部分。對于一個電路模塊或者數(shù)字系統(tǒng)而言,定義了外部端口后,一旦內(nèi)部功能算法完成后,其他系統(tǒng)可以直接依據(jù)外部端口調(diào)用該電路模塊或數(shù)字系統(tǒng),而不必知道其內(nèi)部結(jié)構(gòu)和算法。VHDL的特點使得電子系統(tǒng)新的設(shè)計方法一一“自頂向下”設(shè)計方法更加容易實現(xiàn)??梢韵葘φ麄€系統(tǒng)進行方案設(shè)計,按功能劃分成若干單元模塊,然后對每個單元模塊進一步細分編程,直到簡單實現(xiàn)的單元電路。VHDL支持硬件的設(shè)計、驗證、綜合和測試,以及硬件設(shè)計數(shù)據(jù)的交換、維護、修改和硬件的實現(xiàn),具有描述能力強、生命周期長、支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用等優(yōu)點。1.3ISE軟件的使用ISE的主要功能包括設(shè)計輸入、綜合、仿真、實現(xiàn)和下載,涵蓋了可編程邏輯器件開發(fā)的全過程,從功能上講,完成CPLD/FPGA的設(shè)計流程無需借助任何第三方EDA軟件。下面簡要說明各功能的作用:設(shè)計輸入:ISE提供的設(shè)計輸入工具包括用于HDL代碼輸入和查看報告的ISE文本編輯器(TheISETextEditor),用于原理圖編輯的工具ECS(TheEngineeringCaptureSystem),用于生成IPCore的CoreGenerator,用于狀態(tài)機設(shè)計的StateCAD以及用于約束文件編輯的ConstraintEditor等。綜合:ISE的綜合工具不但包含了Xilinx自身提供的綜合工具XST,同時還可以內(nèi)嵌MentorGraphics公司的LeonardoSpectrum和Synplicity公司的Synplify,實現(xiàn)無縫鏈接。仿真:ISE本身自帶了一個具有圖形化波形編輯功能的仿真工具HDLBencher,同時又提供了使用ModelTech公司的Modelsim進行仿真的接口。實現(xiàn):此功能包括了翻譯、映射、布局布線等,還具備時序分析、管腳指定以及增量設(shè)計等高級功能。下載:下載功能包括了BitGen,用于將布局布線后的設(shè)計文件轉(zhuǎn)換為位流文件,還包括了IMPACT,功能是進行芯片配置和通信,控制將程序燒寫到FPGA芯片中去。ISE使用的整體開發(fā)流程為:建立新工程→建立源文件→編寫工程代碼→行為仿真→各模塊綜合→管腳約束→功能實現(xiàn)→時序仿真→生成bit流文件→下載到實驗板上調(diào)試。1.4Modelsim仿真軟件的使用仿真是指在軟件環(huán)境下,驗證電路的行為和設(shè)計意圖是否一致。Modelsim是一種第三方EDA仿真工具,它是由Model公司開發(fā)的,它支持Verilog、VHDL以及兩者的混合仿真,可以將整個程序分步執(zhí)行,它在程序執(zhí)行的任何步驟任何時刻都可以查看任意變量的當前值,可以查看某一單元或模塊的輸入輸出的連續(xù)變化等。其主要特點是仿真速度快,仿真精度高,而且支持VHDL、VerilogHDL以及兩者的混合使用,是目前業(yè)界最流行最通用的仿真器之一。Modelsim仿真步驟分為以下5步:(1)建立庫;(2)映射庫到物理目錄;(3)編譯源代碼,包括所有的HDL代碼和Testbench;(4)啟動仿真器并加載設(shè)計頂層;(5)執(zhí)行仿真;一般來說,仿真分為三種類型,即功能仿真、綜合后功能仿真和時序仿真,分別對應于設(shè)計輸入后、綜合完成后、布局布線完成后等步驟,這些步驟也是仿真的切入點。(1)功能仿真功能仿真也稱為前仿真,主旨在于驗證電路功能是否符合設(shè)計要求,其特點是不考慮電路門延時與路徑延時,考察重點為電路在理想環(huán)境下的行為和設(shè)計構(gòu)想是否一致??删C合FPGA仿真代碼是用RTL級代碼語言描述的,功能仿真的輸入是設(shè)計的RTL代碼,也就是HDL源文件與Testbench.。(2)綜合后仿真綜合后仿真的主旨在于驗證綜合后的電路結(jié)構(gòu)是否與設(shè)計意圖相符,是否存在歧義綜合結(jié)果。綜合后仿真的輸入是從綜合得到的一般性邏輯網(wǎng)表抽象出的仿真模型和綜合產(chǎn)生的延時文件,綜合時的延時文件僅僅能估算門延時,而不包含布線延時信息,所以延時信息不十分準確。(3)時序仿真時序仿真也稱為布局布線后仿真或者后仿真,是指電路已經(jīng)映射到特定的工藝環(huán)境后,綜合考慮電路的路徑延時與門延時的影響,驗證電路的行為是否能夠在一定時序條件下滿足設(shè)計構(gòu)想的功能。時序仿真主要目的在于驗證電路是否存在時序違規(guī),其輸入為從布局布線抽象出的門級網(wǎng)表、Testbench以及擴展名為SDO的標準延時文件。一般來說,時序仿真是必選步驟,通過時序仿真能檢查設(shè)計時序與FPGA的實際運行情況是否一致,確保設(shè)計的可靠性和穩(wěn)定性。2數(shù)字秒表的設(shè)計2.1時間的概念人類在生活中總結(jié)出時間的觀念,其根源來自于日常生活中事件的發(fā)生次序。當然人們在生活中得到的絕不僅僅是事件發(fā)生次序的概念,同時也有時間間隔長短的概念,這個概念來源于對兩個過程的比較——比如兩件事同時開始,但一件事結(jié)束了另一件事還在進行,我們就說另一件事所需的時間更長。這里我們可以看到,人們運用可以測量的過程來測量抽象的時間。當前人類包括生物圈里的決大多數(shù)生命使用的都是太陽時。地球自轉(zhuǎn)一周導致了太陽東升西落一次,這一周期的完成就表示過去了一天。一天這個時間是由地球自轉(zhuǎn)一周導致的太陽東升西落這一運動狀態(tài)決定的。一年也是一樣,是由地球公轉(zhuǎn)繞太陽一周這個運動狀態(tài)決定的。地球的自轉(zhuǎn)和公轉(zhuǎn)速度的改變狀態(tài)將直接導致人類使用的一天和一年發(fā)生改變時間來自于運動,不同的運動狀態(tài)決定了不同的時間??刂七\動、掌握時間成了每一個人都可以做到的事,時間不在神秘。一種運動狀態(tài)決定了一個時間,一個獨立的時間也表示了一種動動狀態(tài)的延續(xù)。2.2實驗任務及要求秒表的計時范圍為00’00”00~59’59”99。有兩個按鈕開關(guān)Start/Stop和Split/Reset,控制秒表的啟動、停止、分段和復位:在秒表已經(jīng)被復位的情況下,按下“Start/Stop”鍵,秒表開始計時。在秒表正常運行的情況下,如果按下“Start/Stop”鍵,則秒表暫停計時;再次按下該鍵,秒表繼續(xù)計時。在秒表正常運行的情況下,如果按下“Split/Reset”鍵,顯示停止在按鍵時的時間,但秒表仍然在計時;再次按下該鍵,秒表恢復正常顯示。在秒表暫停計時的情況下,按下“Split/Reset”鍵,秒表復位歸零。圖2.2.1實驗原理圖圖2.2.2秒表實物圖2.3系統(tǒng)需求和解決方案首先根據(jù)設(shè)計的要求明確設(shè)計的目的,并根據(jù)設(shè)計需求制定相應的設(shè)計方法,設(shè)計出不同的設(shè)計模塊,畫出秒表設(shè)計的總框圖,在設(shè)計時根據(jù)已有的設(shè)計框圖一步步設(shè)計各個子模塊。在設(shè)計一個秒表電路時,需要先設(shè)計各個不同的子模塊,然后進行模塊的綜合。根據(jù)我們的習慣我們可以按照從左到右的順序依次建立模塊并進行組合。設(shè)計電路時遵循從上到下的設(shè)計原則,首先從系統(tǒng)設(shè)計入手,在頂層進行功能劃分和結(jié)構(gòu)設(shè)計,頂層的每個子模塊均可完成一個獨立的功能,子模塊在調(diào)試成功后可生成一個默認的符號,以供上一層使用??紤]到實驗電路板條件有限,僅有48MHZ的晶體振蕩器,為獲取準確時間,需要1KHZ的時鐘信號,且實際使用時又涉及到計數(shù),進位,8段數(shù)碼管顯示,暫停時的時間顯示和保存,各部分聯(lián)動及按鍵的消抖等諸多問題,故在分模塊的設(shè)計時可為分頻器電路,按鍵消抖電路,控制電路,計數(shù)電路,鎖存電路,掃描和顯示電路。以下為各部分功能簡述:圖2.3.1實驗板實物圖1.分頻器=1\*GB3①對產(chǎn)生的時鐘信號的48MHz晶體振蕩器進行分頻,先產(chǎn)生1KHz產(chǎn)生時間基準信號,用以控制8個數(shù)碼管以掃描方式顯示計時結(jié)果。=2\*GB3②再對1KHz的分頻信號再進行10分頻,從而產(chǎn)生100Hz的基準信號,用于秒表最后一位的顯示。2.按鍵消抖電路在按鍵按下時,F(xiàn)PGA的輸入為低電平;松開按鍵時,F(xiàn)PGA的輸入為高電平,但是在按下按鍵和松開按鍵的瞬間會出現(xiàn)抖動現(xiàn)象,影響秒表的運行,因此需要按鍵消抖電路,用以消除按鍵輸入信號抖動的影響,輸出單脈沖。3.控制器控制計數(shù)器的運行、停止以及復位。產(chǎn)生鎖存器的使能信號,控制模塊應包括開始計時/停止計時、分段/復位兩個按鈕,即電路設(shè)計經(jīng)常用到的使能端和清零端,這兩個控制端口直接接到計數(shù)器的清零和史能端即可實現(xiàn)復位、開始計時/停止計時;但是外圍使能輸入需要經(jīng)過使能轉(zhuǎn)換電路后,才可變?yōu)橛嫈?shù)器可用的使能控制信號。因此在輸入使能信號和計數(shù)器使能輸入之間需設(shè)計一個信號轉(zhuǎn)換模塊。顯示計數(shù)結(jié)果的模塊實現(xiàn)較為簡單,只需將六位計數(shù)結(jié)果通過七段譯碼電路接到輸出即可點亮數(shù)碼管,無需時序控制,直接用組合邏輯電路就可以實現(xiàn)。數(shù)碼管顯示可以采用掃描顯示,用一個頻率1KHz的信號掃描一個多路選擇器,實現(xiàn)對六位已經(jīng)鎖存的計數(shù)結(jié)果的掃描輸出。該模塊部分VHDL源程序見附錄。狀態(tài)圖如圖2.3.3所示:圖2.3.2狀態(tài)圖4.計數(shù)器對時間基準脈沖進行計數(shù),完成10進制,6進制的計數(shù)功能,并在最后把他們進行綜合級聯(lián),組成兩個60進制,一個100進制的計數(shù)器。5.數(shù)據(jù)鎖存器鎖存數(shù)據(jù)使顯示并保持暫停。6.掃描顯示的控制電路包括掃描計數(shù)器、數(shù)據(jù)選擇器和7段譯碼器,控制8個數(shù)碼管以掃描方式顯示計時結(jié)果??偪驁D如圖2.3.3所示總設(shè)計框圖2.3.1分頻器設(shè)計實驗板提供48MHz的震蕩信號,要求輸出頻率分別為1KHz和100Hz。分頻器的實現(xiàn)原理是基于計數(shù)器的方法設(shè)計的,通過對若干個震蕩信號的計數(shù)來實現(xiàn)輸出信號的翻轉(zhuǎn),故而實現(xiàn)了分頻。要得到1KHz的方波,需要48000分頻,同時若想得到100Hz的方波,需要再對得到的1KHz的時鐘信號再進行10分頻。對時鐘分頻模塊是將輸入的外部48MHz的時鐘信號進行分頻,從而產(chǎn)生用來消抖和用于控制的1KHz的時鐘信號clk_out和用于秒表內(nèi)部計時的100Hz的時鐘信號clk,輸入信號實驗板晶振產(chǎn)生的48MHz的時鐘信號,輸出信號分別是用于消抖和控制的clk_out和用于計數(shù)的時鐘信號clk,如圖示,本次設(shè)計,我使用的方法是取第24000次翻轉(zhuǎn),從而達到48000次一個周期實現(xiàn)1KHZ信號的獲取,模塊圖如圖1:圖12.3.2消抖電路設(shè)計由于秒表采用按鍵的輸入方式,按鍵產(chǎn)生的時間和持續(xù)的時間的長短是隨機的,存在各種原因引起的電平抖動現(xiàn)象,因此需要在每個開關(guān)后面加一個按鍵輸入模塊。消抖模塊應能排除在按鍵按下電平不能穩(wěn)定變化,出現(xiàn)紋波的情況下,對按鍵電平的識別。按鍵輸入模塊的作用是保證系統(tǒng)能捕捉到輸入脈沖,并保證每按一鍵,只形成一個寬度為模塊時鐘周期的脈沖。當按鍵按下時,做一個延時,一段延時后,仍檢測出按鍵為低電平,則認為按鍵按下,否則不判定為按鍵按下。本設(shè)使用計的按鍵消抖模塊的思想為,當按鍵按下后,在所設(shè)定的一小段時間內(nèi),持續(xù)維持低電平,則判斷為真正按下,輸出有效。2.3.3控制器使能控制是為了產(chǎn)生使能控制信號,在該控制信號作用下使輸出發(fā)生翻轉(zhuǎn)。按鍵輸入每來一個上升沿,使能輸出電平變化一次。即實現(xiàn)了每按一次按鍵計數(shù)器在停止和開始計數(shù)之間切換。控制模塊的主要作用是產(chǎn)生秒表內(nèi)部的定時計數(shù)的計數(shù)允許信號,該模塊的輸入信號分別是兩個去除抖動后的啟動信號ajxss,ajxsr,以及時鐘信號clk_out,輸出分別為用于控制計數(shù)器的清零信號kzrst,控制計數(shù)器使能信號的kzcin,以及控制鎖存器的信號kzen,控制模塊的引腳如圖2示:圖22.3.4計數(shù)器秒表計數(shù)模塊主要是用于實現(xiàn)秒表的定時計數(shù)功能。由于實驗板數(shù)碼管數(shù)量限制,計數(shù)器由六個計數(shù)器級聯(lián)實現(xiàn),其中4個十進制計數(shù)器、2個六進制計數(shù)器。本實驗方案采用同步級聯(lián)實現(xiàn)。本設(shè)計使用的是異步清零和同步使能,即當清零有效時,計數(shù)器立即清零,而當使能有效時,只有當時鐘上升沿到來時,才進行暫?;蜷_始計數(shù)的功能。使能輸入即進位輸入。首先先判斷清零是否有效,當有效時,執(zhí)行清零操作,q值為0。當清零無效時,并且使能有效是,進行計數(shù)。計數(shù)輸出為四位二進制數(shù)q。最后判斷當計數(shù)值滿并且使能有效時,進位輸出有效。六進制計數(shù)器原理與十進制計數(shù)器類似。只是q值最大為“0101”。秒表計數(shù)模塊的輸入信號包括經(jīng)過分頻的100Hz時鐘信號以及用于控制清零復位信號rst和使能的cin。秒表計數(shù)模塊的輸出信號就是秒表的計時信息,包括分十位信號,分個位信號,秒十位信號,秒個位信號,0.01秒十位信號,0.01秒個位信號,并將輸出信號與鎖存器相連,作為鎖存器的輸入信號。根據(jù)計數(shù)器的知識我們可以知道,可以將6個計數(shù)器級聯(lián)實現(xiàn)這個功能。利用分頻器得到0.01s的方波信號,以此作為每一個計數(shù)器的clk,計數(shù)器計算上升沿,得到輸出與進位,此計數(shù)器的進位作為下一個計數(shù)器的使能控制端cin,依次類推。一共有7個計數(shù)器,第1、2、4、7個計數(shù)器是十進制,第5、8個計數(shù)器是6進制。其中rst為復位清零信號,cin為計數(shù)使能信號,計數(shù)器有模10和模6計數(shù)器,其引腳電路圖如圖3示,結(jié)構(gòu)圖如圖4示:圖3圖42.3.5模塊設(shè)計之數(shù)據(jù)鎖存器因為秒表設(shè)計中要求在計時過程中能隨時固定顯示時間,而計時仍然繼續(xù),所以要用到鎖存器。數(shù)據(jù)鎖存器,在使能en=1時,將計數(shù)器傳送來的數(shù)據(jù)正常傳輸至輸出口從而正常顯示,en=0時,不能將計數(shù)器傳出來的數(shù)據(jù)正常送至輸出,而是將之前輸入送至輸出,一直顯示因此不能正常顯示,但此時仍能正常計數(shù),當en再次等于1時,顯示將回歸原來的狀態(tài)。鎖存器的輸入為計數(shù)器的輸出,鎖存器結(jié)構(gòu)如圖5示:圖52.3.6模塊設(shè)計之掃描顯示和控制電路顯示部分直接采用實驗板上的6個共陽極數(shù)碼管,如上圖示,若想使數(shù)碼管顯示,則需先使其使能端置于低電平,在本設(shè)計中為ncs=0,掃描顯示和控制電路共分為3個小模塊,=1\*GB3①在clk信號1khz,計數(shù)器數(shù)其上升沿,輸出q2、q1、q0三位位選信號=2\*GB3②在q2、q1、q0控制下,將來自鎖存器的信號某一時刻只輸出一個信號=3\*GB3③將此信號輸出成數(shù)碼管編碼。位選某一時刻選擇一個數(shù)碼管顯示相應數(shù)據(jù),即為動態(tài)掃描顯示。數(shù)碼管的7個段,只需將其輸出端口定義到可用作數(shù)碼管顯示的器件的I/O引腳上即可。顯示電路引腳圖如圖6示;圖62.3.7模塊設(shè)計之模塊綜合秒表內(nèi)部模塊級聯(lián)框圖如下:3數(shù)字秒表的仿真結(jié)果3.1各仿真結(jié)果編寫各個模塊的testbench文件,進行仿真,得到仿真波形。3.2模塊仿真之分頻器仿真波形如圖示(圖3.1)圖3.13.3計數(shù)電路仿真=1\*GB3①模6計數(shù)器仿真(圖3.2)圖3.2=2\*GB3②模10計數(shù)器仿真(圖3.3)圖3.34實驗結(jié)論經(jīng)下載仿真后,從FPGA實驗板的運行結(jié)果來看,該秒表實現(xiàn)了設(shè)計要求中包括所有擴展功能在內(nèi)的全部功能,且顯示時間穩(wěn)定準確,按鍵靈敏度高。在ISE軟件的開發(fā)環(huán)境下,采用自頂向下的方法有利于在早期發(fā)現(xiàn)結(jié)構(gòu)設(shè)計中的錯誤,再結(jié)合基于FPGA的可編程實驗板,輕松的實現(xiàn)了秒表的功能,利用仿真和現(xiàn)場觀察實驗結(jié)果,大大地提高了設(shè)計的可靠性和成功率,充分體現(xiàn)了可編程邏輯器件在數(shù)字電路中的優(yōu)越性。參考文獻[1]侯伯亨,顧新,VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計[2]石英,李新新,ISE應用與開發(fā)技巧[3]馮祥,可編程邏輯器件在數(shù)字系統(tǒng)中的應用[4]JohnM.Yarbrough,DigitallogicApplicationandDesign[5]熊焱春,劉益成,基于FPGA的數(shù)字秒表設(shè)計[6]古天祥,王厚軍,習友寶,電子測量原理[7]洪海麗,用VHDL設(shè)計數(shù)字電路[8]胡青,EDA設(shè)計中的層次化設(shè)計方法[9]劉寧寧,VHDL語言在FPGA設(shè)計中的應用[10]于斌,米秀杰,ModelSim電子系統(tǒng)分析及仿真附錄:1,分頻器電路程序Company:--Engineer:----CreateDate:15:50:0803/06/2014--DesignName:--ModuleName:fenpin-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityfenpinisport(clk:instd_logic; clk_out:outstd_logic); endfenpin;architectureBehavioraloffenpinissignalnew_clk:integer:=0;signalclk_out_tmp:std_logic:='0';beginprocess(clk)begin ifrising_edge(clk)then ifnew_clk=23999then new_clk<=0; clk_out_tmp<=notclk_out_tmp; else new_clk<=new_clk+1; endif; endif;endprocess;clk_out<=clk_out_tmp;endBehavioral;2,消抖電路程序Company:--Engineer:----CreateDate:16:37:3103/06/2014--DesignName:--ModuleName:zongxiaodou-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityzongxiaodouisport(clk:INstd_logic; key_in:INstd_logic;keysr_in:INstd_logic; key_out:OUTstd_logic; keysr_out:OUTstd_logic);endzongxiaodou;architectureBehavioralofzongxiaodouisCOMPONENTxiaodou PORT( clk:INstd_logic; key_in:INstd_logic; key_out:OUTstd_logic ); ENDCOMPONENT;signalzbclk:std_logic;beginzbclk<=clk; XD1:xiaodouPORTMAP( clk=>zbclk, key_in=>key_in, key_out=>key_out ); XD2:xiaodouPORTMAP( clk=>zbclk, key_in=>keysr_in, key_out=>keysr_out );endBehavioral;XD1&XD2:Company:--Engineer:----CreateDate:16:38:2603/06/2014--DesignName:--ModuleName:xiaodou-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityxiaodouisport(clk:instd_logic;key_in:instd_logic; key_out:outstd_logic); endxiaodou;architectureBehavioralofxiaodouissignalk1,k2:std_logic; signalcnt:std_logic_vector(1downto0); beginprocess(clk,key_in) begin ifclk'eventandclk='0'then ifcnt=3then k1<='1'; else k1<='0'; cnt<=cnt+1; endif; k2<=k1; endif; ifkey_in='0'then cnt<="00"; endif; endprocess; key_out<=notk1andk2; endBehavioral;3,控制電路程序Company:--Engineer:----CreateDate:15:51:0503/06/2014--DesignName:--ModuleName:control-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitycontrolis port( clk:instd_logic; ajxss:instd_logic; ajxsr:instd_logic; kzrst:outstd_logic; kzcin:outstd_logic; kzen:outstd_logic );endcontrol;architectureBehavioralofcontrolis signalst:std_logic_vector(2downto0):="111"; signalsr:std_logic_vector(1downto0);begin sr<=ajxss&ajxsr; process(sr,clk) begin ifrising_edge(clk)then casestis when"011"=> casesris when"01"=>st<="010"; when"10"=>st<="001"; whenothers=>st<="011"; endcase; when"111"=> casesris when"10"=>st<="011"; whenothers=>st<="111"; endcase; when"001"=> casesris when"01"=>st<="111"; when"10"=>st<="011"; whenothers=>st<="001"; endcase; when"010"=> casesris when"01"=>st<="011"; whenothers=>st<="010"; endcase; whenothers=> st<="111"; endcase; endif; endprocess; kzrst<=st(2); kzcin<=st(1); kzen<=st(0); endBehavioral;4,計數(shù)電路程序綜合進位程序Company:--Engineer:----CreateDate:15:51:4703/06/2014--DesignName:--ModuleName:main-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitymainisport(rst:instd_logic; cin:instd_logic; clk:instd_logic; q1:outstd_logic_vector(3downto0); q2:outstd_logic_vector(3downto0); q3:outstd_logic_vector(3downto0); q4:outstd_logic_vector(3downto0); q5:outstd_logic_vector(3downto0); q6:outstd_logic_vector(3downto0));endmain;architectureBehavioralofmainisCOMPONENTcnt_10 PORT( clk:INstd_logic; cin:INstd_logic; rst:INstd_logic; cout:OUTstd_logic; q:OUTstd_logic_vector(3downto0) ); ENDCOMPONENT; COMPONENTcnt_6 PORT( clk:INstd_logic; cin:INstd_logic; rst:INstd_logic; cout:OUTstd_logic; q:OUTstd_logic_vector(3downto0) ); ENDCOMPONENT; signalc0,c1,c2,c3,c4,c5:std_logic;begin U0:cnt_10PORTMAP( clk=>clk, cin=>cin, rst=>rst, cout=>c0, q=>open ); U1:cnt_10PORTMAP( clk=>clk, cin=>c0, rst=>rst, cout=>c1, q=>q1 ); U2:cnt_10PORTMAP( clk=>clk, cin=>c1, rst=>rst, cout=>c2, q=>q2 ); U3:cnt_10PORTMAP( clk=>clk, cin=>c2, rst=>rst, cout=>c3, q=>q3 ); U4:cnt_6PORTMAP( clk=>clk, cin=>c3, rst=>rst, cout=>c4, q=>q4 ); U5:cnt_10PORTMAP( clk=>clk, cin=>c4, rst=>rst, cout=>c5, q=>q5 ); U6:cnt_6PORTMAP( clk=>clk, cin=>c5, rst=>rst, cout=>open, q=>q6 );endBehavioral;=1\*GB3①模6計數(shù)器Company:--Engineer:----CreateDate:15:54:2503/06/2014--DesignName:--ModuleName:cnt_6-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitycnt_6is port( clk:instd_logic; cin:instd_logic; rst:instd_logic; cout:outstd_logic; q:outstd_logic_vector(3downto0) );endcnt_6;architectureBehavioralofcnt_6is signalold_s,new_s:std_logic_vector(3downto0);begin process(rst,clk) begin ifrst='1'then old_s<=(others=>'0'); elsifrising_edge(clk)then old_s<=new_s; endif; endprocess; process(cin,old_s) begin ifcin='1'then ifold_s<5then new_s<=old_s+1; else new_s<=(others=>'0'); endif; else new_s<=old_s; endif; endprocess; process(cin,old_s) begin q<=old_s; ifcin='1'andold_s=5then cout<='1'; else cout<='0'; endif; endprocess;endBehavioral;=2\*GB3②模10計數(shù)器Company:--Engineer:----CreateDate:15:53:1503/06/2014--DesignName:--ModuleName:cnt_10-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitycnt_10is port( clk:instd_logic; cin:instd_logic; rst:instd_logic; cout:outstd_logic; q:outstd_logic_vector(3downto0) );endcnt_10;architectureBehavioralofcnt_10is signalold_s,new_s:std_logic_vector(3downto0);begin process(rst,clk) begin ifrst='1'then old_s<=(others=>'0'); elsifrising_edge(clk)then old_s<=new_s; endif; endprocess; process(cin,old_s) begin ifcin='1'then ifold_s<9then new_s<=old_s+1; else new_s<=(others=>'0'); endif; else new_s<=old_s; endif; endprocess; process(cin,old_s) begin q<=old_s; ifcin='1'andold_s=9then cout<='1'; else cout<='0'; endif; endprocess;endBehavioral;5,數(shù)據(jù)鎖存電路程序Company:--Engineer:----CreateDate:15:55:0603/06/2014--DesignName:--ModuleName:save-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitysaveisport(en:instd_logic; rq1:instd_logic_vector(3downto0); rq2:instd_logic_vector(3downto0); rq3:instd_logic_vector(3downto0); rq4:instd_logic_vector(3downto0); rq5:instd_logic_vector(3downto0); rq6:instd_logic_vector(3downto0); cq1:outstd_logic_vector(3downto0); cq2:outstd_logic_vector(3downto0); cq3:outstd_logic_vector(3downto0); cq4:outstd_logic_vector(3downto0); cq5:outstd_logic_vector(3downto0); cq6:outstd_logic_vector(3downto0));endsave;architectureBehavioralofsaveissignals1,s2,s3,s4,s5,s6:std_logic_vector(3downto0);begins1<=rq1; s2<=rq2; s3<=rq3; s4<=rq4; s5<=rq5; s6<=rq6;process(s1,s2,s3,s4,s5,s6,en)beginifen='1'then cq1<=s1; cq2<=s2; cq3<=s3; cq4<=s4; cq5<=s5; cq6<=s6;endif;endprocess;endBehavioral;6,掃描顯示和控制電路程序Company:--Engineer:----CreateDate:15:55:4003/06/2014--DesignName:--ModuleName:disp-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitydispisport(zsclk:instd_logic; m1:INstd_logic_vector(3downto0); m2:INstd_logic_vector(3downto0); m3:INstd_logic_vector(3downto0); m4:INstd_logic_vector(3downto0); m5:INstd_logic_vector(3downto0); m6:INstd_logic_vector(3downto0); led:OUTstd_logic_vector(6downto0); q0:OUTstd_logic; q1:OUTstd_logic; q2:OUTstd_logic);enddisp;architectureBehavioralofdispisCOMPONENTsmkzxsym PORT( sclk:INstd_logic; q0:OUTstd_logic; q1:OUTstd_logic; q2:OUTstd_logic ); ENDCOMPONENT; COMPONENTshumaguan PORT( yiger:INstd_logic_vector(3downto0); led:OUTstd_logic_vector(6downto0) ); ENDCOMPONENT; COMPONENTduoguiyi PORT( m1:INstd_logic_vector(3downto0); m2:INstd_logic_vector(3downto0); m3:INstd_logic_vector(3downto0); m4:INstd_logic_vector(3downto0); m5:INstd_logic_vector(3downto0); m6:INstd_logic_vector(3downto0); pxr0:INstd_logic; pxr1:INstd_logic; pxr2:INstd_logic; yigec:OUTstd_logic_vector(3downto0) ); ENDCOMPONENT; signalzbq0:std_logic; signalzbq1:std_logic; signalzbq2:std_logic; signalyige:std_logic_vector(3downto0); beginq0<=zbq0; q1<=zbq1; q2<=zbq2;Inst_smkzxsym:smkzxsymPORTMAP( sclk=>zsclk, q0=>zbq0, q1=>zbq1, q2=>zbq2 );Inst_shumaguan:shumaguanPORTMAP( yiger=>yige, led=>led ); Inst_duoguiyi:duoguiyiPORTMAP( m1=>m1, m2=>m2, m3=>m3, m4=>m4, m5=>m5, m6=>m6, pxr0=>zbq0, pxr1=>zbq1, pxr2=>zbq2, yigec=>yige );endBehavioral;Company:--Engineer:----CreateDate:15:57:1203/06/2014--DesignName:--ModuleName:smkzxsym-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entitysmkzxsymisport(sclk:instd_logic; q0:outstd_logic; q1:outstd_logic; q2:outstd_logic);endsmkzxsym;architectureBehavioralofsmkzxsymissignalold_s,q:std_logic_vector(2downto0);beginq0<=q(0); q1<=q(1);q2<=q(2);process(sclk) begin ifrising_edge(sclk)then ifold_s<7then old_s<=old_s+1; else old_s<=(others=>'0'); endif; endif; q<=old_s; endprocess; endBehavioral;Company:--Engineer:----CreateDate:15:57:5703/06/2014--DesignName:--ModuleName:shumaguan-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityshumaguanisport(yiger:instd_logic_vector(3downto0); led:outstd_logic_vector(6downto0));endshumaguan;architectureBehavioralofshumaguanisbeginprocess(yiger)begin caseyigeris when"0000"=>led<="0000001"; when"0001"=>led<="1001111"; when"0010"=>led<="0010010"; when"0011"=>led<="0000110"; when"0100"=>led<="1001100"; when"0101"=>led<="0100100"; when"0110"=>led<="0100000"; when"0111"=>led<="0001111"; when"1000"=>led<="0000000"; when"1001"=>led<="0000100"; when"1111"=>led<="1111110"; whenothers=>led<="1111111"; endcase; endprocess;endBehavioral;Company:--Engineer:----CreateDate:15:59:1903/06/2014--DesignName:--ModuleName:duoguiyi-Behavioral--ProjectName:--TargetDevices:--Toolversions:--Description:Dependencies:Revision:--Revision0.01-FileCreated--AdditionalComments:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;UncommentthefollowinglibrarydeclarationifinstantiatinganyXilinxprimitivesinthiscode.--libraryUNISIM;--useUNISIM.VComponents.all;entityduoguiyiisport(m1:instd_logic_vector(3downto0); m2:instd_logic_vector(3downto0); m3:instd_logic_vector(3downto0);m4:instd_logic_vector(3downto0);m5:instd_logic_vector(3downto0);m6:instd_logic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論