版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 摘要</b></p><p> 通用串口是遠程通信接口,在數(shù)字系統(tǒng)使用很普遍,是一個很重要的部件。本論文使用Verilog HDL 語言描述硬件功能,利用QuartusII 5.0在 FPGA 芯片上的綜合描述,采用模塊化設(shè)計方法設(shè)計UART(通用異步收發(fā)器)的各個模塊。其中包括波特發(fā)生器,程序控制器,UART數(shù)據(jù)接收器和UART數(shù)據(jù)發(fā)送器,本文采用的外部時鐘
2、為48MHZ,波特率為9600。在QuartusII 5.0和Modelsim6.0環(huán)境下進行設(shè)計、編譯和仿真。最后的程序編譯仿真表明系統(tǒng)數(shù)據(jù)完全正確。</p><p> 關(guān)鍵詞:VerilogHDL; UART;幀格式;FPGA;</p><p><b> Abstract</b></p><p> In this paper, the
3、 use of hardware description languages Verilog VHDL function, the use of Altera's FPGA chips, the design of modular design method of UART (Universal Asynchronous Receiver Transmitter) of each module, including Porter
4、, generators, process controllers, UART receiver data and the UART transmitter data. QuartusII 5.0 and Modelsim6.0 in environment design, compilation, simulation and downloading. Finally, simulation results show that the
5、 procedures for compiling data entirely correc</p><p> Key words: VerilogHDL; UART; frame format; FPGA</p><p><b> 目錄</b></p><p><b> 第一章 緒論1</b></p>
6、<p><b> 1.1引言1</b></p><p> 1.2 什么是Verilog HDL?1</p><p><b> 1.3 歷史2</b></p><p> 1.4 主要能力2</p><p><b> 1.5 模塊4</b><
7、/p><p> 1.6 數(shù)據(jù)流描述方式5</p><p> 第二章片上系統(tǒng)SOC與FPGA的現(xiàn)狀6</p><p> 2.1 片上系統(tǒng)SOC介紹6</p><p> 2.2 FPGA技術(shù)介紹6</p><p> 2.3 FPGA 核心設(shè)計流程7</p><p> 2.3.1 設(shè)
8、計流程圖7</p><p> 2.3.2關(guān)鍵步驟的實現(xiàn)8</p><p> 2.3.2.1 功能仿真8</p><p> 2.3.2.2 邏輯綜合9</p><p> 2.3.2.3 前仿真9</p><p> 2.3.2.4 布局布線10</p><p> 2.3.2.
9、5 后仿真(時序仿真)11</p><p> 第三章UART設(shè)計12</p><p> 3.1 UART的幀格式12</p><p> 3.2 UART模塊13</p><p> 3.2.1主要引腳功能介紹13</p><p> 3.2.2UART主體程序14</p><p&g
10、t; 3.3UART發(fā)送模塊15</p><p> 3.3.1UART的數(shù)據(jù)發(fā)送服務(wù)15</p><p> 3.3.2UART的數(shù)據(jù)發(fā)送操作16</p><p> 3.3.3UART的數(shù)據(jù)發(fā)送模塊程序17</p><p> 3.3.4UART的數(shù)據(jù)發(fā)送模塊程序仿真圖20</p><p> 3.4U
11、ART接收模塊21</p><p> 3.4.1UART數(shù)據(jù)接收服務(wù)21</p><p> 3.4.2UART數(shù)據(jù)接收操作22</p><p> 3.4.3UART的數(shù)據(jù)接收模塊程序22</p><p> 3.4.4UART的數(shù)據(jù)接收模塊程序功能仿真圖25</p><p> 3.5UART控制器2
12、6</p><p> 3.5.1UART控制器服務(wù)26</p><p> 3.5.2UART控制器模塊程序26</p><p> 3.5.3UART控制器模塊程序仿真圖28</p><p> 3.6UART波特發(fā)生器29</p><p> 3.6.1UART波特發(fā)生器服務(wù)29</p>
13、<p> 3.6.2UART波特發(fā)生器模塊程序29</p><p> 3.6.13UART波特發(fā)生器程序仿真圖30</p><p><b> 結(jié)論31</b></p><p><b> 參考文獻32</b></p><p><b> 致謝33</b>
14、;</p><p><b> 附錄34</b></p><p><b> 外文資料原文35</b></p><p><b> 譯文43</b></p><p><b> 緒論</b></p><p><b>
15、 1.1引言</b></p><p> 21世紀(jì),電子技術(shù)迅猛發(fā)展,高新技術(shù)日新月異。傳統(tǒng)的設(shè)計方法正逐步退出歷史舞臺,取而代之的是基于EDA技術(shù)的芯片設(shè)計技術(shù),它正在成為電子系統(tǒng)設(shè)計的主流。大規(guī)??删幊唐骷F(xiàn)場可編程門陣列FPGA(Field Programmable Gate Array)和復(fù)雜可編程邏輯器件CPLD(Complex Programmable Logic Device)是當(dāng)今應(yīng)
16、用最廣泛的兩類可編程專用集成電路(ASIC)。其性能好、可靠性高、容量大、體積小,微功耗、速度快、使用靈活、設(shè)計周期短、開發(fā)成本低,靜態(tài)可重復(fù)編程、動態(tài)在系統(tǒng)重構(gòu)、硬件功能可以像軟件一樣通過編程來修改,極大地提高了電子系統(tǒng)設(shè)計的靈活性和通用性。電子工程師和科學(xué)研究人員利用該類器件可以在辦公室或?qū)嶒炇以O(shè)計出所需要的專用集成電路,大大縮短產(chǎn)品的研發(fā)周期和降低成本。</p><p> 近年來,可編程邏輯器件的開發(fā)生產(chǎn)
17、和銷售規(guī)模以驚人的速度增長,且廣泛地應(yīng)用于航空航天、網(wǎng)絡(luò)通信、軍用雷達、儀器儀表、工業(yè)控制、醫(yī)用CT、家用電器、手機和計算機等各個領(lǐng)域。它的廣泛應(yīng)用,使傳統(tǒng)的設(shè)計方法正在進行一場巨大的變革。異步串行通信要求的傳輸線少,可靠性高,傳輸距離遠,被廣泛應(yīng)用于微機和外設(shè)的數(shù)據(jù)交換。通常都由通用異步收發(fā)器UART(Universal AsynchronousReceiver- Transmitter)來實現(xiàn)該功能,如IBM PC 機中作為串行接口
18、芯片的National INS 8250。在實際應(yīng)用中,往往只需要UART 的幾個主要功能,專用的接口芯片會造成資源浪費和成本提高,特別是近來電子設(shè)計領(lǐng)域中日趨成熟的SOC 技術(shù),由于要在單塊或極少數(shù)的幾塊芯片中實現(xiàn)整個系統(tǒng)的功能,設(shè)計者就可以將類似UART的功能模塊集成到FPGA 中。</p><p> 1.2 什么是Verilog HDL?</p><p> Verilog HD
19、L是一種硬件描述語言,用于從算法級、門級到開關(guān)級的多種抽象設(shè)計層次的數(shù)字系統(tǒng)建模。被建模的數(shù)字系統(tǒng)對象的復(fù)雜性可以介于簡單的門和完整的電子數(shù)字系統(tǒng)之間。數(shù)字系統(tǒng)能夠按層次描述,并可在相同描述中顯式地進行時序建模。Verilog HDL 語言具有下述描述能力:設(shè)計的行為特性、設(shè)計</p><p> 的數(shù)據(jù)流特性、設(shè)計的結(jié)構(gòu)組成以及包含響應(yīng)監(jiān)控和設(shè)計驗證方面的時延和波形產(chǎn)生機制。所有這些都使用同一種建模語言。此外,
20、 Verilog HDL語言提供了編程語言接口,通過該接口可以在模擬、驗證期間從設(shè)計外部訪問設(shè)計,包括模擬的具體控制和運行。Verilog HDL語言不僅定義了語法,而且對每個語法結(jié)構(gòu)都定義了清晰的模擬、仿真語義。</p><p> 因此,用這種語言編寫的模型能夠使用Ve r i l o g仿真器進行驗證。語言從C編程語言中繼承了多種操作符和結(jié)構(gòu)。Verilog HDL提供了擴展的建模能力,其中許多擴展最初很難
21、理解。但是,Verilog HDL語言的核心子集非常易于學(xué)習(xí)和使用,這對大多數(shù)建模應(yīng)用來說已經(jīng)足夠。當(dāng)然,完整的硬件描述語言足以對從最復(fù)雜的芯片到完整的電子系統(tǒng)進行描述。</p><p><b> 1.3 歷史</b></p><p> Verilog HDL語言最初是于1 9 8 3年由Gateway Design Automation 公司為其模擬器產(chǎn)品開發(fā)的
22、硬件建模語言。那時它只是一種專用語言。 由于他們的模擬、仿真器產(chǎn)品的廣泛使用,Verilog HDL 作為一種便于使用且實用的語言逐漸為眾多設(shè)計者所接受。在一次努力增加語言普及性的活動中, Verilog HDL語言于1 9 9 0年被推向公眾領(lǐng)域。Open Verilog International(O V I)是促進Ve r i l o g發(fā)展的國際性組織。1 9 9 2年, O V I決定致力于推廣Verilog OVI標(biāo)準(zhǔn)成為I
23、 E E E標(biāo)準(zhǔn)。這一努力最后獲得成功, Verilog 語言于1 9 9 5年成為I E E E標(biāo)準(zhǔn),稱為IEEE Std1 3 6 4-1 9 9 5。完整的標(biāo)準(zhǔn)在Ve r i l o g硬件描述語言參考手冊中有詳細描述。</p><p><b> 1.4 主要能力</b></p><p> 下面列出的是Ve r i l o g硬件描述語言的主要能力:<
24、/p><p> ? 基本邏輯門,例如a n d、o r和n a n d等都內(nèi)置在語言中。</p><p> ? 用戶定義原語( U D P)創(chuàng)建的靈活性。用戶定義的原語既可以是組合邏輯原語,也可以是時序邏輯原語。</p><p> ? 開關(guān)級基本結(jié)構(gòu)模型,例如p m o s 和n m o s等也被內(nèi)置在語言中。</p><p> ? 提供
25、顯式語言結(jié)構(gòu)指定設(shè)計中的端口到端口的時延及路徑時延和設(shè)計的時序檢查。</p><p> ? 可采用三種不同方式或混合方式對設(shè)計建模。這些方式包括:行為描述方式—使用過程化結(jié)構(gòu)建模;數(shù)據(jù)流方式—使用連續(xù)賦值語句方式建模;結(jié)構(gòu)化方式—使用門和模塊實例語句描述建模。</p><p> ? Verilog HDL中有兩類數(shù)據(jù)類型:線網(wǎng)數(shù)據(jù)類型和寄存器數(shù)據(jù)類型。線網(wǎng)類型表示構(gòu)件間的物理連線,而寄
26、存器類型表示抽象的數(shù)據(jù)存儲元件。</p><p> ? 能夠描述層次設(shè)計,可使用模塊實例結(jié)構(gòu)描述任何層次。</p><p> ? 設(shè)計的規(guī)模可以是任意的;語言不對設(shè)計的規(guī)模(大?。┦┘尤魏蜗拗啤?lt;/p><p> ? Verilog HDL不再是某些公司的專有語言而是I E E E標(biāo)準(zhǔn)。</p><p> ? 人和機器都可閱讀Veri
27、log 語言,因此它可作為E D A的工具和設(shè)計者之間的交互語言。</p><p> ? Verilog HDL語言的描述能力能夠通過使用編程語言接口( P L I)機制進一步擴展。P L I是允許外部函數(shù)訪問Verilog 模塊內(nèi)信息、允許設(shè)計者與模擬器交互的例程集合。</p><p> ? 設(shè)計能夠在多個層次上加以描述,從開關(guān)級、門級、寄存器傳送級( RT L)到算法級,包括進程和
28、隊列級。</p><p> ? 能夠使用內(nèi)置開關(guān)級原語在開關(guān)級對設(shè)計完整建模。</p><p> ? 同一語言可用于生成模擬激勵和指定測試的驗證約束條件,例如輸入值的指定。</p><p> ? Verilog HDL 能夠監(jiān)控模擬驗證的執(zhí)行,即模擬驗證執(zhí)行過程中設(shè)計的值能夠被監(jiān)控和顯示。這些值也能夠用于與期望值比較,在不匹配的情況下,打印報告消息。</
29、p><p> ? 在行為級描述中, Verilog HDL不僅能夠在RT L級上進行設(shè)計描述,而且能</p><p> 夠在體系結(jié)構(gòu)級描述及其算法級行為上進行設(shè)計描述。</p><p> ? 能夠使用門和模塊實例化語句在結(jié)構(gòu)級進行結(jié)構(gòu)描述。建</p><p> 模能力,即在一個設(shè)計中每個模塊均可以在不同設(shè)計層次上建模。</p>
30、<p> ? Verilog HDL 還具有內(nèi)置邏輯函數(shù),例如&(按位與)和|(按位或)。</p><p> ? 對高級編程語言結(jié)構(gòu),例如條件語句、情況語句和循環(huán)語句,語言中都可以使用。</p><p> ? 可以顯式地對并發(fā)和定時進行建模。</p><p> ? 提供強有力的文件讀寫能力。</p><p>
31、? 語言在特定情況下是非確定性的,即在不同的模擬器上模型可以產(chǎn)生不同</p><p> 的結(jié)果;例如,事件隊列上的事件順序在標(biāo)準(zhǔn)中沒有定義。</p><p><b> 1.5模塊</b></p><p> 模塊是Verilog 的基本描述單位,用于描述某個設(shè)計的功能或結(jié)構(gòu)及其與其他模塊通信的外部端口。一個設(shè)計的結(jié)構(gòu)可使用開關(guān)級原語、門級原
32、語和用戶定義的原語方式描述; 設(shè)計的數(shù)據(jù)流行為使用連續(xù)賦值語句進行描述; 時序行為使用過程結(jié)構(gòu)描述。一個模塊可以在另一個模塊中使用。一個模塊的基本語法如下:</p><p> Module modulename(portlist);</p><p> Declarations;</p><p> reg, wire, parameter,</p>
33、<p> input, output, inout,</p><p> function, task, . . .</p><p> Statements:</p><p> Initial statement</p><p> Always statement</p><p> Module
34、instantiation</p><p> Gate instantiation</p><p> UDP instantiation</p><p> Continuous assignment</p><p><b> endmodule</b></p><p> 說明部分用于定義
35、不同的項,例如模塊描述中使用的寄存器和參數(shù)。語句定義設(shè)計的功能和結(jié)構(gòu)。說明部分和語句可以散布在模塊中的任何地方;但是變量、寄存器、線網(wǎng)和參數(shù)等的說明部分必須在使用前出現(xiàn)。為了使模塊描述清晰和具有良好的可讀性, 最好將所有的說明部分放在語句前。本書中的所有實例都遵守這一規(guī)范。</p><p> 圖1- 2為建模一個半加器電路的模塊的簡單實例。</p><p> Module halfad
36、der(A,B,Sum,Carry);</p><p> Input: A, B;</p><p> Output: Sum, Carry;</p><p> assign #2 Sum = A ^ B;</p><p> assign #5 Carry = A & B;</p><p> end
37、module圖1-2半加法器</p><p> 模塊的名字是halfadder。模塊有4個端口: 兩個輸</p><p> 入端口A和B,兩個輸出端口S u m和C a rry。由于沒有定義端口的位數(shù), 所有端口大小都為1位;同時, 由于沒有各端口的數(shù)據(jù)類型說明, 這四個端口都是線網(wǎng)數(shù)據(jù)類型。模塊包含兩條描述半加器數(shù)據(jù)流行為的連續(xù)賦值語句。從這種意義上講,這些語句在模塊中出現(xiàn)的順序
38、無關(guān)緊要,這些語句是并發(fā)的。每條語句的執(zhí)行順序依賴于發(fā)生在變量A和B上的事件。</p><p> 在模塊中,可用下述方式描述一個設(shè)計:</p><p><b> 1) 數(shù)據(jù)流方式;</b></p><p><b> 2) 行為方式;</b></p><p><b> 3) 結(jié)構(gòu)方式
39、;</b></p><p> 4) 上述描述方式的混合。</p><p> 1.6 數(shù)據(jù)流描述方式</p><p> 用數(shù)據(jù)流描述方式對一個設(shè)計建模的最基本的機制就是使用連續(xù)賦值語句。在連續(xù)賦值語句中,某個值被指派給線網(wǎng)變量。連續(xù)賦值語句的語法為:</p><p> a s s i g n [d e l a y] L H
40、S n e t = RHS_ expression;</p><p> 右邊表達式使用的操作數(shù)無論何時發(fā)生變化, 右邊表達式都重新計算, 并且在指定的時延后變化值被賦予左邊表達式的線網(wǎng)變量。時延定義了右邊表達式操作數(shù)變化與賦值給左邊表達式之間的持續(xù)時間。如果沒有定義時延值, 缺省時延為0。</p><p> 1.6 行為描述方式</p><p> 設(shè)計的行為功
41、能使用下述過程語句結(jié)構(gòu)描述:</p><p> 1)initial語句:此語句只執(zhí)行一次。</p><p> 2) always語句:此語句總是循環(huán)執(zhí)行, 或者說此語句重復(fù)執(zhí)行。</p><p> 只有寄存器類型數(shù)據(jù)能夠在這兩種語句中被賦值。寄存器類型數(shù)據(jù)在被賦新值前保持原有值不變。所有的初始化語句和a l w a y s語句在0時刻并發(fā)執(zhí)行。</p&g
42、t;<p> 第二章片上系統(tǒng)SOC與FPGA的現(xiàn)狀</p><p> 2.1 片上系統(tǒng)SOC介紹</p><p> SOC(systemonChip)稱為片上系統(tǒng)。它最早產(chǎn)生于20世紀(jì)90年代中期,是一種將一個完整系統(tǒng)所有不同的功能塊一次直接集成于一顆硅片上的技術(shù)。根據(jù)這種技術(shù)所制造出的芯片,就叫做片上系統(tǒng),也稱為系統(tǒng)級芯片。SOC由可設(shè)計復(fù)用的IP核組成,采用超深亞微
43、米工藝技術(shù)制造。這種結(jié)構(gòu)使得在芯片設(shè)計過程中,能做到各種資源的最優(yōu)化利用,使設(shè)計周期縮短,資源利用率最高。</p><p> 在一般設(shè)計過程中,設(shè)計人員要做的只是前端設(shè)計,如系統(tǒng)結(jié)構(gòu)設(shè)計、硬件編程、功能仿真、時序仿真,然后向芯片制造商提供生成的網(wǎng)表。芯片制造商則負責(zé)芯片的物理設(shè)計、封裝、測試等工作。但是隨著系統(tǒng)集成度的不斷提高以及終端用戶需求的多樣化,系統(tǒng)功能愈來愈復(fù)雜,如何確定系統(tǒng)結(jié)構(gòu)并完成軟硬件的劃分,傳統(tǒng)
44、的系統(tǒng)設(shè)計方法己經(jīng)不能很好滿足設(shè)計的需求。為了提高芯片的設(shè)計效率,縮短設(shè)計周期,系統(tǒng)設(shè)計需要新的設(shè)計理論體系和設(shè)計方法,以克服傳統(tǒng)設(shè)計方法中前端設(shè)計和后端設(shè)計相互分離的弊病 。SOC技術(shù)從誕生到目前被廣泛采用,也正是基于這一背景。本文設(shè)計工作采用的FPGA技術(shù),就是目前流行的一種SOC。</p><p> 2.2 FPGA技術(shù)介紹</p><p> FPGA(Field Program
45、mable Gate Array)稱為現(xiàn)場可編程門陣列,是在CPLD的基礎(chǔ)上發(fā)展起來的新型高性能可編程邏輯器件,它一般采用SRAM工藝,也有一些專用器件采用Flash工藝或反熔絲(Anti一Fuse)工藝等。FPGA的集成度很高,其器件密度從數(shù)萬系統(tǒng)門到數(shù)千萬系統(tǒng)門不等,可以完成極其復(fù)雜的組合與時序邏輯電路功能,適用于高速、高密度的高端數(shù)字邏輯電路設(shè)計領(lǐng)域。使用FPGA技術(shù)設(shè)計各種大規(guī)?;虺笠?guī)模的組合、時序邏輯電路,不僅可以使設(shè)計者避
46、免直接與若干復(fù)雜煩瑣的電路元器件的選擇布線直接接觸,而且開發(fā)設(shè)計過程中采用的類似于軟件開發(fā)的模塊化設(shè)計方法還更加便于多人合作設(shè)計開發(fā),這就極大地提高了產(chǎn)品規(guī)劃設(shè)計的效率。因此,F(xiàn)PGA技術(shù)己經(jīng)成為目前國際上通</p><p> 行的硬件芯片產(chǎn)品設(shè)計開發(fā)的主流。</p><p> 現(xiàn)在通用的FPGA芯片都含有大容量的ROM和RAM單元、可編程邏輯單元、豐富的布線資源等基本組成部分,這些資
47、源已經(jīng)完全可以滿足目前絕大多數(shù)設(shè)計開發(fā)的需要。隨著工藝技術(shù)的發(fā)展與市場需要,超大規(guī)模、高速、低功耗的新型FPGA不斷推陳出新。一些高級的FPGA智能芯片甚至包含了中央處理器(CPU)和內(nèi)嵌專用硬核。FPGA的主要器件供應(yīng)商有Xilinx、Altera、Lattice、Actel</p><p> 和Atmel等,本文工作所用的FPGA開發(fā)板和芯片就是由Altera公司提供的。</p><p&
48、gt; 2.3 FPGA 核心設(shè)計流程</p><p> 2.3.1 設(shè)計流程圖</p><p> 圖2-1FPGA設(shè)計流程圖</p><p><b> 說明:</b></p><p> 邏輯仿真器主要指modelsim,Verilog-XL。</p><p> 邏輯綜合器主要指Le
49、onardoSpectrum、Synplify、FPGA Express/FPGA Compiler等。</p><p> FPGA廠家工具指的是如Altera的Max+PlusII、QuartusII,Xilinx的Foundation、Alliance、ISE4.1等。</p><p> 2.3.2關(guān)鍵步驟的實現(xiàn)</p><p> 2.3.2.1 功能仿真
50、</p><p> 圖2-2FPGA設(shè)計流程之功能仿真</p><p><b> 說明:</b></p><p> “調(diào)用模塊的行為仿真模型”指的是RTL代碼中引用的由廠家提供的宏模塊/IP,如Altera 提供的LPM庫中的乘法器、存儲器等部件的行為模型。</p><p> 2.3.2.2 邏輯綜合</p
51、><p> 圖2-3FPGA設(shè)計流程之邏輯綜合</p><p><b> 說明:</b></p><p> “調(diào)用模塊的黑盒子接口”的導(dǎo)入,是由于RTL代碼調(diào)用了一些外部模塊,而這些外部模塊不能被綜合或無需綜合,但邏輯綜合器需要其接口的定義來檢查邏輯并保留這些模塊的接口。</p><p> 2.3.2.3 前仿真&l
52、t;/p><p> 如圖2-4FPGA設(shè)計流程之前仿真</p><p><b> 說明:</b></p><p> 一般來說,對FPGA設(shè)計這一步可以跳過不做,但可用于debug綜合有無問題。</p><p> 2.3.2.4 布局布線 </p><p> 圖2-5FPGA設(shè)計流程之布局布
53、線</p><p> 2.3.2.5 后仿真(時序仿真) </p><p> 圖2-6FPGA設(shè)計流程之后仿真</p><p> 隨著微機系統(tǒng)的廣泛運用和微機網(wǎng)絡(luò)的極大發(fā)展,UART(Universal Asynchronous Receive Transmitter)在數(shù)據(jù)通信及控制系統(tǒng)中得到了廣泛運用。8250,NS 16450等芯片都是常見的UAR
54、T器件,這類芯片己經(jīng)相當(dāng)復(fù)雜,有的含有許多輔助模塊(如FIFO),但在實際中有時只需要使用UART的部分功能,因而會造成一定的資源浪費。</p><p> FPGA在現(xiàn)代電子設(shè)計中的廣泛運用,使我們可以充分利用其資源,在芯片上集成UART的功能模塊,這樣就無需外接專用UART芯片,從而簡化了電路,縮小了體積,設(shè)計的靈活性更大。</p><p><b> 第三章UART設(shè)計&l
55、t;/b></p><p> 3.1 UART的幀格式</p><p> 在 UART 中,數(shù)據(jù)位是以字符為傳送單位,數(shù)據(jù)的前、后要有起始位、停止位,另外可以在停止位的前面加上一個比特(bit)的校驗位。其幀格式如圖所示。</p><p><b> 數(shù)據(jù)位</b></p><p> 起始位D0 D1 D2
56、 D3 —————— D7 校驗位 停止位</p><p> 以9600波特率接收或發(fā)送,每一位時間為</p><p> 1/9600秒,或48MHZ晶振5000次計數(shù)</p><p><b> 圖3_1數(shù)據(jù)幀格式</b></p><p> 文章 通 過 分析UART的功能,利用有限狀態(tài)機來描述UART核心控制
57、邏輯的方法,將其核心功能集成,從而使整個設(shè)計更加穩(wěn)定、可靠?;镜腢ART通信只需要兩條信號線就可以完成數(shù)據(jù)的相互通信。UART的功能模塊如圖3_2所示。</p><p><b> 波特發(fā)生器</b></p><p><b> Uart控制器</b></p><p><b> 接收模塊發(fā)送模塊</b
58、></p><p><b> 對象模塊</b></p><p> 圖3_2UART的功能模塊圖</p><p> 3.2 UART模塊</p><p> 在大規(guī)模電路的設(shè)計中,廣泛采用層次化,結(jié)構(gòu)化的設(shè)計方法。它將一個完整的硬件設(shè)計任務(wù)從系統(tǒng)級開始,劃分為若干個可操作的模塊,編制出相應(yīng)的模型并進行仿真驗證,
59、最后在系統(tǒng)級上進行組合。這樣在提高設(shè)計效率的同時又提高了設(shè)計質(zhì)量,是目前復(fù)雜數(shù)字系統(tǒng)實現(xiàn)的主要手段,也是本文設(shè)計思想的基礎(chǔ)。</p><p> 其系統(tǒng)模塊可劃分為4個部分,如波特發(fā)生器,控制器,接收器,發(fā)送器,如圖3-3所示:</p><p><b> readsend</b></p><p> Clr3 clr4ks</p&
60、gt;<p> csData_in</p><p> Data_outclear</p><p> Read_enablesend_enable</p><p> counterscounters</p><p> resetCounters(control)</p><p><
61、;b> state</b></p><p> T1clk_enable</p><p><b> Clk_clear</b></p><p> Clk(波特發(fā)生器)</p><p><b> clk</b></p><p> 圖3-3uart結(jié)
62、構(gòu)圖</p><p> 3.2.1主要引腳功能介紹</p><p> Read:串行輸入send:串行輸出</p><p> Data_in:并行輸入data_out:并行輸出</p><p> Cs:通知cpu接收數(shù)據(jù)位ks:通知cpu發(fā)送準(zhǔn)備位</p><p> Reset:重啟
63、輸入state:uart狀態(tài)輸入</p><p> Clk:48M時鐘輸入</p><p> 3.2.2UART主體程序</p><p> module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out);</p><p> input read,clk,reset,st
64、ate;</p><p> //read為串行輸入,clk為時鐘輸入48MHZ,reset為重啟鍵</p><p> input[7:0] dat_in;//并行數(shù)據(jù)輸入</p><p> output send,cs,ks;</p><p> //send為串行輸出,cs為通知cpu接收數(shù)據(jù)位,ks為發(fā)送準(zhǔn)備位</p>
65、<p> output[7:0] dat_out;//并行數(shù)據(jù)輸出</p><p> wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1;</p><p> wire[7:0] counters,dat_in;</p><p> read u1 (dat_out,cs,re
66、ad,reset,clk_enable,clk,</p><p> read_enable,clear3,counters);//接收數(shù)據(jù)module</p><p> send u2 (dat_in,ks,send,reset,clk_enable,clk,</p><p> send_enable,clear4,counters);//發(fā)送數(shù)據(jù)module
67、</p><p> clk u3 (clk,t1,clk_enable); //時鐘計數(shù)器模塊</p><p> counters u4(read_enable,send_enable,clk,state,t1,read,counters,reset,clear);</p><p> check u5 (state,clear3,clear4,clear,cl
68、k_enable3,</p><p> clk_enable4,clk_enable);</p><p><b> endmodule</b></p><p> /////////////////////////////////////////////////////////////////////////////////////////
69、//////////////////////</p><p> module read(dat_out,cs,read,reset,clk_enable3,</p><p> clk,read_enable,clear3,counters);//接收數(shù)據(jù)module</p><p> input read_enable;</p><p>
70、; input read,reset,clk;</p><p> //read為串行輸入,read_control為時鐘控制,reset為重啟鍵</p><p> input[7:0] counters;</p><p> output cs,clear3,clk_enable3;//cs為通知cpu讀取數(shù)據(jù)位</p><p> o
71、utput[7:0] dat_out;</p><p><b> endmodule</b></p><p> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><
72、p> module send(dat_in,ks,send,reset,clk_enable4,clk,</p><p> send_enable,clear4,counters);//發(fā)送數(shù)據(jù)module</p><p> input[7:0] dat_in,counters;</p><p> input reset,clk,send_enabl
73、e;</p><p> output send,clk_enable4,clear4,ks;//ks為通知cpu發(fā)送準(zhǔn)備位</p><p><b> endmodule</b></p><p> ////////////////////////////////////////////////////////////////////////
74、///////////////////////////////////////</p><p> module counters(read_enable,send_enable,clk,</p><p> state,t1,read,counters,reset,clear);//控制器module</p><p> input clk,state,t1,re
75、ad,reset,clear;//state為uart狀態(tài)輸入,</p><p> //clear為程序計數(shù)寄存器清零控制位</p><p> output[7:0] counters;</p><p> output read_enable,send_enable;</p><p><b> endmodule</b
76、></p><p> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p> module clk(clk,t1,clk_enable);//時鐘計數(shù)器模塊</p>
77、;<p> input clk,clk_enable;</p><p> output t1;</p><p><b> endmodule</b></p><p> //////////////////////////////////////////////////////////////////////////////
78、/////////////////////////////////////////</p><p> module check(state,clear3,clear4,clear,clk_enable3,</p><p> clk_enable4,clk_enable);//clear選擇模塊</p><p> input state,clear3,clear
79、4,clk_enable3,clk_enable4;</p><p> output clear,clk_enable;</p><p> assign clear=state?clear4:clear3;</p><p> assign clk_enable==state?clk_enable4:clk_enable3;</p><p&g
80、t;<b> endmodule</b></p><p> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p> 3.3UART發(fā)送模塊</p>
81、<p> 3.3.1UART的數(shù)據(jù)發(fā)送服務(wù)</p><p> 發(fā)送器實現(xiàn)的功能是將輸入的8位并行數(shù)據(jù)變?yōu)榇袛?shù)據(jù),同時在數(shù)據(jù)頭部加起始位,在數(shù)據(jù)位尾部加奇偶校驗位和停止位。數(shù)據(jù)發(fā)送服務(wù)如表3.1</p><p><b> 表3.1數(shù)據(jù)發(fā)送</b></p><p> 其基 本 特 點是:</p><p>
82、 ?、?在 信 號線上共有兩種狀態(tài),可分別用邏輯1和邏輯。來區(qū)分。在發(fā)送器空閑時,數(shù)據(jù)線應(yīng)該保持在邏輯高電平狀態(tài)。</p><p> ?、诎l(fā)送 起 始 位:該位是一個邏輯0,總是加在每一幀的頭部,提示接受器數(shù)據(jù)傳輸即將開始,在接收數(shù)據(jù)位過程中又被分離出去,占據(jù)一個數(shù)據(jù)位的時間。</p><p> ?、郯l(fā)送 數(shù) 據(jù) 位:在起始位之后就是數(shù)據(jù)位,一般為8位一個字節(jié)的數(shù)據(jù),低位在前,高位在后。如
83、字母C在ASCII表中是十進制67,二進制01000011,那么傳輸?shù)膶⑹?10000100。并在數(shù)據(jù)發(fā)送過程當(dāng)中,進行數(shù)據(jù)位奇偶校驗。</p><p> ④ 發(fā)送校 驗 位:該位一般用來判斷接收的數(shù)據(jù)位有無錯誤,常用的校驗方法是奇偶校驗法。將3過程當(dāng)中奇偶校驗的結(jié)果輸入到數(shù)據(jù)線,并占一個數(shù)據(jù)位時鐘。</p><p> ?、?停止位 :停止位總在每一幀的末尾,為邏輯1,用于標(biāo)志一個字符傳
84、送的結(jié)束,占據(jù)一個數(shù)據(jù)位的時間。</p><p> ⑥ 幀:從起始位到停止位之間的一組數(shù)據(jù)稱為一幀。</p><p> 3.3.2UART的數(shù)據(jù)發(fā)送操作</p><p><b> 如圖3-4</b></p><p> 拉低電平空閑檢測</p><p><b> Cpu發(fā)送位
85、檢測</b></p><p><b> 自檢測</b></p><p> 接cpu傳入數(shù)據(jù)拉高電平</p><p> 發(fā)送等待數(shù)據(jù)發(fā)送和奇偶校驗奇偶結(jié)果發(fā)送</p><p> 圖3-4數(shù)據(jù)發(fā)送操作</p><p> 解釋:采用9600波特率發(fā)送<
86、;/p><p> 從cpu傳入數(shù)據(jù):是指將data_in端口的數(shù)據(jù)存入寄存器中</p><p> Cpu發(fā)送為檢測:是指將ks寄存器置位,即數(shù)據(jù)發(fā)送完畢</p><p> 3.3.3UART的數(shù)據(jù)發(fā)送模塊程序</p><p> module send(dat_in,send,reset,clk_enable4,clk,</p>
87、<p> send_enable,clear4,counters);//發(fā)送數(shù)據(jù)module</p><p> input[7:0] dat_in,counters;</p><p> input reset,clk,send_enable;</p><p> output send,clk_enable4,clear4;</p>
88、<p> wire clear;</p><p> wire[7:0] dat_s;</p><p> reg send,parity_result;</p><p> reg clk_enable,clear1,clear4;</p><p> reg[7:0] date_s;</p><p>
89、 /////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p> always@(posedge clk)</p><p><b> begin</b></p><p>
90、if(send_enable & !reset)//當(dāng)send_enable為高電平時為發(fā)送操作狀態(tài)</p><p><b> begin</b></p><p> clk_enable4<=1;</p><p> clear4<=clear1;</p><p><b> end&l
91、t;/b></p><p><b> else</b></p><p><b> begin</b></p><p> clear4<=1;</p><p><b> end</b></p><p><b> end<
92、;/b></p><p> ////////////////////////////////////////////////////////////////////////////////////////////////////////////</p><p> always@(posedge clk)</p><p> if(send_enable &
93、amp; !reset)</p><p><b> begin</b></p><p> if(counters==8'b00000001)//0</p><p><b> begin</b></p><p><b> send<=0;</b></p
94、><p> date_s<=dat_in;</p><p> parity_result<=1;</p><p><b> end</b></p><p> else if(counters==8'b00010000)//1</p><p><b> begin
95、</b></p><p> send<=date_s[0];</p><p> parity_result<=parity_result + date_s[0];</p><p><b> end</b></p><p> else if(counters==8'b00100000
96、)//2</p><p><b> begin</b></p><p> send<=date_s[1];</p><p> parity_result<=parity_result + date_s[0];</p><p><b> end</b></p><
97、;p> else if(counters==8'b00110000)//3</p><p><b> begin</b></p><p> send<=date_s[2];</p><p> parity_result<=parity_result + date_s[0];</p><p&g
98、t;<b> end</b></p><p> else if(counters==8'b01000000)//4</p><p><b> begin</b></p><p> send<=date_s[3];</p><p> parity_result<=pari
99、ty_result + date_s[0];</p><p><b> end</b></p><p> else if(counters==8'b01010000)//5</p><p><b> begin</b></p><p> send<=date_s[4];<
100、/p><p> parity_result<=parity_result + date_s[0];</p><p><b> end</b></p><p> else if(counters==8'b01100000)//6</p><p><b> begin</b></
101、p><p> send<=date_s[5];</p><p> parity_result<=parity_result + date_s[0];</p><p><b> end</b></p><p> else if(counters==8'b01110000)//7</p>
102、<p><b> begin</b></p><p> send<=date_s[6];</p><p> parity_result<=parity_result + date_s[0];</p><p><b> end</b></p><p> else if
103、(counters==8'b10000000)//8</p><p><b> begin</b></p><p> send<=date_s[7];</p><p> parity_result<=parity_result + date_s[0];</p><p><b> en
104、d</b></p><p> else if(counters==8'b10010000)//9發(fā)送奇偶校驗結(jié)果</p><p><b> begin</b></p><p> send=parity_result;</p><p><b> end</b></p&
105、gt;<p> else if(counters==8'b10100000)//0發(fā)送高電平</p><p><b> begin</b></p><p><b> send<=1;</b></p><p><b> end</b></p><p
106、> else if(counters==8'b10101111)//0</p><p><b> begin</b></p><p> clear1<=1;</p><p><b> end</b></p><p> else if(counters==8'b
107、00000000)</p><p><b> begin</b></p><p><b> send<=1;</b></p><p><b> end</b></p><p> else clear1<=0;</p><p><
108、b> End</b></p><p><b> else</b></p><p><b> send<=1;</b></p><p> /////////////////////////////////////////////////////////////////</p>
109、<p><b> endmodul</b></p><p> 3.3.4UART的數(shù)據(jù)發(fā)送模塊程序仿真圖</p><p><b> 當(dāng)reset為零時</b></p><p> 圖3-5reset為零時仿真圖</p><p> 如圖為UART的數(shù)據(jù)發(fā)送模塊的功能仿真圖,為方便觀察
110、,其中的時鐘是直接給出來的,根據(jù)圖中的數(shù)據(jù)判讀,其功能為正確,UART的數(shù)據(jù)發(fā)送模塊編譯成功。</p><p> 當(dāng)計時器為140ns時,為數(shù)據(jù)接收</p><p> 當(dāng)計時器為357ns時,為數(shù)據(jù)發(fā)送</p><p> 當(dāng)計時器為705ns時,為奇偶校驗結(jié)果發(fā)送</p><p> 當(dāng)計時器為825ns時,發(fā)送高電平</p>
111、;<p><b> 當(dāng)reset為1時</b></p><p><b> 如圖3-6</b></p><p> 圖3-6reset為1時仿真圖</p><p> 3.4UART接收模塊</p><p> 3.4.1UART數(shù)據(jù)接收服務(wù)</p><p>
112、; 串行 數(shù) 據(jù) 幀和接收時鐘是異步的,由邏輯1跳變?yōu)檫壿?可視為一個數(shù)據(jù)幀的開始,所以接收器首先要判斷起始位。如表3.2</p><p> 表3.2uart的數(shù)據(jù)接收服務(wù)</p><p> 其基 本 特 點是:</p><p> UART 接收狀態(tài) 一 共 有 4個:state0(檢測起始位),stat e1( 對數(shù)據(jù)位進行采樣,并串/并轉(zhuǎn)換),state
113、2(奇偶校驗 分析),state3(接收數(shù)據(jù)正確與否檢測)。</p><p> ?、?起始位判讀:當(dāng)UART接收器復(fù)位以后,接收器將處 于這一狀態(tài)。在該狀態(tài),控制器一直等待read電平的跳 變,即從邏輯1變?yōu)檫壿?,也就是等待起始位的到來 。一旦檢測到起始位,就對采樣時鐘elk一 rev 上跳沿計 數(shù),當(dāng)計數(shù)為8時,也就是確保在起始位的中間點 ,然后轉(zhuǎn)到state1 狀態(tài)。</p><p>
114、; ② 數(shù)據(jù)接收 :該狀態(tài)下,每間隔16位倍頻采樣一位 串行數(shù)據(jù),接收8位異步數(shù)據(jù)并進行串/并轉(zhuǎn)換。即對 clk一 rev 上跳沿計數(shù),當(dāng)為16時,就對數(shù)據(jù)采樣,這樣 保證了數(shù)據(jù)位是在中點處被采樣的,同時串/并轉(zhuǎn)換,當(dāng)檢測到已收到8個數(shù)據(jù)后以后,便進入了state2狀態(tài)。</p><p> ?、?奇偶校驗 :該狀態(tài)實現(xiàn)的功能是奇偶校驗。本文采 用的是偶校驗。校驗結(jié)束以后,轉(zhuǎn)到state3狀態(tài)。</p>
115、;<p> ?、?數(shù)據(jù)幀判讀 :該狀態(tài)是用來幀校驗的,即在校驗位 以后,檢測停止位是否為邏輯高電平</p><p> 3.4.2UART數(shù)據(jù)接收操作</p><p> 圖3-7UART數(shù)據(jù)接收操作</p><p> 起始位檢測空閑檢測</p><p><b> Cpu接收位檢測</b></p
116、><p><b> 檢測</b></p><p> 毛刺檢測數(shù)據(jù)幀檢測</p><p> 接收等待數(shù)據(jù)位讀取和奇偶校驗奇偶結(jié)果比較</p><p> 圖3-7UART數(shù)據(jù)接收操作</p><p> 解釋:數(shù)據(jù)接收速度9600波特率,以16倍頻接收</p><p>
117、; cpu接收位檢測:當(dāng)奇偶結(jié)果比較和數(shù)據(jù)幀檢測都正確時,cpu檢測接收位cs置位</p><p> 3.4.3UART的數(shù)據(jù)接收模塊程序</p><p> module read(dat_out,cs,read,reset,clk_enable3,clk,read_enable,clear3,counters);</p><p> //接收數(shù)據(jù)module
118、</p><p> input read_enable;</p><p> input read,reset,clk;//read為串行輸入,read_control為時鐘控制,reset為重啟鍵</p><p> input[7:0] counters;</p><p> output cs,clear3,clk_enable3;/
119、/cs為通知cpu讀取數(shù)據(jù)位</p><p> output[7:0] dat_out;</p><p> wire clear3;</p><p> reg cs,cs1,clk_enable3;</p><p> reg[7:0] data_out;//移位寄存器</p><p>
120、reg parity_check_result,parity_result,clear3,clear1;/////////////////////////////////////////////////////////////////////////</p><p> always@(posedge clk)</p><p><b> begin</b><
121、/p><p> if(read_enable)//當(dāng)read_enable為高電平時為發(fā)送操作狀態(tài)</p><p><b> begin</b></p><p> clk_enable3<=1;</p><p> clear3<=clear1;</p><p><b>
122、 end</b></p><p><b> else</b></p><p><b> begin</b></p><p> clear3<=1;</p><p><b> end</b></p><p><b>
123、 end</b></p><p> //////////////////////////////////////////////////////////////////////////////</p><p> always@(negedge counters[0])///接收操作</p><p> if(read_enable & !r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文----基于fpga的uart設(shè)計(含外文翻譯)
- 畢業(yè)論文--基于fpga的uart設(shè)計(含外文翻譯)
- 畢業(yè)論文-基于fpga的uart控制器設(shè)計【精校排版】
- 基于fpga的uart設(shè)計
- 基于fpga的uart模塊設(shè)計
- 基于FPGA的UART控制器設(shè)計論文初稿.doc
- 基于fpga的uart控制器設(shè)計
- 基于FPGA的UART控制器設(shè)計論文 二稿.doc
- 基于fpga數(shù)字時鐘設(shè)計-畢業(yè)論文
- 基于FPGA的UART接口設(shè)計與實現(xiàn).pdf
- 畢業(yè)論文--基于fpga的學(xué)校打鈴器設(shè)計
- 基于fpga的回波抵消器設(shè)計【畢業(yè)論文】
- 畢業(yè)論文---基于fpga的ddc的設(shè)計與實現(xiàn)
- 基于FPGA的UART電路的設(shè)計與應(yīng)用.pdf
- 基于fpga的ddc的設(shè)計與實現(xiàn)畢業(yè)論文
- fpga—uart實驗
- 基于FPGA的UART控制器設(shè)計定稿.doc
- 畢業(yè)論文--基于fpga的串口通信電路設(shè)計
- 基于fpga的紅外遙控器設(shè)計【畢業(yè)論文】
- 基于fpga的數(shù)字鎖相環(huán)設(shè)計【畢業(yè)論文】
評論
0/150
提交評論