Ian11122840 发表于 2010-10-13 16:22:59

【求助!】变量在编译的时候,老是被软件提示位宽不对!怎么解决啊!

都快被Quartus综合软件整疯了~~~~这句话:

   assign SysRA = (RA_buf == 3'b011)? 1 : 0;

老是被提示 truncated value with size <32> to match size of target (<1>)(削减31位长度来满足目标的一位长度~!!)

所以后面的逻辑(如下)也就全部不对了
assign Ren = (SysRA & !bin) | (SysFA &bin) | (SysRB &ain) | (SysFB & !ain) ;
assign Fen = (SysRA &bin) | (SysFA & !bin) | (SysRB & !ain) | (SysFB &ain) ;


问题是我根本没有在哪里定义过32位位宽的,用到的变量都是3位的,或者1位的!!(如下所示)
        reg RA_buf;
        reg RB_buf;
        reg FA_buf;
        reg FB_buf;
       
        wire SysRA,SysFA,SysRB,SysFB;



为啥老是被提示有错呢?~~大虾支个招啊,求给我点燃一盏明灯吧~~~~

Ian11122840 发表于 2010-10-13 16:24:10

完整的程序像这样的,同步ain bin 的信号,产生一个脉冲,以改变计数器的值,最后用数码管显示


//由AB相产生脉冲并计数,显示
module decodeprj(ain,bin,rst,clk,dataout,en);

input ain,bin,rst,clk;
output dataout;
output en;//COM使能输出

reg dataout;//各段数据输出
reg en;

reg cnt_scan;//扫描频率计数器
reg dataout_buf;

// reg bcdout;//16位计数器转化成的BCD码,4位一值

        reg RA_buf;
        reg RB_buf;
        reg FA_buf;
        reg FB_buf;
       
        wire SysRA,SysFA,SysRB,SysFB;
        triregRen,Fen;
       
reg cnumberplus;
reg cnumberminus;
reg cnumber;//脉冲计数个数 16位空间 65536个数 um—mm级别


always@(negedge rst or posedge clk)
begin
if(!rst)
    begin
      RA_buf <= 0;
    end
   
        else RA_buf <= {RA_buf,ain};
end

assign SysRA = (RA_buf == 3'b011)? 1 : 0; //同步A的上升沿


always@(negedge rst or posedge clk)
begin
if(!rst)
    begin
      FA_buf <= 7;
    end
   
        else FA_buf <= {FA_buf,ain};
end

assign SysFA = (FA_buf == 3'b100)? 1 : 0; //同步A的下降沿

always@(negedge rst or posedge clk)
begin
if(!rst)
    begin
      RB_buf <= 0;
    end
   
        else RB_buf <= {RB_buf,ain};
end

assign SysRB = (RB_buf == 3'b011)? 1 : 0; //同步B的上升沿

always@(negedge rst or posedge clk)
begin
if(!rst)
    begin
      FB_buf <= 7;
    end
   
        else FB_buf <= {FB_buf,ain};
end

assign SysFB = (FB_buf == 3'b100)? 1 : 0; //同步B的下降沿

assign Ren = (SysRA & !bin) | (SysFA &bin) | (SysRB &ain) | (SysFB & !ain) ;
assign Fen = (SysRA &bin) | (SysFA & !bin) | (SysRB & !ain) | (SysFB &ain) ;




//use ain bin to TEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
always@(negedge rst or posedge Ren)
begin
if(!rst)
    begin
      cnumberplus <= 65536;
    end
else
   cnumberplus <= cnumberplus+1;
end


always@(negedge rst or posedge Fen)
begin
if(!rst)
    begin
      cnumberminus <= 0;
    end
else
   cnumberminus <= cnumberminus+1;
end

always@(cnumberminus or cnumberplus)
        cnumber = cnumberplus - cnumberminus;

always@(posedge clk)
        begin
                cnt_scan<=cnt_scan+1;
        end

always @(cnt_scan)
begin
   case(cnt_scan)
       3'b000 :
          en = 8'b1111_1110;
       3'b001 :
          en = 8'b1111_1101;
       3'b010 :
          en = 8'b1111_1011;
       3'b011 :
          en = 8'b1111_0111;
       3'b100 :
          en = 8'b1110_1111;
       3'b101 :
          en = 8'b1101_1111;
       3'b110 :
          en = 8'b1011_1111;
       3'b111 :
          en = 8'b0111_1111;
       default :
          en = 8'b1111_1111;
    endcase
end

always@(en or cnumber) //对应COM信号给出各段数据
begin
        case(en)
                8'b1111_1110:
                        dataout_buf<=cnumber;
                8'b1111_1101:
                        dataout_buf<=cnumber;
                8'b1111_1011:
                        dataout_buf<=cnumber;
                8'b1111_0111:
                        dataout_buf<=cnumber;       
                8'b1110_1111:
                        dataout_buf<=cnumber;
                8'b1101_1111:
                        dataout_buf<=cnumber;
                8'b1011_1111:
                        dataout_buf<=cnumber;
                8'b0111_1111:
                        dataout_buf<=cnumber;
                default:
                        dataout_buf<=8;
       endcase
end

always@(dataout_buf)
begin
        case(dataout_buf)
                4'b0000:
                        dataout=8'b0000_0011;
                4'b0001:
                        dataout=8'b1001_1111;
                4'b0010:
                        dataout=8'b0010_0101;
                4'b0011:
                        dataout=8'b0000_1101;
                4'b0100:
                        dataout=8'b1001_1001;
                4'b0101:
                        dataout=8'b0100_1001;
                4'b0110:
                        dataout=8'b0100_0001;
                4'b0111:
                        dataout=8'b0001_1111;
                4'b1000:
                        dataout=8'b0000_0001;
                4'b1001:
                        dataout=8'b0001_1001;
                4'b1010:
                        dataout=8'b0001_0001;
                4'b1011:
                        dataout=8'b1100_0001;
                4'b1100:
                        dataout=8'b0110_0011;
                4'b1101:
                        dataout=8'b1000_0101;
                4'b1110:
                        dataout=8'b0110_0001;
                4'b1111:
                        dataout=8'b0111_0001;
                default:
                        dataout=8'b1111_1111;
       endcase
end

endmodule

Ian11122840 发表于 2010-10-13 16:49:24

汗!我大汗!求人不如求己


   assign SysRA = (RA_buf == 3'b011)? 1 : 0;

改成:
   assign SysRA = (RA_buf == 3'b011)? 1'b1 : 1'b0;



问题就解决了!具体为什么,不用我解释了吧~~唉,真是强悍的开发环境啊~~

seemrain 发表于 2010-10-13 17:22:10

这个不是错误啊,一个警告而已。。。不用去理他就可以了
相对于其他综合器而言,quartus的语法检查已经是很宽松的了。

lbc___ 发表于 2010-10-13 18:51:31

回复【2楼】Ian11122840 船儿
-----------------------------------------------------------------------

呵呵,你不指定位宽,编译器会默认是32位的

wang110 发表于 2010-10-16 11:27:20

回复【2楼】Ian11122840 船儿
-----------------------------------------------------------------------
汗!我大汗!求人不如求己

同感
页: [1]
查看完整版本: 【求助!】变量在编译的时候,老是被软件提示位宽不对!怎么解决啊!