您当前的位置: 首页 >  算法

耐心的小黑

暂无认证

  • 1浏览

    0关注

    323博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

verilog 整数开方算法实现(逐次逼近法)

耐心的小黑 发布时间:2021-04-06 20:12:08 ,浏览量:1

本文对原文的代码做了一些注释和微调,为的是更加方便理解!!!

一、逐次逼近算法

逐次逼近算法流程如图 1所示,首先数据输入data[7:0],接着设置实验值D_z[3:0]和确定值D_q[3:0],然后按照从高往低的顺序,依次将每一位置1(如D_z[3]置1),再将实验值平方后与输入数据比较,若实验值的平方大于输入值(D_z^2 > data),则此位为0(D_q[3]为0),反之(D_z^2 ≤ data)此位为1(D_q[3]为1);以此迭代到最后一位。

可见,如果是n bit的数据,那么需要n/2次迭代,每次计算如果一个周期,则需要n/2个周期。 在这里插入图片描述

二、算法实现
module sqrt
	#( 	    //8,4,5
			parameter  d_width = 8,
			parameter  q_width = d_width/2,
			parameter  r_width = q_width + 1	)
	(
	input	wire clk,
	input	wire rst_n,
	input	wire i_vaild,
	input	wire [d_width-1:0]	data_i, //输入
	
	
	output	reg	o_vaild,
	output	reg	[q_width-1:0]	data_o, //输出
	output	reg	[r_width-1:0]	data_r  //余数
	
    );
//--------------------------------------------------------------------------------
//  注意这里使用了流水线操作,输出数据的位宽决定了流水线的级数,级数=q_width
	reg 	[d_width-1:0] D     [q_width:1]; //保存依次输入进来的被开方数据
	reg 	[q_width-1:0] Q_z	[q_width:1]; //保存每一级流水线的实验值
	reg	 	[q_width-1:0] Q_q	[q_width:1]; //由实验值与真实值的比较结果确定的最终值
	reg 	valid_flag		    [q_width:1]; //表示此时寄存器D中对应位置的数据是否有效
//--------------------------------------------------------------------------------
	always@(posedge	clk or negedge	rst_n)
		begin
			if(!rst_n)
				begin
					D[q_width]             
关注
打赏
1640088279
查看更多评论
0.0400s