Verilog HDL警告 Warning (13024): Output pins are stuck at VCC or GND

这个警告代表某个输出变量的值恒为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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值