基于VHDL的RS232串口通信控制器word格式_第1頁
基于VHDL的RS232串口通信控制器word格式_第2頁
基于VHDL的RS232串口通信控制器word格式_第3頁
基于VHDL的RS232串口通信控制器word格式_第4頁
基于VHDL的RS232串口通信控制器word格式_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目錄摘要2正文21.rs232協(xié)議簡介21.1串口21.2rs232串口31.3數(shù)據(jù)幀42.系統(tǒng)設(shè)計52.1總體設(shè)計52.2各模塊設(shè)計及參數(shù)53.系統(tǒng)調(diào)試93.1仿真調(diào)試93.2下載調(diào)試104.系統(tǒng)指標(biāo)測試104.1功能說明104.2管教分布及說明104.3元件清單及資源利用情況115.參考文獻(xiàn)116.致謝、心得、體會11rs232串口通信控制器摘要本實(shí)驗(yàn)使用vhdl語言設(shè)計了一個串口通信控制器,實(shí)現(xiàn)了cpld和pc機(jī)通過rs232協(xié)議進(jìn)行數(shù)據(jù)通信。利用maxii epm1270t144c5為核心芯片的數(shù)電實(shí)驗(yàn)開發(fā)板下載實(shí)現(xiàn)。串口的波特率選擇9600bit,處于雙工工作狀態(tài)。按“發(fā)送鍵”cpl

2、d向pc發(fā)送字符串“welcome”;pc課隨時向cpld發(fā)送0f的十六進(jìn)制數(shù)據(jù),cpld接收后譯碼顯示在7段數(shù)碼管上。abstractin this study, using the vhdl language designed a serial communications controller, to achieve the cpld and the pc through rs232 protocol for data communication. core chip using maxii epm1270t144c5 several power board download exper

3、imental development to achieve. serial port baud rate selection 9600bit, in the duplex working condition. press the "send button" cpld send the string to the pc "welcome" pc class at 0 f to the cpld send the hexadecimal data, cpld decoding after receiving the 7-segment display on

4、.關(guān)鍵詞: vhdl ras232串口通信 cpld 正文 1. rs232協(xié)議簡介 1.1 串口 串口是計算機(jī)上一種非常通用設(shè)備通信的協(xié)議(不要與通用串行總線universal serialbus或者usb混淆)。大多數(shù)計算機(jī)包含兩個基于rs232的串口。串口同時也是儀器儀表設(shè)備通用的通信協(xié)議;很多gpib兼容的設(shè)備也帶有rs-232口。同時,串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。 串口通信的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。它很簡單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。比如ieee488

5、定義并行通行狀態(tài)時,規(guī)定設(shè)備線總長不得超過20米,并且任意兩個設(shè)備間的長度不得超過2米;而對于串口而言,長度可達(dá)1200米。 典型地,串口用于ascii碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發(fā)送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時在另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。對于兩個進(jìn)行通行的端口,這些參數(shù)必須匹配: a,波特率:這是一個衡量通信速度的參數(shù)。它表示每秒鐘傳送的bit的個數(shù)。例如300波特表示每秒鐘發(fā)送300個bit。當(dāng)我們提到時鐘周期時,我們就是指波特率例如如果協(xié)議需要4

6、800波特率,那么時鐘是4800hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為4800hz。通常電話線的波特率為14400,28800和36600。波特率可以遠(yuǎn)遠(yuǎn)大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是gpib設(shè)備的通信。 b,數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計算機(jī)發(fā)送一個信息包,實(shí)際的數(shù)據(jù)不會是8位的,標(biāo)準(zhǔn)的值是5、7和8位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的ascii碼是0127(7位)。擴(kuò)展的ascii碼是0255(8位)。如果數(shù)據(jù)使用簡單的文本(標(biāo)準(zhǔn)ascii碼),那么每個數(shù)據(jù)包使用7位數(shù)據(jù)。每個包是指一個字節(jié),包括開始

7、/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語“包”指任何通信的情況。c,停止位:用于表示單個包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時的,并且每一個設(shè)備有其自己的時鐘,很可能在通信中兩臺設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計算機(jī)校正時鐘同步的機(jī)會。適用于停止位的位數(shù)越多,不同時鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時也越慢。 d,奇偶校驗(yàn)位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當(dāng)然沒有校驗(yàn)位也是可以的。對于偶和奇校驗(yàn)的情況,串口會設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個值確保傳輸?shù)臄?shù)據(jù)有

8、偶個或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對于偶校驗(yàn),校驗(yàn)位為0,保證邏輯高的位數(shù)是偶數(shù)個。如果是奇校驗(yàn),校驗(yàn)位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個位的狀態(tài),有機(jī)會判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。 1.2 rs232串口 rs-232(ansi/eia-232標(biāo)準(zhǔn))是ibm-pc及其兼容機(jī)上的串行連接標(biāo)準(zhǔn)??捎糜谠S多用途,比如連接鼠標(biāo)、打印機(jī)或者modem,同時也可以接工業(yè)儀器儀表。用于驅(qū)動和連線的改進(jìn),實(shí)際應(yīng)用中rs-232的傳輸長度或者速度常常超過標(biāo)準(zhǔn)的值。rs-232只限于pc

9、串口和設(shè)備間點(diǎn)對點(diǎn)的通信。rs-232串口通信最遠(yuǎn)距離是50英尺。 db-9針連接頭 - 1 2 3 4 5 / 6 7 8 9 / - 從計算機(jī)連出的線的截面。 rs-232針腳的功能: 數(shù)據(jù): txd(pin 3):串口數(shù)據(jù)輸出(transmit data) rxd(pin 2):串口數(shù)據(jù)輸入(receive data) 握手: rts(pin 7):發(fā)送數(shù)據(jù)請求(request to send) cts(pin 8):清除發(fā)送(clear to send) dsr(pin 6):數(shù)據(jù)發(fā)送就緒(data send ready) dcd(pin 1):數(shù)據(jù)載波檢測(data carrier

10、detect) dtr(pin 4):數(shù)據(jù)終端就緒(data terminal ready) 地線: gnd(pin 5):地線 其他 ri(pin 9):鈴聲指示1.3 數(shù)據(jù)幀 異步串行通信方式是把一個字符看作一個獨(dú)立的信息單元,并且字符出現(xiàn)在數(shù)據(jù)流中的相對時間是任意的,而每一個字符中的各位是以固定的時間傳送。因此這種方式在同一字符內(nèi)部是同步的,而字符間是異步的。異步通信的主要特點(diǎn)是字符幀的傳輸格式,這樣就使得發(fā)送方可以在字符之間可根據(jù)實(shí)際的需要插入不同的時間間隔,即每一個字符的發(fā)送是隨機(jī)的。異步串行通信是以數(shù)據(jù)幀的格式傳送的,1個字符開始傳輸前,輸出線必須在邏輯上處于1狀態(tài),這稱為標(biāo)識態(tài)。

11、傳輸一開始,輸出線由標(biāo)識態(tài)變?yōu)閛,狀態(tài),從而作為起始位。起始位后面為58個信息位,信息位由低到高排列,即第1位為字符的最低位,在同一傳輸系統(tǒng)中,信息位的數(shù)目是固定的。信息位后面為校驗(yàn)位,校驗(yàn)位可以按奇校驗(yàn)設(shè)置,也可以按偶校驗(yàn)設(shè)置,不過,校驗(yàn)位也可以不設(shè)置。最后的數(shù)位為1,它作為停止位,停止位可為1位、15位或者2位。如果傳輸完1個字符以后,立即傳輸下一個字符,那么,后一個字符的起始位便緊挨著前一個字符的停止位了,否則,輸出線又會立即進(jìn)入標(biāo)識態(tài),即邏輯上處于l。2. 系統(tǒng)設(shè)計 2.1 總體設(shè)計分頻模塊發(fā)送模塊接收模塊顯示模塊pctxdrxdcpld key_inputclk,rst clkbau

12、d8x2.2 各模塊設(shè)計及參數(shù)本實(shí)驗(yàn)是串口異步通信的典型應(yīng)用,串口工作在全雙工模式,采用正確的分頻系數(shù)得出串口通信所需的波特率時鐘。把每一位的發(fā)送接受分成了8個時隙,這樣更好的實(shí)現(xiàn)質(zhì)量可靠的通信,在每次的第7個時隙時,發(fā)送接受使能信號有效。 發(fā)送部分采用并串轉(zhuǎn)換,在先發(fā)送完一個低電平的起始位后,從lsb到msb的順序逐個發(fā)出,再發(fā)一個高電平結(jié)束發(fā)送過程。接受部分采用串并轉(zhuǎn)換,在檢測到起始位的下降沿后,進(jìn)入接受,接受采用兩級緩存模式,保證高質(zhì)量的通信。顯示部分,接受到的是相應(yīng)數(shù)字和字符的ascll碼,所以必須進(jìn)行譯碼顯示部分,在數(shù)碼管上顯示接受到的信息。綜上所述:本實(shí)驗(yàn)大體上分為四個模塊:分頻模

13、塊:產(chǎn)生正確的滿足實(shí)驗(yàn)要求的8×波特率的時鐘。發(fā)送模塊:把發(fā)送寄存器里的內(nèi)容按正確的時序通過串口發(fā)送到計算機(jī)上。接受模塊:通過串口把計算機(jī)發(fā)送過來的內(nèi)容按著正確的時序存放在接受寄存器中。顯示模塊:把接受寄存器中的內(nèi)容,正確譯碼顯示在數(shù)碼管上。2.2.1 分頻模塊 通過本模塊要產(chǎn)生8×波特率的時鐘,波特率時鐘,以及完成可靠性判斷。系統(tǒng)時鐘是50m,波特率是9600,所以得出分頻系數(shù)=50m/(8*9600*2)=325,轉(zhuǎn)換為二進(jìn)制為0000000101000101;用div_par表示,分頻計數(shù)器為div_reg,時隙寄存器div8_tras_reg、div8_rec_re

14、g,分別代表發(fā)送,接受兩個過程。結(jié)束收發(fā)使能clkbaud8x上升沿?第七個時隙?div8_tras_reg+1div8_rec_reg+111div_reg+0clkbaud8x<= not clkbaud8xdiv_reg=0div8_tras_reg=0div8_rec_reg=0rst=1?div_reg=div_par-1?div_reg+1clk上升?開始 2.2.2 發(fā)送模塊 發(fā)送過程其實(shí)是一個并轉(zhuǎn)串的過程,在每到來一個發(fā)送使能信號后,發(fā)送出每一位,最先發(fā)送起始位-一個低電平信號,緊接著發(fā)送lsb,發(fā)送完8位數(shù)據(jù)位后,因?yàn)轭}目不要求發(fā)送奇偶校驗(yàn)位,所以直接發(fā)送一位結(jié)束位停止

15、發(fā)送。在每發(fā)送一幀數(shù)據(jù)前,先要檢測譯碼,檢測到撥碼開關(guān)所輸入的ascll碼,然后把正確的數(shù)據(jù)裝入發(fā)送緩存寄存器txd_buf 中。本模塊需要用到的信號量如下:trasstart- 開始發(fā)送標(biāo)志,state_tras-發(fā)送狀態(tài)寄存器。初始化狀態(tài)如下:txd_reg <= '1' trasstart <= '0' txd_buf <= "00000000" state_tras <= "0000"開始復(fù)位?初始化有按鍵?進(jìn)入發(fā)送狀態(tài),位循環(huán)計數(shù),字母循環(huán)計數(shù)發(fā)送完成結(jié)束nynyny2.2.3 接收模塊接

16、受過程恰好是發(fā)送過程的逆過程,實(shí)現(xiàn)一個串并轉(zhuǎn)換,把rxd上的來自pc的數(shù)據(jù)存放在rxd_buf中,實(shí)現(xiàn)通信。由于接受為異步通信方式,故設(shè)計兩級緩存來檢測起始信號。與此過程相關(guān)的信號量為:rxd_reg1 和rxd_reg2兩級緩存,state_rec接受狀態(tài)寄存器,初始化狀態(tài)如下:rxd_reg1 <= '0' rxd_reg2 <= '0' rxd_buf <= "00000000" state_rec <= "0000" recstart <= '0' recstart_t

17、mp <= '0' 開始復(fù)位?初始化起始位?進(jìn)入接收,位循環(huán)計數(shù)接收完成結(jié)束yyyn、n、n、2.2.4 顯示模塊實(shí)驗(yàn)中用到的7段數(shù)碼管是共陰極數(shù)碼管,共6個。數(shù)碼管的共陰極端是各自獨(dú)立的,當(dāng)共陰極端catn為低電平時,該數(shù)碼管就亮。6個數(shù)碼管的8個輸入端是并聯(lián)在一起的,起名為aaag,ap,輸入端為高電平時,對應(yīng)段位就亮對相應(yīng)的輸入十六進(jìn)制數(shù),進(jìn)行譯碼后,使能數(shù)碼管,即可顯示。3. 系統(tǒng)調(diào)試3.1 仿真調(diào)試3.1.1 分頻仿真3.1.2 發(fā)送仿真從上圖可以看出,在沒有復(fù)位信號且按下key_input鍵后,時鐘分頻得到在8倍波特率的時鐘,且在8倍波特率時鐘下,每當(dāng)?shù)谄邆€時

18、隙時,發(fā)送出一位數(shù)據(jù),從最開始的起始位,緊接著是lsb到 msb再到停止位高電平,共10位數(shù)據(jù)。之后,send_state計數(shù)加一,傳送下一個字母。3.1.3 接收和顯示仿真從上面這張圖能完全看出接受和顯示兩部分的時序關(guān)系,同樣從起始位開始,到最后9箭頭所對應(yīng)的rxd_buf和實(shí)際rxd上的數(shù)據(jù)是一致的,都是00110000,是接受到了數(shù)字0的ascll碼,最后顯示譯碼輸出的是11111100,即在數(shù)碼管上顯示0.3.2 下載調(diào)試3.2.1 按鍵抖動使用按鍵作為key_input會出現(xiàn)按鍵抖動問題。后增加延時去抖的代碼。也可以使用撥碼開關(guān)做輸入。3.2.2 實(shí)驗(yàn)儀器問題本實(shí)驗(yàn)雖然涉及硬件儀器較

19、少,但還是應(yīng)當(dāng)仔細(xì)閱讀cpld個模塊使用說明。特別注意區(qū)分com1與com2,切勿接錯,白白浪費(fèi)時間。4. 系統(tǒng)指標(biāo)測試4.1 功能說明本模塊的功能是驗(yàn)證實(shí)現(xiàn)和pc機(jī)進(jìn)行基本的串口通信的功能。需要在pc機(jī)上安裝一個串口調(diào)試工具來驗(yàn)證程序的功能。 程序?qū)崿F(xiàn)了一個收發(fā)一幀10個bit(即無奇偶校驗(yàn)位)的串口控制器,10個bit是1位起始位,8個數(shù)據(jù)位,1個結(jié)束位。串口的波特律由程序中定義的div_par參數(shù)決定,更改該參數(shù)可以實(shí)現(xiàn)相應(yīng)的波特率。程序當(dāng)前設(shè)定的div_par 的值是0x104,對應(yīng)的波特率是9600。用一個8倍波特率的時鐘將發(fā)送或接受每一位bit的周期時間劃分為8個時隙以使通信同步.

20、程序的工作過程是:串口處于全雙工工作狀態(tài),按動key_input,cpld向pc發(fā)送字符串“welcome”(串口調(diào)試工具設(shè)成按ascii碼接受方式);pc可隨時向cpld發(fā)送0-f的十六進(jìn)制數(shù)據(jù),cpld接受后顯示在7段數(shù)碼管上。具體實(shí)現(xiàn)如下:按下鍵rst(124)進(jìn)行復(fù)位,然后通過input(撥碼開關(guān))輸入想要發(fā)送的字符的ascll碼,然后按下鍵key(123)進(jìn)行發(fā)送。接受時,直接在串口調(diào)試工具上輸入自己想要發(fā)送的數(shù)字即可。4.2 管腳分布及說明4.3 元件清單及資源利用情況所用元件分硬件和軟件:其中硬件包括max實(shí)驗(yàn)板一個,usb下載線,以及針串口線。軟件包括quartus集成開發(fā)環(huán)境

21、以及串口調(diào)試工具。資料利用情況如下:5. 附錄5.1 源程序- 本模塊的功能是驗(yàn)證實(shí)現(xiàn)和pc機(jī)進(jìn)行基本的串口通信的功能。需要在-pc機(jī)上安裝一個串口調(diào)試工具來驗(yàn)證程序的功能。- 程序?qū)崿F(xiàn)了一個收發(fā)一幀10個bit(即無奇偶校驗(yàn)位)的串口控-制器,10個bit是1位起始位,8個數(shù)據(jù)位,1個結(jié)束-位。串口的波特律由程序中定義的div_par參數(shù)決定,更改該參數(shù)可以實(shí)-現(xiàn)相應(yīng)的波特率。程序當(dāng)前設(shè)定的div_par 的值是0x104,對應(yīng)的波特率是-9600。用一個8倍波特率的時鐘將發(fā)送或接受每一位bit的周期時間-劃分為8個時隙以使通信同步.-程序的工作過程是:串口處于全雙工工作狀態(tài),按動key2,

22、cpld向pc發(fā)送皐elcome"-字符串(串口調(diào)試工具設(shè)成按ascii碼接受方式);pc可隨時向cpld發(fā)送0-f的十六進(jìn)制-數(shù)據(jù),cpld接受后顯示在7段數(shù)碼管上。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all; entity uart is port ( clk : in std_logic; rst : in std_logic; rxd : in std_logic; -串行數(shù)據(jù)接收端 txd : out std_log

23、ic; -串行數(shù)據(jù)發(fā)送端 en : out std_logic_vector(5 downto 0); - 數(shù)碼管使能 seg_data : out std_logic_vector(7 downto 0); -數(shù)碼管數(shù)據(jù) key_input : in std_logic -按鍵輸入 ); end uart;architecture arch of uart is -/inner reg/ signal div_reg : std_logic_vector(15 downto 0);-分頻計數(shù)器,分頻值由波特率決定。分頻后得到頻率8倍波特率的時鐘 signal div8_tras_reg :

24、std_logic_vector(2 downto 0);-該寄存器的計數(shù)值對應(yīng)發(fā)送時當(dāng)前位于的時隙數(shù) signal div8_rec_reg : std_logic_vector(2 downto 0); -寄存器的計數(shù)值對應(yīng)接收時當(dāng)前位于的時隙數(shù) signal state_tras : std_logic_vector(3 downto 0); - 發(fā)送狀態(tài)寄存器 signal state_rec : std_logic_vector(3 downto 0); - 接受狀態(tài)寄存器 signal clkbaud_tras : std_logic; -以波特率為頻率的發(fā)送使能信號 signal

25、 clkbaud_rec : std_logic; -以波特率為頻率的接受使能信號 signal clkbaud8x : std_logic; -以8倍波特率為頻率的時鐘,它的作用是將發(fā)送或接受一個bit的時鐘周期分為8個時隙 signal recstart : std_logic; - 開始發(fā)送標(biāo)志 signal recstart_tmp : std_logic; -開始接受標(biāo)志 signal trasstart : std_logic; signal rxd_reg1 : std_logic; -接收寄存器1 signal rxd_reg2 : std_logic; -接收寄存器2,因?yàn)榻?/p>

26、收數(shù)據(jù)為異步信號,故用兩級緩存 signal txd_reg : std_logic; -發(fā)送寄存器 signal rxd_buf : std_logic_vector(7 downto 0);-接受數(shù)據(jù)緩存 signal txd_buf : std_logic_vector(7 downto 0);-發(fā)送數(shù)據(jù)緩存 signal send_state : std_logic_vector(2 downto 0);-每次按鍵給pc發(fā)送"welcome"字符串,這是發(fā)送狀態(tài)寄存器 signal cnt_delay : std_logic_vector(19 downto 0);

27、-延時去抖計數(shù)器 signal start_delaycnt : std_logic; -開始延時計數(shù)標(biāo)志 signal key_entry1 : std_logic; -確定有鍵按下曛? signal key_entry2 : std_logic; -確定有鍵按下標(biāo)志 -/ constant div_par : std_logic_vector(15 downto 0) := "0000000101000101" -分頻參數(shù),其值由對應(yīng)的波特率計算而得,按此參數(shù)分頻的時鐘頻率是波倍特率的8倍,此處值對應(yīng)9600的波特率,即分頻出的時鐘頻率是9600*8 signal tx

28、d_xhdl3 : std_logic; begin en <="111110" ;-7段數(shù)碼管使能信號賦值 txd_xhdl3 <= txd_reg ; txd <= txd_xhdl3; process(clk,rst) begin if ( rst = '1') then -如果重新開始 cnt_delay <= "00000000000000000000" start_delaycnt <= '0' elsif(clk'event and clk='1')the

29、n -否則在時鐘上升沿 if (start_delaycnt = '1') then -每800000次,檢測一次是否有按鍵按下 if (cnt_delay /= "00001100001101010000") then cnt_delay <= cnt_delay + "00000000000000000001" -每次時鐘到來加1 else cnt_delay <= "00000000000000000000" start_delaycnt <= '0' end if; else

30、if ( key_input='1') and (cnt_delay = "00000000000000000000") then start_delaycnt <= '1' end if; end if; end if; end process; process(clk,rst) begin if ( rst = '1' ) then key_entry1 <= '0' elsif(clk'event and clk='1')then if (key_entry2 = &#

31、39;1') then -如果key2=1 key_entry1 <= '0' -有鍵輸入? else -如果key2=0, if (cnt_delay = "00001100001101010000") then -檢測鍵輸入 if (not key_input = '1') then -如果沒有鍵輸入 key_entry1 <= '1' end if; end if; end if; end if; end process; process(clk,rst) begin if ( rst = '

32、1') then div_reg <= "0000000000000000" elsif(clk'event and clk='1')then -div_reg是某個延時 if (div_reg = div_par - "0000000000000001") then div_reg <= "0000000000000000" else div_reg <= div_reg + "0000000000000001" end if; end if; end proce

33、ss; process(clk,rst) -分頻得到8倍波特率的時鐘 begin if ( rst = '1') then clkbaud8x <= '0' elsif(clk'event and clk='1')then if (div_reg = div_par - "0000000000000001") then clkbaud8x <= not clkbaud8x; -產(chǎn)生時鐘脈沖 end if; end if; end process; process(clkbaud8x,rst) begin i

34、f ( rst = '1') then div8_rec_reg <= "000" else if(clkbaud8x'event and clkbaud8x = '1') then if (recstart = '1') then -接收開始標(biāo)志 div8_rec_reg <= div8_rec_reg + "001"-接收開始后,時隙數(shù)在8倍波特率的時鐘下加1循環(huán) end if; end if; end if; end process; process(clkbaud8x,rst)

35、begin if ( rst = '1') then div8_tras_reg <= "000" else if(clkbaud8x'event and clkbaud8x = '1') then if (trasstart = '1') then div8_tras_reg <= div8_tras_reg + "001"-發(fā)送開始后,時隙數(shù)在8倍波特率的時鐘下加1循環(huán) end if; end if; end if; end process; process(div8_rec_reg

36、) begin if (div8_rec_reg = "111") then clkbaud_rec <= '1' -在第7個時隙,接收鼓芐藕龐行荽蛉? else clkbaud_rec <= '0' end if; end process; process(div8_tras_reg) begin if (div8_tras_reg = "111") then clkbaud_tras <= '1' -在第7個時隙,發(fā)送使能信號有效,將數(shù)據(jù)發(fā)出 else clkbaud_tras <

37、;= '0' end if; end process; process(clkbaud8x,rst) begin if ( rst = '1') then txd_reg <= '1' trasstart <= '0' txd_buf <= "00000000" state_tras <= "0000" send_state <= "000" key_entry2 <= '0' else if(clkbaud8x'

38、;event and clkbaud8x = '1') then if (not key_entry2 = '1') then -key2=0,key1=1 if (key_entry1 = '1') then key_entry2 <= '1' -key2=1 txd_buf <= "01110111" -"w" end if; else case state_tras is -判斷發(fā)送第幾位 - when "0000" => -發(fā)送起始位 if (n

39、ot trasstart='1') and (send_state < "111") ) then trasstart <= '1' else if (send_state < "111") then if (clkbaud_tras = '1') then txd_reg <= '0' state_tras <= state_tras + "0001" end if; else key_entry2 <= '0' st

40、ate_tras <= "0000" end if; end if; when "0001" => -發(fā)送第1位 if (clkbaud_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "0010" => -發(fā)送第2位 if (clkbaud_tras

41、= '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "0011" => -發(fā)送第3位 if (clkbaud_tras = '1') then -波特頻率 txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); s

42、tate_tras <= state_tras + "0001" end if; when "0100" => -發(fā)送第4位 if (clkbaud_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "0101" => -發(fā)送第5位 if (clkbaud

43、_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "0110" => -發(fā)送第6位 if (clkbaud_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); s

44、tate_tras <= state_tras + "0001" end if; when "0111" => -發(fā)送第7位 if (clkbaud_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "1000" => -發(fā)送第8位 if (clkbaud

45、_tras = '1') then txd_reg <= txd_buf(0); txd_buf(6 downto 0) <= txd_buf(7 downto 1); state_tras <= state_tras + "0001" end if; when "1001" => -發(fā)送停止位 if (clkbaud_tras = '1') then txd_reg <= '1' txd_buf <= "01010101" state_tras &l

46、t;= state_tras + "0001" end if; when "1010" => -1111時發(fā)送文字 if (clkbaud_tras = '1') then state_tras <= "0000" send_state <= send_state + "001" trasstart <= '0' case send_state is when "000" => txd_buf <= "01100101" -"e" when "001" => txd_buf <= "01101100" -"l" when "010" => txd_buf <= "01100011" -"c" when "011" => txd_buf <= "01101111"

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論