sasinop 发表于 2013-6-1 18:55:46

串口问题, veriglo 谢谢


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

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

该如何修改?

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

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


output led0;
wire led0;


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

always @ (posedge clk or negedge rst_n) begin
   if(!rst_n) begin
            rs232_rx0 <= 1'b1;
            rs232_rx1 <= 1'b1;
            rs232_rx2 <= 1'b1;
      end
   else begin
            rs232_rx0 <= rs232_rx;
            rs232_rx1 <= rs232_rx0;
            rs232_rx2 <= rs232_rx1;
      end
end

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

//----------------------------------------------------------------
reg bps_start_r;
reg   num;   //移位次数
reg rx_int;   //接收数据中断信号,接收到数据期间始终为高电平

always @ (posedge clk or negedge rst_n) begin
   if(!rst_n) begin
            bps_start_r <= 1'b0;
            rx_int <= 1'b0;
      end
   else if(neg_rs232_rx) begin
            bps_start_r <= 1'b1; //启动接收数据
         rx_int <= 1'b1;   //接收数据中断信号使能
            end
   else if(num==4'd10) begin                      //??
            bps_start_r <= 1'b0; //数据接收完毕
            rx_int <= 1'b0;      //接收数据中断信号关闭
      end
end
assign bps_start = bps_start_r;

//----------------------------------------------------------------
reg rx_data_r;//接收数据寄存器,保存直至下一个数据来到
//----------------------------------------------------------------

reg   rx_temp_data; //当前接收数据寄存器
reg rx_data_shift;   //数据移位标志

always @ (posedge clk or negedge rst_n) begin
   if(!rst_n) begin
            rx_data_shift <= 1'b0;
            rx_temp_data <= 8'd0;
            num <= 4'd0;
            rx_data_r <= 8'd0;                               
      end
   else if(rx_int) begin    //接收数据处理
      if(clk_bps) begin //读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位      
            rx_data_shift <= 1'b1;
               num <= num+1'b1;
               if(num<=4'd8) rx_temp_data <= rs232_rx;    //锁存9bit(1bit起始位,8bit数据)   ??如何配置rs232_rx
            end
      else if(rx_data_shift) begin    //数据移位处理   
            rx_data_shift <= 1'b0;
               if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1;//移位8次,第1bit起始位移除,剩下8bit正好是接收数据
               else if(num==4'd10) begin
                      num <= 4'd0;//接收到STOP位后结束,num清零
                      rx_data_r <= rx_temp_data;//把数据锁存到数据寄存器rx_data中                                                       
                   end
            end
      end
end

//assign rx_data = rx_data_r;


// 自加点灯部分代码
reg    led;
assign   {led0} = led;

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

endmodule

firefox1123 发表于 2013-6-2 00:04:39

101行是不是缺少个else了。收到0x55后led就一直为1了

sasinop 发表于 2013-6-2 07:56:22

firefox1123 发表于 2013-6-2 00:04 static/image/common/back.gif
101行是不是缺少个else了。收到0x55后led就一直为1了

现在问题是

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

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

firefox1123 发表于 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里面赋值,会产生冲突

sasinop 发表于 2013-6-2 13:01:22

reg    led;
assign   {led0} = led;
// 自加点灯部分代码
always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            led <= 1'b0;// <= 8'b0;
      end
   else
          led <= 1'b1;
end        用上面的代码,测试,点灯正常,,也就是程序烧到片子里后,LED0等一直常亮

而加上串口发送 内容,来判断是否点灯时,如何发啥内容都不行,灯一直不亮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为啥加上判断条件就不行了呢?
哪里出了问题?

sasinop 发表于 2013-6-2 13:12:11

感觉条件没有触发点灯呀

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

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

sasinop 发表于 2013-6-2 13:44:08

reg    led;
assign   {led0} = led;
// 自加点灯部分代码
always @ (posedge clk_bps 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
修改了一点代码,,发现一个 “ if(rx_data_r!=8'd0101_0101) begin ”这句改成 “不等于” 时,,居然得到了想要的效果
很邪门

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

又是为啥呢?

wangjun403 发表于 2013-6-2 16:18:04

if(rx_data_r!=8'd0101_0101) begin

字面意思很清楚

sasinop 发表于 2013-6-2 18:29:15

wangjun403 发表于 2013-6-2 16:18 static/image/common/back.gif
if(rx_data_r!=8'd0101_0101) begin

字面意思很清楚

问题是我发的是 55

也点亮了

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


wangjun403 发表于 2013-6-3 08:59:19

那就说明,你发的是55,他收到的不一定是55
页: [1]
查看完整版本: 串口问题, veriglo 谢谢