新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于VHDL的異步串行通信電路設計

        基于VHDL的異步串行通信電路設計

        作者: 時間:2011-03-14 來源:網絡 收藏


        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/tHz。發送和接收設備的波特率應該設置成一致,如果兩者的波特率不一致,將會出現校驗錯或者幀錯。

        3串行發送電路的設計

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

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

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

        libraryieee;

        useieee.std_logic_1164.all;

        entityComis

        port(clk,en:instd_logic;

        Send_data:instd_logic_vector(9downto0);

        serial:outstd_logic);

        endcom;

        architecturecom_arcofcomis

        begin

        process(clk)

        variablecount:integerrange0to9:=0;

        begin

        ifen=‘0‘then

        count:=0;

        serial=‘1‘;

        elsifrising_edge(clk)then

        ifcount=9then

        serial=Send_data(9);

        else

        serial=Send_data(count);

        count:=count+1;

        endif;

        endif;

        endprocess;

        endcom_arc;

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


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

        按此在新窗口瀏覽圖片

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

        按此在新窗口瀏覽圖片

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

        libraryieee;
        useieee.std_logic_1164.all;

        entitycount625is

        port(clk,en:instd_logic;Clock1,Clock3:outstd_logic);

        endcount625;

        architecturecount625_arcofcount625is

        begin

        process(clk,en)

        variablecount:integerrange0to625:=0;

        begin

        ifen=‘0‘then

        NUll;

        elsif(rising_edge(clk))then

        count:=count+1;

        ifcount=625then

        Clock1=‘1‘;count:=0;

        else

        Clock1=‘0‘;

        endif;

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

        Clock3=‘1‘;

        else

        Clock3=‘0‘;

        endif;

        endif;

        endprocess;

        endcount625_arc;

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

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

        libraryieee;

        useieee.std_logic_1164.all;

        entitycom_receive10is


        port(com,clr,clk1,clk3:instd_logic;Q:outstd_logic_vector(0to9);Valid:outstd_logic);
        endcom_receive10;

        architecturecom_receive10_arcofcom_receive10is

        SignalEnable:std_logic:=‘1‘;

        SignalHold:std_logic:=‘0‘;

        SignalN:std_logic_vector(0to2):="000";

        begin

        Valid=EnableandHold;

        process(clk1,clr)

        variableNum:integerrange0to9:=0;

        begin

        ifclr=‘0‘then

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

        elsif(rising_edge(clk1))then

        Q(Num)=(N(0)andN(1))or(N(1)andN(2))or(N(0)andN(2));

        ifNum=9then

        Enable=‘0‘;Num:=0;

        else

        Num:=Num+1;

        endif;

        endif;

        endprocess;

        process(clk3,clr)

        variablem:integerrange0to2:=0;

        begin

        ifclr=‘0‘then

        m:=0;

        elsif(rising_edge(clk3))then

        N(m)=com;

        ifm=2then

        m:=0;

        else

        m:=m+1;

        endif;

        endif;

        endprocess;

        process(clr,com)

        begin


        ifclr=‘0‘then
        Hold=‘0‘;

        elsiffalling_edge(com)then

        Hold=‘1‘;

        endif;

        endprocess;

        endcom_receive10_arc;

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

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

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

        按此在新窗口瀏覽圖片

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

        5結束語

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

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

        參考文獻:

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

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

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

        分頻器相關文章:分頻器原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 从化市| 中卫市| 敦煌市| 溧阳市| 宜阳县| 鹰潭市| 平昌县| 容城县| 长春市| 绥德县| 夏河县| 睢宁县| 敦化市| 安徽省| 屏东市| 甘孜| 九龙城区| 杭锦旗| 铜山县| 阜宁县| 鄂伦春自治旗| 司法| 长武县| 上犹县| 囊谦县| 温泉县| 舞钢市| 当雄县| 瑞丽市| 南昌县| 化隆| 新余市| 万源市| 天镇县| 灵川县| 育儿| 富阳市| 金溪县| 江川县| 扎赉特旗| 永泰县|