久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5162|回復: 0
打印 上一主題 下一主題
收起左側

基于FPGA的串口發送與接收設計 含源碼

[復制鏈接]
跳轉到指定樓層
樓主
本實驗是在特權CY-4開發板的基礎上實現的,附件包含了源碼的設計。
代碼里主要有波特率設置模塊、發送模塊、接收模塊。


源程序如下:
  1. /////////////////////////////////////////////////////////////////////////////
  2. //Altera ATPP合作伙伴 至芯科技 攜手 特權同學 共同打造 FPGA開發板系列
  3. //工程硬件平臺: Altera Cyclone IV FPGA
  4. //開發套件型號: SF-CY4 特權打造
  5. //版   權  申   明: 本例程由《深入淺出玩轉FPGA》作者“特權同學”原創,
  6. //                                僅供SF-CY4開發套件學習使用,謝謝支持
  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;        //低電平復位信號
  18. input uart_rx;        // RS232接收數據信號
  19. input clk_bps;        // clk_bps的高電平為接收或者發送數據位的中間采樣點
  20. output bps_start;                //接收到數據后,波特率時鐘啟動信號置位
  21. output[7:0] rx_data;        //接收數據寄存器,保存直至下一個數據來到
  22. output rx_int;        //接收數據中斷信號,接收到數據期間始終為高電平

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

  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.         //這里就是用資源換穩定(前提是我們對時間要求不是那么苛刻,因為輸入信號打了好幾拍)
  41.         //(當然我們的有效低脈沖信號肯定是遠遠大于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;        //移位次數
  46. reg rx_int;                //接收數據中斷信號,接收到數據期間始終為高電平

  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的下降沿標志信號
  53.                 bps_start_r <= 1'b1;        //啟動串口準備數據接收
  54.                 rx_int <= 1'b1;                        //接收數據中斷信號使能
  55.         end
  56.         else if(num == 4'd9) begin                //接收完有用數據信息
  57.                 bps_start_r <= 1'b0;        //數據接收完畢,釋放波特率啟動信號
  58.                 rx_int <= 1'b0;                        //接收數據中斷信號關閉
  59.         end

  60. assign bps_start = bps_start_r;

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

  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        //接收數據處理
  71.                 if(clk_bps) begin        //讀取并保存數據,接收數據為一個起始位,8bit數據,1或2個結束位               
  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                //我們的標準接收模式下只有1+8+1(2)=11bit的有效數據
  86.                         num <= 4'd0;                            //接收到STOP位后結束,num清零
  87.                         rx_data_r <= rx_temp_data;        //把數據鎖存到數據寄存器rx_data中
  88.                 end
  89.         end

  90. assign rx_data = rx_data_r;       

  91. endmodule
復制代碼

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



評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 欧美 另类 综合 偷拍 | 精品免费国产一区二区三区四区 | 久久91精品国产一区二区三区 | 91国产视频在线 | 91视频官网 | 91久久精品国产 | 国产91视频一区二区 | 亚洲成人免费电影 | 欧美一级免费看 | 日韩在线观看 | 麻豆av电影网| 视频一区二区中文字幕日韩 | 亚洲精品乱码久久久久久按摩观 | 亚洲精品小视频在线观看 | 精精国产xxxx视频在线 | 日韩在线观看网站 | 国产精品久久久久久久岛一牛影视 | 99精品久久 | 亚洲视频在线观看一区二区三区 | 日韩欧美不卡 | 久久综合欧美 | 欧洲尺码日本国产精品 | 亚洲欧美一区二区三区视频 | 国产精品久久99 | 一区二区三区中文字幕 | 欧美电影大全 | 91视频大全 | 成人精品一区二区户外勾搭野战 | 亚洲欧美高清 | www国产成人免费观看视频,深夜成人网 | 国产精品视频偷伦精品视频 | 极情综合网 | 欧美一级α片 | 福利视频网 | 亚洲自拍偷拍免费视频 | 夜夜夜操| www.亚洲成人网 | 人妖av| 免费黄色av网站 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 欧美亚洲激情 |