找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5181|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于FPGA的串口發(fā)送與接收設(shè)計 含源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:384610 發(fā)表于 2018-8-9 14:41 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
本實(shí)驗是在特權(quán)CY-4開發(fā)板的基礎(chǔ)上實(shí)現(xiàn)的,附件包含了源碼的設(shè)計。
代碼里主要有波特率設(shè)置模塊、發(fā)送模塊、接收模塊。


源程序如下:
  1. /////////////////////////////////////////////////////////////////////////////
  2. //Altera ATPP合作伙伴 至芯科技 攜手 特權(quán)同學(xué) 共同打造 FPGA開發(fā)板系列
  3. //工程硬件平臺: Altera Cyclone IV FPGA
  4. //開發(fā)套件型號: SF-CY4 特權(quán)打造
  5. //版   權(quán)  申   明: 本例程由《深入淺出玩轉(zhuǎn)FPGA》作者“特權(quán)同學(xué)”原創(chuàng),
  6. //                                僅供SF-CY4開發(fā)套件學(xué)習(xí)使用,謝謝支持
  7. /////////////////////////////////////////////////////////////////////////////
  8. //項目名稱:串口lookback測試項目
  9. //子模塊:串口接收模塊
  10. //功能:
  11. module my_uart_rx(
  12.                                 clk,rst_n,
  13.                                 uart_rx,rx_data,rx_int,
  14.                                 clk_bps,bps_start
  15.                         );

  16. input clk;                // 25MHz主時鐘
  17. input rst_n;        //低電平復(fù)位信號
  18. input uart_rx;        // RS232接收數(shù)據(jù)信號
  19. input clk_bps;        // clk_bps的高電平為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)
  20. output bps_start;                //接收到數(shù)據(jù)后,波特率時鐘啟動信號置位
  21. output[7:0] rx_data;        //接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到
  22. output rx_int;        //接收數(shù)據(jù)中斷信號,接收到數(shù)據(jù)期間始終為高電平

  23. //----------------------------------------------------------------
  24. reg uart_rx0,uart_rx1,uart_rx2,uart_rx3;        //接收數(shù)據(jù)寄存器,濾波用
  25. wire neg_uart_rx;        //表示數(shù)據(jù)線接收到下降沿

  26. always @ (posedge clk or negedge rst_n)
  27.         if(!rst_n) begin
  28.                 uart_rx0 <= 1'b0;
  29.                 uart_rx1 <= 1'b0;
  30.                 uart_rx2 <= 1'b0;
  31.                 uart_rx3 <= 1'b0;
  32.         end
  33.         else begin
  34.                 uart_rx0 <= uart_rx;
  35.                 uart_rx1 <= uart_rx0;
  36.                 uart_rx2 <= uart_rx1;
  37.                 uart_rx3 <= uart_rx2;
  38.         end

  39.         //下面的下降沿檢測可以濾掉<40ns-80ns的毛刺(包括高脈沖和低脈沖毛刺),
  40.         //這里就是用資源換穩(wěn)定(前提是我們對時間要求不是那么苛刻,因為輸入信號打了好幾拍)
  41.         //(當(dāng)然我們的有效低脈沖信號肯定是遠(yuǎn)遠(yuǎn)大于80ns的)
  42. assign neg_uart_rx = uart_rx3 & uart_rx2 & ~uart_rx1 & ~uart_rx0;        //接收到下降沿后neg_uart_rx置高一個時鐘周期

  43. //----------------------------------------------------------------
  44. reg bps_start_r;
  45. reg[3:0] num;        //移位次數(shù)
  46. reg rx_int;                //接收數(shù)據(jù)中斷信號,接收到數(shù)據(jù)期間始終為高電平

  47. always @ (posedge clk or negedge rst_n)
  48.         if(!rst_n) begin
  49.                 bps_start_r <= 1'bz;
  50.                 rx_int <= 1'b0;
  51.         end
  52.         else if(neg_uart_rx) begin                //接收到串口接收線uart_rx的下降沿標(biāo)志信號
  53.                 bps_start_r <= 1'b1;        //啟動串口準(zhǔn)備數(shù)據(jù)接收
  54.                 rx_int <= 1'b1;                        //接收數(shù)據(jù)中斷信號使能
  55.         end
  56.         else if(num == 4'd9) begin                //接收完有用數(shù)據(jù)信息
  57.                 bps_start_r <= 1'b0;        //數(shù)據(jù)接收完畢,釋放波特率啟動信號
  58.                 rx_int <= 1'b0;                        //接收數(shù)據(jù)中斷信號關(guān)閉
  59.         end

  60. assign bps_start = bps_start_r;

  61. //----------------------------------------------------------------
  62. reg[7:0] rx_data_r;                //串口接收數(shù)據(jù)寄存器,保存直至下一個數(shù)據(jù)來到
  63. reg[7:0] rx_temp_data;        //當(dāng)前接收數(shù)據(jù)寄存器

  64. always @ (posedge clk or negedge rst_n)
  65.         if(!rst_n) begin
  66.                 rx_temp_data <= 8'd0;
  67.                 num <= 4'd0;
  68.                 rx_data_r <= 8'd0;
  69.         end
  70.         else if(rx_int) begin        //接收數(shù)據(jù)處理
  71.                 if(clk_bps) begin        //讀取并保存數(shù)據(jù),接收數(shù)據(jù)為一個起始位,8bit數(shù)據(jù),1或2個結(jié)束位               
  72.                         num <= num+1'b1;
  73.                         case (num)
  74.                                 4'd1: rx_temp_data[0] <= uart_rx;        //鎖存第0bit
  75.                                 4'd2: rx_temp_data[1] <= uart_rx;        //鎖存第1bit
  76.                                 4'd3: rx_temp_data[2] <= uart_rx;        //鎖存第2bit
  77.                                 4'd4: rx_temp_data[3] <= uart_rx;        //鎖存第3bit
  78.                                 4'd5: rx_temp_data[4] <= uart_rx;        //鎖存第4bit
  79.                                 4'd6: rx_temp_data[5] <= uart_rx;        //鎖存第5bit
  80.                                 4'd7: rx_temp_data[6] <= uart_rx;        //鎖存第6bit
  81.                                 4'd8: rx_temp_data[7] <= uart_rx;        //鎖存第7bit
  82.                                 default: ;
  83.                         endcase
  84.                 end
  85.                 else if(num == 4'd9) begin                //我們的標(biāo)準(zhǔn)接收模式下只有1+8+1(2)=11bit的有效數(shù)據(jù)
  86.                         num <= 4'd0;                            //接收到STOP位后結(jié)束,num清零
  87.                         rx_data_r <= rx_temp_data;        //把數(shù)據(jù)鎖存到數(shù)據(jù)寄存器rx_data中
  88.                 end
  89.         end

  90. assign rx_data = rx_data_r;       

  91. endmodule
復(fù)制代碼

所有資料51hei提供下載:
UART_TXRX.rar (6.68 MB, 下載次數(shù): 66)



評分

參與人數(shù) 1黑幣 +18 收起 理由
外星人11111 + 18

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表