<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 汽車電子 > 設(shè)計應(yīng)用 > 異步通信起始位正確檢測的VHDL實(shí)現(xiàn)

          異步通信起始位正確檢測的VHDL實(shí)現(xiàn)

          ——
          作者:中國電子科技集團(tuán)公司第34研究所 楊潤利 曹偉軍 鄭莉 雷慶華 時間:2007-12-05 來源:電子產(chǎn)品世界 收藏

            摘要: 基于設(shè)計眾多,本文分析了3倍頻采樣方法存在的不足,同時分析了16倍頻采樣對起始位檢測的可靠性,并給出相關(guān)的硬件描述語言程序代碼。

            關(guān)健詞: ;;;

            概述

            隨著電子設(shè)計自動化(EDA)技術(shù)的發(fā)展,可編程邏輯器件已經(jīng)在許多方面得到了廣泛應(yīng)用,而(通用異步收發(fā)器) 是在數(shù)字通信和控制系統(tǒng)中廣泛使用的串行數(shù)據(jù)傳輸協(xié)議。因此越來越多用戶根據(jù)自己的需要,以EDA技術(shù)作為開發(fā)手段,用一塊FPGA/CPLD設(shè)計出符合自己需要的UART芯片?;贔PGA/ CPLD的UART設(shè)計在諸多文獻(xiàn)中都有論述,在此不再對UART整個功能模塊實(shí)現(xiàn)做太多的論述。本文著重分析UART接收器起始位的檢測。

            3倍頻采樣的缺陷

            首先,串行異步通信規(guī)定了字符數(shù)據(jù)的傳送格式。每一幀數(shù)據(jù)由起始位、數(shù)據(jù)位、奇偶校驗位、停止位和線路空閑狀態(tài)組成,格式如圖1所示。一般情況起始位為1位,數(shù)據(jù)位為5、6、7或8位、奇偶校驗位為1位,停止位為1、1.5或2位。其中的起始位和停止位就是用來實(shí)現(xiàn)字符的同步。在空閑狀態(tài),傳送線為邏輯“1”狀態(tài)。數(shù)據(jù)的傳送總是以一個“起始位”開始的,接著是要傳送的若干數(shù)據(jù)位,低位先行,最后是一個“1”狀態(tài)的“停止位”;那么,當(dāng)接收器檢測到一個“1”向“0”的跳變時,便視為可能的起始位。起始位被確認(rèn)后,就知道發(fā)送器已開始發(fā)送,當(dāng)接收了已協(xié)議好的位數(shù)后并接收到字符幀中停止位就是一幀字符數(shù)據(jù)已發(fā)送完畢。這樣,接收器就知道發(fā)送器何時開始發(fā)送數(shù)據(jù)和何時結(jié)束發(fā)送數(shù)據(jù)。

          圖1 異步通信字符幀格式

            要提高接收器的接收準(zhǔn)確性,減少誤碼率,必須要用比數(shù)據(jù)波特率高n 倍(n≥1)的速率對數(shù)據(jù)進(jìn)行采樣。文獻(xiàn)2中采用了非常規(guī)的3倍頻采樣方法:用3倍頻的波特率對每一位數(shù)據(jù)進(jìn)行采樣(如圖2所示),然后對3次采樣結(jié)果進(jìn)行判決。如果3次采樣中至少有2次為高電平,則接收這一位數(shù)據(jù)被判決為高電平,否則,為低電平。

          圖2 3倍頻采樣時序圖

            此方法剛開始給人感覺比常規(guī)的16倍頻采樣準(zhǔn)確性高,因為每一位數(shù)據(jù)都進(jìn)行3取2的判決,而16倍頻采樣對每位數(shù)據(jù)只進(jìn)行一次中間采樣。然而筆者在實(shí)際應(yīng)用中發(fā)現(xiàn)了其存在抗干擾性差,移植性差等不足。筆者在應(yīng)用中自定義的幀長達(dá)21位,應(yīng)用環(huán)境是渦輪工作間。在這樣條件下,3倍頻采樣比在良好的實(shí)驗室環(huán)境性能差了很多,誤碼率很高。

            經(jīng)分析代碼,發(fā)現(xiàn)3倍頻采樣方法在檢測起始位沒有任何的抗干擾處理。如果在接收線上存在干擾信號,即使是一個很窄負(fù)脈沖干擾,接收器也會誤判為是數(shù)據(jù)幀的起始位,從而產(chǎn)生采樣時鐘進(jìn)行后續(xù)的數(shù)據(jù)采樣。圖3所示為存在干擾信號時,檢測起始位信號時序仿真波形。圖中COLCK3-IN是3倍頻采樣時鐘,CLOCK1-IN是數(shù)據(jù)波特率,DATAIN是接收線上的數(shù)據(jù)。從圖中看出,干擾信號后,COLCK3-IN時鐘產(chǎn)生,接收器接收數(shù)據(jù)??梢娊邮盏降臄?shù)據(jù)都是錯誤數(shù)據(jù)。簡單說,文獻(xiàn)2中所論述方法不能識別真假數(shù)據(jù)起始位。再從程序可移植性來說,3倍頻采樣時鐘是用三個數(shù)值進(jìn)行計數(shù)判斷而得,當(dāng)波特率改變,其數(shù)值都要做相應(yīng)改變,這就增加了程序的修改難度。

          圖3 存在干擾信號時3倍頻采樣時序圖

          {{分頁}}

            16倍頻采樣起始位的檢測

            3倍頻采樣方法無法識別真假數(shù)據(jù)起始位,導(dǎo)致其抗干擾性差,準(zhǔn)確性得不到保證。筆者拋棄非常規(guī)3倍頻采樣方法,采用了常規(guī)的16倍頻采樣方法:采用數(shù)據(jù)速率的16倍進(jìn)行采樣,采樣時鐘連續(xù)采樣到8個低電平信號,可確定該低電平為真正的起始位,從而防止干擾信號產(chǎn)生的假起始位現(xiàn)象的發(fā)生。此后,接收器每隔16個采樣時鐘采樣一次,并把采樣到的數(shù)據(jù)作為輸入數(shù)據(jù),以移位方式存入到接收移位寄存器。16倍頻對接收線的采樣關(guān)系如圖4所示。

          圖4 UART對數(shù)據(jù)的采樣

            起始位檢測8個連續(xù)脈沖的另一個更重要的原因是,采用16倍頻采樣的時鐘,第8個采樣脈沖所對應(yīng)的數(shù)據(jù)波形正好是該位數(shù)據(jù)位波形的正中點(diǎn)(以時鐘上升沿采樣),在該處讀寫數(shù)據(jù)應(yīng)該是最安全點(diǎn)。

            在設(shè)計時,充分抓住異步數(shù)據(jù)的特征進(jìn)行設(shè)計:起始位為低電平、停止位為高電平、每幀數(shù)據(jù)幀結(jié)構(gòu)相同。根據(jù)異步數(shù)據(jù)這些特征就可設(shè)計出以下相應(yīng)程序:

            process(clk16x,start) --產(chǎn)生clk1x時鐘進(jìn)程

            begin

            if start='0' then

            q<="0001";

            elsif clk16x'event and clk16x='1'

            then

            q<=q+1;

            end if;

            end process ;

            clk1x<=q(3);

            process(clk16x,i,serialin,rst) --起始位檢測進(jìn)程

          {{分頁}}

            begin

            if rst='1' then

            start<='0';

            elsif rising_edge(clk16x) then    if serialin='0' then

            start<='1' ;

            elsif over='0' then

            start<='1';

            else start<='0';

            end if;

            end if;

            end process;

            process(clk1x,serialin,i,rst) --讀數(shù)據(jù)進(jìn)程

            begin

            if rst='1' then

            buff<= (others => '1');

            Dout_P<= (others => '1');

            i<=0;

            over<='1';

            elsif rising_edge(clk1x) then

            if i

            buff21<=serialin;

            i<=i+1;

            over<='0';    else

            i<=0;

            over<='1';

            Dout_P<=buff;

            end if;

            end if;

            end process ;

          {{分頁}}

            本設(shè)計采用硬件描述語言來進(jìn)行描述。clk16x為16倍頻采樣時鐘,clk1x是檢測到真正起始位后由clk16x時鐘分頻產(chǎn)生的采樣時鐘,start為開始接收數(shù)據(jù)信號(接收數(shù)據(jù)期間為高電平)、serialin為異步數(shù)據(jù)輸入端口。平常,接收器按clk16x時鐘上升采樣serialin。當(dāng)采樣時鐘檢測到低電平時輸出一個高電平給start信號,clk1x分頻計數(shù)器啟動。如果連續(xù)采集8個脈沖都為低電平(起始位之半),即確定該低電平為起始位,輸出一個低電平給接收數(shù)據(jù)完信號over(接收數(shù)據(jù)期間為低電平,接收完數(shù)據(jù)為高電平),over信號在低電平檢測共同作用下保持start為高電平。start長時間保持高電平(8個clk16周期T)產(chǎn)生clk1x時鐘。反之判別為假起始位,over仍然為高電平,start卻變?yōu)榈碗娖?,clk1x分頻計數(shù)器復(fù)位,一直等到下次檢測serialin為低電平才重新啟動??梢?,只有確定了起始位,clk1x時鐘才會產(chǎn)生,否則不產(chǎn)生。而clk16x時鐘始終存在,保證不會錯過每次接收線上的數(shù)據(jù)采樣。

            圖5所示為接收信號時序仿真波形。從圖中可以清楚看到clk1x的上升沿都對準(zhǔn)了每個數(shù)據(jù)的中間。圖6是存在干擾信號起始位檢測時序仿真波形。從圖中看到干擾信號后,沒有產(chǎn)生clk1x時鐘,接收器不接收數(shù)據(jù)。當(dāng)真正檢測到起始位,產(chǎn)生clk1x時鐘,接收器開始接收數(shù)據(jù)。改變數(shù)據(jù)波特率,clk1x計數(shù)值不用改變,只要改變clk16x的分頻計數(shù)器的計數(shù)值就可以了。對于自定義的異步數(shù)據(jù),只要是起始位是低電平,停止位是高電平,改變length的值就可以接收不同位數(shù)數(shù)據(jù)??梢娨陨洗a容易移植。筆者在應(yīng)用中自定義21位異步數(shù)據(jù)驗證了其性能優(yōu)越:無誤碼率高,抗干擾性強(qiáng)。

          圖5 16倍頻采樣時序圖

          圖6 16倍頻采樣時序圖(有干擾信號)

            結(jié)語

            按常規(guī)的16倍頻采樣方法接收異步數(shù)據(jù),其抗干擾性、移植性等都優(yōu)于3倍頻采樣方法。實(shí)際應(yīng)用表明,提高采樣倍數(shù),接收準(zhǔn)確性相應(yīng)提高;在一定范圍內(nèi),提高數(shù)據(jù)波特率不會影響接收準(zhǔn)確性。

            參考文獻(xiàn):

            1. 朱明程、孫普譯,可編程邏輯系統(tǒng)的VHDL設(shè)計技術(shù),東南大學(xué)出版社

            2. 李剛強(qiáng),基于VHDL的異步串行通信電路設(shè)計,電子開發(fā)網(wǎng)

          通信相關(guān)文章:通信原理




          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();