赞
踩
/******************************************
verilog开平方操作
******************************************/
module mysqrt
(
clk,//时钟
indata,//输入待开平方数
outdata,//输出开平方的结果
flag_ok,
);
input wire clk;//时钟
input wire [31:0]indata;//假设数据为32bit
output reg [15:0]outdata=0;//32bit数据开根号,输出的数据为16bit
output reg flag_ok=0;//完成一次产生一个上升沿
reg [31:0]buff_indata=0;//缓存输入参数
reg [7:0]state=0;//状态机参数
reg [7:0]cnt=0;//移位参数
reg [15:0]out_t=0;//中间变量
always@(posedge clk)
begin
case(state)
0:begin
buff_indata<=indata;
cnt<=0;
out_t<=0;
state<=1;
flag_ok<=0;
end
1:begin
out_t<=out_t+(16'h8000>>cnt);
if(cnt>=16)
state<=3;
else
state<=2;
end
2:begin
if((out_t*out_t)>buff_indata)begin
out_t<=out_t-(16'h8000>>cnt);
end
cnt<=cnt+1;
state<=1;
end
3:begin
outdata<=out_t;
state<=0;
flag_ok<=1;
end
endcase
end
endmodule
/***********************************************************************************************************************************************/
`timescale 1ns/1ps
`include "mysqrt.v"
module mysqrt_t;
reg clk=0;
reg [31:0]indata;
reg [31:0]cnt=0;
wire flag_ok;
wire [15:0]outdata;
always #1 clk=~clk;
initial
begin
indata=1000000;
forever
begin
if(indata>0)begin
#100 indata=indata-1;//每个100个时钟更新一次测试值
end
end
end
mysqrt u1(.clk(clk),
.indata(indata),
.outdata(outdata),
.flag_ok(flag_ok)
);
endmodule
/***********************************************************************************************************************************************/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。