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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5223|回復: 0
收起左側

EDA,FPGA設計,有誰可以幫忙吧這個程序改成1602顯示

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


第三章  數字秒表的軟件開發環境
本章主要介紹項目中將要用到了一系列軟件,包括用于VHDL語言編寫和編譯的ISE軟件和用于程序仿真的仿真軟件ModelSim。
3.1  開發環境
隨著可編程器件紛紛超越百萬門級,設計者面臨的產品性能與設計效率的挑戰也越來越大。設計者必須合理選擇各EDA廠家提供的加速設計的工具軟件,這樣才能在較短的時間內設計出高效穩定的產品。在本次設計中,由于選擇的FPGA芯片是由Xilinx公司生產的,所以我們主要使用ModelSim和ISE軟件進行仿真和綜合。
3.2 ModelSim介紹
ModelSim支持PC和UNIX平臺,是單一內核支持VHDL和Verilog混合仿真的HDL語言仿真器。ModelSim不僅可以完成設計的功能驗證,也可實現邏輯綜合后的門級仿真以及布局布線后的功能與時序驗證。
ModelSim完全支持VHDL和Verilog標準;采用直接編輯技術,大大提高HDL編譯和仿真速度。還可以利用ModelSim調用設計文件進行仿真分析。在調試環境中,設計者可以通過ModelSim的快速調試步驟以及對各種信號的監控功能(無論信號處于VHDL層,還是處于混合語言層)使仿真的執行過程形象直觀化,幫助設計者及時發現漏洞,縮短設計周期。
ModelSim最大的特點是其強大的調試功能:先進的數據流窗口,可以迅速追蹤到生產不定或者錯誤狀態的原因;性能分析工具幫助分析性能瓶頸,加速仿真;代碼覆蓋率檢查確保測試的完備;多種模式的波形比較功能;先進的 SignalSpy功能,可以方便地訪問VHDL或者VHDL和Verilog混合設計中的底層信號;支持加密IP;可以實現與Matlab的Simulink的聯合仿真。
3.2.1  ISE環境中ModelSim的使用
ModelSim是一個獨立的仿真工具,它在工作的時候并不需要其他軟件的協助,在Xilinx公司的ISE集成開發環境中給ModelSim仿真軟件預留了接口,通過這個接口可以從ISE集成環境中直接啟動ModelSim工具進行仿真。這個過程通常會給初學者一個錯覺,以為ISE集成環境和ModelSim工具是聯合工作的,其實ISE并沒有集成ModelSim工具,只是預留了軟件接口。為了說明ModelSim的用戶接口,將使用從ISE集成開發環境中直接啟動ModelSim仿真工具的方法。使用此種方法啟動ModelSim工具需要具備3個條件:第一,啟動ISE集成開發環境并建立了一個FPGA/CPLD的工程項目;第二,添加設計源代碼并且編譯通過;第三,使用ISE中的TestFixture或者TestBenchWaveform工具為當前的設計提供一個測試模板(Testbench),并且在測試模板中添加設計激勵。只有上述條件具備之后才可以從ISE的當前資源操作窗中直接啟動ModelSim工具并運行仿真,以下使用ISE自帶的一個例子加以說明。
在ISE中直接啟動ModelSim
1、在Windows操作系統中選擇[開始]/[程序]/[Xilinx ISE 6]/[Project Navigator]命令,啟動ISE集成開發環境。
2、在ISE主窗口中選擇[File]/[Open Example]命令,彈出[Open Example]對話框,如圖所示,然后在[Select an ExampleProject]欄目中選擇“goldcode-ver-217”,在[Destination Directory]中選擇項目存放的目錄,單擊OK按鈕打開例子程序。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
圖3-1 打開例子程序
3、在資源管理窗口(Source in Project)中的模塊視圖(Model View)中選中的測試文件“testbench.tf”,在相應的當前資源操作窗口(Process for CurrentSource)中將會出現與Modelsim仿真器相關的行為仿真(Simulate BehavioralVerilog Model),翻譯后仿真(Simulate Post-Map Verilog Model)和布局布線后仿真(Simulate Post-Place& Route Verilog Model)等4個不同的操作選項,如圖所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
圖 3-2 Modelsim 仿真
4、雙擊[Simulate BehavioralModel]操作選項,將啟動Modelsim仿真器。
5、在Modelsim主窗口中選擇[View]/[All]命令,將顯示所有的窗口。
在當前資源操作窗口中選擇任意一個操作選項都可以啟動相應階段的仿真操作,如果相應階段的仿真文件不存在,那么集成環境將自動生成仿真文件。例如,當雙擊資源操作窗口中的[Simulate Post-Place& Route Verilog Model]操作選項時將啟動時序仿真,而這一仿真過程所需要的布局布線后仿真文件以及時序標注文件都還沒有產生,那么ISE集成開發環境將自動開始對這個工程進行編譯,綜合,翻譯,映射和布局布線等操作,得到布局布線后仿真文件以及時序標注文件,然后再啟動ModelSim仿真器進行時序仿真。
3.3  ISE介紹
本節主要介紹在XILINX的ISE集成軟件環境中,如何用VHDL和原理圖的方式進行設計輸入,如何用ModelSim仿真工具對設計進行功能仿真和時序仿真,如何實現設計。
3.3.1  建立項目工程
建立新的項目工程,選擇【File】,再選擇【New Project】,如圖就可以了。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
圖 3-3 ISE建立新工程
選擇使用的可編程器件類型device family-器件族名device-器件型號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,最后點擊完成。剛生成的工程是沒有類型的,需要自己加入。方法是在 sources in project中右擊,選擇add sources,選擇你寫的文件加入即可。如果要新寫程序,用同樣的方法,選擇new sources即可,會彈出如下對話框,讓你選擇New Sources的類型。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
圖 3-5 選擇NewSources的類型
選擇vhdl module,寫上文件名,在下一頁可以寫上輸入輸出口,也可以不寫。一路NEXT到完成就可以。這樣就可以開始寫代碼或繼續下一步綜合了。要打開或編輯新建的文件,直接在sources in project窗口中雙擊該文件即可。
3.3.2  行為仿真
1、在工程項窗口Project Window的源文件中選中計數器(counter.vhd)。
2、選擇Project/New Source。
3、在新的對話框中選擇新文件類型為Test Bench Waveform。
4、鍵入文件名為counter_tbw。
5、點擊Next,在其他工程項中你可以將你的testbench波形與其他源文件關聯。
6、一直Next直到Finish,此時HDL Bencher 程序自動啟動并等候你輸入所需的時序需求,你現在可以指定仿真所需的時間參數、時鐘高電平時間和時鐘低電平時間一起定義了設計操作必須達到的時鐘周期,輸入建立時間定義了輸入在什么時候必須有效,輸出有效延時,定義了有效時鐘沿到達后多久必須輸出有效數據。
默認的初始化時間設置如下:
時鐘高電平時間:  Clock high time: 50 ns 。
時鐘低電平時間:  Clock low time: 50 ns 。
輸入建立時間:   Input setup time: 10 ns 。
輸出有效時間: Output valid delay: 10 ns 。
7、點擊OK,接受默認的時間設定。Testbench waveform窗口如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
圖 3-6 Testbench Waveform
在HDL Bencher 的波形中,初始化計數器輸入如下:
在每個單元的藍色區域輸入激勵。
a、在CLK第1周期下點擊RESET單元直到該單元變為。
b、在CLK第2周期下點擊RESET單元直到該單元變為低。
c、在CLK第3周期下點擊CE單元直到該單元變為高。
d、在CLK第2周期下點擊DIR單元直到該單元變為高。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
圖 3-7 激勵輸入
e、將你的testbench文件存盤,選擇File/Save Waveform或點擊工具欄的存盤圖標,接下來HDL Bencher會提示你設置你希望仿真的時鐘周期數。
f、在End the testbench __cycles after the last input assignment對話框中輸入8,默認值為1。
g、點擊OK.退出HDL Bencher新的testbench波形源文件counter_tbw.tbw自動加入到該工程項中。
8、生成預期的輸出響應:
我們進行行為仿真以驗證計數器模塊的功能。
a、在Sources in Project窗口中選擇counter_tbw.tbw文件。
b、在Processes for CurrentSource窗口中點擊+ 符號展開ModelSim仿真器的層次結構找到并雙擊Simulate BehavioralVHDL Model,此時ModelSim仿真器自動啟動。
c、對于第一次運行ModelSim的用戶會顯示一個對話框需要在其中做以下處理:選中Do not show thisdialog again選項,點擊Run ModelSim此對話框在你重新安裝或重新配置ModelSim之前將不再顯示你的仿真結果現在顯示在ModelSim的波形窗口(wave window)。
d、點擊Zoom / Zoom Full;點擊Zoom / Zoom in。
e、拖動波形窗口下端的滾動條至窗口的最左端。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
圖 3-8 仿真圖
3.3.3  建立頂層原理圖3.3.3.1  生成原理圖符號
1、在Sources in Project窗口中選中計數器模塊counter.vhd。
2、在Processes for CurrentSource窗口中,點擊設計輸入實用程序(Design Entry Utilities)之前的“+”符號然后雙擊創建原理圖符號(Create SchematicSymbol)經過以上步驟,名稱為“counter”的圖形化元件被放入到工程項庫中。
3.3.3.2  創建頂層原理圖
1、在工程項導航器(Project Navigator)菜單中,選擇Project/New Source。
2、選擇原理圖(Schematic)為源類型。
3、輸入原理圖名為“top”。
4、先點擊“Next”再點擊“Finish”,此時原理圖編輯器(ECS)自動啟動并在其原理圖窗口中打開一張空圖。
3.3.3.3  例化VHDL模塊
1、在菜單中選擇Add / Symbol或者在工具欄中點擊(Add Symbol)圖標。
2、從元件符號列表(在屏幕右側)中選擇計數器counter,注意不要在類別(Categories)窗口中作任何選擇。
3、點擊左鍵可將計數器counter放置在光標所在的位置出現。
4、按ESC鍵退出添加符號(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或者在工具欄中點擊 (Add Wire)圖標。
2、添加一根懸空線和延展連線,在計數器模塊的某一管腳單擊鼠標,然后將連線拉伸到需要的長度。再在連線端點處雙擊鼠標,給計數器模塊的每一管腳添加連線。
3、添加兩個元件符號之間的連線,在一個計數器模塊的管腳處單擊鼠標,在另一個計數器模塊的對應管腳處雙擊鼠標。連接好線后按ESC鍵退出添加連線(Add/Wire)模式。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
圖3-10 原理圖連線
3.3.3.5  添加輸入輸出管腳標記
1、在菜單中選擇Add/ (I/O Marker)或在工具欄中點擊(Add I/O Marker)圖標,連接好的圖如下。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
圖3-11 添加輸入輸出管腳
2、連接步驟:首先為clock,reset,ce,load,dir1和dir2添加輸入標記,同時為總線din1(3:0)和din2(3:0)添加輸入標記。在工具欄右邊的參數單選框中選擇輸入(Input);將鼠標移動到輸入信號線的端點,此時光標處顯示出輸入標記的圖形;點擊鼠標左鍵,輸入標記會將網絡名或總線名包含在標記圖形的內部。
3、按如下步驟為count總線添加雙向信號標記。在工具欄右邊的參數單選框中選擇雙向(Bidirectional);將鼠標移動到輸出信號線的端點,此時光標處顯示出雙向信號標記的圖形;點擊鼠標左鍵。
4、在菜單中選擇File/Save,保存原理圖,退出原理圖編輯器(ECS)。
3.3.4  綜合3.3.4.1  Synthesize綜合
當你編寫程序后,并把頂層原理圖連接好以后,就可以綜合了。選中你的頂層文件,雙擊Synthesize-SynplifyPro。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
圖3-12 綜合
如果出現上圖的小勾,表示綜合沒有問題。你可以雙擊View RTL Schematic來查看綜合后的RTL原理圖。
3.3.4.2  定義輸入輸出管腳約束
選中頂層文件,雙擊下圖中的Assign Package Pins,該操作會提示系統將生成一個.ucf文件,選擇是,系統將自動啟動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
現在就可以在LOC欄寫上管腳名,定義I/O電平類型,輸出電流大小等,需要注意的是一些I/O是有特殊用處的,不能胡亂分配。定義完后保存退出。
3.3.5  布局布線
雙擊Implement Design,會依次執行Translate,Map,Place&Route。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
圖3-15 設計實現
3.3.6  下載及硬件仿真
選中頂層文件,雙擊運行Generate ProgrammingFile,運行后生成相應的(.Bit)下載文件。該文件將下載到芯片中實現設計。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
圖3-16 生成下載文件
再雙擊上圖Configure Device。運行后跳出下載界面,選擇主從下載文式(Slave Serial Mode),點擊完成。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg
圖3-17 下載方式
右鍵點擊元件,點擊Program,選擇相應的BIT文件開始下載。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg
圖3-18 下載位文件
成功下載后就可以在FPGA板子上運行和測試了。
第四章  數字秒表的設計與實現
一、  項目任務與設計思路
1、實驗項目
數字秒表的設計
2、實驗指標
晶振輸入信號:50MHZ時鐘信號
計時范圍范圍為:00:00:00到59:59:99
按鈕開關:start/stop,split/reset
     在秒表已經被復位的情況下,按下start/stop鍵,秒表開始計時。在秒表正常運行的情況下,如果按下start/stop鍵,則秒表暫停計時;再次按下該鍵,秒表繼續計時。在秒表正常運行情況下,如果按下split/reset鍵,顯示停止在按鍵時間,但秒表仍然計時,再次按下該鍵,秒表恢復正常顯示。在秒表暫停計時情況下,按下split/reset鍵,秒表復位歸零。
顯示工作方式:用六位BCD七段數碼管顯示讀數。
3、實驗思路
根據實驗指標,將電路設計分成6個模塊:分頻器,計數器,鎖存器,掃描顯示控制,按鍵消陡,控制電路
二、  基于VHDL方法的設計方案
1、系統需求和解決方案計劃
在項目開始設計時,首先要確定系統的需求并發展出一個針對這些需求的計劃。
晶振   本設計所用為 50MHz的晶振信號。
分頻器
  對晶體振蕩器產生的時鐘信號進行分頻,產生時間基準信號。本設計中將50MHz的信號分頻成1KHz的基準頻率
計數器
  對時間基準脈沖進行計數,完成計時功能。本設計中采用六進制與十進制計數器級聯的形式。
數據鎖存器
  鎖存數據使顯示保持暫停
控制器
  控制計數器的運行、停止以及復位、產生鎖存器的使能信號。本設計中為一個moore機,可以讓狀態編碼為相應的輸出以方便程序編寫。
掃描顯示的控制電路
    包括掃描計數器、數據選擇器、3*8譯碼器和7段譯碼器,控制8個數碼管
以掃描方式顯示計時結果。本設計中一個八進制的計數器產生的掃描信號同時
完成從鎖存器送來的信號的選擇以及LED數碼管的選擇。
按鍵消抖電路
    消除按鍵輸入信號抖動的影響,輸出單脈沖。本設計中采用軟件延時的消抖方法。
2、設計方框圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg
四、系統電路設計
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
五、系統單元模塊設計
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、計數器模塊
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模十計數器模塊:
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模六計數器:
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掃描計數模塊
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數據選擇模塊
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、數字秒表頂層連接模塊
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;
三、  系統硬件實現與調試
管腳分配:
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;
第五章  實驗總結及心得體會
1、這次實驗是利用VHDL語言完成基于FPGA的數字秒表的設計與實現。通過實驗掌握了設計方案以及各模塊的設計過程及其實現的功能,及對設計中遇到的問題分析和解決方法;學會了利用ISE和ModelSim對設計進行了仿真,分析,綜合還熟悉了Xilinx ISE 和ModelSim軟件的用法和VHDL 的編程環境,,并最終下載到Spartan3E系列芯片中,實現了對數字秒表的測量。
2、通過《電子技術綜合實驗》課程的學習,我第一次接觸到VHDL語言,并學會了用VHDL語言設計簡單的電路模塊。使我對系統設計原理、主要性能參數的選擇原則、單元電路和系統電路設計方法及仿真技術、測試方案擬定及調測技術有了初步了解;初步掌握電子技術中應用開發的一般流程,初步建立起有關系統設計的基本概念,掌握其基本設計方法,為將來走出校園從事電子技術應用和研究工作打下基礎

FPGA秒表實驗報告.docx

1.63 MB, 下載次數: 3

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠操狠狠干 | 久久久久国产一区二区三区 | 观看毛片 | 亚洲精品久久久蜜桃网站 | 国产精品日韩欧美一区二区三区 | 国产欧美一区二区三区在线看 | 国产精品中文字幕在线 | 中文字幕高清 | 成人免费观看男女羞羞视频 | 国产精久久久 | 欧美一区二区三区视频在线播放 | 日韩亚洲视频在线 | 免费观看的黄色网址 | 久久久久久久一区 | 成年人免费看的视频 | 精品国产一区二区三区观看不卡 | 日本免费一区二区三区四区 | 日韩精品久久一区二区三区 | 欧美亚洲另类在线 | 欧美日本在线观看 | 99久久久久久 | 欧美日韩精品一区二区三区四区 | sese视频在线观看 | 国产日韩欧美中文字幕 | 国产欧美精品一区二区三区 | 一级黄在线观看 | 盗摄精品av一区二区三区 | 在线成人av | 欧美一级视频 | 亚洲高清在线 | 久久亚洲精品国产精品紫薇 | 亚洲一区在线免费观看 | 亚洲一区二区综合 | 国产在线精品免费 | 中文字幕国产 | 在线成人av | 中文字幕av在线 | 99视频在线免费观看 | 久久精品国产一区二区三区不卡 | 国产专区视频 | h视频在线免费观看 |