《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 基于VHDL的異步串行通信電路設(shè)計
基于VHDL的異步串行通信電路設(shè)計
互聯(lián)網(wǎng)
摘要: 隨著電子技術(shù)的發(fā)展,,現(xiàn)場可編程門陣列FPGA和復(fù)雜可編程邏輯器件CPLD的出現(xiàn),,使得電子系統(tǒng)的設(shè)計者利...
關(guān)鍵詞: VHDL 異步串行通信 CPLD FPGA
Abstract:
Key words :
1 引 言 
隨著電子技術(shù)的發(fā)展,現(xiàn)場可編程門陣列 FPGA和復(fù)雜可編程邏輯器件CPLD的出現(xiàn),,使得電子系統(tǒng)的設(shè)計者利用與器件相應(yīng)的電子CAD軟件,在實驗室里就可以設(shè)計自己的專用集成電路ASIC器件,。這種可編程ASIC不僅使設(shè)計的產(chǎn)品達(dá)到小型化,、集成化和高可靠性,而且器件具有用戶可編程特性,,大大縮短了設(shè)計周期,,減少了設(shè)計費用,降低了設(shè)計風(fēng)險,。目前數(shù)字系統(tǒng)的設(shè)計可以直接面向用戶需求,,根據(jù)系統(tǒng)的行為和功能要求,自上至下地逐層完成相應(yīng)的描述﹑綜合﹑優(yōu)化﹑仿真與驗證,,直到生成器件,,實現(xiàn)電子設(shè)計自動化。其中電子設(shè)計自動化(EDA)的關(guān)鍵技術(shù)之一就是可以用硬件描述語言(HDL)來描述硬件電路,。 VHDL是用來描述從抽象到具體級別硬件的工業(yè)標(biāo)準(zhǔn)語言,,它是由美國國防部在80年代開發(fā)的HDL,現(xiàn)在已成為IEEE承認(rèn)的標(biāo)準(zhǔn)硬件描述語言。VHDL支持硬件的設(shè)計,、驗證,、綜合和測試,以及硬件設(shè)計數(shù)據(jù)的交換,、維護(hù),、修改和硬件的實現(xiàn),具有描述能力強(qiáng),、生命周期長,、支持大規(guī)模設(shè)計的分解和已有設(shè)計的再利用等優(yōu)點。利用VHDL這些優(yōu)點和先進(jìn)的EDA工具,根據(jù)具體的實際要求,,我們可以自己來設(shè)計串口異步通信電路,。 

2串口異步通信的幀格式和波特率 

2.1 串行異步通信的幀格式 
在串行異步通信中,數(shù)據(jù)位是以字符為傳送單位,,數(shù)據(jù)位的前,、后要有起始位、停止位,,另外可以在停止位的前面加上一個比特位(bit)的校驗位,。其幀格式如圖1所示。 

按此在新窗口瀏覽圖片
起始位是一個邏輯0,,總是加在每一幀的開始,,為的是提醒數(shù)據(jù)接收設(shè)備接收數(shù)據(jù),在接收數(shù)據(jù)位過程中又被分離出去,。數(shù)據(jù)位根據(jù)串行通信協(xié)議,,允許傳輸?shù)淖址L度可以為5、6,、7或8位,。通常數(shù)據(jù)位為7位或8位,如果要傳輸非ASCII數(shù)據(jù)(假如使用擴(kuò)展字符設(shè)置的文本或者二進(jìn)制數(shù)據(jù)),,數(shù)據(jù)位格式就需要采用8位,。數(shù)據(jù)位被傳輸時從一個字符的最低位數(shù)據(jù)開始,最高位數(shù)據(jù)在最后,。例如字母C在ASCII表中是十進(jìn)制67,,二進(jìn)制的01000011,那么傳輸?shù)膶⑹?1000010,。校驗位是為了驗證傳輸?shù)臄?shù)據(jù)是否被正確接收,,常見的校驗方法是奇、偶校驗,。另外校驗位也可以為0校驗或者1校驗,,即不管數(shù)據(jù)位中1的個數(shù)是多少,校驗位始終為0或者1,,如果在傳輸?shù)倪^程中校驗位發(fā)生了變化,,這就提示出現(xiàn)了某類錯誤,。不過,,在傳輸數(shù)據(jù)的時候,也可以不用校驗位,。停止位,,為邏輯1,總在每一幀的末尾,可以是1位,、1.5位或者2位,。最常用的是1位,超過1位的停止位通常出現(xiàn)在這樣的場合:在處理下一個即將發(fā)送來的字符之前接收設(shè)備要求附加時間,。 

2.2 串行異步通信的波特率 
串行口每秒發(fā)送或接收數(shù)據(jù)的位數(shù)為波特率,。若發(fā)送或接收一位數(shù)據(jù)需要時間為t,則波特率為1/ t,相應(yīng)的發(fā)送或接收時鐘為1/t Hz,。發(fā)送和接收設(shè)備的波特率應(yīng)該設(shè)置成一致,,如果兩者的波特率不一致,將會出現(xiàn)校驗錯或者幀錯,。 

3 串行發(fā)送電路的設(shè)計 

為簡化電路設(shè)計的復(fù)雜性,,采用的幀格式為: 1位開始位+8位數(shù)據(jù)位+1位停止位,沒有校驗位,,波特率為9600,。 

3.1 波特率發(fā)生器的設(shè)計 
要產(chǎn)生9600波特率,要有一個不低于9600 Hz的時鐘才可以,。為產(chǎn)生高精度的時鐘,,我選了6MHz(6M能整除9600)的晶振來提供外部時鐘。當(dāng)然,,你也可以選其它頻率的時鐘來產(chǎn)生9600 Hz的時鐘,。對于6MHz時鐘,需要設(shè)計一個625進(jìn)制的分頻器來產(chǎn)生9600波特率的時鐘信號,。用VHDL設(shè)計分頻器較簡單,,在這里就不再給出源程序了。 

3.2 發(fā)送電路的設(shè)計 
根據(jù)采用的幀格式,需要發(fā)送的數(shù)據(jù)為10位(1位開始位,、8位數(shù)據(jù)位,、1位停止位),在發(fā)送完這10位后,,就應(yīng)該停止發(fā)送,,并使發(fā)送端電平處于邏輯1,然后等候下次的發(fā)送,。下面是實現(xiàn)上述功能的VHDL源程序: 

library ieee; 

use ieee.std_logic_1164.all; 

entity Com is 

port(clk,en:in std_logic; 

Send_data:in std_logic_vector(9 downto 0); 

serial:out std_logic); 

end com; 

architecture com_arc of com is 

begin 

process(clk) 

variable count:integer range 0 to 9 :=0; 

begin 

if en=‘0‘ then 

count:=0; 

serial<=‘1‘; 

elsif rising_edge(clk) then 

if count=9 then 

serial<=Send_data(9); 

else 

serial<=Send_data(count); 

count:=count+1; 

end if; 

end if; 

end process; 

end com_arc; 

其中,,Send_data(0 to 9)表示需要發(fā)送的數(shù)據(jù)幀,發(fā)送時,,開始位Send_data(0)必須為邏輯0,,停止位Send_data(9)必須為邏輯1,否者與硬件電路連接的設(shè)備接收到的數(shù)據(jù)會出現(xiàn)錯誤,。在發(fā)送每一幀之前,,首先給輸入端en一個低電平脈沖,,讓電路復(fù)位(count置0),然后開始發(fā)送,。變量count 在進(jìn)程中用來記錄發(fā)送的數(shù)據(jù)數(shù)目,,當(dāng)數(shù)據(jù)幀發(fā)送完后,發(fā)送端就一直發(fā)送停止位(邏輯1),。 

3.3 時序仿真 
選EDA工具,,對VHDL源程序編譯。用的是 Altera公司的MAX+plus II 9.3 Baseline,,這個工具支持VHDL的編譯,、仿真。圖2是編譯后的仿真結(jié)果,,其中,,Clk為頻率9600Hz的時鐘,Send_data0為開始位,,Send_data[8..0]為數(shù)據(jù)位,, Send_data9為停止位。結(jié)果顯示,,輸出完全是按數(shù)據(jù)幀格式發(fā)送的,。
 
按此在新窗口瀏覽圖片

4 串行接收電路的設(shè)計 
接收電路比發(fā)送電路要復(fù)雜,接收電路要時實檢測起始位的到來,,一旦檢測到起始位到,,就要將這一幀數(shù)據(jù)接收下來。為提高接收的準(zhǔn)確性,,減少誤碼率,,每一位數(shù)據(jù)都用3倍頻的波特率對數(shù)據(jù)進(jìn)行采樣(如圖3所示),然后對3次采樣結(jié)果進(jìn)行判決:如果3次采樣中至少有2次為高電平,,則接收這一位數(shù)據(jù)被判決為高電平,,否者,為低電平,。

按此在新窗口瀏覽圖片

4.1 波特率發(fā)生器和采樣時鐘的設(shè)計 
為完成3次采樣,,除了頻率為9600Hz的接收時鐘外,還要有一個3倍頻的采樣時鐘,。下面是實現(xiàn)上述功能的VHDL源程序: 

library ieee; 
use ieee.std_logic_1164.all; 

entity count625 is 

port(clk,en:in std_logic; Clock1,Clock3:out std_logic); 

end count625; 

architecture count625_arc of count625 is 

begin 

process(clk,en) 

variable count:integer range 0 to 625 :=0; 

begin 

if en=‘0‘ then 

NUll; 

elsif (rising_edge(clk)) then 

count:=count+1; 

if count=625 then 

Clock1<=‘1‘; count:=0; 

else 

Clock1<=‘0‘; 

end if; 

if (count=100 or count=300 or count=500 ) then 

Clock3<=‘1‘; 

else 

Clock3<=‘0‘; 

end if; 

end if; 

end process; 

end count625_arc; 

其中clk為6MHz的時鐘,;en控制波形的產(chǎn)生; Clock1為9600Hz的接收時鐘,; Clock3為3倍頻的采樣時鐘,。 

4.2 接收電路的設(shè)計 
串行接收電路首先要能判斷接收數(shù)據(jù)的到來,即每一幀的開始,,然后對數(shù)據(jù)進(jìn)行3次采樣,,最后判決輸出,。為簡化設(shè)計,,幀格式仍然采用1位開始位+8位數(shù)據(jù)位+1位停止位,。下面是設(shè)計的接收電路VHDL程序: 

library ieee; 

use ieee.std_logic_1164.all; 

entity com_receive10 is 


port(com,clr,clk1,clk3:in std_logic;Q:out std_logic_vector(0 to 9);Valid:out std_logic); 
end com_receive10; 

architecture com_receive10_arc of com_receive10 is 

Signal Enable:std_logic :=‘1‘; 

Signal Hold:std_logic :=‘0‘; 

Signal N:std_logic_vector(0 to 2) :="000"; 

begin 

Valid<=Enable and Hold; 

process(clk1,clr) 

variable Num:integer range 0 to 9 :=0; 

begin 

if clr=‘0‘ then 

Enable<=‘1‘  Num:=0; Q<="0000000000"; 

elsif (rising_edge(clk1)) then 

Q(Num)<=(N(0) and N(1)) or (N(1) and N(2)) or (N(0) and N(2)); 

if Num=9 then 

Enable<=‘0‘; Num:=0; 

else 

Num:=Num+1; 

end if; 

end if; 

end process; 

process(clk3,clr) 

variable m:integer range 0 to 2 :=0; 

begin 

if clr=‘0‘ then 

m:=0; 

elsif(rising_edge(clk3)) then 

N(m)<=com; 

if m=2 then 

m:=0; 

else 

m:=m+1; 

end if; 

end if; 

end process; 

process(clr,com) 

begin 


if clr=‘0‘ then 
Hold<=‘0‘; 

elsif falling_edge(com) then 

Hold<=‘1‘; 

end if; 

end process; 

end com_receive10_arc; 

其中,N(m)<=com 用來對波形采樣,;Q(Num)<=(N(0) and N(1)) or (N(1) and N(2)) or (N(0) and N(2))是對其中1位數(shù)據(jù)的3次采樣結(jié)果判決,;Num用來記錄接收的數(shù)據(jù)位數(shù);falling_edge(com)是用來時實檢測每一幀的起始位(即下降沿)的到來,;Valid<=Enable and Hold用來輸出到波特率發(fā)生器電路單元控制時鐘的產(chǎn)生,,最后將一幀的10位數(shù)據(jù)輸出。 

用MAX+plus II 9.3 Baseline將上面兩個VHDL文件制成庫器件,,然后在電路圖上調(diào)出來,,最后做成的串行接收電路圖如圖4所示。 

按此在新窗口瀏覽圖片
4.3 時序仿真 
時序仿真如圖5所示,,Receive為接收到的序 

按此在新窗口瀏覽圖片

列波形,,最后結(jié)果:接收到的數(shù)據(jù)位為6D,起始位為0,,停止位為1,。 

5 結(jié)束語 

VHDL語言設(shè)計的出現(xiàn)從根本上改變了以往數(shù)字電路的設(shè)計模式,使電路設(shè)計由硬件設(shè)計轉(zhuǎn)變?yōu)檐浖O(shè)計,這樣提高了設(shè)計的靈活性,降低了電路的復(fù)雜程度,修改起來也很方便。 利用VHDL設(shè)計的靈活性,,根據(jù)串行通信協(xié)議的要求,,可以在實驗室利用先進(jìn)的EDA工具,用VHDL設(shè)計出符合自己實際需求的異步串行通信電路,。 

本文設(shè)計出的基于VHDL異步串行通信電路,,在實驗室已經(jīng)與計算機(jī)串口RS-232進(jìn)行了通信實驗(注意:TTL和RS-232邏輯電平的轉(zhuǎn)換)。實驗證明,,0至255的所有數(shù)據(jù)都能被正確收,、發(fā)。 

參考文獻(xiàn): 

[1] ARMSTRONG J R,, FRAY F G. VHDL設(shè)計表示和綜合[M].李宗伯,,王蓉暉譯.北京:機(jī)械工業(yè)出版社, 2002. 

[2] SKAHILL K.可編程邏輯系統(tǒng)的VHDL設(shè)計技術(shù)[M].朱明程,,孫普譯.南京:東南大學(xué)出版社,1998. 

[3] 仇玉章. 微型計算機(jī)系統(tǒng)接口技術(shù)[M]. 南京:江蘇科技出版社,1997. 

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。