串口问题, 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
101行是不是缺少个else了。收到0x55后led就一直为1了 firefox1123 发表于 2013-6-2 00:04 static/image/common/back.gif
101行是不是缺少个else了。收到0x55后led就一直为1了
现在问题是
程序烧进去后,串口还没发东西呢,灯就亮了
后面发啥数据,灯都一直亮... // 自加点灯部分代码
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里面赋值,会产生冲突 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为啥加上判断条件就不行了呢?
哪里出了问题?
感觉条件没有触发点灯呀
但是,发了55 后,串口调试软件上也返回了 55 呀
按道理说,应该是55 发下去了,,咋就不能触发点灯动作呢?
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 ”这句改成 “不等于” 时,,居然得到了想要的效果
很邪门
改成上面的代码后,烧写到片子里后,,灯是不亮的,,,随意发一个 字节的 数据 给开发板,,灯就被点亮了....
又是为啥呢?
if(rx_data_r!=8'd0101_0101) begin
字面意思很清楚
wangjun403 发表于 2013-6-2 16:18 static/image/common/back.gif
if(rx_data_r!=8'd0101_0101) begin
字面意思很清楚
问题是我发的是 55
也点亮了
就是说不管发什么都能点亮
那就说明,你发的是55,他收到的不一定是55
页:
[1]