当前位置: 首页 > 工具软件 > pins > 使用案例 >

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

黄靖
2023-12-01

这个警告代表某个输出变量的值恒为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
 类似资料: