此平方根求解算法用的是试根法,绝对好用,最后有modelsim仿真图验证哟~~~modulesqrt(//端口列表clk,start,over,data,result,remain);//端口定义及数据类型说明inputclk;inputstart;//开始信号,为1时才开始计算,否则等待inputwire[9:0]data;//10位数据输入outputregover;//结束信号,计算完成时产生一个时钟周期的高电平outputreg[9:0]result;//接近开平方结果的整数outputreg[9:0]remain;//“余数”部分remain=data-result*resultreg[2:0]STATE;//标识状态reg[9:0]M;//中间变量reg[3:0]N;//权的表示reg[9:0]CMP;//中间变量reg[9:0]X,R;//存中间结果哒initialbeginSTATE=0;over=0;endalways@(posedgeclk)begincase(STATE)0:beginover=0;if(start)beginSTATE=1;//指示状态X=0;//00…00R=data;M=data8;//原数据右移8位后给M,也就是M存着data的最高位和次高位N=8;endend1:beginif(M=1)//如果最高位和次高位不是00也就是011011三种beginX=1;//00…01R=R-(10'd1N);endSTATE=2;//这是2状态end2:beginN=N-2;X=X1;CMP=(((X2)+1)(N-2));STATE=3;//这是状态3end3:beginif(R=CMP)beginX=X+1;R=R-CMP;endSTATE=4;//这是还不知道在干嘛的状态4end4:beginif(N==0)//N为零时beginresult=X;//X的值就是结果remain=R;//R的值是余数over=1;//计算结束over置为1STATE=0;//回到起始状态endelseSTATE=2;//不为零也就是还没算完时,回到状态2喵enddefault:beginSTATE=0;//啦啦要是前面出错回到起始状态endendcaseendendmodule//sqrt程序的测试程序`timescale10ns/1nsmodulesqrt_tb;//主要输入寄存器regclk;regstart;reg[9:0]data;//主要输出声明wireover;wire[9:0]result;wire[9:0]remain;//待测试设计例化sqrtmy_sqrt(clk,start,over,data,result,remain);//产生时钟周期是100个时间单位always#50clk=~clk;//设计一个或多个激励信号发生器initialbeginclk=0;data=10'd676;start=0;#100start=1;#1500start=0;//改变数据#2000data=10'd750;//为了检测start是否起作用#2000start=1;end//检测输出信号initialbegin$monitor($time,over=%bresult=%dremain=%d,over,result,remain);#8000$finish;endendmodule仿真验证的结果如下图所示。