这个警告代表某个输出变量的值恒为1或0。
问题:编译后ERR和RxdEnd的值恒为0。
分析:找到ERR和RxdEnd的位置(43-50行),程序完全没进入43到50行的if语句,导致程序没有对上述两个变量的值进行任何操作。
原因:第二行rnd_cnt变量没有指定位宽,默认位宽是1,所以程序处理时rnd_cnt最大为2,没有办法加到43行的5,所以程序卡在43行之前没法前进处理ERR和RxdEnd,导致了错误出现。
解决:指定位宽,将第二行改成reg[7:0] rnd_cnt; 问题解决。
总结:用于计数的变量要指定位宽
以下为错误代码
reg[7:0] RxdBuf;
reg rnd_cnt;
reg[8:0] LrcSum;
always@(posedge clk_sys or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 0;
RxdBuf <= 0;
RxdEnd <= 0;
baud_en <= 0;
rnd_cnt <= 0;
LrcSum <= 0;
ERR <= 0;
end
else
case(cur_state)
STA_IDLE : begin //闲置状态下对寄存器进行复位
cnt <= 0;
RxdBuf <= 0;
RxdEnd <= 0;
ERR <= 0;
if(Rxd) //检测到低电平
baud_en <= 1'b1; //允许进入次态
end
STA_START: if(baud_pulse && Rxd) //再次检测是否为低电平 不是就清baud_en回IDLE状态
baud_en <= 1'b0;
STA_DATA : if(baud_pulse)
begin
RxdBuf <= {Rxd, RxdBuf[7:1]}; //先收低位数据
cnt <= cnt + 1'b1; //数据位计数
end
STA_END : if(baud_pulse)
begin
baud_en <= 1'b0;
rnd_cnt = rnd_cnt + 1'b1; //记录这是第几轮接收数据
if(rnd_cnt <= 4)
LrcSum = LrcSum + RxdBuf;
else if(rnd_cnt == 5)
begin
rnd_cnt <= 0;
RxdEnd <= 1'b1;
LrcSum <= 9'd256 - LrcSum;
if(LrcSum != RxdBuf)
ERR = 1'b1;
end
end
endcase
end
endmodule