久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5172|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

EDA,F(xiàn)PGA設(shè)計(jì),有誰可以幫忙吧這個(gè)程序改成1602顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:115394 發(fā)表于 2017-6-14 16:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
200黑幣
現(xiàn)代電子技術(shù)綜合實(shí)驗(yàn)
秒表
實(shí)
驗(yàn)
報(bào)
         
                              時(shí)間:2013年6月6日  
摘 要
隨著電子信息產(chǎn)業(yè)的不斷發(fā)展,基于FPGA的應(yīng)用技術(shù)發(fā)展迅速,在某些領(lǐng)域FPGA正逐步代替dsp、arm、單片機(jī)等微處理器。本文設(shè)計(jì)一個(gè)基于FPGA技術(shù)的數(shù)字秒表。首先,我們把晶振產(chǎn)生的50MHZ時(shí)鐘信號(hào)送入FPGA芯片內(nèi),經(jīng)FPGA內(nèi)分頻模塊處理產(chǎn)生1KHZ時(shí)鐘信號(hào)。秒表的功能模塊由VHDL語言編寫,在Xilinx的ISE環(huán)境下調(diào)試,并在Modelsim上完成仿真,在最后把產(chǎn)生的信號(hào)送入LED顯示電路里進(jìn)行顯示。本文從電子秒表的具體設(shè)計(jì)觸發(fā),詳細(xì)闡述了基于FPGA的數(shù)字秒表的設(shè)計(jì)方案,設(shè)計(jì)了各模塊的代碼,并對(duì)硬件電路進(jìn)行了仿真。
關(guān)鍵詞:FPGA,VHDL,電子秒表
第一章  引言
隨著電子信息產(chǎn)業(yè)的發(fā)展,數(shù)字系統(tǒng)的規(guī)模越來越大,更多采用自頂而下的模塊化設(shè)計(jì)方法,這就要求技術(shù)人員對(duì)于基本的模塊有著深入的理解。隨著FPGA技術(shù)的發(fā)展和成熟,用FPGA來做為一個(gè)電路系統(tǒng)的控制電路逐漸顯示出其無與倫比的優(yōu)越性。因此本文采用FPGA來做為電路的控制系統(tǒng),采用模塊化的設(shè)計(jì)方法設(shè)計(jì)一個(gè)能顯示從00-00-00到59-59-99,并且具備秒表所有功能的小型數(shù)字系統(tǒng)。
第二章  基于FPGAVHDL設(shè)計(jì)流程2.1  概述
數(shù)字秒表是數(shù)字電路中的一個(gè)典型應(yīng)用,實(shí)際的硬件設(shè)計(jì)用到的器件較多,連線比較復(fù)雜,而且會(huì)產(chǎn)生比較大的延時(shí),造成測(cè)量誤差、可靠性差。秒表的設(shè)計(jì)有傳統(tǒng)方法和現(xiàn)代方法,傳統(tǒng)的設(shè)計(jì)方法耗時(shí)耗功,設(shè)計(jì)強(qiáng)度大,且容易出錯(cuò),設(shè)計(jì)的質(zhì)量不一定是最好的。自然我們考慮到現(xiàn)代方法,即二十世紀(jì)八十年代興起的電子設(shè)計(jì)自動(dòng)化技術(shù),英文為Electronic Design Auto,縮寫為EDA。在EDA設(shè)計(jì)工具中,用的最廣泛的是VHDL和VERILOG,當(dāng)然還有其它的。比較VHDL和VERILOG,在頂層設(shè)計(jì)方面VHDL優(yōu)于VERILOG,在門級(jí)電路設(shè)計(jì)方面VERILOG優(yōu)于VHDL。隨著復(fù)雜可編程邏輯器件(CPLD)的廣泛應(yīng)用,以EDA工具作為開發(fā)手段,運(yùn)用VHDL語言,將使整個(gè)系統(tǒng)大大簡(jiǎn)化,提高整體的性能和可靠性。
2.2  VHDL語言介紹
VHDL(Very-high-speed IntegratedCircuit Hardware Description Language)誕生于1982年。1987年底,VHDL被IEEE(The Institute ofElectrical and Electronics Engineers)和美國國防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語言。自IEEE公布了VHDL的標(biāo)準(zhǔn)版本(IEEE-1076)之后,各EDA公司相繼推出了自己的VHDL設(shè)計(jì)環(huán)境,并宣布自己的設(shè)計(jì)工具可以和VHDL接口。此后VHDL在電子設(shè)計(jì)領(lǐng)域得到了廣泛的接受,并逐步取代了原有的非標(biāo)準(zhǔn)硬件描述語言。1993年,IEEE對(duì)VHDL進(jìn)行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴(kuò)展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標(biāo)準(zhǔn)的1076-1993版本。現(xiàn)在,VHDL和VERILOG作為IEEE的工業(yè)標(biāo)準(zhǔn)硬件描述語言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實(shí)上的通用硬件描述語言。有專家認(rèn)為,在新的世紀(jì)中,VHDL和VERILOG語言將承擔(dān)起--幾乎全部的數(shù)字系統(tǒng)設(shè)計(jì)任務(wù)。
2.2.1  VHDL的特點(diǎn)
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式,描述風(fēng)格以及句法十分類似于一般的計(jì)算機(jī)高級(jí)語言。VHDL的程序結(jié)構(gòu)特點(diǎn)是將一項(xiàng)工程設(shè)計(jì),或稱為設(shè)計(jì)實(shí)體(可以是一個(gè)元件、一個(gè)電路模塊或一個(gè)系統(tǒng))分成外部(又稱為可視部分,即端口)和內(nèi)部(又稱為不可視部分),即設(shè)計(jì)實(shí)體的內(nèi)部功能和算法完成部分。在對(duì)一個(gè)設(shè)計(jì)實(shí)體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其它的設(shè)計(jì)就可以直接調(diào)用這個(gè)實(shí)體。這種將設(shè)計(jì)實(shí)體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計(jì)的基本點(diǎn)。應(yīng)用VHDL進(jìn)行工程設(shè)計(jì)的優(yōu)點(diǎn)是多方面的,具體如下:
1、與其它的硬件描述語言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語言。強(qiáng)大的行為描述能力是避開具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。就目前流行的EDA工具和VHDL綜合器而言,將基于抽象的行為描述風(fēng)格的VHDL程序綜合成為具體的FPGA和CPLD等目標(biāo)器件的網(wǎng)表文件已不成問題,只是在綜合與優(yōu)化效率上略有差異。
2、VHDL最初是作為一種仿真標(biāo)準(zhǔn)格式出現(xiàn)的,因此VHDL既是一種硬件電路描述和設(shè)計(jì)語言,也是一種標(biāo)準(zhǔn)的網(wǎng)表格式,還是一種仿真語言。其豐富的仿真語句和庫函數(shù),使得在任何大系統(tǒng)的設(shè)計(jì)早期(即尚未完成),就能用于查驗(yàn)設(shè)計(jì)系統(tǒng)的功能可行性,隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真模擬。即在遠(yuǎn)離門級(jí)的高層次上進(jìn)行模擬,使設(shè)計(jì)者對(duì)整個(gè)工程設(shè)計(jì)的結(jié)構(gòu)和功能的可行性做出決策。
3、VHDL語句的行為描述能力和程序結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能,符合市場(chǎng)所需求的,大規(guī)模系統(tǒng)高效、高速的完成必須由多人甚至多個(gè)開發(fā)組共同并行工作才能實(shí)現(xiàn)的特點(diǎn)。VHDL中設(shè)計(jì)實(shí)體的概念、程序包的概念、設(shè)計(jì)庫的概念為設(shè)計(jì)的分解和并行工作提供了有力的支持。
4、對(duì)于用VHDL完成的一個(gè)確定的設(shè)計(jì),可以利用EDA工具進(jìn)行邏輯綜合和優(yōu)化,并自動(dòng)地把VHDL描述設(shè)計(jì)轉(zhuǎn)變成為門級(jí)網(wǎng)表。這種方式突破了門級(jí)電路設(shè)計(jì)的瓶頸,極大地減少了電路設(shè)計(jì)的時(shí)間和可能發(fā)生的錯(cuò)誤,降低了開發(fā)成本。應(yīng)用EDA工具的邏輯優(yōu)化功能,可以自動(dòng)地把一個(gè)綜合后的設(shè)計(jì)變成一個(gè)更高效、更高速的電路系統(tǒng)。反過來,設(shè)計(jì)者還可以容易地從綜合和優(yōu)化后的電路獲得設(shè)計(jì)信息,返回去更新修改VHDL設(shè)計(jì)描述,使之更為完善。
5、VHDL對(duì)設(shè)計(jì)的描述具有相對(duì)獨(dú)立性,設(shè)計(jì)者可以不懂硬件的結(jié)構(gòu),也不必管最終設(shè)計(jì)實(shí)現(xiàn)的目標(biāo)器件是什么,而進(jìn)行獨(dú)立的設(shè)計(jì)。正因?yàn)閂HDL硬件描述與具體的工藝技術(shù)和硬件結(jié)構(gòu)無關(guān),VHDL設(shè)計(jì)程序的硬件實(shí)現(xiàn)目標(biāo)器件有廣闊的選擇范圍,其中包括各系列的CPLD、FPGA及各種門陣列實(shí)現(xiàn)目標(biāo)。
6、由于VHDL具有類屬描述語句和子程序調(diào)用等功能,對(duì)于已完成的設(shè)計(jì),在不改變?cè)闯绦虻臈l件下,只需要改變端口類屬參量或函數(shù),就能輕易地改變?cè)O(shè)計(jì)的規(guī)模和結(jié)構(gòu)。
2.2.2  基于VHDL的自頂向下設(shè)計(jì)方2.2.2.1  自頂向下設(shè)計(jì)的步驟
1、設(shè)計(jì)說明:用自然語言表達(dá)系統(tǒng)項(xiàng)目的功能特點(diǎn)和技術(shù)參數(shù)等。
2、建立VHDL行為模型,即將設(shè)計(jì)說明已轉(zhuǎn)化為VHDL行為模型。建立模型是為了通過VHDL仿真器對(duì)整個(gè)系統(tǒng)進(jìn)行系統(tǒng)行為仿真和性能評(píng)估。
3、VHDL行為仿真。這一階段可以利用VHDL仿真器對(duì)頂層系統(tǒng)的行為模型進(jìn)行仿真測(cè)試,檢查模擬結(jié)果,繼而進(jìn)行修改和完善。
4、VHDL-RTL級(jí)建模。即將VHDL的行為模型表達(dá)為VHDL行為代碼。
5、前端功能仿真。即對(duì)VHDL-RTL級(jí)模型進(jìn)行仿真,簡(jiǎn)稱功能仿真。
6、邏輯綜合。使用邏輯綜合工具將VHDL行為代碼描述轉(zhuǎn)化為結(jié)構(gòu)化的門級(jí)電路。
7、測(cè)試向量生成。
8、功能仿真。
9、結(jié)構(gòu)綜合。
10、門級(jí)時(shí)序仿真。
11、硬件測(cè)試。
2.2.2.2  Top-down設(shè)計(jì)方法的優(yōu)點(diǎn)
1、完全符合設(shè)計(jì)人員的設(shè)計(jì)思路;從功能描述開始,到最后的物理實(shí)現(xiàn)。
2、功能設(shè)計(jì)可完全獨(dú)立于物理實(shí)現(xiàn);采用Top-Down設(shè)計(jì)方法,功能輸入采用國際標(biāo)準(zhǔn)的HDL輸入方法,HDL可不含有任何器件的物理信息,因此工程師可以有更多的空間去集中精力進(jìn)行功能描述。設(shè)計(jì)師可以在設(shè)計(jì)過程的最后階段任意選擇或更改物理器件,不會(huì)在設(shè)計(jì)一開始就受到最終所采用器件的約束。
3、設(shè)計(jì)可再利用;設(shè)計(jì)結(jié)果完全可以以一種知識(shí)產(chǎn)權(quán)(IP-IntellectualProperty)的方式作為設(shè)計(jì)師或設(shè)計(jì)單位的設(shè)計(jì)成果,應(yīng)用于不同的產(chǎn)品設(shè)計(jì)中,做到成果的再利用。
4、易于設(shè)計(jì)的更改;設(shè)計(jì)工程師可在極短的時(shí)間內(nèi)修改設(shè)計(jì),對(duì)各種FPGA/CPLD結(jié)構(gòu)進(jìn)行設(shè)計(jì)結(jié)果規(guī)模(門消耗)和速度(時(shí)序)的比較,選擇最優(yōu)方案。
5、設(shè)計(jì)和處理大規(guī)模復(fù)雜電路;目前的FPGA/CPLD器件正向高集成度、深亞微米工藝發(fā)展。為設(shè)計(jì)系統(tǒng)的小型化,低功耗、高可靠性等提供了集成的手段。
6、設(shè)計(jì)周期縮短,生產(chǎn)率大大提高,產(chǎn)品上市時(shí)間提前,性能明顯提高,產(chǎn)品競(jìng)爭(zhēng)力加強(qiáng)。據(jù)統(tǒng)計(jì),采用Top-Down設(shè)計(jì)方法的生產(chǎn)率可達(dá)到傳統(tǒng)設(shè)計(jì)方法2到4倍。
2.3  FPGA開發(fā)介紹2.3.1  FPGA簡(jiǎn)介
現(xiàn)場(chǎng)可編程門陣列(FPGA)器件是八十年代中期出現(xiàn)的新產(chǎn)品,它的應(yīng)用大大地方便了IC的設(shè)計(jì),因而隨著數(shù)字技術(shù)日益廣泛的應(yīng)用,以FPGA為代表的ASIC器件得到了迅速的普及和發(fā)展,器件集成度和速度都在高速增長。
傳統(tǒng)的電路設(shè)計(jì)過程是:先畫原理圖、把原理圖繪制成印制電路板圖、再制版、安裝、調(diào)試。有了FPGA,我們只需要在計(jì)算機(jī)上繪出原理圖,再運(yùn)行相應(yīng)的軟件,就可把所設(shè)計(jì)的邏輯電路在FPGA中實(shí)現(xiàn)。所有步驟均可自動(dòng)完成。電子設(shè)計(jì)工程師自己設(shè)計(jì)專用集成電路成為了一件很容易的事情。
FPGA作為專用集成電路(ASIC)概念上的一個(gè)新型范疇和門類,以其高度靈活的用戶現(xiàn)場(chǎng)編程方式,現(xiàn)場(chǎng)定義高容量數(shù)字單片系統(tǒng)的能力,能夠重復(fù)定義、反復(fù)改寫的新穎功能,為復(fù)雜數(shù)字系統(tǒng)設(shè)計(jì)、研制以及產(chǎn)品開發(fā)提供了有效的技術(shù)手段。電子應(yīng)用設(shè)計(jì)工程師應(yīng)用FPGA技術(shù)不僅可避免通常ASIC單片系統(tǒng)設(shè)計(jì)周期長,前期投資風(fēng)險(xiǎn)大的弱點(diǎn),而且克服了過去板級(jí)通用數(shù)字電路應(yīng)用設(shè)計(jì)的落后,繁瑣和不可靠性。
目前FPGA的兩個(gè)重要發(fā)展與突破是,大多數(shù)廠商在其高端器件上都提供了片上的處理器(如CPU、DSP)等硬核(Hard Core)或固化核(Fixed Core)。比如Xilinx的Virtex II Pro芯片可以提供Power PC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模塊。在FPGA上集成微處理器,使SOPC設(shè)計(jì)更加便利與強(qiáng)大。另一個(gè)發(fā)展是在不同器件商推出的高端芯片上大都集成了高速串行收發(fā)器,一般能夠達(dá)到3Gb/s以上的數(shù)據(jù)處理能力,在Xilinx、Altera、Lattice都有相應(yīng)的器件型號(hào)提供該功能。這些新功能使FPGA的數(shù)據(jù)吞吐能力大幅度增強(qiáng)。
2.3.2  FPGA設(shè)計(jì)流程
對(duì)于目標(biāo)器件為FPGA和CPLD的HDL設(shè)計(jì),其工程設(shè)計(jì)的基本流程如圖 2-1所示。現(xiàn)具體說明如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
圖 2-1 EDA設(shè)計(jì)流程
1、文本編輯
用任何文本編輯器都可以進(jìn)行,通常VHDL文件保存為vhd文件,Verilog文件保存為v文件。
2、使用編譯工具編譯源文件
HDL的編譯器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的編譯器。
3、邏輯綜合
將源文件調(diào)入邏輯綜合軟件進(jìn)行綜合。綜合的目的是在于將設(shè)計(jì)的源文件由語言轉(zhuǎn)換為實(shí)際的電路。但是此時(shí)還沒有在芯片中形成真正的電路。這一步的最終目的是生成門電路級(jí)的網(wǎng)表(Netlist)。
4、布局、布線
將第3步生成的網(wǎng)表文件調(diào)入PLD廠家提供的軟件中進(jìn)行布線,即把設(shè)計(jì)好的邏輯安放到CPLD/FPGA內(nèi)。這一步的目的是生成用于下載(編程Programming)的編程文件。在這一步,將用到第3步生成的網(wǎng)表,并根據(jù)CPLD/FPGA廠商的器件容量,結(jié)構(gòu)等進(jìn)行布局、布線。這就好像在設(shè)計(jì)PCB時(shí)的布局布線一樣。先將各個(gè)設(shè)計(jì)中的門根據(jù)網(wǎng)表的內(nèi)容和器件的結(jié)構(gòu)放在器件的特定部位。然后,在根據(jù)網(wǎng)表中提供的各門的連接,把各個(gè)門的輸入輸出連接起來。最后,生成一個(gè)供編程的文件。這一步同時(shí)還會(huì)加一些時(shí)序信息(Timing)到你的設(shè)計(jì)項(xiàng)目中去,以便于你做后仿真。
5、后仿真
利用在布局布線中獲得的精確參數(shù),用仿真軟件驗(yàn)證電路的時(shí)序。(也叫布局布線仿真或時(shí)序仿真)。這一步主要是為了確定你的設(shè)計(jì)在經(jīng)過布局布線之后,是不是還滿足你的設(shè)計(jì)要求。
6、編程,下載
如果前幾步都沒有發(fā)生錯(cuò)誤,并且符合設(shè)計(jì)要求,這一步就可以將由適配器等產(chǎn)生的配置或下載文件通過編程器或下載電纜下載到目標(biāo)芯片中。
7、硬件測(cè)試
硬件測(cè)試的目的是為了在更真實(shí)的環(huán)境中檢驗(yàn)HDL設(shè)計(jì)的運(yùn)行情況,特別是對(duì)于HDL程序設(shè)計(jì)上不是十分規(guī)范,語義上含有一定歧義的程序。


第三章  數(shù)字秒表的軟件開發(fā)環(huán)境
本章主要介紹項(xiàng)目中將要用到了一系列軟件,包括用于VHDL語言編寫和編譯的ISE軟件和用于程序仿真的仿真軟件ModelSim。
3.1  開發(fā)環(huán)境
隨著可編程器件紛紛超越百萬門級(jí),設(shè)計(jì)者面臨的產(chǎn)品性能與設(shè)計(jì)效率的挑戰(zhàn)也越來越大。設(shè)計(jì)者必須合理選擇各EDA廠家提供的加速設(shè)計(jì)的工具軟件,這樣才能在較短的時(shí)間內(nèi)設(shè)計(jì)出高效穩(wěn)定的產(chǎn)品。在本次設(shè)計(jì)中,由于選擇的FPGA芯片是由Xilinx公司生產(chǎn)的,所以我們主要使用ModelSim和ISE軟件進(jìn)行仿真和綜合。
3.2 ModelSim介紹
ModelSim支持PC和UNIX平臺(tái),是單一內(nèi)核支持VHDL和Verilog混合仿真的HDL語言仿真器。ModelSim不僅可以完成設(shè)計(jì)的功能驗(yàn)證,也可實(shí)現(xiàn)邏輯綜合后的門級(jí)仿真以及布局布線后的功能與時(shí)序驗(yàn)證。
ModelSim完全支持VHDL和Verilog標(biāo)準(zhǔn);采用直接編輯技術(shù),大大提高HDL編譯和仿真速度。還可以利用ModelSim調(diào)用設(shè)計(jì)文件進(jìn)行仿真分析。在調(diào)試環(huán)境中,設(shè)計(jì)者可以通過ModelSim的快速調(diào)試步驟以及對(duì)各種信號(hào)的監(jiān)控功能(無論信號(hào)處于VHDL層,還是處于混合語言層)使仿真的執(zhí)行過程形象直觀化,幫助設(shè)計(jì)者及時(shí)發(fā)現(xiàn)漏洞,縮短設(shè)計(jì)周期。
ModelSim最大的特點(diǎn)是其強(qiáng)大的調(diào)試功能:先進(jìn)的數(shù)據(jù)流窗口,可以迅速追蹤到生產(chǎn)不定或者錯(cuò)誤狀態(tài)的原因;性能分析工具幫助分析性能瓶頸,加速仿真;代碼覆蓋率檢查確保測(cè)試的完備;多種模式的波形比較功能;先進(jìn)的 SignalSpy功能,可以方便地訪問VHDL或者VHDL和Verilog混合設(shè)計(jì)中的底層信號(hào);支持加密IP;可以實(shí)現(xiàn)與Matlab的Simulink的聯(lián)合仿真。
3.2.1  ISE環(huán)境中ModelSim的使用
ModelSim是一個(gè)獨(dú)立的仿真工具,它在工作的時(shí)候并不需要其他軟件的協(xié)助,在Xilinx公司的ISE集成開發(fā)環(huán)境中給ModelSim仿真軟件預(yù)留了接口,通過這個(gè)接口可以從ISE集成環(huán)境中直接啟動(dòng)ModelSim工具進(jìn)行仿真。這個(gè)過程通常會(huì)給初學(xué)者一個(gè)錯(cuò)覺,以為ISE集成環(huán)境和ModelSim工具是聯(lián)合工作的,其實(shí)ISE并沒有集成ModelSim工具,只是預(yù)留了軟件接口。為了說明ModelSim的用戶接口,將使用從ISE集成開發(fā)環(huán)境中直接啟動(dòng)ModelSim仿真工具的方法。使用此種方法啟動(dòng)ModelSim工具需要具備3個(gè)條件:第一,啟動(dòng)ISE集成開發(fā)環(huán)境并建立了一個(gè)FPGA/CPLD的工程項(xiàng)目;第二,添加設(shè)計(jì)源代碼并且編譯通過;第三,使用ISE中的TestFixture或者TestBenchWaveform工具為當(dāng)前的設(shè)計(jì)提供一個(gè)測(cè)試模板(Testbench),并且在測(cè)試模板中添加設(shè)計(jì)激勵(lì)。只有上述條件具備之后才可以從ISE的當(dāng)前資源操作窗中直接啟動(dòng)ModelSim工具并運(yùn)行仿真,以下使用ISE自帶的一個(gè)例子加以說明。
在ISE中直接啟動(dòng)ModelSim
1、在Windows操作系統(tǒng)中選擇[開始]/[程序]/[Xilinx ISE 6]/[Project Navigator]命令,啟動(dòng)ISE集成開發(fā)環(huán)境。
2、在ISE主窗口中選擇[File]/[Open Example]命令,彈出[Open Example]對(duì)話框,如圖所示,然后在[Select an ExampleProject]欄目中選擇“goldcode-ver-217”,在[Destination Directory]中選擇項(xiàng)目存放的目錄,單擊OK按鈕打開例子程序。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
圖3-1 打開例子程序
3、在資源管理窗口(Source in Project)中的模塊視圖(Model View)中選中的測(cè)試文件“testbench.tf”,在相應(yīng)的當(dāng)前資源操作窗口(Process for CurrentSource)中將會(huì)出現(xiàn)與Modelsim仿真器相關(guān)的行為仿真(Simulate BehavioralVerilog Model),翻譯后仿真(Simulate Post-Map Verilog Model)和布局布線后仿真(Simulate Post-Place& Route Verilog Model)等4個(gè)不同的操作選項(xiàng),如圖所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
圖 3-2 Modelsim 仿真
4、雙擊[Simulate BehavioralModel]操作選項(xiàng),將啟動(dòng)Modelsim仿真器。
5、在Modelsim主窗口中選擇[View]/[All]命令,將顯示所有的窗口。
在當(dāng)前資源操作窗口中選擇任意一個(gè)操作選項(xiàng)都可以啟動(dòng)相應(yīng)階段的仿真操作,如果相應(yīng)階段的仿真文件不存在,那么集成環(huán)境將自動(dòng)生成仿真文件。例如,當(dāng)雙擊資源操作窗口中的[Simulate Post-Place& Route Verilog Model]操作選項(xiàng)時(shí)將啟動(dòng)時(shí)序仿真,而這一仿真過程所需要的布局布線后仿真文件以及時(shí)序標(biāo)注文件都還沒有產(chǎn)生,那么ISE集成開發(fā)環(huán)境將自動(dòng)開始對(duì)這個(gè)工程進(jìn)行編譯,綜合,翻譯,映射和布局布線等操作,得到布局布線后仿真文件以及時(shí)序標(biāo)注文件,然后再啟動(dòng)ModelSim仿真器進(jìn)行時(shí)序仿真。
3.3  ISE介紹
本節(jié)主要介紹在XILINX的ISE集成軟件環(huán)境中,如何用VHDL和原理圖的方式進(jìn)行設(shè)計(jì)輸入,如何用ModelSim仿真工具對(duì)設(shè)計(jì)進(jìn)行功能仿真和時(shí)序仿真,如何實(shí)現(xiàn)設(shè)計(jì)。
3.3.1  建立項(xiàng)目工程
建立新的項(xiàng)目工程,選擇【File】,再選擇【New Project】,如圖就可以了。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
圖 3-3 ISE建立新工程
選擇使用的可編程器件類型device family-器件族名device-器件型號(hào)package-封裝speed grade-速度top-level module type-頂層文件類型synthesis tool-綜合工具simulator-仿真工具generated simulationlanguage-生成的仿真模型語言。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
圖 3-4 選擇器件
然后一路NEXT,最后點(diǎn)擊完成。剛生成的工程是沒有類型的,需要自己加入。方法是在 sources in project中右擊,選擇add sources,選擇你寫的文件加入即可。如果要新寫程序,用同樣的方法,選擇new sources即可,會(huì)彈出如下對(duì)話框,讓你選擇New Sources的類型。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
圖 3-5 選擇NewSources的類型
選擇vhdl module,寫上文件名,在下一頁可以寫上輸入輸出口,也可以不寫。一路NEXT到完成就可以。這樣就可以開始寫代碼或繼續(xù)下一步綜合了。要打開或編輯新建的文件,直接在sources in project窗口中雙擊該文件即可。
3.3.2  行為仿真
1、在工程項(xiàng)窗口Project Window的源文件中選中計(jì)數(shù)器(counter.vhd)。
2、選擇Project/New Source。
3、在新的對(duì)話框中選擇新文件類型為Test Bench Waveform。
4、鍵入文件名為counter_tbw。
5、點(diǎn)擊Next,在其他工程項(xiàng)中你可以將你的testbench波形與其他源文件關(guān)聯(lián)。
6、一直Next直到Finish,此時(shí)HDL Bencher 程序自動(dòng)啟動(dòng)并等候你輸入所需的時(shí)序需求,你現(xiàn)在可以指定仿真所需的時(shí)間參數(shù)、時(shí)鐘高電平時(shí)間和時(shí)鐘低電平時(shí)間一起定義了設(shè)計(jì)操作必須達(dá)到的時(shí)鐘周期,輸入建立時(shí)間定義了輸入在什么時(shí)候必須有效,輸出有效延時(shí),定義了有效時(shí)鐘沿到達(dá)后多久必須輸出有效數(shù)據(jù)。
默認(rèn)的初始化時(shí)間設(shè)置如下:
時(shí)鐘高電平時(shí)間:  Clock high time: 50 ns 。
時(shí)鐘低電平時(shí)間:  Clock low time: 50 ns 。
輸入建立時(shí)間:   Input setup time: 10 ns 。
輸出有效時(shí)間: Output valid delay: 10 ns 。
7、點(diǎn)擊OK,接受默認(rèn)的時(shí)間設(shè)定。Testbench waveform窗口如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
圖 3-6 Testbench Waveform
在HDL Bencher 的波形中,初始化計(jì)數(shù)器輸入如下:
在每個(gè)單元的藍(lán)色區(qū)域輸入激勵(lì)。
a、在CLK第1周期下點(diǎn)擊RESET單元直到該單元變?yōu)椤?/div>
b、在CLK第2周期下點(diǎn)擊RESET單元直到該單元變?yōu)榈汀?/div>
c、在CLK第3周期下點(diǎn)擊CE單元直到該單元變?yōu)楦摺?/div>
d、在CLK第2周期下點(diǎn)擊DIR單元直到該單元變?yōu)楦摺?/div>
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
圖 3-7 激勵(lì)輸入
e、將你的testbench文件存盤,選擇File/Save Waveform或點(diǎn)擊工具欄的存盤圖標(biāo),接下來HDL Bencher會(huì)提示你設(shè)置你希望仿真的時(shí)鐘周期數(shù)。
f、在End the testbench __cycles after the last input assignment對(duì)話框中輸入8,默認(rèn)值為1。
g、點(diǎn)擊OK.退出HDL Bencher新的testbench波形源文件counter_tbw.tbw自動(dòng)加入到該工程項(xiàng)中。
8、生成預(yù)期的輸出響應(yīng):
我們進(jìn)行行為仿真以驗(yàn)證計(jì)數(shù)器模塊的功能。
a、在Sources in Project窗口中選擇counter_tbw.tbw文件。
b、在Processes for CurrentSource窗口中點(diǎn)擊+ 符號(hào)展開ModelSim仿真器的層次結(jié)構(gòu)找到并雙擊Simulate BehavioralVHDL Model,此時(shí)ModelSim仿真器自動(dòng)啟動(dòng)。
c、對(duì)于第一次運(yùn)行ModelSim的用戶會(huì)顯示一個(gè)對(duì)話框需要在其中做以下處理:選中Do not show thisdialog again選項(xiàng),點(diǎn)擊Run ModelSim此對(duì)話框在你重新安裝或重新配置ModelSim之前將不再顯示你的仿真結(jié)果現(xiàn)在顯示在ModelSim的波形窗口(wave window)。
d、點(diǎn)擊Zoom / Zoom Full;點(diǎn)擊Zoom / Zoom in。
e、拖動(dòng)波形窗口下端的滾動(dòng)條至窗口的最左端。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
圖 3-8 仿真圖
3.3.3  建立頂層原理圖3.3.3.1  生成原理圖符號(hào)
1、在Sources in Project窗口中選中計(jì)數(shù)器模塊counter.vhd。
2、在Processes for CurrentSource窗口中,點(diǎn)擊設(shè)計(jì)輸入實(shí)用程序(Design Entry Utilities)之前的“+”符號(hào)然后雙擊創(chuàng)建原理圖符號(hào)(Create SchematicSymbol)經(jīng)過以上步驟,名稱為“counter”的圖形化元件被放入到工程項(xiàng)庫中。
3.3.3.2  創(chuàng)建頂層原理圖
1、在工程項(xiàng)導(dǎo)航器(Project Navigator)菜單中,選擇Project/New Source。
2、選擇原理圖(Schematic)為源類型。
3、輸入原理圖名為“top”。
4、先點(diǎn)擊“Next”再點(diǎn)擊“Finish”,此時(shí)原理圖編輯器(ECS)自動(dòng)啟動(dòng)并在其原理圖窗口中打開一張空?qǐng)D。
3.3.3.3  例化VHDL模塊
1、在菜單中選擇Add / Symbol或者在工具欄中點(diǎn)擊(Add Symbol)圖標(biāo)。
2、從元件符號(hào)列表(在屏幕右側(cè))中選擇計(jì)數(shù)器counter,注意不要在類別(Categories)窗口中作任何選擇。
3、點(diǎn)擊左鍵可將計(jì)數(shù)器counter放置在光標(biāo)所在的位置出現(xiàn)。
4、按ESC鍵退出添加符號(hào)(Add Symbol)模式。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
圖3-9 例化VHDL模塊
3.3.3.4  原理圖連線
1、首先激活劃線功能通過在菜單中選擇Add/Wire或者在工具欄中點(diǎn)擊 (Add Wire)圖標(biāo)。
2、添加一根懸空線和延展連線,在計(jì)數(shù)器模塊的某一管腳單擊鼠標(biāo),然后將連線拉伸到需要的長度。再在連線端點(diǎn)處雙擊鼠標(biāo),給計(jì)數(shù)器模塊的每一管腳添加連線。
3、添加兩個(gè)元件符號(hào)之間的連線,在一個(gè)計(jì)數(shù)器模塊的管腳處單擊鼠標(biāo),在另一個(gè)計(jì)數(shù)器模塊的對(duì)應(yīng)管腳處雙擊鼠標(biāo)。連接好線后按ESC鍵退出添加連線(Add/Wire)模式。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
圖3-10 原理圖連線
3.3.3.5  添加輸入輸出管腳標(biāo)記
1、在菜單中選擇Add/ (I/O Marker)或在工具欄中點(diǎn)擊(Add I/O Marker)圖標(biāo),連接好的圖如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
圖3-11 添加輸入輸出管腳
2、連接步驟:首先為clock,reset,ce,load,dir1和dir2添加輸入標(biāo)記,同時(shí)為總線din1(3:0)和din2(3:0)添加輸入標(biāo)記。在工具欄右邊的參數(shù)單選框中選擇輸入(Input);將鼠標(biāo)移動(dòng)到輸入信號(hào)線的端點(diǎn),此時(shí)光標(biāo)處顯示出輸入標(biāo)記的圖形;點(diǎn)擊鼠標(biāo)左鍵,輸入標(biāo)記會(huì)將網(wǎng)絡(luò)名或總線名包含在標(biāo)記圖形的內(nèi)部。
3、按如下步驟為count總線添加雙向信號(hào)標(biāo)記。在工具欄右邊的參數(shù)單選框中選擇雙向(Bidirectional);將鼠標(biāo)移動(dòng)到輸出信號(hào)線的端點(diǎn),此時(shí)光標(biāo)處顯示出雙向信號(hào)標(biāo)記的圖形;點(diǎn)擊鼠標(biāo)左鍵。
4、在菜單中選擇File/Save,保存原理圖,退出原理圖編輯器(ECS)。
3.3.4  綜合3.3.4.1  Synthesize綜合
當(dāng)你編寫程序后,并把頂層原理圖連接好以后,就可以綜合了。選中你的頂層文件,雙擊Synthesize-SynplifyPro。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
圖3-12 綜合
如果出現(xiàn)上圖的小勾,表示綜合沒有問題。你可以雙擊View RTL Schematic來查看綜合后的RTL原理圖。
3.3.4.2  定義輸入輸出管腳約束
選中頂層文件,雙擊下圖中的Assign Package Pins,該操作會(huì)提示系統(tǒng)將生成一個(gè).ucf文件,選擇是,系統(tǒng)將自動(dòng)啟動(dòng)Xilinx Pace。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg
圖3-13 分配引腳
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
圖3-14 Xilinx Pace
現(xiàn)在就可以在LOC欄寫上管腳名,定義I/O電平類型,輸出電流大小等,需要注意的是一些I/O是有特殊用處的,不能胡亂分配。定義完后保存退出。
3.3.5  布局布線
雙擊Implement Design,會(huì)依次執(zhí)行Translate,Map,Place&Route。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
圖3-15 設(shè)計(jì)實(shí)現(xiàn)
3.3.6  下載及硬件仿真
選中頂層文件,雙擊運(yùn)行Generate ProgrammingFile,運(yùn)行后生成相應(yīng)的(.Bit)下載文件。該文件將下載到芯片中實(shí)現(xiàn)設(shè)計(jì)。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
圖3-16 生成下載文件
再雙擊上圖Configure Device。運(yùn)行后跳出下載界面,選擇主從下載文式(Slave Serial Mode),點(diǎn)擊完成。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg
圖3-17 下載方式
右鍵點(diǎn)擊元件,點(diǎn)擊Program,選擇相應(yīng)的BIT文件開始下載。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg
圖3-18 下載位文件
成功下載后就可以在FPGA板子上運(yùn)行和測(cè)試了。
第四章  數(shù)字秒表的設(shè)計(jì)與實(shí)現(xiàn)
一、  項(xiàng)目任務(wù)與設(shè)計(jì)思路
1、實(shí)驗(yàn)項(xiàng)目
數(shù)字秒表的設(shè)計(jì)
2、實(shí)驗(yàn)指標(biāo)
晶振輸入信號(hào):50MHZ時(shí)鐘信號(hào)
計(jì)時(shí)范圍范圍為:00:00:00到59:59:99
按鈕開關(guān):start/stop,split/reset
     在秒表已經(jīng)被復(fù)位的情況下,按下start/stop鍵,秒表開始計(jì)時(shí)。在秒表正常運(yùn)行的情況下,如果按下start/stop鍵,則秒表暫停計(jì)時(shí);再次按下該鍵,秒表繼續(xù)計(jì)時(shí)。在秒表正常運(yùn)行情況下,如果按下split/reset鍵,顯示停止在按鍵時(shí)間,但秒表仍然計(jì)時(shí),再次按下該鍵,秒表恢復(fù)正常顯示。在秒表暫停計(jì)時(shí)情況下,按下split/reset鍵,秒表復(fù)位歸零。
顯示工作方式:用六位BCD七段數(shù)碼管顯示讀數(shù)。
3、實(shí)驗(yàn)思路
根據(jù)實(shí)驗(yàn)指標(biāo),將電路設(shè)計(jì)分成6個(gè)模塊:分頻器,計(jì)數(shù)器,鎖存器,掃描顯示控制,按鍵消陡,控制電路
二、  基于VHDL方法的設(shè)計(jì)方案
1、系統(tǒng)需求和解決方案計(jì)劃
在項(xiàng)目開始設(shè)計(jì)時(shí),首先要確定系統(tǒng)的需求并發(fā)展出一個(gè)針對(duì)這些需求的計(jì)劃。
晶振   本設(shè)計(jì)所用為 50MHz的晶振信號(hào)。
分頻器
  對(duì)晶體振蕩器產(chǎn)生的時(shí)鐘信號(hào)進(jìn)行分頻,產(chǎn)生時(shí)間基準(zhǔn)信號(hào)。本設(shè)計(jì)中將50MHz的信號(hào)分頻成1KHz的基準(zhǔn)頻率
計(jì)數(shù)器
  對(duì)時(shí)間基準(zhǔn)脈沖進(jìn)行計(jì)數(shù),完成計(jì)時(shí)功能。本設(shè)計(jì)中采用六進(jìn)制與十進(jìn)制計(jì)數(shù)器級(jí)聯(lián)的形式。
數(shù)據(jù)鎖存器
  鎖存數(shù)據(jù)使顯示保持暫停
控制器
  控制計(jì)數(shù)器的運(yùn)行、停止以及復(fù)位、產(chǎn)生鎖存器的使能信號(hào)。本設(shè)計(jì)中為一個(gè)moore機(jī),可以讓狀態(tài)編碼為相應(yīng)的輸出以方便程序編寫。
掃描顯示的控制電路
    包括掃描計(jì)數(shù)器、數(shù)據(jù)選擇器、3*8譯碼器和7段譯碼器,控制8個(gè)數(shù)碼管
以掃描方式顯示計(jì)時(shí)結(jié)果。本設(shè)計(jì)中一個(gè)八進(jìn)制的計(jì)數(shù)器產(chǎn)生的掃描信號(hào)同時(shí)
完成從鎖存器送來的信號(hào)的選擇以及LED數(shù)碼管的選擇。
按鍵消抖電路
    消除按鍵輸入信號(hào)抖動(dòng)的影響,輸出單脈沖。本設(shè)計(jì)中采用軟件延時(shí)的消抖方法。
2、設(shè)計(jì)方框圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg
四、系統(tǒng)電路設(shè)計(jì)
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg
五、系統(tǒng)單元模塊設(shè)計(jì)
1、分頻器模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity fre_div is
    port(clk_50MHz:instd_logic;
    clk_1KHz:outstd_logic
    );
end fre_div;
architecture Behavioral of fre_div is
    signal counter:std_logic_vector(15downto 0);
   
begin
    process(clk_50MHz)
    begin
       ifrising_edge(clk_50MHz) then
           ifcounter=49999 then
              counter<=(others=>'0');
           else
              counter<=counter+1;
           end if;
       end if;   
    end process;
   
    --clk_1KHz <=counter(15);
    clk_1KHz <='1' when counter=49999 else '0';
end Behavioral;
2、計(jì)數(shù)器模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity jishuqi is
port( count_en:  in std_logic;
       count_clr:  in std_logic;
       clk:          in std_logic;
        D, D0,D1,D3,D4,D6,D7 : outstd_logic_vector(3 downto 0)
       );
end jishuqi;
architecture Behavioral of jishuqi is
    COMPONENTm10jishu
    PORT(
       clk : INstd_logic;
       count_en : INstd_logic;
       count_clr :IN std_logic;         
       carry_out :OUT std_logic;
       data : OUTstd_logic_vector(3 downto 0)
       );
    END COMPONENT;
    COMPONENTm6jishu
    PORT(
       clk : INstd_logic;
       count_en : INstd_logic;
       count_clr :IN std_logic;         
       carry_out :OUT std_logic;
       data : OUTstd_logic_vector(3 downto 0)
       );
    END COMPONENT;
signal c0,c1,c2,c3,c4,c5 : std_logic;  
begin
    Inst_m10jishu0:m10jishu PORT MAP(
       clk =>clk,
       count_en=> count_en,
       count_clr=> count_clr,
       carry_out=> c0,
       data => D
    );
      
    Inst_m10jishu1:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c0,
       count_clr=> count_clr,
       carry_out=> c1,
       data => D0
    );
      
    Inst_m10jishu2:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c1,
       count_clr=> count_clr,
       carry_out=> c2,
       data => D1
    );
      
    Inst_m10jishu3:m10jishu PORT MAP(
       clk => clk,
       count_en=> c2,
       count_clr=> count_clr,
       carry_out=> c3,
       data => D3
    );
      
    Inst_m6jishu1:m6jishu PORT MAP(
       clk =>clk,
       count_en=> c3,
       count_clr=> count_clr,
       carry_out=> c4,
       data => D4
    );
      
    Inst_m10jishu4:m10jishu PORT MAP(
       clk =>clk,
       count_en=> c4,
       count_clr=> count_clr,
       carry_out=> c5,
       data => D6
    );
      
    Inst_m6jishu2:m6jishu PORT MAP(
       clk =>clk,
       count_en=> c5,
       count_clr=> count_clr,
       carry_out=> open,
       data => D7
    );
end Behavioral;
2.1模十計(jì)數(shù)器模塊:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entity m10jishu is
port(clk:       in std_logic;
     count_en: in std_logic;
      count_clr: in std_logic;
      carry_out: out std_logic;
      data:      out std_logic_vector(3 downto 0)
    );
end m10jishu;
architecture Behavioral ofm10jishu is
signal c_state,n_state:std_logic_vector(3 downto 0):="0000";
begin
label_1:process(count_en,c_state)
  begin
    if count_en ='1'  then
       ifc_state="1001" then
         n_state<="0000";
       --carry_out <= '1' ;
       else n_state<=c_state+1;
         -- carry_out <='0';
       end if;
    else n_state<=c_state;
    end if;
   
  end process;
label_2:process(clk,count_clr)
begin
  if count_clr='1' then
     c_state<="0000";
  elsif rising_edge(clk) then
     c_state<=n_state;
    end if;
end process;
carry_out <= '1'  when c_state="1001" andcount_en='1' else '0';
data <= c_state;
end Behavioral;
2.2模六計(jì)數(shù)器:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity m6jishu is
port(clk:       in std_logic;
     count_en:  in std_logic;
     count_clr: in std_logic;
     carry_out: out std_logic;
     data:      out std_logic_vector(3downto 0)
    );
end m6jishu;
architecture Behavioral of m6jishu is
signal c_state,n_state: std_logic_vector(3 downto 0):="0000";
begin
label_1:process(count_en,c_state)
  begin
    if count_en='1'  then
      if c_state="0101" then
            n_state <= "0000";
           -- carry_out <= '1';
        else n_state<=c_state+1;
           --carry_out <= '0';
       end if;
    else n_state<=c_state;
    end if;
  end process;
label_2:process(clk,count_clr)
begin
  if count_clr='1' then
     c_state<="0000";
  elsif rising_edge(clk) then
     c_state<=n_state;
    end if;
    end process;
   
carry_out <= '1'  whenc_state="0101" and count_en='1' else '0';
data <= c_state;
end Behavioral;
3、掃描顯示控制電路
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity smxs_control is
port( clk_1KHz : in std_logic;
       Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7: in std_logic_vector(3 downto 0);  
       DIG: out std_logic_vector(7 downto 0);
       SEG: out std_logic_vector(6 downto 0)
       );
end smxs_control;
architecture Behavioral of smxs_control is
    COMPONENTsaomiaojishu
    PORT(
       clk: IN std_logic;         
       data: OUT std_logic_vector(2 downto 0)
       );
    ENDCOMPONENT;
   
    COMPONENTyima38
    PORT(
       S: IN std_logic_vector(2 downto 0);         
       DIG: OUT std_logic_vector(7 downto 0)
       );
    ENDCOMPONENT;
    COMPONENTdselect
    PORT(
       Q0: IN std_logic_vector(3 downto 0);
       Q1: IN std_logic_vector(3 downto 0);
       Q2: IN std_logic_vector(3 downto 0);
       Q3: IN std_logic_vector(3 downto 0);
       Q4: IN std_logic_vector(3 downto 0);
       Q5: IN std_logic_vector(3 downto 0);
       Q6: IN std_logic_vector(3 downto 0);
       Q7: IN std_logic_vector(3 downto 0);
       S: IN std_logic_vector(2 downto 0);         
       BCD: OUT std_logic_vector(3 downto 0)
       );
    ENDCOMPONENT;
    COMPONENTyima7
    PORT(
       BCD: IN std_logic_vector(3 downto 0);         
       SEG: OUT std_logic_vector(6 downto 0)
       );
    ENDCOMPONENT;
   
signal s :        std_logic_vector(2downto 0);
signal bcd :   std_logic_vector(3 downto 0);         
begin
    Inst_saomiaojishu:saomiaojishu PORT MAP(
       clk=> clk_1KHz,
       data=> s
    );
    Inst_yima38:yima38 PORT MAP(
       S=> s,
       DIG=> DIG
    );
   
    Inst_dselect:dselect PORT MAP(
       Q0=> Q0,
       Q1=> Q1,
       Q2=> Q2,
       Q3=> Q3,
       Q4=> Q4,
       Q5=> Q5,
       Q6=> Q6,
       Q7=> Q7,
       S=> s,
       BCD=> bcd
    );
    Inst_yima7:yima7 PORT MAP(
       BCD=> bcd,
       SEG=> SEG
    );
end Behavioral;
3.1掃描計(jì)數(shù)模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entity saomiaojishu is
port(clk:       in std_logic;
      data:      out std_logic_vector(2 downto 0)
    );
end saomiaojishu;
architecture Behavioral ofsaomiaojishu is
    signal c_state,n_state: std_logic_vector(2 downto0):="000";
begin
label_1:process(c_state)
begin
   if c_state="111" then
       n_state <= "000";
    else n_state<=c_state+1;
    end if;
end process;
label_2:process(clk)
begin
    if rising_edge(clk) then
       c_state<=n_state;
    end if;
end process;
data <= c_state;
end Behavioral;
3.2數(shù)據(jù)選擇模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitydselect is
port(Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7 : instd_logic_vector(3 downto 0);
       S : in std_logic_vector(2 downto 0) ;
       BCD : out std_logic_vector(3 downto0)  
       );
enddselect;
architectureBehavioral of dselect is
begin
process(Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7,S)
    begin
       if S = "000" then
       BCD <= Q0;
       elsif S = "001" then
       BCD <= Q1;
       elsif S = "010" then
       BCD <= Q2;
       elsif S = "011" then
       BCD <= Q3;
       elsif S = "100" then
       BCD <= Q4;
       elsif S = "101" then
       BCD <= Q5;
       elsif S = "110" then
       BCD <= Q6;
       elsif S = "111" then
       BCD <= Q7;
       else BCD <= "0000";
       end if;
endprocess;
endBehavioral;
3.33*8譯碼模塊         
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
        
entityyima38 is
  port( S:in std_logic_vector(2 downto 0) ;
        DIG:out std_logic_vector(7 downto 0)
        );
endyima38;
architectureBehavioral of yima38 is
begin
   WITH S SELECT
   DIG <= "11111110" when"000",
        "11111101" when "001",
        "11111011" when "010",
        "11110111" when "011",
        "11101111" when "100",
        "11011111" when "101",
        "10111111" when "110",
        "01111111" when "111",
        "11111111" when others;
endBehavioral;
3.4、七段譯碼器模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
entity yima7 is
port( BCD : in std_logic_vector(3 downto0);
       SEG: out std_logic_vector(6 downto 0)   
       );
end yima7;
architecture Behavioral of yima7 is
begin
    process(BCD)
    begin
    caseBCD is      
       when "0000"  => SEG <= "0000001";
       when"0001" => SEG <= "1001111" ;
       when"0010" => SEG <= "0010010" ;
       when"0011" => SEG <= "0000110" ;
       when"0100" => SEG <= "1001100" ;
       when"0101" => SEG <= "0100100" ;
       when"0110" => SEG <= "0100000" ;
       when"0111" => SEG <= "0001111" ;
       when"1000" => SEG <= "0000000" ;
       when"1001" => SEG <= "0000100" ;      
       when"1111" => SEG <= "1111110" ;      
       whenothers => SEG <= "1111111" ;
    endcase;
    endprocess;
end Behavioral;
4、按鍵消抖模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image066.jpg
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;-- Uncomment the followinglibrary declaration if using
entity key_debounce is
    Port ( clk :in  STD_LOGIC;
           key_in :in  STD_LOGIC;
           key_out :out  STD_LOGIC);
end key_debounce;
architecture Behavioral of key_debounce is
  signal k1,k2 :STD_LOGIC;
  signal cnt   : STD_LOGIC_VECTOR(1 downto 0);
  
begin
   process(clk,key_in)
  begin
      if clk'event andclk = '0' then
       if cnt = 3 then
           k1 <='1';
        else
          k1 <= '0';
          cnt <= cnt+ 1;  
        end if;
          k2 <= k1;
     end if;      
      if key_in = '0'then
         cnt <="00";  
      end if;
   end process;
   key_out <= not k1and k2;  
end Behavioral;
4、鎖存器模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image068.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitylatch is
port( D0,D1,D2,D3,D4,D5,D6,D7: in std_logic_vector(3 downto 0);
      latch_en : in std_logic;
      Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7 : outstd_logic_vector(3 downto 0)      
   );
endlatch;
architectureBehavioral of latch is
begin
lable:process(D0,D1,D2,D3,D4,D5,D6,D7,latch_en)
  begin
    if latch_en = '1' then
       Q0<= D0;
        Q1<= D1;
       Q2<= D2;
       Q3<= D3;
       Q4<= D4;
       Q5<= D5;
       Q6<= D6;
       Q7<= D7;
    endif;
   end process;     
endBehavioral;
5、控制電路模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image070.jpg
libraryIEEE;
use IEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitycontrol is
port(clk : in std_logic;
    start : in std_logic;
      reset : in std_logic;
      count_clr : out std_logic;
      count_en : out std_logic;
    latch_en : out std_logic
    );
endcontrol;
architectureBehavioral of control is
signalsr: std_logic_vector(1 downto 0);
signalccl:std_logic_vector(2 downto 0):="111";
signalccl_out : std_logic_vector(2 downto 0) ;
begin
sr<= start & reset;
lable_1:process(sr,ccl)
   begin
    case ccl is
        when "111" =>        
           if sr="10" then ccl_out <= "011";
           else ccl_out <= "111";
           end if;
        when "011" =>
           if sr="01" then ccl_out <= "010";
           elsif sr="10" then ccl_out <= "001";
           else ccl_out <= "011";
           end if;
        when "001" =>
           if sr="01" then ccl_out <= "111";
           elsif sr="10" then ccl_out <= "011";
           else ccl_out <= "001";
           end if;
        when "010" =>
           if sr="01" then ccl_out <= "011";
           else ccl_out <= "010";
           end if;   
        when others => ccl_out <="111";
    end case;
end process;
  lable_2: process(clk)
begin      
        if rising_edge(clk) then
          ccl <= ccl_out;
        end if;   
end process;
count_clr<= ccl(2);
count_en  <= ccl(1);
latch_en  <= ccl(0);  
endBehavioral;
6、數(shù)字秒表頂層連接模塊
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image071.jpg
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_unsigned.ALL;
entitymiaobiao_top is
port(key1,key2 : in std_logic;
     clk_50MHz : in std_logic;
     DIG : out std_logic_vector(7 downto 0);
     SEG : out std_logic_vector(6 downto 0)
     );
end miaobiao_top;
architectureBehavioral of miaobiao_top is
signalk1,k2,CLK,clr,cen,len : std_logic;
signaldd0,dd1,dd3,dd4,dd6,dd7 : std_logic_vector(3 downto 0);
signalqq1,qq2,qq3,qq4,qq5,qq6,qq7,qq0 : std_logic_vector(3 downto 0);
COMPONENT key_debounce1
PORT(
     clk : IN std_logic;
     key_in : IN std_logic;         
     key_out : OUT std_logic
     );
END COMPONENT;
COMPONENT key_debounce
PORT(
     clk : IN std_logic;
     key_in : IN std_logic;         
     key_out : OUT std_logic
     );
END COMPONENT;
COMPONENT control
PORT(
     clk : IN std_logic;
     start : IN std_logic;
     reset : IN std_logic;         
     count_clr : OUT std_logic;
     count_en : OUT std_logic;
     latch_en : OUT std_logic
     );
END COMPONENT;
COMPONENT fre_div
PORT(
     clk_50MHz : IN std_logic;         
     clk_1KHz : OUT std_logic
     );
END COMPONENT;
COMPONENT jishuqi
PORT(
     count_en : IN std_logic;
     count_clr : IN std_logic;
     clk : IN std_logic;         
     D : OUT std_logic_vector(3 downto 0);
     D0 : OUT std_logic_vector(3 downto 0);
     D1 : OUT std_logic_vector(3 downto 0);
     D3 : OUT std_logic_vector(3 downto 0);
     D4 : OUT std_logic_vector(3 downto 0);
     D6 : OUT std_logic_vector(3 downto 0);
     D7 : OUT std_logic_vector(3 downto 0)
     );
END COMPONENT;
COMPONENT latch
PORT(
     D0 :IN std_logic_vector(3 downto 0);
     D1 : IN std_logic_vector(3 downto 0);
     D2 : IN std_logic_vector(3 downto 0);
     D3 : IN std_logic_vector(3 downto 0);
     D4 : IN std_logic_vector(3 downto 0);
     D5 : IN std_logic_vector(3 downto 0);
     D6 : IN std_logic_vector(3 downto 0);
     D7 : IN std_logic_vector(3 downto 0);
     latch_en : IN std_logic;         
     Q0 : OUT std_logic_vector(3 downto 0);
     Q1 : OUT std_logic_vector(3 downto 0);
     Q2 : OUT std_logic_vector(3 downto 0);
     Q3 : OUT std_logic_vector(3 downto 0);
     Q4 : OUT std_logic_vector(3 downto 0);
     Q5 : OUT std_logic_vector(3 downto 0);
     Q6 : OUT std_logic_vector(3 downto 0);
     Q7 : OUT std_logic_vector(3 downto 0)
     );
END COMPONENT;
COMPONENT smxs_control
PORT(
     clk_1KHz : IN std_logic;
     Q0 : IN std_logic_vector(3 downto 0);
     Q1 : IN std_logic_vector(3 downto 0);
     Q2 : IN std_logic_vector(3 downto 0);
     Q3 : IN std_logic_vector(3 downto 0);
     Q4 : IN std_logic_vector(3 downto 0);
     Q5 : IN std_logic_vector(3 downto 0);
     Q6 : IN std_logic_vector(3 downto 0);
     Q7 : IN std_logic_vector(3 downto 0);         
     DIG : OUT std_logic_vector(7 downto 0);
     SEG : OUT std_logic_vector(6 downto 0)
     );
END COMPONENT;
begin
Inst_key_debounce1: key_debounce PORT MAP(
     clk => CLK,
     key_in => key1,
     key_out=> k1
);
Inst_key_debounce2: key_debounce PORT MAP(
     clk => CLK,
     key_in => key2,
     key_out => k2
);
Inst_control: control PORT MAP(
     clk => CLK ,
     start => k1,
     reset => k2,
     count_clr => clr,
     count_en => cen,
     latch_en => len
);
     Inst_fre_div: fre_div PORT MAP(
     clk_50MHz => clk_50MHz,
     clk_1KHz => CLK
);
Inst_jishuqi: jishuqi PORT MAP(
     count_en => cen,
     count_clr => clr,
     clk => CLK,
     D => open,
     D0 => dd0,
     D1 => dd1,
     D3 => dd3,
     D4 => dd4,
     D6 => dd6,
     D7 => dd7
);
     Inst_latch: latch PORT MAP(
     D0 => dd0,
     D1 => dd1,
     D2 => "1111",
     D3 => dd3,
     D4 => dd4,
     D5 => "1111",
     D6 => dd6,
     D7 => dd7,
     latch_en => len,
     Q0 => qq0,
     Q1 => qq1,
     Q2 => qq2,
     Q3 => qq3,
     Q4 => qq4,
     Q5 => qq5,
     Q6 => qq6,
     Q7 => qq7
);
Inst_smxs_control: smxs_control PORT MAP(
     clk_1KHz => CLK,
     Q0 => qq0,
     Q1 => qq1,
     Q2 => qq2,
     Q3 => qq3,
     Q4 => qq4,
     Q5 => qq5,
     Q6 => qq6,
     Q7 => qq7,
     DIG => DIG,
     SEG => SEG
);
endBehavioral;
三、  系統(tǒng)硬件實(shí)現(xiàn)與調(diào)試
管腳分配:
NET "DIG[0]" LOC =P81;
NET "DIG[1]" LOC =P85;
NET "DIG[2]" LOC =P83;
NET "DIG[3]" LOC =P82;
NET "DIG[4]" LOC =P43;
NET "DIG[5]" LOC =P74;
NET "DIG[6]" LOC =P59;
NET "DIG[7]" LOC =P51;
NET "clk_50MHz" LOC= P128;
NET "key1" LOC =P47;
NET "key2" LOC = P48;
NET "SEG[0]" LOC =P53;
NET "SEG[1]" LOC =P54;
NET "SEG[2]" LOC =P77;
NET "SEG[3]" LOC =P76;
NET "SEG[4]" LOC =P58;
NET "SEG[5]" LOC =P75;
NET "SEG[6]" LOC =P52;
第五章  實(shí)驗(yàn)總結(jié)及心得體會(huì)
1、這次實(shí)驗(yàn)是利用VHDL語言完成基于FPGA的數(shù)字秒表的設(shè)計(jì)與實(shí)現(xiàn)。通過實(shí)驗(yàn)掌握了設(shè)計(jì)方案以及各模塊的設(shè)計(jì)過程及其實(shí)現(xiàn)的功能,及對(duì)設(shè)計(jì)中遇到的問題分析和解決方法;學(xué)會(huì)了利用ISE和ModelSim對(duì)設(shè)計(jì)進(jìn)行了仿真,分析,綜合還熟悉了Xilinx ISE 和ModelSim軟件的用法和VHDL 的編程環(huán)境,,并最終下載到Spartan3E系列芯片中,實(shí)現(xiàn)了對(duì)數(shù)字秒表的測(cè)量。
2、通過《電子技術(shù)綜合實(shí)驗(yàn)》課程的學(xué)習(xí),我第一次接觸到VHDL語言,并學(xué)會(huì)了用VHDL語言設(shè)計(jì)簡(jiǎn)單的電路模塊。使我對(duì)系統(tǒng)設(shè)計(jì)原理、主要性能參數(shù)的選擇原則、單元電路和系統(tǒng)電路設(shè)計(jì)方法及仿真技術(shù)、測(cè)試方案擬定及調(diào)測(cè)技術(shù)有了初步了解;初步掌握電子技術(shù)中應(yīng)用開發(fā)的一般流程,初步建立起有關(guān)系統(tǒng)設(shè)計(jì)的基本概念,掌握其基本設(shè)計(jì)方法,為將來走出校園從事電子技術(shù)應(yīng)用和研究工作打下基礎(chǔ)

FPGA秒表實(shí)驗(yàn)報(bào)告.docx

1.63 MB, 下載次數(shù): 3

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 男人天堂av网站 | 欧美日韩一区精品 | 欧美性猛交一区二区三区精品 | 欧美自拍另类 | 亚洲国产精品久久久久 | 欧美在线a | 国产精品美女久久久久久久久久久 | 美女久久 | 曰批视频在线观看 | 亚洲精品久久久9婷婷中文字幕 | 黄色网址大全在线观看 | 天天插天天狠天天透 | 91精品国产美女在线观看 | 国产一区二区三区四区五区加勒比 | 中文字幕在线一区 | 成人黄色网址大全 | 午夜不卡福利视频 | 国产精品久久久久久 | 亚洲免费在线观看视频 | 亚洲国产精品久久 | 日韩2020狼一二三 | 午夜视频一区二区 | 成人精品系列 | 美国十次成人欧美色导视频 | 全免费a级毛片免费看视频免 | 黑人巨大精品欧美黑白配亚洲 | 中文字幕在线观看成人 | 国产一级视频在线 | 国产精品日日摸夜夜添夜夜av | 日韩av一区二区在线观看 | 亚洲一区中文字幕 | 国产精品九九视频 | 久久久九九 | 精品国产31久久久久久 | 中文字幕亚洲精品 | 99精品视频在线观看 | 国产高清免费 | 中文字幕av亚洲精品一部二部 | 日韩精品免费在线观看 | 久久99深爱久久99精品 | 一本一道久久a久久精品综合 |