歡迎您光臨本站 登入註冊首頁

Verilog串口通訊設計

admin @ 2014-03-26 , reply:0

概述

1串口通信基本特點   隨著多微機系統的應用和微機網路的發展,通信功能越來越顯得重要。串列通信是在一根傳輸線上一位一位地傳送信息.這根線既作數據線又作聯絡線。串列通信作為……

1 串口通信基本特點
    隨著多微機系統的應用和微機網路的發展,通信功能越來越顯得重要。串列通信是在一根傳輸線上一位一位地傳送信息.這根線既作數據線又作聯絡線。串列通信作為一種主要的通信方式,由於所用的傳輸線少,並且可以藉助現存的電話網進行信息傳送,因此特別適合於遠距離傳送。在串列傳輸中,通信雙方都按通信協議進行,所謂通信協議是指通信雙方的一種約定。約定對數據格式、同步方式、傳送速度、傳送步驟、糾錯方式以及控制字元定義等問題做出統一規定,通信雙方必須共同遵守。非同步起止式的禎信息格式為:每禎信息由四部分組成:
a.1位起始位。
b.5~8位數據位。傳送順序是低位在前,高位在後.依次傳送。
c.一位校驗位,也可以沒有。
d.最後是1位或是2位停止位。
    FPGA(Field Pmgrammable Gate Array)現場可編程門陣列在數字電路的設計中已經被廣泛使用。這種設計方式可以將以前需要多塊集成晶元的電路設計到一塊大模塊可編程邏輯器件中,大大減少了電路板的尺寸,增強了系統的可靠性和設計的靈活性。本文詳細介紹了已在實際項目中應用的基於FPGA的串口通訊設計。
    本設計分為硬體電路設計和軟體設計兩部分,最後用模擬驗證了程序設計的正確性。

2 系統的硬體設計
    本方案的非同步串列通信的硬體介面電路圖如圖1所示,主要由四部分組成:RS-485數據發送模塊、FPGA串口模塊、MAX3223和DB9。各部分功能簡述如下:
    RS-485數據發送模塊是將前續電路的數據發送到FPGA,供本電路處理,亦即本電路的輸入。RS485是符合RS-485和RS-4225串口標準的低功耗半雙工收發器件,有3.3V和5V兩種,在本設計中選用了3.3V的器件SP3485。SP3485的內部結構示意圖如圖2所示
    在本設計中。485的7腳和8腳與前端信號相連接,用於接收輸入的數據。數據格式是這樣的:一幀數據有25位,報頭是16個高電平和1個低電平,接下來是8位有效的數據。傳輸速率為700k波特率。2腳是使能端,與FPGA的I/O口相連,由FPGA提供邏輯控制信號。1腳和4腳也與FPGA相連,由FPGA對輸入數據進行處理。
 
圖1非同步串列通信硬體介面功能框圖
 
圖2 SP3485的內部結構示意圖
    FPGA串口模塊是將由RS-485發送過來的數據進行處理,提取出8位有效數據,並按非同步串口通訊的格式要求輸出到MAX3223的12腳。FPGA選用Xilinx公司的Spartan II系列xc2s50。此部分為該設計的主體。如上所述,輸入數據的傳輸速率為700k波特率。為了使FPGA能夠正確地對輸入數據進行採樣,提高解析度能力和抗干擾能力,採樣時鐘必須選用比波特率更高的時鐘,理論上至少是波特率時鐘的2倍。在本設計中選用4倍于波特率的時鐘,利用這種4倍于波特率的接收時鐘對串列數據流進行檢測和定位採樣,接收器能在一個位周期內採樣4次。如果沒有這種倍頻關係,定位採樣頻率和傳送波特率相同,則在一個位周期中,只能採樣一次,解析度會差。比如,為了檢測起始位下降沿的出現,在起始位的前夕採樣一次之後,下次採樣要到起始位結束前夕才進行。而假若在這個周期期間,因某種原因恰恰使接收時鐘往後偏移了一點點,就會錯過起始位。造成整個後面位的檢測和識別錯誤。針對本設計,FPGA的軟體共分了三個模塊:
1.時鐘分頻模塊。模塊的功能是用來產生所需要的數據採集時鐘和數據傳輸時鐘。系統主頻是40M的。數據採集時鐘是2.8M的,發送時鐘是11.2k。
2.提取數據模塊。由RS485發送過來的數據共有25位,其中只有8位是有效數據。為了發送這8位有效數據。必須先將其提取出來。提取的辦法是這樣的:通過連續檢測到的16個高電平和一個低電平。判斷8位有效數據的到來。然後按照串列數據傳輸的格式,在加上起始位和停止位后,將其存儲於輸出緩衝寄存器中。在這裡,我們的串列數據輸出格式是這樣規定的,一位起始位,八位數據位,一位停止位,無校驗位。
3.串列數據輸出模塊。這一模塊相對比較簡單,波特率選為11.2k,模塊的功能是在移位輸出脈衝的作用下,將輸出緩衝寄存器中的數據移位輸出。
    MAX3223是實現電平轉換的晶元。由於RS-232c是用正負電壓來表示邏輯狀態。與TTL以高低電平表示邏輯狀態的規定不同。因此,為了能夠同計算機介面或終端的TTL器件連接,必須在RS-232與TTL電路之間進行電平和邏輯關係的變換。實現這種變換的方法可用分立元件,也可用集成電路晶元。MAXIM公司的MAX3223是為滿足RS-232c的標準而設計的具有功耗低、波特率高、價格低等優點,外接電容僅為0.1uF或1uF,為雙組RS232收發器。由MAX3223的12腳輸入的數據,經過電平轉換後由8腳輸出,再經過DB9的TxD端輸出,由PC機接收並做後續處理。

3 系統軟體設計
    FPGA模塊是本設計的主體,使用Verilog硬體描述語言進行編寫,本段代碼共有兩個子模塊,分別實現提取八位數據和串列數據發送的功能。
下面是verilog源代碼
module SIMO(din,clk,rst,dout_ser);
input din; //串列輸入數據
input clk; //時鐘信號
input vat; 複位信號
reg[7:0] indata_buf; //輸入緩衝寄存器,存提取的有效位
reg[9:0] dout_buf; //輸出緩衝寄存器,加了起停位
output reg dout_ser; //串列數據輸出
reg nclk; //提取八位有效數據的採樣時鐘.是4倍于波特率的時鐘
reg txclk; //發送數據時鐘。發數據取11.2k的波特率
integer bitpos=7; //當前位
parameter s0=0,s1=1,s2=2,s3=3;
reg[2:0]state;
reg[4:0]counter; //用來計算報頭報尾中1的個數
reg tag,tag1;
reg[2:0]cnt3;
reg txdone=1'b1;//一個位元組數據傳輸完畢標誌
*********提取有效數據位並按串列通訊格式裝載數據********
always@ (posedge nclk or posedge rst) begin
 if(rst)
  begin
   state<=0;
   counter<=0;
   tag1=0;
   tag=0;
   indata_buf<=8'bz;
   dout_buf<=10'bz;
   bitpos=7;
   cnt3<=0;
  end
 else case(state)
  s0:begin
   tag=0;//表示數據沒有裝好
   if(din)
    begin
     counter<=counter+1;
     state<=s0;
     if(counter==15)//如果檢測到16個1則轉入s1狀態檢測接下來的是不是0
    begin
     state<=s1;
     counter<=0;
    end
   end
    else begin
     counter<=0;
     state<=s0;
    end
   end
   s1:if(!din)//如果是0的話,轉入s2狀態,提取八位有效數據
    state<=s2;
   else //否則轉到s0狀態重新檢測
    state<=s0;
   s2:if(cnt3==3)//是否採集四次數據
    begin
     cnt2<=0;
     indata_buf[bitpos]<=din; //先進來的是高位數據
       bitpos=bitpos-1;
       if(bitpos==-1)
        begin
         bitpos=7;state<=s3;end
        end
       else cnt3<=cnt3+1;
   s3:begin
     tag1=tag;
     tag=1'b1; //標誌輸入寄存器滿。表明已把有用數據裝入寄存器
    if(tag&&~tag1)&&txdone) //檢測到tag的上升沿以及txdone為高才把輸入緩衝數據放到輸出緩衝去
    dout_buf<={1'b1,indata_buf[7:0],1'b0};//停止位,高位,低位,起始位
    state<=s0;
   end
  endcase
end
//***********發送數據模塊
reg[3:0] state_tx=0;
always@(posedge txclk or posedge rst)
begin
 if(rst)
  begin
    dout_ser<=1'bz;
    state_tx<=0;
    txdone=1;
  end
 else
 case(state_tx)
  0:begin
   dout_ser<=dout_buf[0];state_tx<=state_tx+1;txdone=1'b0;end
  1:begin
   dout_ser<=dout_buf[1];state_tx<=state_tx+1;end
  2:begin
   dout_ser<=dout_buf[2];state_tx<=state_tx+1;end
  3:begin
   dout_ser<=dout_buf[3];state_tx<=state_tx+1;end
  4:begin
   dout_ser<=dout_buf[4];state_tx<=state_tx+1;end
  5:begin
   dout_ser<=dout_buf[5];state_tx<=state_tx+1;end
  6:begin
   dout_ser<=dout_buf[6];state_tx<=state_tx+1;end
  7:begin
   dout_ser<=dout_buf[7];state_tx<=state_tx+1;end
  8:begin
   dout_ser<=dout_buf[8];state_tx<=state_tx+1;end
  9:begin
   dout_ser<=dout_buf[9];state_tx<=state_tx+1;end
  endcase
 end
endmodule
註:兩個頻率信號nclk、txclk由相應的分頻程序產生。由於篇幅所限未在文中列出。
    FPGA模塊接收從RS-485發送過來的串列數據。25位為一個字元。數據的傳輸速率是700kbps,用四倍于波特率的速率進行採樣,這樣可以大大降低系統的雜訊。數據的串列輸出波特率選為11200bps。
    由輸入輸出波形圖可以看出:本段程序實現了對輸入數據的有效數據位的提取,並按照一定的波特率進行串列輸出。程序中,波特率可以根據需要通過分頻程序進行改動。硬體電路搭建簡單,程序代碼書寫容易。數據傳輸穩定可靠,可以滿足串口通信的要求。


[admin via 研發互助社區 ] Verilog串口通訊設計已經有3796次圍觀

http://cocdig.com/docs/show-post-43005.html