異步通信起始位正確檢測的VHDL實現
摘要: 基于FPGA/CPLD的UART設計眾多,本文分析了3倍頻采樣方法存在的不足,同時分析了16倍頻采樣對起始位檢測的可靠性,并給出相關的VHDL硬件描述語言程序代碼。
概述
隨著電子設計自動化(EDA)技術的發展,可編程邏輯器件FPGA/CPLD已經在許多方面得到了廣泛應用,而UART(通用異步收發器) 是在數字通信和控制系統中廣泛使用的串行數據傳輸協議。因此越來越多用戶根據自己的需要,以EDA技術作為開發手段,用一塊FPGA/CPLD設計出符合自己需要的UART芯片。基于FPGA/ CPLD的UART設計在諸多文獻中都有論述,在此不再對UART整個功能模塊實現做太多的論述。本文著重分析UART接收器起始位的檢測。
3倍頻采樣的缺陷
首先,串行異步通信規定了字符數據的傳送格式。每一幀數據由起始位、數據位、奇偶校驗位、停止位和線路空閑狀態組成,格式如圖1所示。一般情況起始位為1位,數據位為5、6、7或8位、奇偶校驗位為1位,停止位為1、1.5或2位。其中的起始位和停止位就是用來實現字符的同步。在空閑狀態,傳送線為邏輯“1”狀態。數據的傳送總是以一個“起始位”開始的,接著是要傳送的若干數據位,低位先行,最后是一個“1”狀態的“停止位”;那么,當接收器檢測到一個“1”向“0”的跳變時,便視為可能的起始位。起始位被確認后,就知道發送器已開始發送,當接收了已協議好的位數后并接收到字符幀中停止位就是一幀字符數據已發送完畢。這樣,接收器就知道發送器何時開始發送數據和何時結束發送數據。
圖1 異步通信字符幀格式
要提高接收器的接收準確性,減少誤碼率,必須要用比數據波特率高n 倍(n≥1)的速率對數據進行采樣。文獻2中采用了非常規的3倍頻采樣方法:用3倍頻的波特率對每一位數據進行采樣(如圖2所示),然后對3次采樣結果進行判決。如果3次采樣中至少有2次為高電平,則接收這一位數據被判決為高電平,否則,為低電平。
圖2 3倍頻采樣時序圖
此方法剛開始給人感覺比常規的16倍頻采樣準確性高,因為每一位數據都進行3取2的判決,而16倍頻采樣對每位數據只進行一次中間采樣。然而筆者在實際應用中發現了其存在抗干擾性差,移植性差等不足。筆者在應用中自定義的異步數據幀長達21位,應用環境是渦輪工作間。在這樣條件下,3倍頻采樣比在良好的實驗室環境性能差了很多,誤碼率很高。
經分析代碼,發現3倍頻采樣方法在檢測異步數據起始位沒有任何的抗干擾處理。如果在接收線上存在干擾信號,即使是一個很窄負脈沖干擾,接收器也會誤判為是數據幀的起始位,從而產生采樣時鐘進行后續的數據采樣。圖3所示為存在干擾信號時,檢測起始位信號時序仿真波形。圖中COLCK3-IN是3倍頻采樣時鐘,CLOCK1-IN是數據波特率,DATAIN是接收線上的數據。從圖中看出,干擾信號后,COLCK3-IN時鐘產生,接收器接收數據。可見接收到的數據都是錯誤數據。簡單說,文獻2中所論述方法不能識別真假數據起始位。再從程序可移植性來說,3倍頻采樣時鐘是用三個數值進行計數判斷而得,當波特率改變,其數值都要做相應改變,這就增加了程序的修改難度。
圖3 存在干擾信號時3倍頻采樣時序圖
{{分頁}}
16倍頻采樣起始位的檢測
3倍頻采樣方法無法識別真假數據起始位,導致其抗干擾性差,準確性得不到保證。筆者拋棄非常規3倍頻采樣方法,采用了常規的16倍頻采樣方法:采用數據速率的16倍進行采樣,采樣時鐘連續采樣到8個低電平信號,可確定該低電平為真正的起始位,從而防止干擾信號產生的假起始位現象的發生。此后,接收器每隔16個采樣時鐘采樣一次,并把采樣到的數據作為輸入數據,以移位方式存入到接收移位寄存器。16倍頻對接收線的采樣關系如圖4所示。
圖4 UART對數據的采樣
起始位檢測8個連續脈沖的另一個更重要的原因是,采用16倍頻采樣的時鐘,第8個采樣脈沖所對應的數據波形正好是該位數據位波形的正中點(以時鐘上升沿采樣),在該處讀寫數據應該是最安全點。
在設計時,充分抓住異步數據的特征進行設計:起始位為低電平、停止位為高電平、每幀數據幀結構相同。根據異步數據這些特征就可設計出以下相應程序:
process(clk16x,start) --產生clk1x時鐘進程
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) --起始位檢測進程
{{分頁}}
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) --讀數據進程
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 ; {{分頁}} 本設計采用VHDL硬件描述語言來進行描述。clk16x為16倍頻采樣時鐘,clk1x是檢測到真正起始位后由clk16x時鐘分頻產生的采樣時鐘,start為開始接收數據信號(接收數據期間為高電平)、serialin為異步數據輸入端口。平常,接收器按clk16x時鐘上升采樣serialin。當采樣時鐘檢測到低電平時輸出一個高電平給start信號,clk1x分頻計數器啟動。如果連續采集8個脈沖都為低電平(起始位之半),即確定該低電平為起始位,輸出一個低電平給接收數據完信號over(接收數據期間為低電平,接收完數據為高電平),over信號在低電平檢測共同作用下保持start為高電平。start長時間保持高電平(8個clk16周期T)產生clk1x時鐘。反之判別為假起始位,over仍然為高電平,start卻變為低電平,clk1x分頻計數器復位,一直等到下次檢測serialin為低電平才重新啟動。可見,只有確定了起始位,clk1x時鐘才會產生,否則不產生。而clk16x時鐘始終存在,保證不會錯過每次接收線上的數據采樣。 圖5所示為接收信號時序仿真波形。從圖中可以清楚看到clk1x的上升沿都對準了每個數據的中間。圖6是存在干擾信號起始位檢測時序仿真波形。從圖中看到干擾信號后,沒有產生clk1x時鐘,接收器不接收數據。當真正檢測到起始位,產生clk1x時鐘,接收器開始接收數據。改變數據波特率,clk1x計數值不用改變,只要改變clk16x的分頻計數器的計數值就可以了。對于自定義的異步數據,只要是起始位是低電平,停止位是高電平,改變length的值就可以接收不同位數數據。可見以上代碼容易移植。筆者在應用中自定義21位異步數據驗證了其性能優越:無誤碼率高,抗干擾性強。 圖5 16倍頻采樣時序圖 圖6 16倍頻采樣時序圖(有干擾信號) 結語 按常規的16倍頻采樣方法接收異步數據,其抗干擾性、移植性等都優于3倍頻采樣方法。實際應用表明,提高采樣倍數,接收準確性相應提高;在一定范圍內,提高數據波特率不會影響接收準確性。 參考文獻: 1. 朱明程、孫普譯,可編程邏輯系統的VHDL設計技術,東南大學出版社 2. 李剛強,基于VHDL的異步串行通信電路設計,電子開發網
通信相關文章:通信原理
評論