搜索
bottom↓
回复: 9

串口问题, veriglo 谢谢

[复制链接]

出0入0汤圆

发表于 2013-6-1 18:55:46 | 显示全部楼层 |阅读模式

在串口接收部分,自己添加了一段代码,想接收到0x55时,
点亮 LED灯

发现,不论发不发数据,灯一直亮的....

该如何修改?


  1. module my_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data,rx_int,led0);

  2. input clk; // 主时钟
  3. input rst_n;  //低电平复位信号
  4. input rs232_rx;   // RS232接收数据信号!!
  5. input clk_bps;    // clk_bps的高电平为接收或者发送数据位的中间采样点
  6. output bps_start; //接收到数据后,波特率时钟启动信号置位
  7. output[7:0] rx_data; //接收数据寄存器,保存直至下一个数据来到
  8. output rx_int;    //接收数据中断信号,接收到数据期间始终为高电平


  9. output led0;
  10. wire led0;


  11. //----------------------------------------------------------------
  12. reg rs232_rx0,rs232_rx1,rs232_rx2; //接收数据寄存器,滤波用
  13. wire neg_rs232_rx;   //表示数据线接收到下降沿

  14. always @ (posedge clk or negedge rst_n) begin
  15.      if(!rst_n) begin
  16.             rs232_rx0 <= 1'b1;
  17.             rs232_rx1 <= 1'b1;
  18.             rs232_rx2 <= 1'b1;
  19.         end
  20.      else begin
  21.             rs232_rx0 <= rs232_rx;
  22.             rs232_rx1 <= rs232_rx0;
  23.             rs232_rx2 <= rs232_rx1;
  24.         end
  25. end

  26. assign neg_rs232_rx = rs232_rx2 & ~rs232_rx1; //接收到下降沿后neg_rs232_rx置高一个时钟周期  ??

  27. //----------------------------------------------------------------
  28. reg bps_start_r;
  29. reg[3:0]   num;   //移位次数
  30. reg rx_int;   //接收数据中断信号,接收到数据期间始终为高电平

  31. always @ (posedge clk or negedge rst_n) begin
  32.      if(!rst_n) begin
  33.             bps_start_r <= 1'b0;
  34.             rx_int <= 1'b0;
  35.         end
  36.      else if(neg_rs232_rx) begin
  37.             bps_start_r <= 1'b1; //启动接收数据
  38.            rx_int <= 1'b1;   //接收数据中断信号使能
  39.             end
  40.      else if(num==4'd10) begin                      //??
  41.             bps_start_r <= 1'b0; //数据接收完毕
  42.             rx_int <= 1'b0;      //接收数据中断信号关闭
  43.         end
  44. end
  45. assign bps_start = bps_start_r;

  46. //----------------------------------------------------------------
  47. reg[7:0] rx_data_r;  //接收数据寄存器,保存直至下一个数据来到
  48. //----------------------------------------------------------------

  49. reg[7:0]   rx_temp_data; //当前接收数据寄存器
  50. reg rx_data_shift;   //数据移位标志

  51. always @ (posedge clk or negedge rst_n) begin
  52.      if(!rst_n) begin
  53.             rx_data_shift <= 1'b0;
  54.             rx_temp_data <= 8'd0;
  55.             num <= 4'd0;
  56.             rx_data_r <= 8'd0;                               
  57.         end
  58.      else if(rx_int) begin    //接收数据处理
  59.         if(clk_bps) begin //读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位      
  60.               rx_data_shift <= 1'b1;
  61.                num <= num+1'b1;
  62.                if(num<=4'd8) rx_temp_data[7] <= rs232_rx;    //锁存9bit(1bit起始位,8bit数据)   ??如何配置rs232_rx
  63.             end
  64.         else if(rx_data_shift) begin    //数据移位处理   
  65.               rx_data_shift <= 1'b0;
  66.                if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1;  //移位8次,第1bit起始位移除,剩下8bit正好是接收数据
  67.                else if(num==4'd10) begin
  68.                       num <= 4'd0;  //接收到STOP位后结束,num清零
  69.                       rx_data_r <= rx_temp_data;  //把数据锁存到数据寄存器rx_data中                                                         
  70.                    end
  71.             end
  72.         end
  73. end

  74. //assign rx_data = rx_data_r;


  75. // 自加点灯部分代码
  76. reg    [1 :0] led;
  77. assign   {led0} = led;

  78. always @ (posedge clk or negedge rst_n) begin
  79.         if(!rst_n) begin
  80.             rx_data_r <= 8'b0;
  81.         end
  82.      else if(rx_data_r==8'd0101_0101) begin //如过收到0x55,点灯一盏
  83.           led <= 1'b1;
  84.         end
  85. end

  86. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-6-2 00:04:39 | 显示全部楼层
101行是不是缺少个else了。收到0x55后led就一直为1了

出0入0汤圆

 楼主| 发表于 2013-6-2 07:56:22 | 显示全部楼层
firefox1123 发表于 2013-6-2 00:04
101行是不是缺少个else了。收到0x55后led就一直为1了

现在问题是

程序烧进去后,串口还没发东西呢,灯就亮了

后面发啥数据,灯都一直亮...

出0入0汤圆

发表于 2013-6-2 11:55:25 | 显示全部楼层
// 自加点灯部分代码
reg   led;

always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            led <= 1'b0;
        end
     else if(rx_data_r==8'd0101_0101) begin //如过收到0x55,点灯一盏
          led <= 1'b1;
        end
     else
        led <= 1'b0;
end


rx_data_r不可以在俩个always里面赋值,会产生冲突

出0入0汤圆

 楼主| 发表于 2013-6-2 13:01:22 | 显示全部楼层
  1. reg    [1 :0] led;
  2. assign   {led0} = led;
  3. // 自加点灯部分代码
  4. always @ (posedge clk or negedge rst_n) begin
  5.         if(!rst_n) begin
  6.             led <= 1'b0;// <= 8'b0;
  7.         end
  8.      else
  9.           led <= 1'b1;
  10. end       
复制代码
用上面的代码,测试,点灯正常,,也就是程序烧到片子里后,LED0等一直常亮

而加上串口发送 内容,来判断是否点灯时,如何发啥内容都不行,灯一直不亮
  1. always @ (posedge clk or negedge rst_n) begin
  2.         if(!rst_n) begin
  3.             led <= 1'b0;
  4.         end
  5.      else if(rx_data_r==8'd0101_0101) begin //如过收到0x55,点灯一盏
  6.           led <= 1'b1;
  7.         end
  8.      else
  9.         led <= 1'b0;
  10. end
复制代码
为啥加上判断条件就不行了呢?
哪里出了问题?

出0入0汤圆

 楼主| 发表于 2013-6-2 13:12:11 | 显示全部楼层
感觉条件没有触发点灯呀

但是,发了55 后,串口调试软件上也返回了 55 呀

按道理说,应该是55 发下去了,,咋就不能触发点灯动作呢?

出0入0汤圆

 楼主| 发表于 2013-6-2 13:44:08 | 显示全部楼层
  1. reg    [1 :0] led;
  2. assign   {led0} = led;
  3. // 自加点灯部分代码
  4. always @ (posedge clk_bps or negedge rst_n) begin
  5.         if(!rst_n) begin
  6.             led <= 1'b0;//
  7.         end
  8.      else if(rx_data_r!=8'd0101_0101) begin //如过收到0x55,点灯一盏
  9.           led <= 1'b1;
  10.         end
  11.      else
  12.         led <= 1'b0;
  13. end
复制代码
修改了一点代码,,发现一个 “ if(rx_data_r!=8'd0101_0101) begin ”  这句改成 “不等于” 时,,居然得到了想要的效果
很邪门

改成上面的代码后,烧写到片子里后,,灯是不亮的,,,随意发一个 字节的 数据 给开发板,,灯就被点亮了....

又是为啥呢?

出0入0汤圆

发表于 2013-6-2 16:18:04 | 显示全部楼层
if(rx_data_r!=8'd0101_0101) begin

字面意思很清楚

出0入0汤圆

 楼主| 发表于 2013-6-2 18:29:15 | 显示全部楼层
wangjun403 发表于 2013-6-2 16:18
if(rx_data_r!=8'd0101_0101) begin

字面意思很清楚

问题是我发的是 55

也点亮了

就是说不管发什么都能点亮


出0入0汤圆

发表于 2013-6-3 08:59:19 | 显示全部楼层
那就说明,你发的是55,他收到的不一定是55
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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