欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: VHDL語(yǔ)言數(shù)字式頻率計(jì)的設(shè)計(jì)過(guò)程,源代碼,和仿真圖型(Word文檔) [打印本頁(yè)]

作者: 童言無(wú)忌    時(shí)間: 2019-1-22 16:16
標(biāo)題: VHDL語(yǔ)言數(shù)字式頻率計(jì)的設(shè)計(jì)過(guò)程,源代碼,和仿真圖型(Word文檔)
本文介紹了使用VHDL開(kāi)發(fā)FPGA的一般流程,重點(diǎn)介紹了頻率計(jì)的基本原理和相應(yīng)的測(cè)量方案,最終采用了一種基于FPGA的數(shù)字頻率的實(shí)現(xiàn)方法。該設(shè)計(jì)采用硬件描述語(yǔ)言VHDL,在軟件開(kāi)發(fā)平臺(tái)ISE上完成,可以在較高速時(shí)鐘頻率(100MHz)下正常工作。該設(shè)計(jì)的頻率計(jì)能準(zhǔn)確的測(cè)量頻率在1Hz到100MHz之間的信號(hào)。使用ModelSim仿真軟件對(duì)VHDL程序做了仿真,并完成了綜合布局布線,最終下載到芯片Spartan-II上取得良好測(cè)試效果。


原理框圖
測(cè)試結(jié)果
參考文獻(xiàn)
計(jì)數(shù)器級(jí)聯(lián)程序
鎖存器源程序
頂層原理圖
計(jì)數(shù)器的級(jí)聯(lián)圖
外文資料原文
翻譯文稿

第一章  引言

第二章  基于FPGA的VHDL設(shè)計(jì)流程

2.1  概述
2.2  VHDL語(yǔ)言介紹
2.2.1  VHDL的特點(diǎn)
2.2.2  基于VHDL的自頂向下設(shè)計(jì)方法
2.3  FPGA開(kāi)發(fā)介紹
2.3.1  FPGA簡(jiǎn)介
2.3.2  FPGA設(shè)計(jì)流程
2.3.3  Spartan-II芯片簡(jiǎn)介
第三章  數(shù)字頻率計(jì)的軟件開(kāi)發(fā)環(huán)境

3.1  開(kāi)發(fā)環(huán)境
3.2  ModelSim介紹
3.2.1  ISE環(huán)境中ModelSim的使用
3.3  ISE介紹
3.3.1  建立項(xiàng)目工程
3.3.2  行為仿真
3.3.3  建立頂層原理圖
3.3.4  綜合
3.3.5  布局布線
3.3.6  下載及硬件仿真
第四章  數(shù)字頻率計(jì)的設(shè)計(jì)與實(shí)現(xiàn)

4.1  任務(wù)要求
4.2  測(cè)量原理
4.2.1  頻率或時(shí)間的原始基準(zhǔn)
4.2.2  電子計(jì)數(shù)器測(cè)頻方法
4.2.3  誤差分析
4.2.4  測(cè)量周期的必要性和基本原理
4.2.5  等精度測(cè)量
4.3  原理框圖
4.4  各模塊的功能及實(shí)現(xiàn)
4.4.1  分頻器
4.4.2  閘門(mén)選擇器
4.4.3  測(cè)頻控制器
4.4.4  頻率計(jì)數(shù)器
4.4.5  鎖存器
4.4.6  掃描顯示控制譯碼系統(tǒng)
4.5  頂層原理圖
4.6  分配引腳和下載實(shí)現(xiàn)
4.7  測(cè)試結(jié)果
第五章  結(jié)論

參考文獻(xiàn)

致  謝

附  錄

附錄1.  計(jì)數(shù)器級(jí)聯(lián)程序
附錄2.  鎖存器源程序
附錄3.  頂層原理圖
附錄4.  計(jì)數(shù)器的級(jí)聯(lián)圖
外文資料原文

翻譯文稿


在電子技術(shù)領(lǐng)域內(nèi),頻率是一個(gè)最基本的參數(shù),頻率與其它許多電參量的測(cè)量方案、測(cè)量結(jié)果都有十分密切的關(guān)系。如時(shí)間,速度等都涉及到或本身可轉(zhuǎn)化為頻率的測(cè)量。因此,頻率的測(cè)量就顯得更為重要。而且,目前在電子測(cè)量中,頻率的測(cè)量精確度是最高的.現(xiàn)在市場(chǎng)上有各種多功能,高精度,高頻率的數(shù)字頻率計(jì),但價(jià)格不菲。而在實(shí)際工程中,不是對(duì)所有信號(hào)的頻率測(cè)量都要求達(dá)到非常高的精度。因此,本文提出了一種能滿足一般測(cè)量精度要求,但成本低廉的數(shù)字頻率計(jì)的設(shè)計(jì)方案。
本文主要任務(wù)是針對(duì)設(shè)計(jì)的要求,基于FPGA利用硬件描述語(yǔ)言VHDL完成數(shù)字頻率計(jì)的設(shè)計(jì),通過(guò)仿真,分析,綜合并最終下載到FPGA里面去實(shí)現(xiàn)。除被測(cè)信號(hào)的整形部分、鍵輸入部分以外,其余全部在一片F(xiàn)PGA芯片上實(shí)現(xiàn),整個(gè)系統(tǒng)非常精簡(jiǎn),而且具有靈活的現(xiàn)場(chǎng)可更改性。在不更改硬件電路的基礎(chǔ)上,對(duì)系統(tǒng)進(jìn)行各種改進(jìn)還可以進(jìn)一步提高系統(tǒng)的性能。該數(shù)字頻率計(jì)具有高速、精確、可靠、抗干擾性強(qiáng)和現(xiàn)場(chǎng)可編程等優(yōu)點(diǎn)。經(jīng)實(shí)驗(yàn)表明,其測(cè)量精度基本能達(dá)到,且系統(tǒng)成本非常低廉,可作為學(xué)生數(shù)字邏輯設(shè)計(jì)綜合實(shí)驗(yàn)或自制數(shù)字頻率計(jì)的備選方案。

第二章  基于FPGA的VHDL設(shè)計(jì)流程2.1  概述
數(shù)字頻率計(jì)是數(shù)字電路中的一個(gè)典型應(yīng)用,實(shí)際的硬件設(shè)計(jì)用到的器件較多,連線比較復(fù)雜,而且會(huì)產(chǎn)生比較大的延時(shí),造成測(cè)量誤差、可靠性差。頻率計(jì)的設(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,縮寫(xiě)為EDA。在EDA設(shè)計(jì)工具中,用的最廣泛的是VHDL和VERILOG,當(dāng)然還有其它的。比較VHDL和VERILOG,在頂層設(shè)計(jì)方面VHDL優(yōu)于VERILOG,在門(mén)級(jí)電路設(shè)計(jì)方面VERILOG優(yōu)于VHDL。隨著復(fù)雜可編程邏輯器件(CPLD)的廣泛應(yīng)用,以EDA工具作為開(kāi)發(fā)手段,運(yùn)用VHDL語(yǔ)言,將使整個(gè)系統(tǒng)大大簡(jiǎn)化,提高整體的性能和可靠性。本次的頻率計(jì)設(shè)計(jì)主要是頂層設(shè)計(jì),目的是設(shè)計(jì)6位十進(jìn)制頻率計(jì),學(xué)習(xí)常用的數(shù)字系統(tǒng)設(shè)計(jì)方法。采用VDHL編程設(shè)計(jì)實(shí)現(xiàn)的數(shù)字頻率計(jì),除被測(cè)信號(hào)的整形部分、鍵輸入部分以外,其余全部在一片F(xiàn)PGA芯片上實(shí)現(xiàn),整個(gè)系統(tǒng)非常精簡(jiǎn),而且具有靈活的現(xiàn)場(chǎng)可更改性。在不更改硬件電路的基礎(chǔ)上,對(duì)系統(tǒng)進(jìn)行各種改進(jìn)還可以進(jìn)一步提高系統(tǒng)的性能。該數(shù)字頻率計(jì)具有高速、精確、可靠、抗干擾性強(qiáng)和現(xiàn)場(chǎng)可編程等優(yōu)點(diǎn)。
2.2  VHDL語(yǔ)言介紹
VHDL(Very-high-speed Integrated Circuit Hardware Description Language)誕生于1982年。1987年底,VHDL被IEEE(The Institute of Electrical and Electronics Engineers)和美國(guó)國(guó)防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語(yǔ)言。自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)硬件描述語(yǔ)言。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)硬件描述語(yǔ)言,又得到眾多EDA公司的支持,在電子工程領(lǐng)域,已成為事實(shí)上的通用硬件描述語(yǔ)言。有專家認(rèn)為,在新的世紀(jì)中,VHDL和VERILOG語(yǔ)言將承擔(dān)起­­幾乎全部的數(shù)字系統(tǒng)設(shè)計(jì)任務(wù)。
2.2.1  VHDL的特點(diǎn)
VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu)、行為、功能和接口。除了含有許多具有硬件特征的語(yǔ)句外,VHDL的語(yǔ)言形式,描述風(fēng)格以及句法十分類似于一般的計(jì)算機(jī)高級(jí)語(yǔ)言。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)部開(kā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、與其它的硬件描述語(yǔ)言相比,VHDL具有更強(qiáng)的行為描述能力,從而決定了它成為系統(tǒng)設(shè)計(jì)領(lǐng)域最佳的硬件描述語(yǔ)言。強(qiáng)大的行為描述能力是避開(kāi)具體的器件結(jié)構(gòu),從邏輯行為上描述和設(shè)計(jì)大規(guī)模電子系統(tǒng)的重要保證。就目前流行的EDA工具和VHDL綜合器而言,將基于抽象的行為描述風(fēng)格的VHDL程序綜合成為具體的FPGA和CPLD等目標(biāo)器件的網(wǎng)表文件已不成問(wèn)題,只是在綜合與優(yōu)化效率上略有差異。
2、VHDL最初是作為一種仿真標(biāo)準(zhǔn)格式出現(xiàn)的,因此VHDL既是一種硬件電路描述和設(shè)計(jì)語(yǔ)言,也是一種標(biāo)準(zhǔn)的網(wǎng)表格式,還是一種仿真語(yǔ)言。其豐富的仿真語(yǔ)句和庫(kù)函數(shù),使得在任何大系統(tǒng)的設(shè)計(jì)早期(即尚未完成),就能用于查驗(yàn)設(shè)計(jì)系統(tǒng)的功能可行性,隨時(shí)可對(duì)設(shè)計(jì)進(jìn)行仿真模擬。即在遠(yuǎn)離門(mén)級(jí)的高層次上進(jìn)行模擬,使設(shè)計(jì)者對(duì)整個(gè)工程設(shè)計(jì)的結(jié)構(gòu)和功能的可行性做出決策。
3、VHDL語(yǔ)句的行為描述能力和程序結(jié)構(gòu)決定了它具有支持大規(guī)模設(shè)計(jì)的分解和已有設(shè)計(jì)的再利用功能,符合市場(chǎng)所需求的,大規(guī)模系統(tǒng)高效、高速的完成必須由多人甚至多個(gè)開(kāi)發(fā)組共同并行工作才能實(shí)現(xiàn)的特點(diǎn)。VHDL中設(shè)計(jì)實(shí)體的概念、程序包的概念、設(shè)計(jì)庫(kù)的概念為設(shè)計(jì)的分解和并行工作提供了有力的支持。
4、對(duì)于用VHDL完成的一個(gè)確定的設(shè)計(jì),可以利用EDA工具進(jìn)行邏輯綜合和優(yōu)化,并自動(dòng)地把VHDL描述設(shè)計(jì)轉(zhuǎn)變成為門(mén)級(jí)網(wǎng)表。這種方式突破了門(mén)級(jí)電路設(shè)計(jì)的瓶頸,極大地減少了電路設(shè)計(jì)的時(shí)間和可能發(fā)生的錯(cuò)誤,降低了開(kāi)發(fā)成本。應(yīng)用EDA工具的邏輯優(yōu)化功能,可以自動(dòng)地把一個(gè)綜合后的設(shè)計(jì)變成一個(gè)更高效、更高速的電路系統(tǒng)。反過(guò)來(lái),設(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)無(wú)關(guān),VHDL設(shè)計(jì)程序的硬件實(shí)現(xiàn)目標(biāo)器件有廣闊的選擇范圍,其中包括各系列的CPLD、FPGA及各種門(mén)陣列實(shí)現(xiàn)目標(biāo)。
6、由于VHDL具有類屬描述語(yǔ)句和子程序調(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ì)說(shuō)明:用自然語(yǔ)言表達(dá)系統(tǒng)項(xiàng)目的功能特點(diǎn)和技術(shù)參數(shù)等。
2、建立VHDL行為模型,即將設(shè)計(jì)說(shuō)明已轉(zhuǎn)化為VHDL行為模型。建立模型是為了通過(guò)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)化的門(mén)級(jí)電路。
7、測(cè)試向量生成。
8、功能仿真。
9、結(jié)構(gòu)綜合。
10、門(mén)級(jí)時(shí)序仿真。
11、硬件測(cè)試。
2.2.2.2  Top-down設(shè)計(jì)方法的優(yōu)點(diǎn)
1、完全符合設(shè)計(jì)人員的設(shè)計(jì)思路;從功能描述開(kāi)始,到最后的物理實(shí)現(xiàn)。
2、功能設(shè)計(jì)可完全獨(dú)立于物理實(shí)現(xiàn);采用Top-Down設(shè)計(jì)方法,功能輸入采用國(guó)際標(biāo)準(zhǔn)的HDL輸入方法,HDL可不含有任何器件的物理信息,因此工程師可以有更多的空間去集中精力進(jìn)行功能描述。設(shè)計(jì)師可以在設(shè)計(jì)過(guò)程的最后階段任意選擇或更改物理器件,不會(huì)在設(shè)計(jì)一開(kāi)始就受到最終所采用器件的約束。
3、設(shè)計(jì)可再利用;設(shè)計(jì)結(jié)果完全可以以一種知識(shí)產(chǎn)權(quán)(IP-Intellectual Property)的方式作為設(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ī)模(門(mén)消耗)和速度(時(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開(kāi)發(fā)介紹2.3.1  FPGA簡(jiǎn)介
現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)器件是八十年代中期出現(xiàn)的新產(chǎn)品,它的應(yīng)用大大地方便了IC的設(shè)計(jì),因而隨著數(shù)字技術(shù)日益廣泛的應(yīng)用,以FPGA為代表的ASIC器件得到了迅速的普及和發(fā)展,器件集成度和速度都在高速增長(zhǎng)。
傳統(tǒng)的電路設(shè)計(jì)過(guò)程是:先畫(huà)原理圖、把原理圖繪制成印制電路板圖、再制版、安裝、調(diào)試。有了FPGA,我們只需要在計(jì)算機(jī)上繪出原理圖,再運(yùn)行相應(yīng)的軟件,就可把所設(shè)計(jì)的邏輯電路在FPGA中實(shí)現(xiàn)。所有步驟均可自動(dòng)完成。電子設(shè)計(jì)工程師自己設(shè)計(jì)專用集成電路成為了一件很容易的事情。
FPGA作為專用集成電路(ASIC)概念上的一個(gè)新型范疇和門(mén)類,以其高度靈活的用戶現(xiàn)場(chǎng)編程方式,現(xiàn)場(chǎng)定義高容量數(shù)字單片系統(tǒng)的能力,能夠重復(fù)定義、反復(fù)改寫(xiě)的新穎功能,為復(fù)雜數(shù)字系統(tǒng)設(shè)計(jì)、研制以及產(chǎn)品開(kāi)發(fā)提供了有效的技術(shù)手段。電子應(yīng)用設(shè)計(jì)工程師應(yīng)用FPGA技術(shù)不僅可避免通常ASIC單片系統(tǒng)設(shè)計(jì)周期長(zhǎng),前期投資風(fēng)險(xiǎn)大的弱點(diǎn),而且克服了過(guò)去板級(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)具體說(shuō)明如下。
圖 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ì)的源文件由語(yǔ)言轉(zhuǎn)換為實(shí)際的電路。但是此時(shí)還沒(méi)有在芯片中形成真正的電路。這一步的最終目的是生成門(mén)電路級(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ì)中的門(mén)根據(jù)網(wǎng)表的內(nèi)容和器件的結(jié)構(gòu)放在器件的特定部位。然后,在根據(jù)網(wǎng)表中提供的各門(mén)的連接,把各個(gè)門(mén)的輸入輸出連接起來(lái)。最后,生成一個(gè)供編程的文件。這一步同時(shí)還會(huì)加一些時(shí)序信息(Timing)到你的設(shè)計(jì)項(xiàng)目中去,以便于你做后仿真。
5、后仿真
利用在布局布線中獲得的精確參數(shù),用仿真軟件驗(yàn)證電路的時(shí)序。(也叫布局布線仿真或時(shí)序仿真)。這一步主要是為了確定你的設(shè)計(jì)在經(jīng)過(guò)布局布線之后,是不是還滿足你的設(shè)計(jì)要求。
6、編程,下載
如果前幾步都沒(méi)有發(fā)生錯(cuò)誤,并且符合設(shè)計(jì)要求,這一步就可以將由適配器等產(chǎn)生的配置或下載文件通過(guò)編程器或下載電纜下載到目標(biāo)芯片中。
7、硬件測(cè)試
硬件測(cè)試的目的是為了在更真實(shí)的環(huán)境中檢驗(yàn)HDL設(shè)計(jì)的運(yùn)行情況,特別是對(duì)于HDL程序設(shè)計(jì)上不是十分規(guī)范,語(yǔ)義上含有一定歧義的程序。
2.3.3  SPARTAN-II芯片簡(jiǎn)介
本設(shè)計(jì)用到的FPGA芯片是XILINX公司生產(chǎn)的SPARNTAN-II系列中的xc2s100-6。下面將對(duì)該系列做簡(jiǎn)單的介紹。
2.3.3.1  Spartan-II系列的特點(diǎn)
進(jìn)入ASSP的領(lǐng)域FPGA正在極力將ASSP從電路板上擠出去,并使其失去設(shè)計(jì)人員的寵愛(ài)。但是任何舊式的FPGA器件都無(wú)法恰當(dāng)?shù)靥娲鷮S闷骷V挥蠸partan-II FPGA可以做到這一點(diǎn)。Spartan-II系列為設(shè)計(jì)人員提供了完整的封裝。在密度、功能和性能以及運(yùn)行速度方面都差不多。但是,Spartan-II為解決方案所提供的可編程能力有著巨大的價(jià)值,從而使其與ASSP/ASIC器件相比具有了很大的優(yōu)勢(shì)。
1、現(xiàn)場(chǎng)升級(jí)的靈活性
Spartan-II FPGA的可編程能力為設(shè)計(jì)人員帶來(lái)很大優(yōu)勢(shì)。采用的FPGA是標(biāo)準(zhǔn)器件后,您可更快地將產(chǎn)品標(biāo)準(zhǔn)化。因?yàn)镾partan器件可進(jìn)行現(xiàn)場(chǎng)升級(jí),升級(jí)就像下載軟件一樣簡(jiǎn)單。
2、擁有豐富的邏輯門(mén)資源
Spartan-II系列有六款器件,密度高達(dá)20萬(wàn)門(mén)。豐富的邏輯門(mén)資源能讓設(shè)計(jì)者更大限度的發(fā)揮。
3、告別ASIC和FPGA間的性能和功能差距
在性能和功能方面,大多數(shù)設(shè)計(jì)人員都會(huì)想到ASIC和FPGA間的巨大差距。但是SPARTAN-II消除了這一差距。
4、擁有最多的存儲(chǔ)器
片上帶存儲(chǔ)器是必須的,如果還具有很好的靈活性的話,那么就更為有用了。分布式存儲(chǔ)器和塊RAM可高效地實(shí)現(xiàn)最適合您要求的配置,現(xiàn)時(shí)還可采用與片上存儲(chǔ)器一樣快的外部存儲(chǔ)器。
5、方便的時(shí)鐘管理
如果您面臨時(shí)鐘管理問(wèn)題,Spartan-II系列的四個(gè)高度靈活的DLL可解決您的問(wèn)題。設(shè)計(jì)人員可在片上對(duì)輸入時(shí)鐘進(jìn)行倍頻或分頻,還可驅(qū)動(dòng)板上的多個(gè)時(shí)鐘。
6、提供高性能
今天的數(shù)字世界里有許多新的I/O標(biāo)準(zhǔn)要求很苛刻。通過(guò)Select I/O技術(shù),Spartan-II器件支持所有這些新I/O標(biāo)準(zhǔn)。I/O速度超過(guò)200 MHz。Spartan-II系列豐富的功能、以及高性能和低成本,使其成為多種數(shù)據(jù)網(wǎng)絡(luò)應(yīng)用HDLC控制器解決方案中的首選。Spartan-II也非常適于實(shí)現(xiàn)控制和接口邏輯,比如用于將CPU同QDR SRAM連接在一起。
7、器件密度擴(kuò)展至20萬(wàn)門(mén)
隨著大量產(chǎn)品的設(shè)計(jì)變得越來(lái)越復(fù)雜,對(duì)更高密度、更大存儲(chǔ)器資源以及更多I/O數(shù)量的需求也在增長(zhǎng)。對(duì)于此類設(shè)計(jì),Spartan-II系列的XC2S200非常適合,該器件能提供20多萬(wàn)個(gè)門(mén)、14個(gè)RAM塊以及284個(gè)I/O,并有三種不同的低成本適合大批量生產(chǎn)的封裝PQ208、FG256和FG456可供選擇。利用XC2S200,可獲得比XC2S150多36%的邏輯單元,而且其密度是Spartan或Spartan-XL最大器件密度的五倍。XC2S200包括了支持Spartan-II解決方案獲得成功的所有特性。
2.3.3.2  Spartan-II的結(jié)構(gòu)特點(diǎn)
1、結(jié)構(gòu)框圖
Spartan-II系列FPGA采用了常規(guī)的靈活可編程構(gòu)架,包括可配置邏輯塊(CLB)和環(huán)繞在CLB四周的可編程輸入/輸出模塊(IOB),并通過(guò)多用途布線資源形成強(qiáng)大的互連體系。
圖2-2 Spartan-ii 的結(jié)構(gòu)框圖
2、輸入/輸出模塊
Spartan-II的IOB的輸入和輸出支持16種I/O信號(hào)標(biāo)準(zhǔn),包括LVCMOS、HSTL、SSTL和GTL。這些高速輸入和輸出可支持各種先進(jìn)的存儲(chǔ)器和總線接口。三個(gè)IOB寄存器可作為邊沿觸發(fā)D型觸發(fā)器或作為電平敏感的鎖存器。
圖2-3 Spartan-ii 的輸入輸出模塊
3、邏輯單元
Spartan-II CLB的基本構(gòu)造單元是邏輯單元(LC)。一個(gè)LC包括一個(gè)四輸入的函數(shù)發(fā)生器、一個(gè)進(jìn)位邏輯和一個(gè)存儲(chǔ)單元。每個(gè)LC中函數(shù)發(fā)生器的輸出同時(shí)驅(qū)動(dòng)CLB輸出端和觸發(fā)器的D輸入端。每個(gè)Spartan-II CLB包含四個(gè)LC,兩兩組合成兩個(gè)同樣的Slice。除了四個(gè)基本LC外,Spartan-II CLB還包含一些邏輯電路,結(jié)合函數(shù)發(fā)生器可提供五個(gè)或六個(gè)輸入的函數(shù)功能。因此當(dāng)預(yù)計(jì)給定器件所能提供的系統(tǒng)門(mén)數(shù)量時(shí),每個(gè)CLB可當(dāng)作4.5個(gè)邏輯單元來(lái)計(jì)算。
Spartan-II函數(shù)發(fā)生器采用4輸入查找表(LUT)的方式來(lái)實(shí)現(xiàn)。除了作為函數(shù)發(fā)生器以外,每個(gè)LUT還可作為一個(gè)16*1位的同步RAM來(lái)使用。Spartan-II LUT還可作為一個(gè)16位移位寄存器使用,而且對(duì)于捕捉高速或猝發(fā)數(shù)據(jù)非常理想。這一模式還可在諸如數(shù)字信號(hào)處理等應(yīng)用中用于數(shù)據(jù)的存儲(chǔ)。Spartan-II邏輯片中的存儲(chǔ)單元可通過(guò)配置成為邊沿觸發(fā)型D型觸發(fā)器或電平敏感鎖存器。



圖2-4 Spartan-ii的邏輯單元
4.塊RAM
Spartan-II FPGA集成了幾塊大型的4K位容量Select RAM+ 存儲(chǔ)器塊。這與在CLB中能夠?qū)崿F(xiàn)淺RAM結(jié)構(gòu)的分布式Select RAM+資源互為補(bǔ)充。每個(gè)存儲(chǔ)器塊可配置為4K x 1 和256 x 16之間的多種不同配置。
圖2-5 Spartan-ii的塊RAM
5.延遲鎖相環(huán)
與每個(gè)全局時(shí)鐘輸入緩沖器相連的是一個(gè)完全數(shù)字的延遲鎖相環(huán)(DLL),它可消除時(shí)鐘輸入焊盤(pán)和器件內(nèi)部時(shí)鐘輸入引腳間的畸變。每個(gè)DLL可驅(qū)動(dòng)兩個(gè)全局時(shí)鐘網(wǎng)絡(luò)。首先監(jiān)視輸入的時(shí)鐘信號(hào),然后是分布式時(shí)鐘信號(hào),并自動(dòng)地調(diào)整時(shí)鐘延遲單元。通過(guò)引入額外的延遲來(lái)保證時(shí)鐘邊沿嚴(yán)格地在到達(dá)時(shí)鐘輸入端一個(gè)時(shí)鐘周期后到達(dá)內(nèi)部觸發(fā)器。通過(guò)保證到達(dá)內(nèi)部觸發(fā)器的時(shí)鐘邊沿與到達(dá)時(shí)鐘輸入端的時(shí)鐘邊沿嚴(yán)格同步,這一閉環(huán)系統(tǒng)有效地消除了時(shí)鐘傳輸延遲。

第三章  數(shù)字頻率計(jì)的軟件開(kāi)發(fā)環(huán)境
本章主要介紹項(xiàng)目中將要用到了一系列軟件,包括用于VHDL語(yǔ)言編寫(xiě)和編譯的ISE軟件和用于程序仿真的仿真軟件ModelSim。
3.1  開(kāi)發(fā)環(huán)境
隨著可編程器件紛紛超越百萬(wàn)門(mén)級(jí),設(shè)計(jì)者面臨的產(chǎn)品性能與設(shè)計(jì)效率的挑戰(zhàn)也越來(lái)越大。設(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語(yǔ)言仿真器。ModelSim不僅可以完成設(shè)計(jì)的功能驗(yàn)證,也可實(shí)現(xiàn)邏輯綜合后的門(mé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ì)者可以通過(guò)ModelSim的快速調(diào)試步驟以及對(duì)各種信號(hào)的監(jiān)控功能(無(wú)論信號(hào)處于VHDL層,還是處于混合語(yǔ)言層)使仿真的執(zhí)行過(guò)程形象直觀化,幫助設(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功能,可以方便地訪問(wèn)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集成開(kāi)發(fā)環(huán)境中給ModelSim仿真軟件預(yù)留了接口,通過(guò)這個(gè)接口可以從ISE集成環(huán)境中直接啟動(dòng)ModelSim工具進(jìn)行仿真。這個(gè)過(guò)程通常會(huì)給初學(xué)者一個(gè)錯(cuò)覺(jué),以為ISE集成環(huán)境和ModelSim工具是聯(lián)合工作的,其實(shí)ISE并沒(méi)有集成ModelSim工具,只是預(yù)留了軟件接口。為了說(shuō)明ModelSim的用戶接口,將使用從ISE集成開(kāi)發(fā)環(huán)境中直接啟動(dòng)ModelSim仿真工具的方法。使用此種方法啟動(dòng)ModelSim工具需要具備3個(gè)條件:第一,啟動(dòng)ISE集成開(kāi)發(fā)環(huán)境并建立了一個(gè)FPGA/CPLD的工程項(xiàng)目;第二,添加設(shè)計(jì)源代碼并且編譯通過(guò);第三,使用ISE中的TestFixture或者TestBenchWaveform工具為當(dāng)前的設(shè)計(jì)提供一個(gè)測(cè)試模板(Testbench),并且在測(cè)試模板中添加設(shè)計(jì)激勵(lì)。只有上述條件具備之后才可以從ISE的當(dāng)前資源操作窗中直接啟動(dòng)ModelSim工具并運(yùn)行仿真,以下使用ISE自帶的一個(gè)例子加以說(shuō)明。
在ISE中直接啟動(dòng)ModelSim
1、在Windows操作系統(tǒng)中選擇[開(kāi)始]/[程序]/[Xilinx ISE 6]/[Project Navigator]命令,啟動(dòng)ISE集成開(kāi)發(fā)環(huán)境。
2、在ISE主窗口中選擇[File]/[Open Example]命令,彈出[Open Example]對(duì)話框,如圖所示,然后在[Select an Example Project]欄目中選擇“goldcode-ver-217”,在[Destination Directory]中選擇項(xiàng)目存放的目錄,單擊OK按鈕打開(kāi)例子程序。
圖3-1 打開(kāi)例子程序
3、在資源管理窗口(Source in Project)中的模塊視圖(Model View)中選中的測(cè)試文件“testbench.tf”,在相應(yīng)的當(dāng)前資源操作窗口(Process for Current Source)中將會(huì)出現(xiàn)與Modelsim仿真器相關(guān)的行為仿真(Simulate Behavioral Verilog Model),翻譯后仿真(Simulate Post-Map Verilog Model)和布局布線后仿真(Simulate Post-Place & Route Verilog Model)等4個(gè)不同的操作選項(xiàng),如圖所示:
圖 3-2 Modelsim 仿真
4、雙擊[Simulate Behavioral Model]操作選項(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í)序仿真,而這一仿真過(guò)程所需要的布局布線后仿真文件以及時(shí)序標(biāo)注文件都還沒(méi)有產(chǎn)生,那么ISE集成開(kāi)發(fā)環(huán)境將自動(dòng)開(kāi)始對(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】,如圖就可以了。
圖 3-3 ISE建立新工程
選擇使用的可編程器件類型device family-器件族名device-器件型號(hào)package-封裝speed grade-速度top-level module type-頂層文件類型synthesis tool-綜合工具simulator-仿真工具generated simulation language-生成的仿真模型語(yǔ)言。
圖 3-4 選擇器件
然后一路NEXT,最后點(diǎn)擊完成。剛生成的工程是沒(méi)有類型的,需要自己加入。方法是在 sources in project中右擊,選擇add sources,選擇你寫(xiě)的文件加入即可。如果要新寫(xiě)程序,用同樣的方法,選擇new sources即可,會(huì)彈出如下對(duì)話框,讓你選擇New Sources的類型。
圖 3-5 選擇New Sources的類型
選擇vhdl module,寫(xiě)上文件名,在下一頁(yè)可以寫(xiě)上輸入輸出口,也可以不寫(xiě)。一路NEXT到完成就可以。這樣就可以開(kāi)始寫(xiě)代碼或繼續(xù)下一步綜合了。要打開(kāi)或編輯新建的文件,直接在sources in project窗口中雙擊該文件即可。
3.3.2  行為仿真
1、在工程項(xiàng)窗口Project Window的源文件中選中計(jì)數(shù)器(counter.vhd)。
2、選擇Project/New Source。
3、在新的對(duì)話框中選擇新文件類型為T(mén)est 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窗口如下。
圖 3-6 Testbench Waveform
在HDL Bencher 的波形中,初始化計(jì)數(shù)器輸入如下:
在每個(gè)單元的藍(lán)色區(qū)域輸入激勵(lì)。
a、在CLK第1周期下點(diǎn)擊RESET單元直到該單元變?yōu)椤?/font>
b、在CLK第2周期下點(diǎn)擊RESET單元直到該單元變?yōu)榈汀?/font>
c、在CLK第3周期下點(diǎn)擊CE單元直到該單元變?yōu)楦摺?/font>
d、在CLK第2周期下點(diǎn)擊DIR單元直到該單元變?yōu)楦摺?/font>
圖 3-7 激勵(lì)輸入
e、將你的testbench文件存盤(pán),選擇File/Save Waveform或點(diǎn)擊工具欄的存盤(pán)圖標(biāo),接下來(lái)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 Current Source窗口中點(diǎn)擊 + 符號(hào)展開(kāi)ModelSim仿真器的層次結(jié)構(gòu)找到并雙擊Simulate Behavioral VHDL Model,此時(shí)ModelSim仿真器自動(dòng)啟動(dòng)。
c、對(duì)于第一次運(yùn)行ModelSim的用戶會(huì)顯示一個(gè)對(duì)話框需要在其中做以下處理:選中Do not show this dialog 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)條至窗口的最左端。
圖 3-8 仿真圖
3.3.3  建立頂層原理圖3.3.3.1 生成原理圖符號(hào)
1、在Sources in Project窗口中選中計(jì)數(shù)器模塊counter.vhd。
2、在Processes for Current Source窗口中,點(diǎn)擊設(shè)計(jì)輸入實(shí)用程序(Design Entry Utilities)之前的“+”符號(hào)然后雙擊創(chuàng)建原理圖符號(hào)(CreateSchematic Symbol)經(jīng)過(guò)以上步驟,名稱為“counter”的圖形化元件被放入到工程項(xiàng)庫(kù)中。
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)并在其原理圖窗口中打開(kāi)一張空?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)模式。
圖 3-9 例化VHDL模塊
3.3.3.4 原理圖連線
1、首先激活劃線功能通過(guò)在菜單中選擇Add/Wire或者在工具欄中點(diǎn)擊 (Add Wire)圖標(biāo)。
2、添加一根懸空線和延展連線,在計(jì)數(shù)器模塊的某一管腳單擊鼠標(biāo),然后將連線拉伸到需要的長(zhǎng)度。再在連線端點(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)模式。
圖 3-10 原理圖連線
3.3.3.5 添加輸入輸出管腳標(biāo)記
1、在菜單中選擇Add/ (I/O Marker)或在工具欄中點(diǎn)擊(Add I/O Marker)圖標(biāo),連接好的圖如下。
圖 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)你編寫(xiě)程序后,并把頂層原理圖連接好以后,就可以綜合了。選中你的頂層文件,雙擊Synthesize-Synplify Pro。
圖 3-12 綜合
如果出現(xiàn)上圖的小勾,表示綜合沒(méi)有問(wèn)題。你可以雙擊View RTL Schematic來(lái)查看綜合后的RTL原理圖。
3.3.4.2 定義輸入輸出管腳約束
選中頂層文件,雙擊下圖中的Assign Package Pins,該操作會(huì)提示系統(tǒng)將生成一個(gè).ucf文件,選擇是,系統(tǒng)將自動(dòng)啟動(dòng)Xilinx Pace。
圖 3-13 分配引腳
圖 3-14 Xilinx Pace
現(xiàn)在就可以在LOC欄寫(xiě)上管腳名,定義I/O電平類型,輸出電流大小等,需要注意的是一些I/O是有特殊用處的,不能胡亂分配。定義完后保存退出。
3.3.5  布局布線
雙擊Implement Design,會(huì)依次執(zhí)行Translate,Map,Place&Route。
圖 3-15 設(shè)計(jì)實(shí)現(xiàn)
3.3.6  下載及硬件仿真
選中頂層文件,雙擊運(yùn)行Generate Programming File,運(yùn)行后生成相應(yīng)的(.Bit)下載文件。該文件將下載到芯片中實(shí)現(xiàn)設(shè)計(jì)。
圖 3-16 生成下載文件
再雙擊上圖Configure Device。運(yùn)行后跳出下載界面,選擇主從下載文式(Slave Serial Mode),點(diǎn)擊完成。
圖 3-17 下載方式
右鍵點(diǎn)擊元件,點(diǎn)擊Program,選擇相應(yīng)的BIT文件開(kāi)始下載。
圖 3-18 下載位文件
成功下載后就可以在FPGA板子上運(yùn)行和測(cè)試了。

第四章  數(shù)字頻率計(jì)的設(shè)計(jì)與實(shí)現(xiàn)4.1  任務(wù)要求
本課題核心任務(wù)是完成基于FPGA利用VHDL語(yǔ)言設(shè)計(jì)一個(gè)數(shù)字頻率計(jì)的設(shè)計(jì),仿真,下載實(shí)現(xiàn)并實(shí)際測(cè)量效果,同時(shí)要熟悉和掌握Spartan-II這塊板子的各種性能。考慮到是首次接觸VHDL描述語(yǔ)言,并且以前沒(méi)有過(guò)基于FPGA設(shè)計(jì)的經(jīng)驗(yàn),所以在完成課題的同時(shí),也不斷的加深對(duì)VHDL描述語(yǔ)言的掌握,以及不斷總結(jié)由軟件來(lái)實(shí)現(xiàn)硬件的特點(diǎn),為以后的工作和更進(jìn)一步的學(xué)習(xí)學(xué)習(xí)打好基礎(chǔ)。除此以外,利用課余時(shí)間學(xué)習(xí)數(shù)字頻率計(jì)的硬件實(shí)現(xiàn)方法,即用MultiSim仿真,PROTEL作原理圖以及PCB板等。數(shù)字頻率計(jì)的相關(guān)技術(shù)指標(biāo)如下:
1、位數(shù):測(cè)量頻率通過(guò)LED數(shù)碼管為六位十進(jìn)制數(shù)顯示。
2、測(cè)試頻率范圍為:1Hz~1MHz。擴(kuò)展1MHz~100MHz。
3、量程分為三檔:
第一檔:最小量程檔,閘門(mén)時(shí)間為1S時(shí),最大讀數(shù)為999.999KHz。
第二檔:閘門(mén)時(shí)間為0.1S時(shí),最大讀數(shù)為9999.99KHz。
第三檔:閘門(mén)時(shí)間為0.01S時(shí),最大讀數(shù)為99999.9KHz。
以上三檔,實(shí)際測(cè)得的頻率是1Hz~99999.9KHz。顯然完全涵蓋了1Hz~100MHz的范圍。
4、顯示工作方式:
a、用BCD七段共陽(yáng)極數(shù)碼管顯示讀數(shù),只有在讀數(shù)不發(fā)生跳變時(shí)才是正確的結(jié)果。
b、采用記憶顯示方法,即在一次測(cè)試結(jié)束時(shí),顯示測(cè)試結(jié)果,此顯示值一直保留到下次測(cè)量顯示數(shù)到來(lái),才將上次顯示沖刷更新。用第二次測(cè)試結(jié)果,更新顯示值。
c、實(shí)現(xiàn)對(duì)高位無(wú)意義零的消隱。
5、要求被測(cè)輸入信號(hào)應(yīng)是符合數(shù)字電路要求的脈沖波或正弦波。
4.2  測(cè)量原理
在電子技術(shù)領(lǐng)域內(nèi),頻率是一個(gè)最基本的參數(shù),頻率與其它許多電參量的測(cè)量方案、測(cè)量結(jié)果都有十分密切的關(guān)系。因此,頻率的測(cè)量就顯得更為重要.而且,目前在電子測(cè)量中,頻率的測(cè)量精確度是最高的。
4.2.1  頻率或時(shí)間的原始基準(zhǔn)
時(shí)間是某一時(shí)刻與另一時(shí)刻之間的時(shí)間長(zhǎng)度,這里指的時(shí)刻是連續(xù)流逝的時(shí)間中的一個(gè)時(shí)點(diǎn)。為了使大家能夠確定出同一時(shí)刻,就需要使用共同的時(shí)刻標(biāo)尺來(lái)衡量,用這個(gè)時(shí)刻標(biāo)尺上的標(biāo)度來(lái)客觀地認(rèn)識(shí)時(shí)刻。要計(jì)量時(shí)間需要有固定不變的時(shí)間單位,用秒作為時(shí)間的基本單位。如果一秒內(nèi)的振動(dòng)數(shù)即頻率為已知,則可由此振動(dòng)數(shù)的倒數(shù)得到秒的間隔,這就是說(shuō)單位秒和標(biāo)準(zhǔn)頻率數(shù)是互相依存的事物。時(shí)刻和時(shí)間發(fā)展的歷史,集中反映在秒的定義在不斷變遷,秒的準(zhǔn)確度不斷提高。
采用天文觀測(cè)方法,求得的太陽(yáng)出現(xiàn)于天頂?shù)钠骄芷跒槠骄?yáng)日。將太陽(yáng)日分為24×60×60份,得到的秒為零類世界時(shí)(記作),其準(zhǔn)確度在量級(jí)。地球自轉(zhuǎn)受到極運(yùn)動(dòng)(極移引起的經(jīng)度變化)的影響,校正了這個(gè)偏差而得到的地球自轉(zhuǎn)的周期,稱為第一世界時(shí)(記作)。再把地球自轉(zhuǎn)的季度性、年度性的變化(最大可達(dá)0.03秒)校正,就引出了第二世界時(shí)(記作)。世界時(shí)經(jīng)過(guò)五十年的觀測(cè),發(fā)現(xiàn)其穩(wěn)定度為。這樣,以為標(biāo)準(zhǔn)其計(jì)時(shí)準(zhǔn)確度很難優(yōu)于
為了得到更準(zhǔn)確的均勻不變的時(shí)間標(biāo)準(zhǔn),人們以1.900回歸年的31 556 925 9747分之一作為歷書(shū)時(shí)的秒(記作ET),其準(zhǔn)確度可達(dá)左右。、ET為宏觀計(jì)時(shí)標(biāo)準(zhǔn),它需要精密的天文觀測(cè),手續(xù)煩雜,準(zhǔn)確度有限。
近年來(lái)引進(jìn)了微觀計(jì)時(shí)標(biāo)準(zhǔn),這就是利用原子或分子內(nèi)部能級(jí)躍遷所輻射或吸收的電磁波的頻率作為基準(zhǔn)來(lái)計(jì)量時(shí)間。采用()原子基態(tài)的兩個(gè)超精細(xì)能級(jí)之間躍遷所對(duì)應(yīng)的9 192 631 770個(gè)周期的持續(xù)時(shí)間為一秒,以此為標(biāo)準(zhǔn)定出的時(shí)間標(biāo)準(zhǔn)稱為原子時(shí)(記作AT),其準(zhǔn)確度可達(dá)
目前,國(guó)際上已經(jīng)應(yīng)用經(jīng)過(guò)原子標(biāo)準(zhǔn)修正過(guò)的時(shí)間來(lái)發(fā)送時(shí)間標(biāo)準(zhǔn),用原子時(shí)來(lái)對(duì)天文時(shí)(、ET)進(jìn)行修正。另外,由于頻率是時(shí)間的倒數(shù),因此,有了時(shí)間標(biāo)準(zhǔn)也就有了頻率標(biāo)準(zhǔn)。
由于數(shù)字電路的飛速發(fā)展和數(shù)字集成電路的普及,電子計(jì)數(shù)器的應(yīng)用已十分普及,利用電子計(jì)數(shù)器測(cè)量頻率具有精確度高、使用方便、測(cè)量迅速,以及便于實(shí)現(xiàn)測(cè)量過(guò)程自動(dòng)化等一系列突出優(yōu)點(diǎn),故已發(fā)展成為近代頻率測(cè)量的重要手段。
4.2.2  電子計(jì)數(shù)器測(cè)頻方法
目前,絕大多數(shù)實(shí)驗(yàn)室用電子計(jì)數(shù)器都具有測(cè)量頻率(測(cè)頻)和測(cè)量周期(測(cè)周)等兩種以上的測(cè)量功能,故統(tǒng)稱“通用計(jì)數(shù)器".各種測(cè)量功能可利用《功能選擇》開(kāi)關(guān)加以選擇。
4.2.2.1  電子計(jì)數(shù)器的測(cè)頻原理
所謂“頻率”,就是周期性信號(hào)在單位時(shí)間(一秒)內(nèi)變化的次數(shù)。若在一定時(shí)間內(nèi)計(jì)得這個(gè)周期信號(hào)變化的次數(shù)為N,則其頻率可表達(dá):
                             (4-1)
電子計(jì)數(shù)器可以嚴(yán)格按照公式(4-1)所表達(dá)的頻率的定義進(jìn)行測(cè)頻,其原理方框圖如圖 4-1 示:
圖 4-1 測(cè)頻原理圖
首先,把被測(cè)信號(hào)①(以正弦波為例)通過(guò)脈沖形成電路轉(zhuǎn)變成脈沖②(實(shí)際上變成方波即可)其重復(fù)頻率等于被測(cè)頻率,然后將它加到閘門(mén)的一個(gè)輸入端。閘門(mén)出門(mén)控信號(hào)④來(lái)控制開(kāi)、閉時(shí)間,只有在閘門(mén)開(kāi)通時(shí)間T內(nèi),被計(jì)數(shù)的脈沖⑤才能通過(guò)閘門(mén),被送到十進(jìn)制電子計(jì)數(shù)器進(jìn)行計(jì)數(shù)。門(mén)控信號(hào)的作用時(shí)間T是非常準(zhǔn)確的,以它作為時(shí)間基準(zhǔn)(時(shí)基),它由時(shí)基發(fā)生器提供。時(shí)基信號(hào)發(fā)生一個(gè)高穩(wěn)定的石英振蕩器和一系列數(shù)字分頻器組成,由它輸出的標(biāo)準(zhǔn)時(shí)間脈沖(時(shí)標(biāo))去控制門(mén)控電路形成門(mén)控信號(hào)。比如,時(shí)標(biāo)信號(hào)的重復(fù)周期為1S,則加到閘門(mén)的門(mén)控信號(hào)作用時(shí)間T即閘門(mén)時(shí)間亦準(zhǔn)確地等于1s,即閘門(mén)開(kāi)通時(shí)間為1s,這時(shí)若計(jì)得10 000個(gè)數(shù),則按式(4-1),被測(cè)頻率=10.000Hz,若計(jì)數(shù)器上單位顯示為“kHz”,則顯示10.000kHz,即小數(shù)點(diǎn)定位在第三位。不難設(shè)想,若閘門(mén)時(shí)間改為T(mén)=0.1s,則計(jì)數(shù)值為1 000,這個(gè)數(shù)乘以10就等于1s的計(jì)數(shù)值,即Hz。實(shí)際上,當(dāng)改變閘門(mén)時(shí)間T時(shí),顯示器上的小數(shù)點(diǎn)也隨著往右移一位(自動(dòng)定位),即顯示10.000kHz。
從以上討論可知,電子計(jì)數(shù)器的測(cè)頻原理實(shí)質(zhì)上以比較法為基礎(chǔ),它將和時(shí)基信號(hào)頻率相比,兩個(gè)頻率相比的結(jié)果以數(shù)字的形式顯示出來(lái)。
4.2.3  誤差分析
下面我們來(lái)分析計(jì)數(shù)器測(cè)頻的測(cè)量誤差。從公式(4-1)可知,上述測(cè)頻方法的測(cè)量誤差,一方面決定于閘門(mén)時(shí)間T準(zhǔn)不準(zhǔn),另一方面決定于計(jì)數(shù)器計(jì)得的數(shù)準(zhǔn)不準(zhǔn)。根據(jù)誤差合成方法,從公式(4-1)可得:
                             (4-2)
公式(4-2)中第一項(xiàng)是數(shù)字化儀器所特有的誤差,而第二項(xiàng)是閘門(mén)時(shí)間的相對(duì)誤差,這項(xiàng)誤差決定于石英振蕩器所提供的標(biāo)準(zhǔn)頻率的準(zhǔn)確度。現(xiàn)分述如下。
4.2.3.1  ±1誤差
在測(cè)頻時(shí),主門(mén)的開(kāi)啟時(shí)刻與計(jì)數(shù)脈沖之間的時(shí)間關(guān)系是不相關(guān)的,所以它們?cè)跁r(shí)間軸上的相對(duì)位置是隨機(jī)的。這樣,在相同的主門(mén)開(kāi)啟時(shí)間內(nèi),計(jì)數(shù)器所計(jì)得的數(shù)卻不一定相同,當(dāng)主門(mén)開(kāi)啟時(shí)間T接近甚至等于被測(cè)信號(hào)周期的整數(shù)倍N倍時(shí),此項(xiàng)誤差為最大,圖 4-2 畫(huà)出的就是這種情況。
圖 4-2 正負(fù)1誤差
若主門(mén)開(kāi)啟時(shí)刻為,而第1個(gè)計(jì)數(shù)脈沖出現(xiàn)在,圖 4-2 (a)中示出了>>0的情況(),這時(shí)計(jì)數(shù)器計(jì)得N個(gè)數(shù)(圖中N=6);現(xiàn)在再來(lái)看圖 4-2 (b)情況,即趨近于0,這就有兩種可能的計(jì)數(shù)結(jié)果:若第1個(gè)計(jì)數(shù)脈沖和第7個(gè)計(jì)數(shù)脈沖都能通過(guò)主門(mén),則可計(jì)得N+1=7個(gè)數(shù);也可能這兩個(gè)脈沖都沒(méi)有能進(jìn)入主門(mén),則只能計(jì)得N-1=5個(gè)數(shù)。由此可知,最大的計(jì)數(shù)誤差為個(gè)數(shù)。所以考慮到公式(4-1),可寫(xiě)成
                               (4-3)
式中T為閘門(mén)時(shí)間,為被測(cè)頻率。從公式(4-3)可知,不管計(jì)數(shù)值N多少,其最大誤差總是±1個(gè)計(jì)數(shù)單位,故稱“±1個(gè)字誤差”,簡(jiǎn)稱“±1誤差”。而且一定時(shí),增大閘門(mén)時(shí)間T,可減小±1誤差對(duì)測(cè)頻誤差的影響。當(dāng)T選定后,越低,則由±1誤差產(chǎn)生的測(cè)頻誤差越大。
4.2.3.2  標(biāo)準(zhǔn)頻率誤差
閘門(mén)時(shí)間T準(zhǔn)不準(zhǔn),主要決定于由石英振蕩器提供的標(biāo)準(zhǔn)頻率的準(zhǔn)確度,若石英振蕩器的頻率為,分頻系數(shù)為k,則
所以
                         (4-4)
可見(jiàn),閘門(mén)時(shí)間的準(zhǔn)確度在數(shù)值上等于標(biāo)準(zhǔn)頻率的準(zhǔn)確度,式中負(fù)號(hào)表示由引起的閘門(mén)時(shí)間的誤差為
通常,對(duì)標(biāo)準(zhǔn)頻率準(zhǔn)確度的要求是根據(jù)所要求的測(cè)頻準(zhǔn)確度提出來(lái)的,例如,當(dāng)測(cè)量方案的最小計(jì)數(shù)單位為1Hz,而=Hz,在T=1s時(shí)的測(cè)量準(zhǔn)確度為(只考慮誤差),為了使標(biāo)準(zhǔn)頻率誤差不對(duì)測(cè)量結(jié)果表明產(chǎn)生影響,石英振蕩器的輸出頻率準(zhǔn)確度應(yīng)優(yōu)于,即比誤差引起的測(cè)頻誤差小一個(gè)量級(jí)。
4.2.3.3  結(jié)論
綜上所述,可得如下結(jié)論:
1、計(jì)數(shù)器直接測(cè)頻的誤差主要有兩項(xiàng):即誤差和標(biāo)準(zhǔn)頻率誤差。一般,總誤差可采用分項(xiàng)誤差絕對(duì)值合成,即
                         (4-5)
可把公式(4-5)畫(huà)成圖 4-3 所示的曲線,即與T,以及的關(guān)系曲線。
圖 4-3 誤差曲線
從圖可知,一定時(shí),閘門(mén)時(shí)間T選得越長(zhǎng),測(cè)量準(zhǔn)確度就越高。而當(dāng)T選定后,越高,則由于誤差對(duì)測(cè)量結(jié)果的影響越小,測(cè)量準(zhǔn)確度就越高。但是,隨著誤差的減小,標(biāo)準(zhǔn)頻率誤差將對(duì)測(cè)量結(jié)果產(chǎn)生影響,并以(圖中以為例)為極限,即測(cè)量準(zhǔn)確度不可能優(yōu)于
2、測(cè)量低頻時(shí),由于誤差產(chǎn)生的測(cè)頻誤差大得驚人,例如,為10Hz,T=1s,則由誤差引起的測(cè)頻誤差可達(dá)到10%,所以,測(cè)量低頻時(shí)不宜采用直接測(cè)頻方法。
4.2.4  測(cè)量周期的必要性和基本原理4.2.4.1 測(cè)量周期的必要性
正如前述,當(dāng)較低時(shí),利用計(jì)數(shù)測(cè)器直接測(cè)頻,由誤差所引起的測(cè)頻誤差將會(huì)大到不可允許的程度。所以,為了提高測(cè)量低頻時(shí)的準(zhǔn)確度,即減小誤差的影響,可改成先測(cè)量周期,然后計(jì)算因?yàn)?img id="aimg_Bf67r" onclick="zoom(this, this.src, 0, 0, 0)" class="zoom" width="19" height="24" src="http://c.51hei.com/a/huq/a/a/c/137/137.097.jpg" border="0" alt="" />越低,則越大,計(jì)數(shù)器計(jì)得的數(shù)N也越大,誤差對(duì)測(cè)量結(jié)果的影響自然減小。
4.2.4.2 測(cè)量周期的基本原理
計(jì)數(shù)器測(cè)量周期的原理方框圖如圖 4-4 所示。
圖 4-4 測(cè)周原理圖
被測(cè)信號(hào)(正弦)從B輸入端輸入,經(jīng)脈沖形成電路變成方波,加到門(mén)控電路,比如=10ms則主門(mén)打開(kāi)10ms,在此期間時(shí)標(biāo)脈沖通過(guò)主門(mén)計(jì)數(shù),若選擇時(shí)標(biāo)為則計(jì)數(shù)器計(jì)得的脈沖數(shù)等于/=10000個(gè),如以ms為單位,則從計(jì)數(shù)器顯示上可讀得10.000(ms)。
從以上討論可知,計(jì)數(shù)器測(cè)周的基本原理剛好與測(cè)頻相反,即由被測(cè)信號(hào)控制主門(mén)開(kāi)門(mén),而用時(shí)標(biāo)脈沖進(jìn)行計(jì)數(shù),所以實(shí)質(zhì)上也是一種比較測(cè)量方法。
4.2.4.3 誤差分析
與分析電子計(jì)數(shù)器測(cè)頻時(shí)的誤差類似,根據(jù)誤差傳遞公式,并結(jié)合圖 4-4可得:
                         (4-6)
根據(jù)圖 4-4 測(cè)周原理
=
所以,公式(4-6)可寫(xiě)成
             (4-7)
從公式(4-7)可見(jiàn),測(cè)量周期時(shí)的誤差表達(dá)式與測(cè)頻的表達(dá)式形式相似,很明顯愈大(即被測(cè)頻率愈低),誤差對(duì)測(cè)周精確度的影響就愈小。
圖 4-5 示出了測(cè)周時(shí)的誤差曲線,圖中三條曲線,其中10和100兩條線是采用多周期測(cè)量(詳后)時(shí)的誤差曲線。
圖 4-5 測(cè)周時(shí)的誤差曲線
4.2.4.4 倒數(shù)計(jì)數(shù)器
測(cè)量低頻時(shí),首選測(cè)量周期,然后求倒數(shù)得到被測(cè)頻率值,這是減小由誤差產(chǎn)生頻率誤差的一種有效方法。但是,這種方法不能直接讀出頻率值,而需要通過(guò)1/求倒數(shù)才得到頻率值。
眾所周知,數(shù)字電路也可以完成數(shù)字運(yùn)算,所謂倒數(shù)計(jì)數(shù)器,就是這種計(jì)數(shù)器:首先測(cè)量周期,然后自動(dòng)計(jì)算并顯示被測(cè)頻率。圖 4-6 示出了一種倒數(shù)計(jì)數(shù)器的簡(jiǎn)化方框圖。
圖 4-6 倒數(shù)計(jì)數(shù)器
主門(mén)I和計(jì)數(shù)器I工作在測(cè)周模式,即輸入頻率經(jīng)觸發(fā)器加工,形成門(mén)控信號(hào),在時(shí)間內(nèi)主門(mén)開(kāi)啟,時(shí)鐘通過(guò)主門(mén)I計(jì)數(shù),計(jì)得(被測(cè)信號(hào)的周期,而為時(shí)鐘周期)。N作為定標(biāo)器的預(yù)置值,即將定標(biāo)器預(yù)置到。定標(biāo)器實(shí)質(zhì)上起分頻作用,時(shí)鐘通過(guò)門(mén)Ⅲ由定標(biāo)器計(jì)數(shù),當(dāng)計(jì)完N個(gè)時(shí)鐘后,計(jì)數(shù)器溢出并輸出一個(gè)進(jìn)位脈沖,即每計(jì)完N個(gè)時(shí)鐘輸出一個(gè)脈沖,故定標(biāo)器輸出頻率為或周期為,后者通過(guò)主門(mén)Ⅱ計(jì)數(shù),主門(mén)Ⅱ的閘門(mén)時(shí)間為,計(jì)數(shù)器計(jì)得的數(shù)為
                     (4-8)
測(cè)周模式計(jì)得的數(shù)為
                             (4-9)
從公式(4-8)和公式(4-9)可見(jiàn),計(jì)數(shù)器II計(jì)得的數(shù)正比于N的倒數(shù),從而完成了倒數(shù)的運(yùn)算,也就是說(shuō),可從計(jì)數(shù)器II上直接讀被測(cè)頻率,其顯示的位數(shù)由分頻系數(shù)而定。將公式(4-9)代入公式(4-8)可得
                             (4-10)
從公式(4-10)可見(jiàn),主門(mén)II和計(jì)數(shù)器II實(shí)際上工作在測(cè)頻模式,其輸入頻率就是(注意:由于測(cè)周期模式計(jì)得的數(shù)N本身存在誤差,故嚴(yán)格來(lái)講輸入頻率并非準(zhǔn)確地等于),且工作在同步計(jì)數(shù)方式,即加到主門(mén)II的同步。由于同步計(jì)數(shù)不會(huì)產(chǎn)生誤差,所以,倒數(shù)計(jì)數(shù)器的誤差與測(cè)周模式誤差相同。
4.2.5  等精度測(cè)量
目前,有三種常用的數(shù)字頻率的測(cè)量方法:直接測(cè)頻法(以下簡(jiǎn)稱M法),直接測(cè)周法(以下簡(jiǎn)稱T法)和綜合測(cè)量法(即相結(jié)合的方法,以下簡(jiǎn)稱為M/T法)。前兩種測(cè)量法的原理,在上面的實(shí)驗(yàn)原理里面已經(jīng)詳細(xì)的討論了,不再累述。這兩種方法由誤差分析可知,其精度都與被測(cè)信號(hào)的有關(guān),因而它們是非等精度測(cè)量法。而M/T法它通過(guò)測(cè)量被測(cè)信號(hào)數(shù)個(gè)周期的時(shí)間,然后換算得出被測(cè)信號(hào)的頻率,克服了測(cè)量精度對(duì)被測(cè)信號(hào)的依賴性。
M/T法的核心思想是通過(guò)閘門(mén)信號(hào)與被測(cè)信號(hào)同步,將閘門(mén)時(shí)間τ控制為被測(cè)信號(hào)周期長(zhǎng)度的整數(shù)倍。測(cè)量時(shí),先打開(kāi)預(yù)置閘門(mén),當(dāng)檢測(cè)到被測(cè)信號(hào)脈沖沿到達(dá)時(shí),標(biāo)準(zhǔn)信號(hào)時(shí)鐘開(kāi)始計(jì)數(shù)。預(yù)置閘門(mén)關(guān)閉時(shí),標(biāo)準(zhǔn)信號(hào)并不立即停止計(jì)數(shù),而是等檢測(cè)到被測(cè)信號(hào)脈沖沿到達(dá)時(shí)才停止,完成被測(cè)信號(hào)整數(shù)個(gè)周期的測(cè)量。測(cè)量的實(shí)際閘門(mén)時(shí)間可能會(huì)與預(yù)置閘門(mén)時(shí)間不完全相同,但最大差值不會(huì)超過(guò)被測(cè)信號(hào)的一個(gè)周期。M/T法測(cè)量原理如下圖所示。
圖 4-7 同步計(jì)數(shù)
不如令實(shí)際閘門(mén)時(shí)間為τ,被測(cè)信號(hào)周期數(shù)為,標(biāo)準(zhǔn)信號(hào)頻率為,計(jì)數(shù)值為,則被測(cè)信號(hào)的頻率值為:
                            (4-11)
由于實(shí)際閘門(mén)時(shí)間τ是由被測(cè)信號(hào)同步過(guò)的,因此在此期間測(cè)得的被測(cè)信號(hào)周期的整數(shù)倍是準(zhǔn)確的,不存在誤差。而標(biāo)準(zhǔn)信號(hào)的計(jì)數(shù)值則存在誤差。用來(lái)表則標(biāo)準(zhǔn)信號(hào)計(jì)數(shù)的真實(shí)值為+。由此可知被測(cè)信號(hào)的頻率真實(shí)值為:
                        (4-12)
若不計(jì)標(biāo)準(zhǔn)信號(hào)時(shí)鐘的誤差,則測(cè)量的相對(duì)誤差為:
                (4-15)
可以看出,在M/T法中,相對(duì)誤差與被測(cè)信號(hào)本身的頻率特性無(wú)關(guān),即對(duì)整個(gè)測(cè)量域而言,測(cè)量精度相等,因而稱之為“等精度測(cè)量”。標(biāo)準(zhǔn)信號(hào)的計(jì)數(shù)值越大則測(cè)量相對(duì)誤差越小,即提高門(mén)限時(shí)間τ和標(biāo)準(zhǔn)信號(hào)頻率可以提高測(cè)量精度。在精度不變的情況下,提高標(biāo)準(zhǔn)信號(hào)頻率可以縮短門(mén)限時(shí)間,提高測(cè)量速度。原理圖如下:
圖 4-8 同等度測(cè)量的原理圖
計(jì)數(shù)控制器將標(biāo)準(zhǔn)信號(hào)分頻為預(yù)置信號(hào),預(yù)置閘門(mén)信號(hào)與被測(cè)信號(hào)作用同步之后輸出實(shí)際閘門(mén)信號(hào),作為周期計(jì)數(shù)器和脈沖計(jì)數(shù)器的計(jì)數(shù)使能信號(hào)。同時(shí)在實(shí)際閘門(mén)信號(hào)關(guān)斷的時(shí)間里,計(jì)數(shù)控制器產(chǎn)生一個(gè)清數(shù)脈沖,用以清除計(jì)數(shù)器內(nèi)的計(jì)數(shù)值,以備下一次計(jì)數(shù),該清零脈沖同時(shí)還作為一次計(jì)數(shù)結(jié)束后,將計(jì)數(shù)值進(jìn)行計(jì)算,譯碼顯示的鎖存信號(hào),不然,數(shù)碼管的顯示將因?yàn)閿?shù)值的不停跳動(dòng)而無(wú)法看清楚。
運(yùn)算器則通過(guò)不停地做除法運(yùn)算實(shí)現(xiàn)被測(cè)信號(hào)頻率值的計(jì)算,顯示譯碼器在收到被測(cè)信號(hào)頻率值后,將該值轉(zhuǎn)換為七段碼數(shù)據(jù)顯示的形式,并按照動(dòng)態(tài)掃描方式依次定時(shí)先通各個(gè)顯示管,將顯示數(shù)值送出,由于人眼的暫留效應(yīng),就可以看到穩(wěn)定的輸出值了。
4.3  原理框圖
圖 4-9 原理框圖
4.4  各模塊的功能及實(shí)現(xiàn)4.4.1  分頻器
分頻器的功能是提供標(biāo)準(zhǔn)閘門(mén)時(shí)間控制信號(hào)以精確控制計(jì)數(shù)器的開(kāi)閉。由于閘門(mén)時(shí)間只有1S,0.1S,0.01S三檔,由于本設(shè)計(jì)將下載到Spartan-II上,其提供的標(biāo)準(zhǔn)時(shí)間是32MHz,為此,我們想到了計(jì)數(shù)器。對(duì)一個(gè)兩位的二進(jìn)制計(jì)數(shù)器,當(dāng)輸入兩個(gè)脈沖時(shí),其輸出進(jìn)位脈沖為1個(gè),即入/出之比為2比1。如此下推,對(duì)輸出為2位、3位、4位、5位的二進(jìn)制計(jì)數(shù)則其輸入/輸出為1﹕4,1﹕8,1﹕16,1﹕32……。但十進(jìn)制例外,輸出雖為四位,但輸入/輸出比為1﹕10。這是因?yàn)樵诖耍?jì)數(shù)器到9時(shí),但產(chǎn)生了進(jìn)位。
如果我們采用一個(gè)32進(jìn)制的計(jì)數(shù)器和六個(gè)十進(jìn)制計(jì)數(shù)器串行連接,那么,我們?cè)谧詈蟮娜?jí)上,可分別獲得100Hz,10Hz、1Hz、其閘門(mén)時(shí)間分別為0.01s、0.1s、1s的控制信號(hào)。生成的分頻器模塊如下圖所示:
圖 4-10 分頻器模塊
程序中使用了隸屬函數(shù)generic, Generic ( rate : integer :=10  );定義了一個(gè)整形變量rate,通過(guò)修改這個(gè)整形變量rate的值,可以實(shí)現(xiàn)分頻器分頻數(shù)的改變。這樣做可以實(shí)現(xiàn)程序的調(diào)用,只需要修改少量的地方就可以實(shí)現(xiàn)不同的分頻需要。
源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity fdiv is
   Generic (  rate : integer :=10  );
   Port    (  f_in : In  std_logic;
                   f_out : Out std_logic );
end;
architecture behavioral of fdiv is
   signal cnt : integer range 0 to rate := 0;
   signal clk : std_logic:='0';
begin
   process (f_in)
   begin
      if f_in'event and f_in = '1' then
              if cnt /= rate then
                  cnt <= cnt + 1;
              else
                  cnt <= 1;
                  clk<=not clk;
              end if;
      end if;
   end process;
f_out <= clk;
end behavioral;
仿真圖如下所示:
圖 4-11 分頻器模塊仿真圖
運(yùn)用component函數(shù)對(duì)上面程序的調(diào)用,即可很輕松的實(shí)現(xiàn)幾個(gè)分頻器,而不用再寫(xiě)類似的程序。生成的模塊如圖所示:
圖 4-12 多輸出的分頻器
這個(gè)模塊即實(shí)現(xiàn)了把32MHz的時(shí)基信號(hào)分成了我們需要的四個(gè)信號(hào)1Hz,10Hz,100Hz,1KHz。其源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Fdiv3 is
    Port ( clkin : in std_logic;
           clkout1 : out std_logic;
           clkout10 : out std_logic;
           clkout100 : out std_logic;
                            clkout1k              :   out std_logic);
end Fdiv3;
architecture structure of Fdiv3 is
   component fdiv is
    Generic (  rate : integer :=10  );
   Port    (  f_in : In  std_logic;
                   f_out : Out std_logic );
    end component fdiv;
                  signal carry1,carry2,carry3:std_logic;
begin
   U1:fdiv generic map(rate=>16000) port map (f_in=>clkin,f_out=>carry1);
   U2:fdiv generic map(rate=>5) port map (f_in=>carry1,f_out=>carry2);
   U3:fdiv generic map(rate=>5) port map (f_in=>carry2,f_out=>carry3);
   U4:fdiv generic map(rate=>5) port map (f_in=>carry3,f_out=>clkout1);
   clkout1K <= carry1;
   clkout100 <= carry2;
   clkout10<=carry3;
end structure;
4.4.2  閘門(mén)選擇器
該模塊的功能是實(shí)現(xiàn)對(duì)輸入的幾個(gè)閘門(mén)信號(hào)的手動(dòng)選擇,并輸出被選中的閘門(mén)信號(hào)以及小數(shù)點(diǎn)的控制信號(hào)DP1,DP2,DP3。生成的模塊如下圖所示:
圖 4-13 閘門(mén)選擇器
該模塊有六個(gè)輸入端口,其中se1,se10,se100為選擇使能端,f1hz,f10hz,f100hz為被選時(shí)基信號(hào)輸入端。當(dāng)se1為1時(shí),f1hz的輸入時(shí)基信號(hào)被選中,被賦值給輸出端口fref輸出,此時(shí)DP1有效,DP2和DP3無(wú)效,點(diǎn)亮DP1連接的小數(shù)點(diǎn);當(dāng)se1為0,se10為1時(shí),f10hz時(shí)基信號(hào)被選中,DP2有效,DP1和DP3無(wú)效,點(diǎn)亮由DP2連接的小數(shù)點(diǎn);最后當(dāng)se1和se10都無(wú)效時(shí),即都為0時(shí),se100為1時(shí),f100hz端口的輸入信號(hào)被選中作為輸出,DP3有效,DP1和DP2無(wú)效,點(diǎn)亮由DP3連接的小數(shù)點(diǎn)。
本模塊的源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity sele is
      port(se1,se10,se100:              in              std_logic;
                    f1hz,f10hz,f100hz:              in              std_logic;
                            fref:                                          out              std_logic;
                            dp1,dp2,dp3:                            out              std_logic);
end sele;
architecture Behavioral of sele is
begin
  process (se1,se10,se100,f1hz,f10hz,f100hz)
   begin
      fref <= '0'; dp1 <= '0';dp2 <= '0';dp3 <= '0';
      if se1 = '1' then
              fref <= f1hz;
              dp1<= '1';
      elsif se10 = '1' then
              fref <= f10hz;
              dp2 <= '1';
      elsif se100 = '1' then
              fref <= f100hz;
              dp3 <='1';
      end if;
   end process;
end Behavioral;
1


第四章  數(shù)字頻率計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
仿真圖如下所示:
圖 4-14 閘門(mén)選擇器仿真圖
4.4.3  測(cè)頻控制器
測(cè)頻控制器是控制整個(gè)頻率計(jì)各模塊進(jìn)行時(shí)序工作的控制裝置,它對(duì)輸入的標(biāo)準(zhǔn)時(shí)鐘信號(hào)進(jìn)行變換,產(chǎn)生我們所需要的三個(gè)信號(hào)閘門(mén)信號(hào)GATE,鎖存信號(hào)LATCH以及清零信號(hào)CLEAR。如使用一個(gè)低觸發(fā)器處理1Hz的時(shí)鐘信號(hào),其Q端輸出,即是脈寬1S計(jì)數(shù)器使能端的控制信號(hào),而輸出即為脈寬1S的鎖存器使能信號(hào)。計(jì)數(shù)清零信號(hào)也由測(cè)頻控制器變換后輸出,控制整個(gè)電路。其生成的元件符號(hào)如下圖所示:
圖 4-15 測(cè)頻控制器
測(cè)頻控制信號(hào)發(fā)生器設(shè)計(jì)要求:頻率測(cè)量的基本原理是計(jì)算每秒鐘內(nèi)待測(cè)信號(hào)的脈沖個(gè)數(shù)。這就要求Control的計(jì)數(shù)使能信號(hào)Gate能產(chǎn)生一個(gè)周期信號(hào),并對(duì)頻率計(jì)的每一計(jì)數(shù)器Counter6的Carry_in使能端進(jìn)行同步控制。當(dāng)Gate為高電平時(shí),允許計(jì)數(shù),為低電平時(shí)停止計(jì)數(shù),并保持其所計(jì)的脈沖數(shù)。在停止計(jì)數(shù)期間,首先需要一個(gè)鎖存信號(hào)latch的上跳沿將計(jì)數(shù)器在前1秒鐘的計(jì)數(shù)值鎖存進(jìn)24位鎖存器Latch中,并由外部的7段譯碼器譯出,并穩(wěn)定顯示。設(shè)置鎖存器的好處是,顯示的數(shù)據(jù)穩(wěn)定,不會(huì)由于周期性的清零信號(hào)而不斷閃爍。鎖存信號(hào)之后,必須有一清零信號(hào)Reset對(duì)計(jì)數(shù)器進(jìn)行清零,為下1秒鐘的計(jì)數(shù)操作準(zhǔn)備。源程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity control is
    Port ( Bsignal : in std_logic;
           Gate : out std_logic;
           Reset : out std_logic;
           latch : out std_logic);
end control;
architecture Behavioral of control is
                signal G1,G2: std_logic:='0';
begin
process(Bsignal,G1)
                begin
                            if rising_edge(Bsignal) then
                                 G1<=not G1;
                            end if;
                            if falling_edge(bsignal) then
                                          G2<=not G1;
                            end if;            
end process;
                            gate<=G1;
                            latch<=G2;
                            reset<=(not bsignal)and(not G1)and (G2);
end Behavioral;
測(cè)頻控制信號(hào)發(fā)生器的仿真工作時(shí)序如圖所示。
圖 4-16 測(cè)頻控制器的仿真圖
如果閘門(mén)信號(hào)Gate的頻率取1Hz,那么信號(hào)Gate的脈寬恰好為1S,可以用作計(jì)數(shù)閘門(mén)信號(hào)。然后根據(jù)測(cè)頻的時(shí)序要求,可得出信號(hào)latch和Reset的邏輯描述。由圖可見(jiàn),在計(jì)數(shù)完成后,即計(jì)數(shù)使能信號(hào)Gate在1S的高電平后,利用其反相值產(chǎn)生一個(gè)鎖存信號(hào)latch,由于反相器的器件延時(shí),鎖存信號(hào)的上升沿是在計(jì)數(shù)使能信號(hào)即閘門(mén)信號(hào)Gate的下降沿之后,即是計(jì)數(shù)完了才鎖存的,符合我們的設(shè)計(jì)要求。而清零信號(hào)Reset的上升沿的產(chǎn)生是在下一個(gè)Gate信號(hào)上升沿來(lái)臨之前,也就是說(shuō)是清了零才開(kāi)始計(jì)數(shù)的,不是計(jì)了一會(huì)兒數(shù)再被清零了繼續(xù)計(jì)數(shù),這也是與我們的設(shè)計(jì)要求相符合的。高質(zhì)量的測(cè)頻控制信號(hào)發(fā)生器的設(shè)計(jì)十分重要,設(shè)計(jì)中要對(duì)其進(jìn)行仔細(xì)的實(shí)時(shí)仿真,防止可能產(chǎn)生的毛刺。
4.4.4  頻率計(jì)數(shù)器
由于要求頻率計(jì)的顯示為十進(jìn)制六位,所示我們?cè)O(shè)計(jì)的是使能端的十進(jìn)制計(jì)數(shù)器,所生成的模塊如圖所示:其中RST是清零端,CLK是計(jì)數(shù)信號(hào)輸入端,Carry_in是計(jì)數(shù)保持端,即為高電平時(shí)計(jì)數(shù),低電平時(shí)停止計(jì)數(shù)保持計(jì)數(shù)不變。Count_out是計(jì)數(shù)結(jié)果輸出,carry_out是進(jìn)位信號(hào)。
圖形 4-17 單個(gè)計(jì)數(shù)器模塊
其源程序?yàn)椋?/font>
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter is
port (rst,clk : in std_logic;
      carry_in  : in std_logic;
      carry_out : out std_logic;
      count_out     : out std_logic_vector(3 downto 0));
end counter;
architecture Behavioral of counter is
                 signal count: std_logic_vector(3 downto 0):="0000";
begin
              process(rst,clk)
                  begin
                            if rst='1' then
                                count <= "0000";
                            elsif clk'event and clk= '1' then
                                          if carry_in = '1' then
                                                        if  count < "1001" then
                                                            count <= count+1;
                                                        else
                                                            count <= "0000";
                                                        end if;
                                              else
                                          null;
                                          end if;
                            end if;            
                end process;
      count_out<=count;
              carry_out <= '1' when carry_in = '1' and count = "1001" else '0';
end Behavioral;
仿真圖如下圖所示:
圖 4-18 單個(gè)計(jì)數(shù)器的仿真圖
由仿真圖可以看出,程序的綜合出來(lái)的這個(gè)計(jì)數(shù)器的確實(shí)現(xiàn)我們預(yù)定的要求。有清零端和保持端,通過(guò)對(duì)計(jì)數(shù)器的級(jí)聯(lián)就可以實(shí)現(xiàn)十進(jìn)制六位數(shù)的計(jì)數(shù)。
被測(cè)信號(hào)接至此計(jì)數(shù)器的Csignal。清零端clear和保持端count_en分別與測(cè)頻控制器Reset端和閘門(mén)信號(hào)Gate相對(duì)接。計(jì)數(shù)器輸出端與鎖存器輸入端對(duì)接,而進(jìn)位輸出端則依次接到下一位計(jì)數(shù)器的保持端cout_en,惟第六位即最高位的進(jìn)位輸出作為溢出標(biāo)志用over來(lái)表示,用以顯示計(jì)數(shù)器計(jì)數(shù)是否溢出,溢出了就更換大一級(jí)的檔位。這樣的級(jí)聯(lián)形成了同步計(jì)數(shù),是一種計(jì)數(shù)較快的級(jí)聯(lián)方式,生成的原理模塊如下:
圖 4-19 級(jí)聯(lián)后的計(jì)數(shù)器
計(jì)數(shù)器模塊級(jí)聯(lián)的程序跟頻率計(jì)級(jí)聯(lián)程序雷同,這里不再貼出,有興趣的朋友可以參考附錄。級(jí)聯(lián)成六位計(jì)數(shù)器的仿真圖如下:
圖 4-20 六位計(jì)數(shù)器的仿真圖
4.4.5  鎖存器
如果計(jì)數(shù)器輸出直接與譯碼器相連接,那么在計(jì)數(shù)過(guò)程中輸出端則隨輸入脈沖數(shù)的增加而不斷跳變,那么顯示數(shù)碼管則也會(huì)不斷閃爍跳變,讓人不能看到穩(wěn)定的輸出,設(shè)鎖存器后,則不再跳變,便可清晰讀出計(jì)數(shù)結(jié)果。由control控制模塊產(chǎn)生的latch信號(hào)來(lái)提供鎖存脈沖。其生成的功能模塊如圖所示:
圖 4-21 鎖存器模塊
這模塊實(shí)現(xiàn)了對(duì)六位計(jì)數(shù)結(jié)果和溢出信號(hào)over的鎖存功能。程序很簡(jiǎn)單,即鎖存信號(hào)的上升沿來(lái)時(shí)送數(shù),其它時(shí)候則保持不變。具體程序參考附錄。
4.4.6  掃描顯示控制譯碼系統(tǒng)
本模塊通過(guò)用一個(gè)頻率1KHz的信號(hào)來(lái)掃描一個(gè)多路選擇器,實(shí)現(xiàn)對(duì)六位已經(jīng)鎖存的計(jì)數(shù)結(jié)果的掃描輸出,由于1KHz相對(duì)了人眼的暫留效應(yīng)已經(jīng)很高了,所以顯示結(jié)果不會(huì)讓人感覺(jué)到閃爍。這樣就可以用一個(gè)譯碼器來(lái)實(shí)現(xiàn)對(duì)六個(gè)4位二進(jìn)制數(shù)的譯碼。譯碼結(jié)果再連接到一個(gè)多路選擇器的輸入端,同樣由1KHz的信號(hào)來(lái)同步掃描選通。同時(shí)本模塊還實(shí)現(xiàn)了無(wú)意義零的消隱。最出的輸出全部通過(guò)下載前的固定引腳連接到LED顯示管上。實(shí)現(xiàn)最終結(jié)果的數(shù)字顯示。輸入端包括掃描信號(hào)1KHz,由前面產(chǎn)生在本模塊起控制作用的溢出信號(hào)Q_over,小數(shù)點(diǎn)指示信號(hào)Dp1,Dp2以及鎖存器的輸出結(jié)果。

其生成模塊如下:
圖 4-22 顯示譯碼控制模塊
其源程序如下:
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5. entity multi is
  6.        port(f1khz,q_over              :              in              std_logic;
  7.                                 dp1,dp2              :              in              std_logic;            
  8.                     freq_value0,freq_value1              :              in              std_logic_vector(3 downto 0);
  9.                             freq_value2,freq_value3              :              in              std_logic_vector(3 downto 0);
  10.                             freq_value4,freq_value5              :              in              std_logic_vector(3 downto 0);
  11.                             out0,out1,out2,out3,out4,out5:              out               std_logic_vector(6 downto 0));
  12. end multi;
  13. architecture Behavioral of multi is
  14.               signal               sel                            :              std_logic_vector(2 downto 0):="000";
  15.               signal               hide                            :              std_logic;
  16.               signal               data                            :              std_logic_vector(3 downto 0);
  17.               signal              led                            :              std_logic_vector(6 downto 0);            
  18. begin
  19.               scan : process (f1khz)
  20.                                begin
  21.                                   if rising_edge(f1khz) then
  22.                                                         if sel  = "101" then
  23.                                                             sel <= "000";
  24.                                                         else
  25.                                                             sel <= sel + 1;
  26.                                                         end if;
  27.                                   end if;
  28.                                end process;
  29.               mux:process(sel,freq_value0,freq_value1,freq_value2,freq_value3,freq_value4,freq_value5)
  30.                                begin
  31.                     case sel is
  32.                                           when "000" =>              data <= freq_value0;
  33.                                           when "001" =>              data <= freq_value1;
  34.                                           when "010" =>              data <= freq_value2;
  35.                                           when "011" =>              data <= freq_value3;
  36.                                           when "100" =>              data <= freq_value4;
  37.                                           when others =>              data <= freq_value5;
  38.                     end case;
  39.                                end process;
  40.               bcd2led : process (hide,data)
  41.                                begin
  42.                     led <= "1111111";
  43.                     if hide /= '1' then
  44.                                           case data is
  45.                                               when "0000" =>  led <= "0000001";            
  46.                                               when "0001" =>  led <= "1001111";            
  47.                                               when "0010" =>  led <= "0010010";            
  48.                                               when "0011" =>  led <= "0000110";            
  49.                                               when "0100" =>  led <= "1001100";            
  50.                                               when "0101" =>  led <= "0100100";            
  51.                                               when "0110" =>  led <= "0100000";            
  52.                                               when "0111" =>  led <= "0001111";            
  53.                                               when "1000" =>  led <= "0000000";
  54.                                               when "1001" =>  led <= "0000100";
  55.                                               when others =>  null;
  56.                                           end case;
  57.                     end if;
  58.                                end process;
  59.               fenpei:process(sel,led)
  60.                                           begin
  61.                                           out0<="1111111";
  62.                                  out1<="1111111";
  63.                                  out2<="1111111";
  64.                                  out3<="1111111";
  65.                                  out4<="1111111";
  66.                                  out5<="1111111";            
  67.                                                         case sel is
  68.                                                                       when "000" => out0 <= led;
  69.                                                                       when "001" => out1 <= led;
  70.                                                                       when "010" => out2 <= led;
  71.                                                                       when "011" => out3 <= led;
  72.                                                                       when "100" => out4 <= led;
  73.                                                                       when "101" => out5 <= led;
  74.                                                                       when others => null;
  75.                                                         end case;
  76.                             end process;            
  77.                  hide_zero:process (sel,q_over,dp1,dp2,freq_value5,freq_value4,freq_value3,freq_value2)
  78.                                begin
  79.                     hide <= '0';
  80.                     case sel is
  81.                             when "101" =>
  82.                                               if q_over = '0' and freq_value5 = "0000"
  83.                                                  then hide <= '1';
  84.                                               end if;
  85.                             when "100" =>
  86.                                               if q_over = '0' and freq_value5 = "0000"
  87.                                                         and freq_value4 = "0000"
  88.                                                  then hide <= '1';
  89.                                               end if;
  90.                             when "011" =>
  91.                                               if q_over = '0' and freq_value5 = "0000"
  92.                                                             and freq_value4 = "0000"
  93.                                                             and freq_value3 = "0000"
  94.                                                             and dp1 /= '1'
  95.                                    then hide <= '1';
  96.                                               end if;
  97.                             when "010" =>
  98.                                               if q_over = '0' and freq_value5 = "0000"
  99.                                                             and freq_value4 = "0000"
  100.                                                             and freq_value3 = "0000"
  101.                                                             and freq_value2 = "0000"
  102.                                                             and dp1 /= '1'
  103.                                                             and dp2 /= '1'
  104.                                    then hide <= '1';
  105.                                               end if;
  106.                             when others =>
  107.                                               null;
  108.                     end case;
  109.                                end process;
  110. end Behavioral;
復(fù)制代碼


仿真結(jié)果如下:
圖 4-23 顯示譯碼控制模塊的仿真圖
4.5  頂層原理圖
將各程序生成的模塊按我們的要求連接就形成了頂層原理圖。再定義好輸入輸出引腳,就可以做最后的綜合和設(shè)計(jì)實(shí)現(xiàn)了。原理圖過(guò)大,可參考附錄。
以下是最后的仿真,第一個(gè)是局部的放大,第二個(gè)仿真結(jié)果的整體。在仿真圖上可以看出程序的綜合的確達(dá)到了我們的要求。能清零,小數(shù)點(diǎn)隨著閘門(mén)的變化而變化,正確顯示是否溢出,以及成功的計(jì)數(shù)和譯碼顯示。
圖 4-24 頂層原理圖仿真的局部放大
圖 4-25 頂層原理圖仿真圖整體
4.6  分配引腳和下載實(shí)現(xiàn)
全部仿真通過(guò)后,就運(yùn)行ISE的設(shè)計(jì)實(shí)現(xiàn),然后再打開(kāi)XILINX PACE,在里面分配引腳,即實(shí)現(xiàn)設(shè)計(jì)的輸入輸出端口與實(shí)際芯片的輸入輸出端口的對(duì)應(yīng)連接。比如七段LED管的控制信號(hào)就連接到實(shí)際電路的七個(gè)引腳。需要注意的是一些端口是固定的,不能胡亂的連接。比如時(shí)基信號(hào)即石英振蕩器所提供的信號(hào)就只能由P181輸入。同時(shí)還要考慮內(nèi)部的可配制邏輯塊CLB的數(shù)量是否夠滿足程序的綜合要求。一切都準(zhǔn)備就緒后就可以運(yùn)行Configure Device,選擇要下載的位文件(.bit)便可開(kāi)始下載了。
4.7  測(cè)試結(jié)果
在成功下載并運(yùn)行后,為評(píng)估該設(shè)計(jì)系統(tǒng)的實(shí)際測(cè)量效果,做了一次對(duì)比實(shí)驗(yàn),選用頻率可調(diào)的函數(shù)發(fā)生器SP1641B,同時(shí)用示波器TDS210 Tektronix做同步的跟蹤。測(cè)得的數(shù)據(jù)很精確,跟函數(shù)發(fā)生器以及示波器的顯示全吻合。最低頻率可以測(cè)到1Hz,不過(guò)要求輸入信號(hào)很穩(wěn)定且為方波,因?yàn)樾酒斎攵丝谧詭У恼坞娐纺芰Ξ吘褂邢蕖T谧龈哳l的對(duì)比測(cè)量時(shí),波形發(fā)生器換成了Agilent公司生產(chǎn)的4410做信號(hào)源。結(jié)果表明該設(shè)計(jì)的確能測(cè)量到100MHz,測(cè)量結(jié)果表明該設(shè)計(jì)達(dá)到了最初的提出的所有設(shè)計(jì)要求。

第五章  結(jié)論
本文主要介紹了利用VHDL語(yǔ)言完成基于FPGA的數(shù)字頻率計(jì)的設(shè)計(jì)與實(shí)現(xiàn)。詳細(xì)介紹了測(cè)量原理,設(shè)計(jì)方案以及各模塊的設(shè)計(jì)過(guò)程及其實(shí)現(xiàn)的功能,并對(duì)設(shè)計(jì)中遇到的問(wèn)題作了分析和處理;利用ISE和ModelSim對(duì)設(shè)計(jì)進(jìn)行了仿真,分析,綜合,并最終下載到Spartan-II系列芯片中,實(shí)現(xiàn)了對(duì)頻率的測(cè)量。
傳統(tǒng)數(shù)字頻率計(jì)由于在高頻段受基準(zhǔn)時(shí)鐘頻率的限制,其測(cè)頻精度受到很大的限制.本設(shè)計(jì)應(yīng)用EDA技術(shù),很好的解決了這一問(wèn)題.在設(shè)計(jì)完成后,為評(píng)估系統(tǒng)的實(shí)際測(cè)量效果,做了一次對(duì)比實(shí)驗(yàn),測(cè)量結(jié)果表明測(cè)量精度基本能達(dá)到,可滿足一般測(cè)量精度的要求。但當(dāng)被測(cè)信號(hào)頻率較低時(shí),測(cè)試精度較低,誤差變大。究其原因,除了數(shù)字測(cè)量本身的正負(fù)誤差和標(biāo)準(zhǔn)信號(hào)引起的誤差外,還發(fā)現(xiàn)低頻信號(hào)的上升沿和下降沿的變化較緩慢,影響了計(jì)數(shù)器的計(jì)數(shù)值,造成了測(cè)量精度的下降。
這是第一次利用HDL語(yǔ)言來(lái)實(shí)現(xiàn)基于FPGA的實(shí)際工程項(xiàng)目,所以在實(shí)踐過(guò)程中不可避免的遇到了很多問(wèn)題以及設(shè)計(jì)中一些不足的地方。理論和實(shí)踐沒(méi)有有機(jī)的聯(lián)系起來(lái),理論沒(méi)有起到應(yīng)有的指導(dǎo)作用。如本來(lái)可以實(shí)現(xiàn)測(cè)量檔位的自動(dòng)切換。同時(shí)受到FPGA板子本身的限制(小數(shù)點(diǎn)不受控于芯片I/O的輸出信號(hào)),小數(shù)點(diǎn)的變化只能由另外的LED來(lái)體現(xiàn)。

附錄1.  計(jì)數(shù)器級(jí)聯(lián)程序
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5. entity counter6 is
  6.    port(Csignal              :              in               std_logic;
  7.                  clear                            :              in              std_logic;
  8.                  count_en              :              in              std_logic;
  9.                  over                            :              out              std_logic;
  10.                  result1              :              out               std_logic_vector(3 downto 0);
  11.                  result2              :              out               std_logic_vector(3 downto 0);
  12.                  result3              :              out               std_logic_vector(3 downto 0);
  13.                  result4              :              out               std_logic_vector(3 downto 0);
  14.                  result5              :              out               std_logic_vector(3 downto 0);
  15.                  result6              :              out               std_logic_vector(3 downto 0));
  16. end counter6;
  17. architecture structure of counter6 is
  18.               component counter is
  19.                    port(rst,clk                 :               in               std_logic;
  20.                                   carry_in                :               in               std_logic;
  21.                                   carry_out               :               out               std_logic;
  22.                                   count_out               :               out               std_logic_vector(3 downto 0));
  23.               end component counter;
  24.             
  25.               signal              carry1,carry2,carry3,carry4,carry5,carry6:              std_logic;
  26.               signal              over1              :std_logic;                           
  27. begin
  28.                             U1 : counter Port map (     rst => clear,
  29.                                                               clk => Csignal,
  30.                                                         carry_in => count_en,
  31.                                                         carry_out => carry1,
  32.                                                             count_out => result1   );
  33.                             U2 : counter Port map (     rst => clear,
  34.                                                               clk => Csignal,
  35.                                                         carry_in => carry1,
  36.                                                         carry_out => carry2,
  37.                                                             count_out => result2   );
  38.                             U3 : counter Port map (     rst => clear,
  39.                                                               clk => Csignal,
  40.                                                         carry_in => carry2,
  41.                                                         carry_out => carry3,
  42.                                                             count_out => result3   );
  43.                             U4 : counter Port map (     rst => clear,
  44.                                                               clk => Csignal,
  45.                                                         carry_in => carry3,
  46.                                                         carry_out => carry4,
  47.                                                             count_out => result4   );
  48.                             U5 : counter Port map (     rst => clear,
  49.                                                               clk => Csignal,
  50.                                                         carry_in => carry4,
  51.                                                         carry_out => carry5,
  52.                                                             count_out => result5   );
  53.                             U6 : counter Port map (     rst => clear,
  54.                                                               clk => Csignal,
  55.                                                         carry_in => carry5,
  56.                                                         carry_out => carry6,
  57.                                                         count_out => result6   );
  58. process (clear,csignal)
  59.    begin
  60.       if clear = '1' then
  61.               over1<= '0';
  62.       elsif rising_edge(csignal) then
  63.       over1 <= carry6 or over1;
  64.       end if;
  65.    end process;
  66.    over<=over1;
  67. end structure;
復(fù)制代碼

附錄2.  鎖存器源程序
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5. entity latch is
  6.   port ( latchin              :              in std_logic;
  7.          overin              :              in std_logic;
  8.                      numin1              :              in std_logic_vector(3 downto 0);
  9.                   numin2              :              in std_logic_vector(3 downto 0);
  10.                   numin3              :              in std_logic_vector(3 downto 0);
  11.                   numin4              :              in std_logic_vector(3 downto 0);
  12.                   numin5              :              in std_logic_vector(3 downto 0);
  13.                   numin6              :              in std_logic_vector(3 downto 0);
  14.                   overout              :              out std_logic;
  15.                   numout1              :              out std_logic_vector(3 downto 0);
  16.                   numout2              :              out std_logic_vector(3 downto 0);
  17.                   numout3              :              out std_logic_vector(3 downto 0);
  18.                   numout4              :              out std_logic_vector(3 downto 0);
  19.                   numout5              :              out std_logic_vector(3 downto 0);
  20.                   numout6              :              out std_logic_vector(3 downto 0));                                                      
  21. end latch;
  22. rchitecture Behavioral of latch is
  23. begin
  24.   process(latchin)
  25.     begin
  26.    if rising_edge(latchin) then
  27.    overout<=overin;
  28.    numout1<=numin1;
  29.    numout2<=numin2;
  30.    numout3<=numin3;
  31.    numout4<=numin4;
  32.    numout5<=numin5;
  33.    numout6<=numin6;
  34.     end if;
  35.   end process;
  36. end Behavioral;
復(fù)制代碼


附錄3.  頂層原理圖

附錄4.  計(jì)數(shù)器的級(jí)聯(lián)圖



完整的Word格式文檔51黑下載地址:
數(shù)字式頻率計(jì)的設(shè)計(jì)過(guò)程,其中包含了所用到的VHDl語(yǔ)言的源代碼,和仿真圖型.rar (1.77 MB, 下載次數(shù): 41)



作者: admin    時(shí)間: 2019-1-25 01:44
好資料,51黑有你更精彩!!!




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1