




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村合作社與農(nóng)戶聯(lián)合開發(fā)農(nóng)業(yè)技術(shù)項(xiàng)目協(xié)議
- 通信技術(shù)與信號(hào)處理練習(xí)題
- 技術(shù)標(biāo)準(zhǔn)制定合作協(xié)議
- 數(shù)學(xué)課本九章算術(shù)教案
- 教育資源分布報(bào)告表
- 西廂記的愛情悲劇征文
- 中學(xué)生國學(xué)經(jīng)典故事解讀
- 農(nóng)業(yè)旅游開發(fā)實(shí)施方案
- 數(shù)據(jù)安全與隱私保護(hù)服務(wù)協(xié)議約定事項(xiàng)
- 業(yè)務(wù)往來預(yù)付款協(xié)議書
- 體育測(cè)量與評(píng)價(jià)-第二章-體育測(cè)量與評(píng)價(jià)的基礎(chǔ)理論課件
- 法律服務(wù)方案(投標(biāo))
- 轉(zhuǎn)移的危險(xiǎn)廢物性狀清單
- 高中英語-新外研版必修一unit5-The-Monarchs-Journey-公開課reading課件
- 建設(shè)項(xiàng)目用地預(yù)審與選址意見課件講解
- 四年級(jí)公共安全教育全冊(cè)教案(海峽教育出版社)
- 工程結(jié)構(gòu)通用規(guī)范
- 《構(gòu)成基礎(chǔ)》PPT課件(190頁P(yáng)PT)
- 四年級(jí)道德與法治從中國制造到中國創(chuàng)造
- 2021-2022新教科版四年級(jí)科學(xué)下冊(cè)全一冊(cè)全部課件(共24課)
- 3 棄渣場(chǎng)施工方案
評(píng)論
0/150
提交評(píng)論