OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4223|回复: 2

[XILINX] xc7k325t使用uart重复发送数据

[复制链接]

4

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2022-8-9
在线时间
7 小时
发表于 2022-11-1 10:22:35 | 显示全部楼层 |阅读模式
10金钱
使用k7系列fpga做cmos图像采集存储至bram中再由uart串口发送回上位机,这里uart每次会重复发送数据,请问是哪里有问题呢,代码如下:
  1. //*******************uart***********************
  2. wire rx_data_done;
  3. wire [7:0] rx_data;

  4. parameter CLK_FRE = 200; //Mhz
  5. localparam IDLE = 0;
  6. localparam SEND = 1; //send
  7. localparam WAIT = 2; //wait 1 second and send uart received data
  8. localparam STOP = 3;

  9. reg [7:0] tx_data;
  10. reg [7:0] tx_str;
  11. reg tx_data_valid;
  12. wire tx_data_ready;
  13. reg [7:0] tx_cnt;

  14. wire rx_data_valid;
  15. wire rx_data_ready;

  16. reg [3:0] state;

  17. reg [23:0] pixel_cnt;
  18. reg [23:0] off_cnt;
  19. wire uart_vaild;
  20. wire end_cnt;
  21. reg uart_cnt;
  22. reg [31:0] cnt_1s;
  23. reg flag_1s;

  24. assign rx_data_done = rx_data_valid;
  25. assign rx_data_ready = 1'b1; //always can receive data

  26. assign end_cnt = (off_cnt < 1000)? 1'b1:1'b0;
  27. assign uart_vaild = uart_en && uart_cnt && end_cnt && bram_read_en;

  28. always@(posedge sys_clk or negedge sys_rst_n)
  29. begin
  30. if(sys_rst_n == 1'b0)
  31. begin
  32. uart_cnt <= 1'b0;
  33. cnt_1s <= 32'd0;
  34. end
  35. else
  36. begin
  37. if(pixel_cnt < 2500)
  38. begin
  39. uart_cnt <= 1'b1;
  40. flag_1s <= 1'b0;
  41. end
  42. else
  43. begin
  44. uart_cnt <= 1'b0;
  45. cnt_1s <= cnt_1s + 32'd1;
  46. if(cnt_1s == 32'd200000000)
  47. begin
  48. cnt_1s <= 32'd0;
  49. flag_1s <= 1'b1;
  50. end
  51. end
  52. end
  53. end

  54. always@(posedge sys_clk or negedge sys_rst_n)
  55. begin
  56. if(sys_rst_n == 1'b0)
  57. begin
  58. tx_data <= 8'd0;
  59. state <= IDLE;
  60. tx_data_valid <= 1'b0;
  61. pixel_cnt <= 24'b0;
  62. off_cnt <= 24'b0;
  63. end
  64. else
  65. begin
  66. if(flag_1s == 1'b1)
  67. pixel_cnt <= 24'b0;
  68. if (uart_vaild == 1'b1)
  69. begin
  70. state <= IDLE;
  71. case(state)
  72. IDLE:
  73. state <= SEND;
  74. SEND:
  75. begin
  76. tx_data <= data_read;
  77. if(tx_data_valid && tx_data_ready) //last byte sent is complete
  78. begin
  79. tx_data_valid <= 1'b0;
  80. state <= WAIT;
  81. end
  82. else if(~tx_data_valid)
  83. begin
  84. tx_data_valid <= 1'b1;
  85. end
  86. end
  87. WAIT:
  88. begin
  89. state <= STOP;
  90. end
  91. STOP:
  92. begin
  93. pixel_cnt <= pixel_cnt + 24'd1;
  94. addr_read <= addr_read + 24'd1;
  95. off_cnt <= off_cnt + 24'd1;
  96. if(addr_read == 24'd1036801)
  97. // if(addr_read == 24'd629856)
  98. begin
  99. addr_read <= 24'd0;
  100. end
  101. end
  102. default:
  103. state <= IDLE;
  104. endcase
  105. end
  106. end
  107. end

  108. uart_rx#
  109. (
  110. .CLK_FRE(CLK_FRE),
  111. .BAUD_RATE(115200)
  112. ) uart_rx_inst
  113. (
  114. .clk (sys_clk ),
  115. .rst_n (sys_rst_n ),
  116. .rx_data (rx_data ),
  117. .rx_data_valid (rx_data_valid ),
  118. .rx_data_ready (rx_data_ready ),
  119. .rx_pin (uart_rx )
  120. );

  121. uart_tx#
  122. (
  123. .CLK_FRE(CLK_FRE),
  124. .BAUD_RATE(115200)
  125. ) uart_tx_inst
  126. (
  127. .clk (sys_clk ),
  128. .rst_n (sys_rst_n ),
  129. .tx_data (tx_data ),
  130. .tx_data_valid (tx_data_valid ),
  131. .tx_data_ready (tx_data_ready ),
  132. .tx_pin (uart_tx )
  133. );

  134. //*******************uart***************************
复制代码
uart发送数据的代码
  1. module uart_tx
  2. #(
  3.         parameter              CLK_FRE = 50,                    //clock frequency(Mhz)
  4.         parameter              BAUD_RATE = 115200      //serial baud rate
  5. )
  6. (
  7.         input                        clk,                                      //clock input
  8.         input                        rst_n,                                   //asynchronous reset input, low active
  9.         input      [7:0]           tx_data,                              //data to send
  10.         input                        tx_data_valid,                     //data to be sent is valid
  11.         output   reg            tx_data_ready,                    //send ready
  12.         output                     tx_pin                                  //serial data output
  13. );

  14. //calculates the clock cycle for baud rate
  15. localparam                  CYCLE = CLK_FRE * 1000000 / BAUD_RATE;

  16. //state machine code
  17. localparam                  S_IDLE                = 1;
  18. localparam                  S_START             = 2;   //start bit
  19. localparam                  S_SEND_BYTE    = 3;    //data bits
  20. localparam                  S_STOP               = 4;   //stop bit

  21. reg     [2:0]                   state;
  22. reg     [2:0]                   next_state;
  23. reg     [15:0]                 cycle_cnt;                   //baud counter
  24. reg     [2:0]                   bit_cnt;                       //bit counter
  25. reg     [7:0]                   tx_data_latch;            //latch data to send
  26. reg                               tx_reg;                        //serial data output

  27. assign tx_pin = tx_reg;

  28. always@(posedge clk or negedge rst_n)
  29. begin
  30.         if(rst_n == 1'b0)
  31.                 state <= S_IDLE;
  32.         else
  33.                 state <= next_state;
  34. end

  35. always@(*)
  36. begin
  37.         case(state)
  38.                 S_IDLE:
  39.                         if(tx_data_valid == 1'b1)
  40.                                 next_state <= S_START;
  41.                         else
  42.                                 next_state <= S_IDLE;
  43.                 S_START:
  44.                         if(cycle_cnt == CYCLE - 1)
  45.                                 next_state <= S_SEND_BYTE;
  46.                         else
  47.                                 next_state <= S_START;
  48.                 S_SEND_BYTE:
  49.                         if(cycle_cnt == CYCLE - 1  && bit_cnt == 3'd7)
  50.                                 next_state <= S_STOP;
  51.                         else
  52.                                 next_state <= S_SEND_BYTE;
  53.                 S_STOP:
  54.                         if(cycle_cnt == CYCLE - 1)
  55.                                 next_state <= S_IDLE;
  56.                         else
  57.                                 next_state <= S_STOP;
  58.                 default:
  59.                         next_state <= S_IDLE;
  60.         endcase
  61. end

  62. always@(posedge clk or negedge rst_n)
  63. begin
  64.         if(rst_n == 1'b0)
  65.                         tx_data_ready <= 1'b0;
  66.         else if(state == S_IDLE)
  67.                 if(tx_data_valid == 1'b1)
  68.                         tx_data_ready <= 1'b0;
  69.                 else
  70.                         tx_data_ready <= 1'b1;
  71.         else if(state == S_STOP && cycle_cnt == CYCLE - 1)
  72.                         tx_data_ready <= 1'b1;
  73. end

  74. always@(posedge clk or negedge rst_n)
  75. begin
  76.         if(rst_n == 1'b0)
  77.                         tx_data_latch <= 8'd0;
  78.         else if(state == S_IDLE && tx_data_valid == 1'b1)
  79.                         tx_data_latch <= tx_data;               
  80. end

  81. always@(posedge clk or negedge rst_n)
  82. begin
  83.         if(rst_n == 1'b0)
  84.                         bit_cnt <= 3'd0;
  85.         else if(state == S_SEND_BYTE)begin
  86.         if(cycle_cnt == CYCLE - 1)
  87.                         bit_cnt <= bit_cnt + 3'd1;
  88.                 else
  89.                         bit_cnt <= bit_cnt;
  90.         end
  91.         else
  92.                 bit_cnt <= 3'd0;
  93. end

  94. always@(posedge clk or negedge rst_n)
  95. begin
  96.         if(rst_n == 1'b0)
  97.                 cycle_cnt <= 16'd0;
  98.         else if((state == S_SEND_BYTE && cycle_cnt == CYCLE - 1) || next_state != state)
  99.                 cycle_cnt <= 16'd0;
  100.         else
  101.                 cycle_cnt <= cycle_cnt + 16'd1;       
  102. end

  103. always@(posedge clk or negedge rst_n)
  104. begin
  105.         if(rst_n == 1'b0)
  106.                 tx_reg <= 1'b1;
  107.         else
  108.                 case(state)
  109.                         S_IDLE,S_STOP:
  110.                                 tx_reg <= 1'b1;
  111.                         S_START:
  112.                                 tx_reg <= 1'b0;
  113.                         S_SEND_BYTE:
  114.                                 tx_reg <= tx_data_latch[bit_cnt];
  115.                         default:
  116.                                 tx_reg <= 1'b1;
  117.                 endcase
  118. end

  119. endmodule
复制代码
assign end_cnt = (off_cnt < 1000)?  1'b1:1'b0;
这里设定发送1000个数据,实际收到2000个,每个数据重复发送一次,请问如何解决,谢谢!

串口收到的数据

串口收到的数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-11-2 00:12:09 | 显示全部楼层
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2022-11-2 17:14:07 | 显示全部楼层
直接看代码不好找问题,直接在线调试下吧,看下是不是给uart_tx模块提供的输入端口,就是有问题,一步步查问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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