newton算法实现的div的verilog

代码如下

module cordicDiv
(
   input CLOCK,RESET,
   input iCall, 
   input [31:0]dividend,
   input [31:0]divisor,
   output [31:0]quotient
);

	reg signed [7:0]e;
	reg signed [31:0]f,rp,dd,x0,x1;
	reg signed [63:0]q;
	reg [7:0]i;
	reg isDone,isSign,isE;

	always @ ( posedge CLOCK or negedge RESET )
		if( !RESET )
			begin
				e <= 8'd0;
				{ f,rp,dd,x0,x1 } <= { 32'd0,32'd0,32'd0,32'd0,32'd0 };
				q <= 64'd0;
				i <= 8'd0;
				{ isDone,isSign,isE } <= { 1'b0,1'b0,1'b0 };
			end
		 
		else if( iCall )
			case( i )
				0:
				begin
					isSign <= dividend[31] ^ divisor[31];
					dd <= dividend[31] ? -(dividend) : dividend;
					f <= divisor[31]? -(divisor):divisor;
					e <= 8'd0;
					i <= i + 1'b1;
				end

				1:
				begin
					if( f >= 65536 ) begin f = f >>> 1; e = e + 1'b1; end
					else if( f < 32768 ) begin f = f <<< 1; e = e - 1'b1; end

					if( f < 32768 | f >= 65536 ) i <= i;
					else i <= i + 1'b1;
				end

				2:
				begin
					isE <= e[7];
					e <= e[7] ? -e : e;
					x0 <= { 16'd0,f[19:4] };
					i <= i + 1'b1;
				end

				3,4,5,6,7,8,9,10:
				begin
					x1 = 8192 - ((f[19:4]*x0) >>> 12);
					x0 <= (x0 * x1) >>> 12;
					i <= i + 1'b1;
				end

				11:
				begin
					x0 = x0 <<< 4;
					rp = isE ? x0 <<< e : x0 >>> e; // x0 * 2-e
					q <= (dd * rp) >>> 16;
					i <= i + 1'b1;
				end
			endcase
	assign quotient = isSign ? -q : q;

endmodule

模块的功能如下:

  1. 当RESET信号为低电平时,重置模块的内部状态和变量。
  2. 当iCall信号为高电平时,开始执行除法运算。
  3. 根据i的值,执行不同的操作:
    • 当i为0时,初始化一些变量,确定被除数和除数的符号。
    • 当i为1时,进行除数归一化的计算,将除数调整到特定范围内。
    • 当i为2时,判断除数的符号,计算初始值x0。
    • 当i为3到10时,使用CORDIC算法迭代计算x0和x1的值。
    • 当i为11时,根据计算得到的x0和e,计算商的值q。
  4. 最后,根据商的符号位isSign,确定最终的商的值。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andeyeluguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值