新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 基于串口通訊的Verilog設計

        基于串口通訊的Verilog設計

        作者: 時間:2012-09-03 來源:網絡 收藏

        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源代碼

        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



        關鍵詞: Verilog 串口通訊

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 鄯善县| 即墨市| 襄樊市| 彭泽县| 元阳县| 光泽县| 鞍山市| 巍山| 广德县| 玉林市| 腾冲县| 临汾市| 邳州市| 尤溪县| 永川市| 纳雍县| 抚顺县| 台中市| 亚东县| 浪卡子县| 合山市| 齐河县| 永嘉县| 明水县| 琼中| 库尔勒市| 苍山县| 家居| 钟祥市| 尚义县| 林州市| 扎兰屯市| 海南省| 威宁| 调兵山市| 许昌市| 冕宁县| 积石山| 教育| 张家口市| 通河县|