【求助!】变量在编译的时候,老是被软件提示位宽不对!怎么解决啊!
都快被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;
为啥老是被提示有错呢?~~大虾支个招啊,求给我点燃一盏明灯吧~~~~ 完整的程序像这样的,同步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 汗!我大汗!求人不如求己
assign SysRA = (RA_buf == 3'b011)? 1 : 0;
改成:
assign SysRA = (RA_buf == 3'b011)? 1'b1 : 1'b0;
问题就解决了!具体为什么,不用我解释了吧~~唉,真是强悍的开发环境啊~~ 这个不是错误啊,一个警告而已。。。不用去理他就可以了
相对于其他综合器而言,quartus的语法检查已经是很宽松的了。 回复【2楼】Ian11122840 船儿
-----------------------------------------------------------------------
呵呵,你不指定位宽,编译器会默认是32位的 回复【2楼】Ian11122840 船儿
-----------------------------------------------------------------------
汗!我大汗!求人不如求己
同感
页:
[1]