微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于uart的一点疑问

关于uart的一点疑问

时间:10-02 整理:3721RD 点击:


复制代码

特权的uart程序中,串口发送模块如上:
通过捕捉rx_int的下降沿触发发送模块。我给rx_data一个定值,然后同时再给一个下降沿,仿真正确,但下载到板子上结果错误,求解?

  1. module speed_select(
  2.                                 clk,rst_n,
  3.                                 bps_start,clk_bps
  4.                         );

  5. input clk;        // 50MHz?
  6. input rst_n;        //?
  7. input bps_start;        //?
  8. output clk_bps;        // clk_bps?

  9. /*
  10. parameter                 bps9600         = 5208,        //?9600bps
  11.                                  bps19200         = 2604,        //?19200bps
  12.                                 bps38400         = 1302,        //?38400bps
  13.                                 bps57600         = 868,        //?57600bps
  14.                                 bps115200        = 434;        //?115200bps

  15. parameter                 bps9600_2         = 2604,
  16.                                 bps19200_2        = 1302,
  17.                                 bps38400_2        = 651,
  18.                                 bps57600_2        = 434,
  19.                                 bps115200_2 = 217;  
  20. */

  21.         //?
  22. `define                BPS_PARA                5208        //?9600?
  23. `define         BPS_PARA_2                2604        //?9600?

  24. reg[12:0] cnt;                        //?
  25. reg clk_bps_r;                        //?

  26. //----------------------------------------------------------
  27. //reg[2:0] uart_ctrl;        // uart?
  28. //----------------------------------------------------------

  29. always @ (posedge clk or negedge rst_n)
  30.         if(!rst_n) cnt <= 13'd0;
  31.         else if((cnt == `BPS_PARA) || !bps_start) cnt <= 13'd0;        //?
  32.         else cnt <= cnt+1'b1;                        //?

  33. always @ (posedge clk or negedge rst_n)
  34.         if(!rst_n) clk_bps_r <= 1'b0;
  35.         else if(cnt == `BPS_PARA_2) clk_bps_r <= 1'b1;        // clk_bps_r?,?
  36.         else clk_bps_r <= 1'b0;

  37. assign clk_bps = clk_bps_r;

  38. endmodule

复制代码

  1. //`timescale 1ns / 1ps
  2. ////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    17:11:32 08/28/08
  7. // Design Name:   
  8. // Module Name:    my_uart_rx
  9. // Project Name:   
  10. // Target Device:  
  11. // Tool versions:  
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. ////////////////////////////////////////////////////////////////////////////////
  21. module my_uart_tx(
  22.                                 clk,rst_n,
  23.                                 rx_data,rx_int,rs232_tx,
  24.                                 clk_bps,bps_start
  25.                         );

  26. input clk;                        // 50MHz主时钟
  27. input rst_n;                //低电平复位信号
  28. input clk_bps;                // clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点
  29. input[7:0] rx_data;        //接收数据寄存器
  30. input rx_int;                //接收数据中断信号,接收到数据期间始终为高电平,在该模块中利用它的下降沿来启动串口发送数据
  31. output rs232_tx;        // RS232发送数据信号
  32. output bps_start;        //接收或者要发送数据,波特率时钟启动信号置位

  33. //---------------------------------------------------------
  34. reg rx_int0,rx_int1,rx_int2;        //rx_int信号寄存器,捕捉下降沿滤波用
  35. wire neg_rx_int;        // rx_int下降沿标志位

  36. always @ (posedge clk or negedge rst_n) begin
  37.         if(!rst_n) begin
  38.                         rx_int0 <= 1'b1;
  39.                         rx_int1 <= 1'b1;
  40.                         rx_int2 <= 1'b1;//是0还是1?一旦开始接收,rx_int变为1,接收完毕,被置0;似乎可有可无。
  41.                 end
  42.         else begin
  43.                         rx_int0 <= rx_int;
  44.                         rx_int1 <= rx_int0;
  45.                         rx_int2 <= rx_int1;
  46.                 end
  47. end

  48. assign neg_rx_int =  ~rx_int1 & rx_int2;        //捕捉到下降沿后,neg_rx_int拉高保持一个主时钟周期

  49. //---------------------------------------------------------
  50. reg[7:0] tx_data;        //待发送数据的寄存器
  51. //---------------------------------------------------------
  52. reg bps_start_r;
  53. reg tx_en;        //发送数据使能信号,高有效
  54. reg[3:0] num;

  55. always @ (posedge clk or negedge rst_n) begin
  56.         if(!rst_n) begin
  57.                         bps_start_r <= 1'bz;
  58.                         tx_en <= 1'b0;
  59.                         tx_data <= 8'd0;
  60.                 end
  61.         else if(neg_rx_int) begin        //接收数据完毕,准备把接收到的数据发回去
  62.                         bps_start_r <= 1'b1;
  63.                         tx_data <= rx_data;        //把接收到的数据存入发送数据寄存器
  64.                         tx_en <= 1'b1;                //进入发送数据状态中
  65.                 end
  66.         else if(num==4'd10) begin        //数据发送完成,复位
  67.                         bps_start_r <= 1'b0;
  68.                         tx_en <= 1'b0;
  69.                 end
  70. end

  71. assign bps_start = bps_start_r;

  72. //---------------------------------------------------------
  73. reg rs232_tx_r;

  74. always @ (posedge clk or negedge rst_n) begin
  75.         if(!rst_n) begin
  76.                         num <= 4'd0;//什么意思?重新发送数据(10位串行数据)
  77.                         rs232_tx_r <= 1'b1;//什么意思?串口默认高电平为空闲
  78.                 end
  79.         else if(tx_en) begin
  80.                         if(clk_bps)        begin
  81.                                         num <= num+1'b1;
  82.                                         case (num)
  83.                                                 4'd0: rs232_tx_r <= 1'b0;         //发送起始位
  84.                                                 4'd1: rs232_tx_r <= tx_data[0];        //发送bit0
  85.                                                 4'd2: rs232_tx_r <= tx_data[1];        //发送bit1
  86.                                                 4'd3: rs232_tx_r <= tx_data[2];        //发送bit2
  87.                                                 4'd4: rs232_tx_r <= tx_data[3];        //发送bit3
  88.                                                 4'd5: rs232_tx_r <= tx_data[4];        //发送bit4
  89.                                                 4'd6: rs232_tx_r <= tx_data[5];        //发送bit5
  90.                                                 4'd7: rs232_tx_r <= tx_data[6];        //发送bit6
  91.                                                 4'd8: rs232_tx_r <= tx_data[7];        //发送bit7
  92.                                                 4'd9: rs232_tx_r <= 1'b1;        //发送结束位
  93.                                                  default: rs232_tx_r <= 1'b1;
  94.                                                 endcase
  95.                                 end
  96.                         else if(num==4'd10) num <= 4'd0;        //复位
  97.                 end
  98. end

  99. assign rs232_tx = rs232_tx_r;

  100. endmodule

复制代码



菜鸟求各位指教。@小梅哥

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top