在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2168|回复: 3

[求助] 新手求助---串口接收模块状态机,烧到板子里面从串口终端看到的是乱码

[复制链接]
发表于 2015-8-24 17:23:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x




  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    14:06:16 08/19/2015
  7. // Design Name:
  8. // Module Name:    uart_rx
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module uartrx(clk,
  22.                                         rx,
  23.                                         dataout,
  24.                                         rdsig,
  25.                                         dataerror,
  26.                                         frameerror
  27.     );
  28.          input clk;
  29.          input rx;
  30.          output dataout;
  31.          output rdsig;
  32.          output dataerror;
  33.          output frameerror;
  34.          
  35.          reg rxbuf;
  36.          reg rxfall;
  37.          reg idle;
  38.          reg [7:0] cnt;
  39.          reg receive;
  40.          reg presult;
  41.          
  42.          localparam paritymode = 1'b0;
  43.          localparam [3:0]
  44.                                         hold = 4'b0000,
  45.                                         prepare = 4'b0001,
  46.                                         start = 4'b0010,
  47.                                         data0 = 4'b0011,
  48.                                         data1 = 4'b0100,
  49.                                         data2 = 4'b0101,
  50.                                         data3 = 4'b0110,
  51.                                         data4 = 4'b0111,
  52.                                         data5 = 4'b1000,
  53.                                         data6 = 4'b1001,
  54.                                         data7 = 4'b1010,
  55.                                         checkout = 4'b1011,
  56.                                         stop = 4'b1100;
  57.                                        
  58.          always @(posedge clk)
  59.                 begin
  60.                         rxbuf <= rx;
  61.                         rxfall <= rxbuf & (~rx);
  62.                 end
  63.          always @(posedge clk)
  64.                 begin
  65.                         if(rxfall & (~idle))
  66.                                 receive <= 1;
  67.                         else if(counter == 8'd168)
  68.                                 receive <= 0;
  69.                 end
  70.          always @(posedge clk or posedge receive)
  71.                 begin
  72.                         if(receive)
  73.                                 current_state <= next_state;
  74.                 end
  75.         always @(*)
  76.                 begin
  77.                 case(current_state)
  78.                 hold:beginif(receive == 1)
  79.                                 next_state = prepare;
  80.                                 else
  81.                                 next_state = hold;end
  82.                 prepare:beginif(cnt == 8'd8)
  83.                                         next_state = start;elsenext_state = prepare;end
  84.                 start:beginif(cnt == 8'd24)
  85.                                         next_state = data0;elsenext_state = start;end
  86.                 data0:beginif(cnt == 8'd40)
  87.                                         next_state = data1;        elsenext_state = data0;end  
  88. data1:if(cnt == 8'd56)
  89.                                         next_state = data2;elsenext_state = data1;end                data2:beginif(cnt == 8'd72)
  90.                                         next_state = data3;elsenext_state = data2;end                data3:beginif(cnt == 8'd88)
  91.                                         next_state = data4;elsenext_state = data3;end                data4:beginif(cnt == 8'd104)
  92.                                         next_state = data5;        elsenext_state = data4;         end   
  93. data5:beginif(cnt == 8'd120)
  94.                                         next_state = data6;elsenext_state = data5;end                data6:beginif(cnt == 8'd136)
  95.                                         next_state = data7;elsenext_state = data6;end                data7:beginif(cnt == 8'd152)
  96.                                         next_state = checkout;elsenext_state = data7;end                checkout:beginif(cnt == 8'd168)
  97.                                         next_state = stop;        elsenext_state = checkout;         end   
  98. stop:beginnext_state = hold;end                default: next_state = hold;
  99.                 endcase
  100.         end
  101.                 always @(posedge clk)
  102.                         begin
  103.                                 case(next_state)
  104.                                 hold:begin
  105.                                                 idle <= 0;
  106.                                                 cnt <= 0;
  107.                                                 rdsig <= 0;
  108.                                                 end
  109.                                 prepare:        begin
  110.                                                 idle <= 1'b0;
  111.                                                 cnt <= cnt + 8'b1;
  112.                                                 rdsig <= 1'b0;
  113.                                                 end
  114.                                 start:begin
  115.                                                 idle <= 1'b1;
  116.                                                 cnt <= cnt + 8'b1;
  117.                                                 rdsig <= 1'b0;
  118.                                                 end
  119.                                 data0:begin
  120.                                       idle <= 1'b1;
  121.                                                 cnt <= cnt + 8'b1;
  122.                                                 rdsig <= 1'b0;
  123.                                                 dataout[0] <= rx;
  124.                                                 presult <= paritymode^rx;
  125.                                                 end
  126.                                 data1:begin
  127.                                                 idle <= 1'b1;
  128.                                                 cnt <= cnt + 8'b1;
  129.                                                 rdsig <= 1'b0;
  130.                                                 dataout[1] <= rx;
  131.                                                 presult <= presult^rx;
  132.                                                 end
  133.                                 data2:begin
  134.                                                 idle <= 1'b1;
  135.                                                 cnt <= cnt + 8'b1;
  136.                                                 rdsig <= 1'b0;
  137.                                                 dataout[2] <= rx;
  138.                                                 presult <= presult^rx;        
  139.                                                 end
  140.                                 data3:begin
  141.                                                 idle <= 1'b1;
  142.                                                 cnt <= cnt + 8'b1;
  143.                                                 rdsig <= 1'b0;
  144.                                                 dataout[3] <= rx;
  145.                                                 presult <= presult^rx;
  146.                                                 end
  147.                                 data4:begin
  148.                                                 idle <= 1'b1;
  149.                                                 cnt <= cnt + 8'b1;
  150.                                                 rdsig <= 1'b0;
  151.                                                 dataout[4] <= rx;
  152.                                                 presult <= presult^rx;
  153.                                                 end
  154.                                 data5:begin
  155.                                                 idle <= 1'b1;
  156.                                                 cnt <= cnt + 8'b1;
  157.                                                 rdsig <= 1'b0;
  158.                                                 dataout[5] <= rx;
  159.                                                 presult <= presult^rx;
  160.                                                 end
  161.                                 data6:begin
  162.                                                 idle <= 1'b1;
  163.                                                 cnt <= cnt + 8'b1;
  164.                                                 rdsig <= 1'b0;
  165.                                                 dataout[6] <= rx;
  166.                                                 presult <= presult^rx;
  167.                                                 end
  168.                                 data7:begin
  169.                                                 idle <= 1'b1;
  170.                                                 cnt <= cnt + 8'b1;
  171.                                                 rdsig <= 1'b1;
  172.                                                 dataout[7] <= rx;
  173.                                                 presult <= presult^rx;
  174.                                                 end
  175.                                 checkout:begin
  176.                                                         if(presult == rx)
  177.                                                                 dataerror <= 1'b0;
  178.                                                         else
  179.                                                                 dataerror <= 1'b1;
  180.                                                         cnt <= cnt+8'b1;
  181.                                                         rdsig <= 1'b1;
  182.                                                         idle = 1'b1;
  183.                                                         end
  184.                                 stop:begin
  185.                                            if(rx == 1'b1)
  186.                                                         frameerror <= 1'b0;
  187.                                                 else
  188.                                                         frameerror <= 1'b1;
  189.                                                 idle <= 1'b1;
  190.                                                 cnt <= cnt+8'b1;
  191.                                                 rdsig <= 1'b1;
  192.                                           end
  193.                      endcase
  194.         end
  195. endmodule



复制代码
 楼主| 发表于 2015-8-24 17:55:23 | 显示全部楼层
采用16倍频波特率进行采样,用modelsim仿真,可以看到状态机跳转,但是就是在板子上,用串口调试助手就不能正常接收,是乱码。
发表于 2015-8-24 18:22:45 | 显示全部楼层
最好能chipscope抓波形
 楼主| 发表于 2015-8-25 15:49:43 | 显示全部楼层
回复 3# atlandis

我试试 不过感觉为啥会出现乱码?就是数据可以通信 但是接收的乱码。。。。。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 17:12 , Processed in 0.021817 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表