FPGA串口通信_(tái)第1頁
FPGA串口通信_(tái)第2頁
FPGA串口通信_(tái)第3頁
FPGA串口通信_(tái)第4頁
FPGA串口通信_(tái)第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、FPGA實(shí)現(xiàn)RS-232串口收發(fā)的仿真過程(Quartus+Synplify+ModelSim)(2007-09-11 12:17:37)  網(wǎng)上關(guān)于RS-232的異步收發(fā)介紹得很多,最近沒事學(xué)著摸索用ModelSim來做時(shí)序仿真,就結(jié)合網(wǎng)上的參考資料和自己的琢磨,做了這個(gè)東西。針對(duì)我這個(gè)小程序結(jié)合FPGA的開發(fā)流程,主要走了以下幾步:1. 文本程序輸入(Verilog HDL)2. 功能仿真(ModelSim,查看邏輯功能是否正確,要寫一個(gè)Test Bench)3. 綜合(Synplify Pro,程序綜合成網(wǎng)表)4. 布局布線(Quartus II,根據(jù)我選定的FPGA器件型號(hào),

2、將網(wǎng)表布到器件中,并估算出相應(yīng)的時(shí)延)5. 時(shí)序仿真(ModelSim,根據(jù)時(shí)延做進(jìn)一步仿真) 這里貼出我的程序和各個(gè)詳細(xì)步驟,能和各位正在學(xué)習(xí)的新手們一起分享。0. 原理    略一、文本程序輸入(Verilog HDL)發(fā)送端:module trans(clk,             rst,           

3、;  TxD_start,             TxD_data,             TxD,             TxD_busy       

4、      );input      clk,           rst,           TxD_start;input7:0 TxD_data;   / 待發(fā)送的數(shù)據(jù)output     TxD,   

5、;     / 輸出端口發(fā)送的串口數(shù)據(jù)           TxD_busy;   reg        TxD;reg 7:0  TxD_dataReg;   / 寄存器發(fā)送模式,因?yàn)樵诖诎l(fā)送過程中輸入端不可能一直保持有效電平reg 3:0  state;parameter  ClkFrequency =

6、 25000000;  / 時(shí)鐘頻率25 MHzparameter  Baud = 115200;            / 串口波特率115200 / 波特率產(chǎn)生parameter BaudGeneratorAccWidth = 16;reg       BaudGeneratorAccWidth:0 BaudGeneratorAcc;wire BaudGeneratorAccWidth:0 B

7、audGeneratorInc = (Baud<<(BaudGeneratorAccWidth-4)+(ClkFrequency>>5)/(ClkFrequency>>4);wire BaudTick = BaudGeneratorAccBaudGeneratorAccWidth;wire TxD_busy;always (posedge clk or negedge rst)   if(rst)      BaudGeneratorAcc <= 0; else if(Tx

8、D_busy)    BaudGeneratorAcc <= BaudGeneratorAccBaudGeneratorAccWidth-1:0 + BaudGeneratorInc;/ 發(fā)送端狀態(tài)wire   TxD_ready = (state=0);  / 當(dāng)state = 0時(shí),處于準(zhǔn)備空閑狀態(tài),TxD_ready = 1assign TxD_busy = TxD_ready;   / 空閑狀態(tài)時(shí)TxD_busy = 0/ 把待發(fā)送數(shù)據(jù)放入緩存寄存器 TxD_dataRegalways (posedg

9、e clk or negedge rst)   if(rst)      TxD_dataReg <= 8'b00000000; else if(TxD_ready & TxD_start)  TxD_dataReg <= TxD_data;     / 發(fā)送狀態(tài)機(jī)always (posedge clk or negedge rst) if(rst)     

10、 begin         state <= 4'b0000;   / 復(fù)位時(shí),狀態(tài)為0000,發(fā)送端一直發(fā)1電平         TxD <= 1'b1;      end else  case(state)  4'b0000: if(TxD_start) begin 

11、                     state <= 4'b0100; / 接受到發(fā)送信號(hào),進(jìn)入發(fā)送狀態(tài)                        

12、; end  4'b0100: if(BaudTick) begin                            state <= 4'b1000;  / 發(fā)送開始位 - 0電平       

13、60;          TxD <= 1'b0;                            end  4'b1000: if(BaudTick) begin  &#

14、160;                         state <= 4'b1001;  / bit 0                  TxD <=

15、TxD_dataReg0;                            end  4'b1001: if(BaudTick) begin             

16、               state <= 4'b1010;  / bit 1                  TxD <= TxD_dataReg1;        

17、60;               end  4'b1010: if(BaudTick) begin                            sta

18、te <= 4'b1011;  / bit 2                  TxD <= TxD_dataReg2;                       &

19、#160;    end  4'b1011: if(BaudTick) begin                            state <= 4'b1100;  / bit 3     

20、;             TxD <= TxD_dataReg3;                            end  4'b1100: if(BaudTick)

21、 begin                            state <= 4'b1101;  / bit 4               

22、60;  TxD <= TxD_dataReg4;                            end  4'b1101: if(BaudTick) begin         

23、0;                  state <= 4'b1110;  / bit 5                  TxD <= TxD_dataReg5;     &

24、#160;                      end  4'b1110: if(BaudTick) begin                    &#

25、160;       state <= 4'b1111;  / bit 6                  TxD <= TxD_dataReg6;                

26、;            end  4'b1111: if(BaudTick) begin                            state <= 4'b0010

27、;  / bit 7                  TxD <= TxD_dataReg7;                          

28、60; end  4'b0010: if(BaudTick) begin                            state <= 4'b0011;  / stop1        &

29、#160;         TxD <= 1'b1;                            end  4'b0011: if(BaudTick) begin   

30、                         state <= 4'b0000;  / stop2                    &#

31、160;   TxD <= 1'b1;                            end  default: if(BaudTick) begin          

32、;                  state <= 4'b0000;                TxD <= 1'b1;          &#

33、160;   end endcaseendmodule接收端:module rcv(clk,           rst,           RxD,           RxD_data,      

34、60;    RxD_data_ready,           );input       clk,            rst,            RxD;output7:0 Rx

35、D_data;        / 接收數(shù)據(jù)寄存器        output      RxD_data_ready;  / 接收完8位數(shù)據(jù),RxD_data 值有效時(shí),RxD_data_ready 輸出讀信號(hào)parameter  ClkFrequency = 25000000;  / 時(shí)鐘頻率25MHzparameter  Baud = 115200; &

36、#160;          / 波特率115200reg2:0  bit_spacing;reg       RxD_delay;reg      RxD_start;reg3:0  state;reg7:0  RxD_data;reg       RxD_data_ready;/ 波特率產(chǎn)生,使用8倍過采樣para

37、meter Baud8 = Baud*8;parameter Baud8GeneratorAccWidth = 16;wire    Baud8GeneratorAccWidth:0 Baud8GeneratorInc = (Baud8<<(Baud8GeneratorAccWidth-7)+(ClkFrequency>>8)/(ClkFrequency>>7);reg     Baud8GeneratorAccWidth:0 Baud8GeneratorAcc;always (posedge cl

38、k or negedge rst)   if(rst)      Baud8GeneratorAcc <= 0;   else      Baud8GeneratorAcc <= Baud8GeneratorAccBaud8GeneratorAccWidth-1:0 + Baud8GeneratorInc;/ Baud8Tick 為波特率的8倍 115200*8 = 921600wire  Baud8Tick = Baud8Gener

39、atorAccBaud8GeneratorAccWidth; / next_bit 為波特率 115200always (posedge clk or negedge rst) if(rst|(state=0)      bit_spacing <= 0; else if(Baud8Tick)    bit_spacing <= bit_spacing + 1;wire next_bit = (bit_spacing=7);/ 檢測(cè)到 RxD 有下跳沿時(shí),RxD_start

40、 置1,準(zhǔn)備接收數(shù)據(jù)always(posedge clk) if(Baud8Tick) begin  RxD_delay <= RxD;    RxD_start <= (Baud8Tick & RxD_delay & (RxD); end / 狀態(tài)機(jī)接收數(shù)據(jù)always(posedge clk or negedge rst) if(rst)    state <= 4'b0000; else if(Ba

41、ud8Tick)    case(state)     4'b0000: if(RxD_start) state <= 4'b1000;  / 檢測(cè)到下跳沿     4'b1000: if(next_bit)  state <= 4'b1001;  / bit 0     4'b1001: if(next_bit)  state <= 4'b

42、1010;  / bit 1     4'b1010: if(next_bit)  state <= 4'b1011;  / bit 2     4'b1011: if(next_bit)  state <= 4'b1100;  / bit 3     4'b1100: if(next_bit)  state <= 4'b1101;  / b

43、it 4     4'b1101: if(next_bit)  state <= 4'b1110;  / bit 5     4'b1110: if(next_bit)  state <= 4'b1111;  / bit 6     4'b1111: if(next_bit)  state <= 4'b0001;  / bit 7  

44、;   4'b0001: if(next_bit)  state <= 4'b0000;  / 停止位     default: state <= 4'b0000;    endcase/ 保存接收數(shù)據(jù)到 RxD_data 中always (posedge clk or negedge rst)   if(rst)      RxD_data <= 8'b000000

45、00; else if(Baud8Tick && next_bit && state3)  RxD_data <= RxD, RxD_data7:1;/ RxD_data_ready 置位信號(hào)always (posedge clk or negedge rst)   if(rst)      RxD_data_ready <= 0; else    RxD_data_ready <= (Baud8Tick

46、&& next_bit && state=4'b0001);endmodule 為了測(cè)試收發(fā)是否正常,寫的Test Benchtimescale 1ns / 1nsmodule rs232_test; reg       clk,      rst,      TxD_start; reg 7:0  TxD_data;  wire7:0&

47、#160; RxD_data;  wire     /RxD,      TxD,      TxD_busy,      RxD_data_ready;     trans trans(.clk(clk),          &

48、#160; .rst(rst),      .TxD_start(TxD_start),      .TxD_busy(TxD_busy),      .TxD_data(TxD_data),      .TxD(TxD)    );    rcv rcv(.clk(clk),   

49、60;    .rst(rst),        .RxD(TxD),     / 收發(fā)相接時(shí) RxD = TxD        .RxD_data(RxD_data),        .RxD_data_ready(RxD_data_ready)   );   

50、60;  initial begin TxD_start = 0;   TxD_data = 0;    clk = 0;   rst = 1;   #54 rst = 0;   #70 rst = 1;   #40 TxD_start = 1'b1;   #10 TxD_data = 8'b11011001;   #100 TxD_start = 1'b0;en

51、d   always begin      #30 clk = clk;      #10 clk = clk;       endendmodule 二、綜合三、FPGA與PC串口自收發(fā)通信串口通信其實(shí)簡(jiǎn)單實(shí)用,這里我就不多說,只把自己動(dòng)手寫的verilog代碼共享下。實(shí)現(xiàn)的功能如題,就是FPGA里實(shí)現(xiàn)從PC接收數(shù)據(jù),然后把接收到的數(shù)據(jù)發(fā)回去。使用的是串口UART協(xié)議進(jìn)行收發(fā)數(shù)據(jù)。上位機(jī)用的是老

52、得掉牙的串口調(diào)試助手,如下:發(fā)送數(shù)據(jù)的波特率可選9600bps,19200bps,38400bps,57600bps,115200bps等,是可調(diào)的。發(fā)送格式為:1bit起始位,8bit數(shù)據(jù),1bit停止位,無校驗(yàn)位。以下的代碼有比較詳細(xì)的注釋,經(jīng)過下載驗(yàn)證,存在誤碼率(<5%),僅供學(xué)習(xí)!代碼如下:(頂層模塊):module my_uart_top(clk,rst_n,rs232_rx,rs232_tx);input clk;/ 50MHz主時(shí)鐘input rst_n;/低電平復(fù)位信號(hào)input rs232_rx;/ RS232接收數(shù)據(jù)信號(hào)output rs232_tx;/RS232發(fā)

53、送數(shù)據(jù)信號(hào)wire bps_start;/接收到數(shù)據(jù)后,波特率時(shí)鐘啟動(dòng)信號(hào)置位wire clk_bps;/ clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn) wire7:0 rx_data;/接收數(shù)據(jù)寄存器,保存直至下一個(gè)數(shù)據(jù)來到wire rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平/-speed_selectspeed_select(.clk(clk),/波特率選擇模塊,接收和發(fā)送模塊復(fù)用,不支持全雙工通信.rst_n(rst_n),.bps_start(bps_start),.clk_bps(clk_bps);my_uart_rxmy_uart_rx(.clk(clk

54、),/接收數(shù)據(jù)模塊.rst_n(rst_n),.rs232_rx(rs232_rx),.clk_bps(clk_bps),.bps_start(bps_start),.rx_data(rx_data),.rx_int(rx_int);my_uart_txmy_uart_tx(.clk(clk),/發(fā)送數(shù)據(jù)模塊.rst_n(rst_n),.clk_bps(clk_bps),.rx_data(rx_data),.rx_int(rx_int),.rs232_tx(rs232_tx),.bps_start(bps_start);endmodulemodule speed_select(clk,rst_

55、n,bps_start,clk_bps);input clk;/ 50MHz主時(shí)鐘input rst_n;/低電平復(fù)位信號(hào)input bps_start;/接收到數(shù)據(jù)后,波特率時(shí)鐘啟動(dòng)信號(hào)置位output clk_bps;/ clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn) parameter bps9600 = 5207,/波特率為9600bps bps19200 = 2603,/波特率為19200bpsbps38400 = 1301,/波特率為38400bpsbps57600 = 867,/波特率為57600bpsbps115200= 433;/波特率為115200bpsparame

56、ter bps9600_2 = 2603,bps19200_2= 1301,bps38400_2= 650,bps57600_2= 433,bps115200_2 = 216; reg12:0 bps_para;/分頻計(jì)數(shù)最大值reg12:0 bps_para_2;/分頻計(jì)數(shù)的一半reg12:0 cnt;/分頻計(jì)數(shù)reg clk_bps_r;/波特率時(shí)鐘寄存器/-reg2:0 uart_ctrl;/ uart波特率選擇寄存器/-always (posedge clk or negedge rst_n) beginif(!rst_n) begin uart_ctrl <= 3'd0

57、;/默認(rèn)波特率為9600bpsendelse begincase (uart_ctrl)/波特率設(shè)置3'd0:beginbps_para <= bps9600;bps_para_2 <= bps9600_2;end3'd1:beginbps_para <= bps19200;bps_para_2 <= bps19200_2;end3'd2:beginbps_para <= bps38400;bps_para_2 <= bps38400_2;end3'd3:beginbps_para <= bps57600;bps_par

58、a_2 <= bps57600_2;end3'd4:beginbps_para <= bps115200;bps_para_2 <= bps115200_2;enddefault: ;endcaseendendalways (posedge clk or negedge rst_n)if(!rst_n) cnt <= 13'd0;else if(cnt<bps_para && bps_start) cnt <= cnt+1'b1;/波特率時(shí)鐘計(jì)數(shù)啟動(dòng)else cnt <= 13'd0;always (po

59、sedge clk or negedge rst_n)if(!rst_n) clk_bps_r <= 1'b0;else if(cnt=bps_para_2 && bps_start) clk_bps_r <= 1'b1;/ clk_bps_r高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn) else clk_bps_r <= 1'b0;assign clk_bps = clk_bps_r;endmodulemodule my_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data,rx_int)

60、;input clk;/ 50MHz主時(shí)鐘input rst_n;/低電平復(fù)位信號(hào)input rs232_rx;/ RS232接收數(shù)據(jù)信號(hào)input clk_bps;/ clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)output bps_start;/接收到數(shù)據(jù)后,波特率時(shí)鐘啟動(dòng)信號(hào)置位output7:0 rx_data;/接收數(shù)據(jù)寄存器,保存直至下一個(gè)數(shù)據(jù)來到 output rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平/-reg rs232_rx0,rs232_rx1,rs232_rx2;/接收數(shù)據(jù)寄存器,濾波用wire neg_rs232_rx;/表示數(shù)據(jù)線接收到下

61、降沿always (posedge clk or negedge rst_n) beginif(!rst_n) beginrs232_rx0 <= 1'b1;rs232_rx1 <= 1'b1;rs232_rx2 <= 1'b1;endelse beginrs232_rx0 <= rs232_rx;rs232_rx1 <= rs232_rx0;rs232_rx2 <= rs232_rx1;endendassign neg_rs232_rx = rs232_rx2 & rs232_rx1;/接收到下降沿后neg_rs232_rx

62、置高一個(gè)時(shí)鐘周期/-reg bps_start_r;reg3:0num;/移位次數(shù)reg rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平always (posedge clk or negedge rst_n) beginif(!rst_n) beginbps_start_r <= 1'bz;rx_int <= 1'b0;endelse if(neg_rs232_rx) beginbps_start_r <= 1'b1;/啟動(dòng)接收數(shù)據(jù) rx_int <= 1'b1;/接收數(shù)據(jù)中斷信號(hào)使能endelse if(num=4

63、9;d12) beginbps_start_r <= 1'bz;/數(shù)據(jù)接收完畢rx_int <= 1'b0;/接收數(shù)據(jù)中斷信號(hào)關(guān)閉endend assign bps_start = bps_start_r;/-reg7:0 rx_data_r;/接收數(shù)據(jù)寄存器,保存直至下一個(gè)數(shù)據(jù)來到/-reg7:0rx_temp_data;/但前接收數(shù)據(jù)寄存器reg rx_data_shift;/數(shù)據(jù)移位標(biāo)志always (posedge clk or negedge rst_n) beginif(!rst_n) beginrx_data_shift <= 1'b0;

64、rx_temp_data <= 8'd0;num <= 4'd0;rx_data_r <= 8'd0;endelse if(rx_int) begin/接收數(shù)據(jù)處理if(clk_bps) begin/讀取并保存數(shù)據(jù),接收數(shù)據(jù)為一個(gè)起始位,8bit數(shù)據(jù),一個(gè)結(jié)束位rx_data_shift <= 1'b1;num <= num+1'b1;if(num<=4'd8) rx_temp_data7 <= rs232_rx;/鎖存9bit(1bit起始位,8bit數(shù)據(jù))endelse if(rx_data_shif

65、t) begin/數(shù)據(jù)移位處理rx_data_shift <= 1'b0;if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1;/移位8次,第1bit起始位移除,剩下8bit正好時(shí)接收數(shù)據(jù)else if(num=4'd12) beginnum <= 4'd0;/接收到STOP位后結(jié)束,num清零rx_data_r <= rx_temp_data;/把數(shù)據(jù)鎖存到數(shù)據(jù)寄存器rx_data中endend endendassign rx_data = rx_data_r;e

66、ndmodulemodule my_uart_tx(clk,rst_n,clk_bps,rx_data,rx_int,rs232_tx,bps_start);input clk;/ 50MHz主時(shí)鐘input rst_n;/低電平復(fù)位信號(hào)input clk_bps;/ clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)input7:0 rx_data;/接收數(shù)據(jù)寄存器input rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平,在次利用它的下降沿來啟動(dòng)發(fā)送數(shù)據(jù)output rs232_tx;/ RS232發(fā)送數(shù)據(jù)信號(hào)output bps_start;/接收或者要發(fā)送數(shù)據(jù),波特率

67、時(shí)鐘啟動(dòng)信號(hào)置位/-reg rx_int0,rx_int1,rx_int2;/rx_int信號(hào)寄存器,捕捉下降沿濾波用wire neg_rx_int;/ rx_int下降沿標(biāo)志位always (posedge clk or negedge rst_n) beginif(!rst_n) beginrx_int0 <= 1'b0;rx_int1 <= 1'b0;rx_int2 <= 1'b0;endelse beginrx_int0 <= rx_int;rx_int1 <= rx_int0;rx_int2 <= rx_int1;enden

68、dassign neg_rx_int = rx_int1 & rx_int2;/捕捉到下降沿后,neg_rx_int拉地保持一個(gè)主時(shí)鐘周期/-reg7:0 tx_data;/待發(fā)送數(shù)據(jù)的寄存器/-reg bps_start_r;reg tx_en;/發(fā)送數(shù)據(jù)使能信號(hào),高有效reg3:0 num;always (posedge clk or negedge rst_n) beginif(!rst_n) beginbps_start_r <= 1'bz;tx_en <= 1'b0;tx_data <= 8'd0;endelse if(neg_rx_

69、int) begin/接收數(shù)據(jù)完畢,準(zhǔn)備把接收到的數(shù)據(jù)發(fā)回去bps_start_r <= 1'b1;tx_data <= rx_data;/把接收到的數(shù)據(jù)存入發(fā)送數(shù)據(jù)寄存器tx_en <= 1'b1;/進(jìn)入發(fā)送數(shù)據(jù)狀態(tài)中endelse if(num=4'd11) begin/數(shù)據(jù)發(fā)送完成,復(fù)位bps_start_r <= 1'bz;tx_en <= 1'b0;endendassign bps_start = bps_start_r;/-reg rs232_tx_r;always (posedge clk or negedge

70、 rst_n) beginif(!rst_n) beginnum <= 4'd0;rs232_tx_r <= 1'b1;endelse if(tx_en) beginif(clk_bps)beginnum <= num+1'b1;case (num)4'd0:rs232_tx_r <= 1'b0; /發(fā)送起始位4'd1:rs232_tx_r <= tx_data0;/發(fā)送bit04'd2:rs232_tx_r <= tx_data1;/發(fā)送bit14'd3: rs232_tx_r <= t

71、x_data2;/發(fā)送bit24'd4: rs232_tx_r <= tx_data3;/發(fā)送bit34'd5: rs232_tx_r <= tx_data4;/發(fā)送bit44'd6: rs232_tx_r <= tx_data5;/發(fā)送bit54'd7:rs232_tx_r <= tx_data6;/發(fā)送bit64'd8: rs232_tx_r <= tx_data7;/發(fā)送bit74'd9: rs232_tx_r <= 1'b0;/發(fā)送結(jié)束位 default: rs232_tx_r <= 1&

72、#39;b1;endcaseendelse if(num=4'd11) num <= 4'd0;/復(fù)位endendassign rs232_tx = rs232_tx_r;endmoduleFPGA實(shí)現(xiàn)串行接口 RS232(1)2008-12-17 11:38串行接口(RS-232)串行接口是連接FPGA和PC機(jī)的一種簡(jiǎn)單方式。這個(gè)項(xiàng)目向大家展示了如果使用FPGA來創(chuàng)建RS-232收發(fā)器。整個(gè)項(xiàng)目包括5個(gè)部分1. RS232是怎樣工作的 2. 如何產(chǎn)生需要的波特率 3. 發(fā)送模塊 4. 接收模塊 5. 應(yīng)用實(shí)例 RS-232接口是怎樣工作的作為標(biāo)準(zhǔn)設(shè)備,大多數(shù)的計(jì)算機(jī)都有

73、1到2個(gè)RS-232串口。特性RS-232有下列特性:· 使用9針的"DB-9"插頭(舊式計(jì)算機(jī)使用25針的"DB-25"插頭). · 允許全雙工的雙向通訊(也就是說計(jì)算機(jī)可以在接收數(shù)據(jù)的同時(shí)發(fā)送數(shù)據(jù)). · 最大可支持的傳輸速率為10KBytes/s. DB-9插頭你可能已經(jīng)在你的計(jì)算機(jī)背后見到過這種插頭它一共有9個(gè)引腳,但是最重要的3個(gè)引腳是:· 引腳2: RxD (接收數(shù)據(jù)). · 引腳3: TxD (發(fā)送數(shù)據(jù)). · 引腳5: GND (地). 僅使用3跟電纜,你就可以發(fā)送和接收數(shù)據(jù).串

74、行通訊數(shù)據(jù)以每次一位的方式傳輸;每條線用來傳輸一個(gè)方向的數(shù)據(jù)。由于計(jì)算機(jī)通常至少需要若干位數(shù)據(jù),因此數(shù)據(jù)在發(fā)送之前先“串行化”。通常是以8位數(shù)據(jù)為1組的。 。先發(fā)送最低有效位,最后發(fā)送最高有效位。異步通訊RS-232使用異步通訊協(xié)議。也就是說數(shù)據(jù)的傳輸沒有時(shí)鐘信號(hào)。接收端必須有某種方式,使之與接收數(shù)據(jù)同步。對(duì)于RS-232來說,是這樣處理的:1. 串行線纜的兩端事先約定好串行傳輸?shù)膮?shù)(傳輸速度、傳輸格式等) 2. 當(dāng)沒有數(shù)據(jù)傳輸?shù)臅r(shí)候,發(fā)送端向數(shù)據(jù)線上發(fā)送"1" 3. 每傳輸一個(gè)字節(jié)之前,發(fā)送端先發(fā)送一個(gè)"0"來表示傳輸已經(jīng)開始。這樣接收端便可以知道有

75、數(shù)據(jù)到來了。 4. 開始傳輸后,數(shù)據(jù)以約定的速度和格式傳輸,所以接收端可以與之同步 5. 每次傳輸完成一個(gè)字節(jié)之后,都在其后發(fā)送一個(gè)停止位("1") 讓我們來看看0x55是如何傳輸?shù)?0x55的二進(jìn)制表示為:01010101。但是由于先發(fā)送的是最低有效位,所以發(fā)送序列是這樣的: 1-0-1-0-1-0-1-0.下面是另外一個(gè)例子 :傳輸?shù)臄?shù)據(jù)為0xC4,你能看出來嗎?從圖中很難看出來所傳輸?shù)臄?shù)據(jù),這也說明了事先知道傳輸?shù)乃俾蕦?duì)于接收端有多么重要。數(shù)據(jù)傳輸可以多快?數(shù)據(jù)的傳輸速度是用波特來描述的,亦即每秒鐘傳輸?shù)臄?shù)據(jù)位,例如1000波特表示每秒鐘傳輸100比特的數(shù)據(jù), 或者說

76、每個(gè)數(shù)據(jù)位持續(xù)1毫秒。波特率不是隨意的,必須服從一定的標(biāo)準(zhǔn),如果希望設(shè)計(jì)123456波特的RS-232接口,對(duì)不起,你很不幸運(yùn),這是不行的。常用的串行傳輸速率值包括以下幾種:· 1200 波特. · 9600 波特. · 38400 波特. · 115200 波特 (通常情況下是你可以使用的最高速度). 在115200 波特傳輸速度下, 每位數(shù)據(jù)持續(xù) (1/115200) = 8.7s. 如果傳輸8位數(shù)據(jù),共持續(xù) 8 x 8.7s = 69s。但是每個(gè)字節(jié)的傳輸又要求額外的“開始位”和“停止位”,所以實(shí)際上需要花費(fèi)10 x 8.7s = 87s的時(shí)間。最

77、大的有效數(shù)據(jù)傳輸率只能達(dá)到 11.5KBytes每秒。在115200 波特傳輸速度下,一些使用了不好的芯片的計(jì)算機(jī)要求一個(gè)長(zhǎng)的停止位(1.5或2位數(shù)據(jù)的長(zhǎng)度),這使得最大傳輸速度降到大約10.5KBytes每秒物理層電纜上的信號(hào)使用正負(fù)電壓的機(jī)制:· "1" 用 -10V 的電壓表示(或者在 -5V 與 -15V之間的電壓). · "0" 用 +10V 的電壓表示(或者在 5V 與 15V之間的電壓). 所以沒有數(shù)據(jù)傳輸?shù)碾娎|上的電壓應(yīng)該為-10V或-5到-10之間的某個(gè)電壓。FPGA實(shí)現(xiàn)串行接口 RS232(2)2008-12-17

78、 11:39波特率發(fā)生器這里我們使用串行連接的最大速度115200波特,其他較慢的波特也很容易由此產(chǎn)生。FPGA通常運(yùn)行在遠(yuǎn)高于115200Hz的時(shí)鐘頻率上(對(duì)于今天的標(biāo)準(zhǔn)的來說RS-232真是太慢了),這就意味著我們需要用一個(gè)較高的時(shí)鐘來分頻產(chǎn)生盡量接近于115200Hz的時(shí)鐘信號(hào)。從1.8432MHz的時(shí)鐘產(chǎn)生通常RS-232芯片使用1.8432MHz的時(shí)鐘,以為這個(gè)時(shí)鐘很容易產(chǎn)生標(biāo)準(zhǔn)的波特率,所以我們假設(shè)已經(jīng)擁有了一個(gè)這樣的時(shí)鐘源。只需要將 1.8432MHz 16分頻便可得到 115200Hz的時(shí)鐘,多方便??!reg 3:0 BaudDivCnt;always (posedge clk) BaudDivCnt <= BaudDivCnt + 1;wire BaudTick = (BaudDivCnt=15);所以 "BaudTick" 每16個(gè)時(shí)鐘周期需要置位一次,從而從1.8432MHz的時(shí)鐘得到115200Hz的時(shí)鐘。從

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論