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

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

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

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

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

3 串行發送電路的設計 

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

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

3.2 發送電路的設計 
根據采用的幀格式,需要發送的數據為10位(1位開始位、8位數據位、1位停止位),在發送完這10位后,就應該停止發送,并使發送端電平處于邏輯1,然后等候下次的發送。下面是實現上述功能的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)表示需要發送的數據幀,發送時,開始位Send_data(0)必須為邏輯0,停止位Send_data(9)必須為邏輯1,否者與硬件電路連接的設備接收到的數據會出現錯誤。在發送每一幀之前,首先給輸入端en一個低電平脈沖,讓電路復位(count置0),然后開始發送。變量count 在進程中用來記錄發送的數據數目,當數據幀發送完后,發送端就一直發送停止位(邏輯1)。 

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

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

按此在新窗口瀏覽圖片

4.1 波特率發生器和采樣時鐘的設計 
為完成3次采樣,除了頻率為9600Hz的接收時鐘外,還要有一個3倍頻的采樣時鐘。下面是實現上述功能的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控制波形的產生; Clock1為9600Hz的接收時鐘; Clock3為3倍頻的采樣時鐘。 

4.2 接收電路的設計 
串行接收電路首先要能判斷接收數據的到來,即每一幀的開始,然后對數據進行3次采樣,最后判決輸出。為簡化設計,幀格式仍然采用1位開始位+8位數據位+1位停止位。下面是設計的接收電路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位數據的3次采樣結果判決;Num用來記錄接收的數據位數;falling_edge(com)是用來時實檢測每一幀的起始位(即下降沿)的到來;Valid<=Enable and Hold用來輸出到波特率發生器電路單元控制時鐘的產生,最后將一幀的10位數據輸出。 

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

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

按此在新窗口瀏覽圖片

列波形,最后結果:接收到的數據位為6D,起始位為0,停止位為1。 

5 結束語 

VHDL語言設計的出現從根本上改變了以往數字電路的設計模式,使電路設計由硬件設計轉變為軟件設計,這樣提高了設計的靈活性,降低了電路的復雜程度,修改起來也很方便。 利用VHDL設計的靈活性,根據串行通信協議的要求,可以在實驗室利用先進的EDA工具,用VHDL設計出符合自己實際需求的異步串行通信電路。 

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

參考文獻: 

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

[2] SKAHILL K.可編程邏輯系統的VHDL設計技術[M].朱明程,孫普譯.南京:東南大學出版社,1998. 

[3] 仇玉章. 微型計算機系統接口技術[M]. 南京:江蘇科技出版社,1997. 

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
宅男精品导航| 一本一本a久久| 久久久久9999亚洲精品| 久久激情五月丁香伊人| 亚洲少妇自拍| 99国产精品| av不卡在线观看| 国产在线精品成人一区二区三区 | 亚洲综合三区| 亚洲美女91| 亚洲欧美久久久久一区二区三区| 伊人久久婷婷| 国产综合视频| 欧美香蕉大胸在线视频观看| 欧美日韩国产影片| 欧美激情1区2区| 欧美国产激情| 欧美中文字幕在线| 日韩亚洲欧美一区二区三区| 91久久精品国产91久久| 亚洲国产精品黑人久久久| 久久国产综合精品| 亚洲电影免费观看高清| 亚洲国内高清视频| 亚洲日本成人| 亚洲美女黄网| 亚洲视频久久| 午夜亚洲性色视频| 久久国产精品久久精品国产| 在线亚洲精品| 亚洲香蕉伊综合在人在线视看| 中文国产成人精品| 午夜日韩激情| 久久久久久久综合| 久久免费精品视频| 久久综合综合久久综合| 欧美精品成人| 欧美视频一区二区三区| 国产精品进线69影院| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲国产精品www| 国产欧美日韩免费| 国产日韩精品在线播放| 国产精品国产a| 国产精品一区一区| 欧美日韩亚洲综合| 国产精品国产三级国产专播精品人| 国产精品白丝jk黑袜喷水| 欧美久久久久久蜜桃| 欧美日韩在线一区二区| 国产日韩精品一区二区浪潮av| 激情懂色av一区av二区av| 亚洲黄色精品| 亚洲一区在线免费观看| 亚洲视频在线看| 欧美一区二区三区视频在线观看| 最新国产乱人伦偷精品免费网站| 一本色道久久综合| 一区二区三区国产在线| 午夜精品福利在线| 久热精品在线视频| 欧美性大战久久久久| 国产偷国产偷亚洲高清97cao| 在线免费一区三区| 1204国产成人精品视频| aa日韩免费精品视频一| 欧美综合二区| 久久大逼视频| 一本一本久久a久久精品牛牛影视| 亚洲精品在线视频观看| 亚洲欧洲视频| 亚洲免费在线视频一区 二区| 亚洲欧美一区二区原创| 久久人人超碰| 欧美成人午夜剧场免费观看| 欧美亚州在线观看| 激情久久综合| 亚洲小说区图片区| 欧美一级精品大片| 先锋影音一区二区三区| 一本久道综合久久精品| 亚洲欧美日本日韩| 欧美电影美腿模特1979在线看 | 国产精品国产三级国产a| 国产精品高潮呻吟久久| 国产精品―色哟哟| 国产午夜精品理论片a级探花 | 欧美三级在线视频| 伊人久久亚洲热| 亚洲欧美亚洲| 欧美在线视频网站| 亚洲国产日韩欧美综合久久| 亚洲精品视频免费| 亚洲一区精品在线| 欧美成人官网二区| 欧美午夜在线| 国产综合久久久久久| 亚洲深夜福利在线| 日韩香蕉视频| 欧美中在线观看| 免费不卡视频| 欧美丝袜第一区| 亚洲黄色毛片| 亚洲男人天堂2024| 亚洲一区二区在线视频| 欧美精品网站| 亚洲国产经典视频| 亚洲一区二区在线| 日韩亚洲欧美一区二区三区| 美女视频黄 久久| 韩国av一区二区三区在线观看| 亚洲欧美日韩天堂一区二区| 亚洲一区二区不卡免费| 欧美激情va永久在线播放| 在线观看亚洲| 亚洲国产精品成人精品 | 欧美在线综合视频| 欧美成人蜜桃| 在线精品福利| 亚洲三级免费观看| 亚洲欧美日韩国产综合| 欧美日韩免费观看一区| 亚洲黄色免费| 欧美一区二区日韩| 欧美一区二粉嫩精品国产一线天| 欧美午夜影院| 亚洲欧洲精品一区| 亚洲欧洲日本国产| 欧美一区二区三区视频在线观看| 欧美三日本三级少妇三2023| 亚洲美女黄色片| 在线视频日韩| 久久琪琪电影院| 国产午夜精品一区理论片飘花| 午夜久久电影网| 日韩亚洲精品电影| 久久精品视频在线观看| 国产日产精品一区二区三区四区的观看方式 | 亚洲人妖在线| 一本久久综合亚洲鲁鲁五月天| 欧美日本国产| 99视频超级精品| 亚洲尤物在线| 国产精品一二一区| 亚洲三级视频在线观看| 日韩一级二级三级| 久热国产精品| 亚洲激情六月丁香| 久久精品视频免费| 亚洲一区日韩在线| 国产精品成人国产乱一区| 一区二区三区四区五区精品| 亚洲欧美高清| 欧美日韩成人一区二区| 亚洲久久一区二区| 亚洲精品免费在线播放| 欧美激情一区二区三区成人| 亚洲精品久久嫩草网站秘色| 久久av最新网址| 蜜桃伊人久久| 亚洲精品欧美激情| 91久久嫩草影院一区二区| 欧美在线视频网站| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 原创国产精品91| 99re66热这里只有精品3直播| 欧美日韩亚洲一区二区三区在线观看| 一区二区三区视频在线看| 欧美在线综合| 国产免费亚洲高清| 欧美在线观看你懂的| 欧美mv日韩mv国产网站| 一本色道88久久加勒比精品| 欧美在线亚洲综合一区| 在线观看欧美日本| 亚洲视频在线观看视频| 国内综合精品午夜久久资源| 亚洲麻豆av| 欧美不卡三区| 99精品99| 久久一区二区三区av| 亚洲精品综合在线| 久久精品国产69国产精品亚洲| 亚洲国产mv| 亚洲免费黄色| 欧美精品电影| 亚洲片区在线| 午夜一级久久| 国产欧美亚洲视频| 亚洲精品国久久99热| 国产精品人人做人人爽| 最新国产乱人伦偷精品免费网站 | 亚洲毛片在线| 日韩午夜电影在线观看| 国产精品久久国产愉拍 | 亚洲激情一区二区| 国产精品二区在线| 亚洲免费高清| 国产一二三精品| 正在播放亚洲一区|