1. 程式人生 > >FPGA實驗——串列埠傳送/接收學習筆記

FPGA實驗——串列埠傳送/接收學習筆記

1. 基礎知識

 1.1 波特率的概念

         波特率(Baud rate),指的是訊號被調製以後在單位時間內的變化,即單位時間內載波引數變化的次數,如每秒鐘傳送240個字元,而每個字元格式包含10位(1個起始位,1個停止位,8個數據位),這時的波特率為240Bd,位元率為10位*240個/秒=2400bps。又比如每秒鐘傳送240個二進位制位,這時的波特率為240Bd,位元率也是240bps。(但是一般調製速率大於波特率,比如曼徹斯特編碼)。波特率,可以通俗的理解為一個裝置在一秒鐘內傳送(或接收)了多少碼元的資料。它是對符號傳輸速率的一種度量,1波特即指每秒傳輸1個碼元符號(通過不同的調製方式,可以在一個碼元符號上負載多個bit位資訊),1位元每秒是指每秒傳輸1位元(bit)。 單位“波特”本身就已經是代表每秒的調製數,以“波特每秒”(Baud per second)為單位是一種常見的錯誤。

 1.2 串列埠傳送/接收的位元率的時鐘計算

串列埠的位元率為9600bps時,dt = 1s/9600 = 104.1667us。即每bit資料傳送的時間間隔為 dt = 104.1667us。

當 主系統時鐘MCLK = 50MHz,其週期T = 0.02us。則要計數 dt/T = 104.1667/0.02 = 5208 個MCLK才傳送一位(bit))資料。

則在RS232(串列埠)的時鐘週期 rsT = dt,要計數5208個MCLK。當時鍾為方波時,只要計數5208/2 = 2604個MCLK,就翻轉IO口產生需要的時鐘訊號。

 1.3 程式碼

`timescale 1ns / 1ps

module UART_BpsClkGen(
       // << input port
       mclk,                // 50MHz master clock 
       rst,                 // reset signal
       bps_startFlag,       // clk start generate flag
       // >> output port    
       bps_clk             // clk output signal
);
input   mclk,rst,bps_startFlag;
output  bps_clk;

reg[12:0] cnt_mclk = 13'd0;         // mclk counter
reg bps_clk_r = 1'b0;              // bps clk regsister

`define     BPS_CNT         (5208)
`define     BPS_CNT_HALF    (`BPS_CNT/2-1)

always @ (posedge mclk, posedge rst)
begin
    if(rst) begin
        cnt_mclk <= 13'd0;
    end
    else if(cnt_mclk > `BPS_CNT_HALF) begin
        bps_clk_r <= ~bps_clk_r;
        cnt_mclk <= 13'd0;
    end
    else begin
        cnt_mclk <= cnt_mclk + 1'b1;
    end
end

assign bps_clk = bps_clk_r&bps_startFlag;

endmodule