版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、FPGA與PC串口自收發(fā)通信實(shí)現(xiàn)的功能如題,就是FPGA里實(shí)現(xiàn)從PC接收數(shù)據(jù),然后把接收到的數(shù)據(jù)發(fā)回去。使用的是串口UART協(xié)議進(jìn)行收發(fā)數(shù)據(jù)。上位機(jī)用的是通用的串口調(diào)試助手。發(fā)送數(shù)據(jù)的波特率可選9600bps,19200bps,38400bps,57600bps,115200bps等,是可調(diào)的。發(fā)送格式為:1bit起始位,8bit數(shù)據(jù),1bit停止位,無(wú)校驗(yàn)位。以下的代碼有比較詳細(xì)的注釋?zhuān)?jīng)過(guò)下載驗(yàn)證,存在誤碼率(<5%),僅供學(xué)習(xí)!代碼如下:(頂層模塊):module my_uart_top(clk,rst_n,rs232_rx,rs232_tx);input clk;/ 50MHz主
2、時(shí)鐘input rst_n;/低電平復(fù)位信號(hào)input rs232_rx;/ RS232接收數(shù)據(jù)信號(hào)output rs232_tx;/RS232發(fā)送數(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ù)來(lái)到wire rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平/-speed_selectspeed_select(.clk(clk),/波特率選擇模塊,接收和發(fā)送模塊復(fù)用,不支持全雙工通信.rst_n(rst
3、_n),.bps_start(bps_start),.clk_bps(clk_bps);my_uart_rxmy_uart_rx(.clk(clk),/接收數(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
4、_tx(rs232_tx),.bps_start(bps_start);endmodulemodule speed_select(clk,rst_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,/波特率為9600bpsbps19200 = 2603,/波特率為19200bpsbps38400 = 1301,/波特率
5、為38400bpsbps57600 = 867,/波特率為57600bpsbps115200= 433;/波特率為115200bpsparameter 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 (posed
6、ge clk or negedge rst_n) beginif(!rst_n) begin uart_ctrl <= 3'd0;/默認(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_p
7、ara_2 <= bps38400_2;end3'd3:beginbps_para <= bps57600;bps_para_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_star
8、t) cnt <= cnt+1'b1;/波特率時(shí)鐘計(jì)數(shù)啟動(dòng)else cnt <= 13'd0;always (posedge 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;endmodul
9、emodule my_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data,rx_int);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ù)來(lái)到 output rx_int;/接收數(shù)據(jù)中斷信號(hào),接收到數(shù)據(jù)期間始終為高電平/-reg
10、 rs232_rx0,rs232_rx1,rs232_rx2;/接收數(shù)據(jù)寄存器,濾波用wire neg_rs232_rx;/表示數(shù)據(jù)線接收到下降沿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;end
11、endassign neg_rs232_rx = rs232_rx2 & rs232_rx1;/接收到下降沿后neg_rs232_rx置高一個(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 <
12、= 1'b1;/啟動(dòng)接收數(shù)據(jù) rx_int <= 1'b1;/接收數(shù)據(jù)中斷信號(hào)使能endelse if(num=4'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ù)來(lái)到/-reg7:0rx_temp_data;/但前接收數(shù)據(jù)寄存器reg rx_data_shift;/數(shù)據(jù)移位標(biāo)志always (posedge c
13、lk or negedge rst_n) beginif(!rst_n) beginrx_data_shift <= 1'b0;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_t
14、emp_data7 <= rs232_rx;/鎖存9bit(1bit起始位,8bit數(shù)據(jù))endelse if(rx_data_shift) 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_
15、temp_data;/把數(shù)據(jù)鎖存到數(shù)據(jù)寄存器rx_data中endendendendassign rx_data = rx_data_r;endmodulemodule 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ù)期間始終為高電平,在次利用它的
16、下降沿來(lái)啟動(dòng)發(fā)送數(shù)據(jù)output rs232_tx;/ RS232發(fā)送數(shù)據(jù)信號(hào)output bps_start;/接收或者要發(fā)送數(shù)據(jù),波特率時(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 begin
17、rx_int0 <= rx_int;rx_int1 <= rx_int0;rx_int2 <= rx_int1;endendassign 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&
18、#39;bz;tx_en <= 1'b0;tx_data <= 8'd0;endelse if(neg_rx_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 rst_n) beginif(!rst_n) beginnum <= 4'd0;rs232_tx_r <= 1'b1;endelse if(tx_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)店美工試題庫(kù)及參考答案
- 吉林省長(zhǎng)春市寬城區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 養(yǎng)老院老人心理咨詢(xún)師激勵(lì)制度
- 養(yǎng)老院老人康復(fù)理療服務(wù)質(zhì)量管理制度
- 《付出總有收獲》課件
- 《VFP系統(tǒng)準(zhǔn)備》課件
- 房屋預(yù)售合同(2篇)
- 2024年特色農(nóng)產(chǎn)品種植配套農(nóng)機(jī)采購(gòu)合同2篇
- 《生命的延續(xù)》課件
- 2025年黃山b2貨運(yùn)資格證多少道題
- 比亞迪試駕協(xié)議書(shū)模板
- 醫(yī)學(xué)影像診斷學(xué)智慧樹(shù)知到答案2024年湖北科技學(xué)院
- 國(guó)家開(kāi)放大學(xué)《初級(jí)經(jīng)濟(jì)學(xué)》形考任務(wù)1-3參考答案
- 重度哮喘診斷與處理中國(guó)專(zhuān)家共識(shí)(2024)解讀課件
- 2024青海海東市水務(wù)集團(tuán)限責(zé)任公司招聘27人(高頻重點(diǎn)提升專(zhuān)題訓(xùn)練)共500題附帶答案詳解
- 2024-2030年色素提取行業(yè)市場(chǎng)發(fā)展分析與發(fā)展趨勢(shì)及投資前景預(yù)測(cè)報(bào)告
- 人教版地理八年級(jí)下冊(cè):6.2 白山黑水-東北三省 說(shuō)課稿4
- 2024江蘇宿遷市政協(xié)辦公室招聘2人歷年(高頻重點(diǎn)提升專(zhuān)題訓(xùn)練)共500題附帶答案詳解
- 院感質(zhì)量管理考核標(biāo)準(zhǔn)
- 旅游公司聯(lián)營(yíng)協(xié)議
- 小學(xué)六年級(jí)數(shù)學(xué)百分?jǐn)?shù)練習(xí)題含答案(滿分必刷)
評(píng)論
0/150
提交評(píng)論