找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4569|回复: 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 单片机教程网

快速回复 返回顶部 返回列表