verilog while循环次数限制问题

Error (10119): Verilog HDL Loop Statement error at divider.v(16): loop with non-constant loop condition must terminate within 250 iterations
出现这个错误提示,指我的循环可能陷入死循环,最高循环次数为250次

代码如下

module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数

output reg[4:0]RX,//商
output reg[4:0]CX//余数
); 
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
	TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
	TB=(BX[4])?BX:(~BX+1'b1);//如果除数是正数就取其负数,反之不变
	QX=AX[4]+BX[4];//判断商的符号
	RX=0; //商初始化为0
		while(TA>=(~TB+1'b1))
		begin
		TA=TA+TB;
		RX=RX+1'b1;
		end
	CX=TA;
	RX=QX?(~RX+1'b1):RX;
end


endmodule

这里是个除法器 我使用补码的形式来进行加法错做,TA是逐渐减小的,但是它仍然认为我的TA有可能陷入死循环,即 TB=0(我敲博客的时候才想到TB有可能等于0,我傻了)现在修改一下试一下

发现还是不对,于是放弃使用while 改用repeat

module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数

output reg[4:0]RX,//商
output reg[4:0]CX//余数
); 
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
	if(BX==0)
	begin
	RX=0;
	CX=0;
	TA=0;
	TB=0;
	QX=0;
	end
	else
	begin
		TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
		TB=(BX[4])?(~BX+1'b1):BX;//如果除数是正数就取其负数,反之不变
		QX=AX[4]+BX[4];//判断商的符号
		RX=0; //商初始化为0
			repeat(15)
			begin
				if(TA>=TB)
				begin
				TA=TA-TB;
				RX=RX+1'b1;
				end
			end
		CX=TA;
		RX=QX?(~RX+1'b1):RX;
	end
end

这种情况下程序正确 仿真结果如下:

还有有问题

此处涉及问题 负数除正数后余数怎么算 如-5 除 2 得-2 余-1 还是得-3 余 1呢?

按理来说应该是余-1的结果。所以即余数应该和被除数同号,修改代码

module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数

output reg[4:0]RX,//商
output reg[4:0]CX//余数
); 
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
	if(BX==0)//如果除数为0则报错输出全为0
	begin
	RX=0;
	CX=0;
	TA=0;
	TB=0;
	QX=0;
	end
	else
	begin
		TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
		TB=(BX[4])?(~BX+1'b1):BX;//如果除数是正数就取其负数,反之不变
		QX=AX[4]+BX[4];//判断商的符号
		RX=0; //商初始化为0
			repeat(15)
			begin
				if(TA>=TB)
				begin
				TA=TA-TB;
				RX=RX+1'b1;
				end
			end
		CX=AX[4]?(~TA+1'b1):TA; //余数与被除数同号	
		RX=QX?(~RX+1'b1):RX;  // 商与被除数和除数有关
	end
end

仿真结果

 

经查阅wiki百科 -5 除 2 得-2 余-1 得-3 余 1的两种结果都是正确的,只要保证余数绝对值小于除数就可以了,但是在某些编程语言中有特殊的规定

具体如下图

preview

preview

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值