module fixfp(clk,data,qout);
input clk;
input [31:0] data; //输入数据的32位定点数data,(1,15,16)
output [17:0] qout; //输出的浮点数18位(1,7,10)
reg [17:0] qout;
reg fp_s; //输出浮点数1位的符号位
reg [6:0] fp_exp; //输出浮点数7位的指数位
reg [9:0] fp_mari; //输出浮点数10位的尾数部分
always@(posedge clk)
begin
if(data==32'd0) //判断输入数据data是否为0
fp_s<=0;
fp_exp<=0;
fp_mari<=0;
end
always@(posedge clk) //输出数据由浮点数的符号位,指数部分及尾数部分组成
begin
qout[17]<=fp_s;
qout[16:10]<=fp_exp;
qout[9:0]<=fp_mari;
end
wire fix_s; //定点数的符号位
wire [14:0] fix_int; //定点数的整数部分
wire [15:0] fix_fra; //定点数的小数部分
assign fix_s=data[31],
fix_int=data[30:16],
fix_fra=data[15:0];
reg [30:0] data_temp;
reg flag;
reg [6:0] cnt; //当定点数的整数部分的第一位为零时,左移data[31:0],记录左移的次数d的计数器
wire [6:0] n_fix_int,bias; //定点数整数部分的位数及浮点指数部分的偏移量
assign n_fix_int=7'd15;
assign bias=7'd63;
initial
cnt<=7'd1;
always @(posedge clk)
begin
fp_s<=fix_s;
if(fix_s==1) begin //输入数据为负数的情况下
data_temp<=~{fix_int,fix_fra}+1'b1; //求负数的补码
flag<=data_temp[30];
if(flag==1) begin //判断除符号位后的第一位是1时,执行if语句
cnt<=1;
fp_mari<=data_temp[29:20];
fp_exp<=n_fix_int+bias-cnt; end
else begin //判断第一位是零,执行else语句
while(flag==0) begin
data_temp<=data_temp<<1;
cnt<=cnt+1'b1;
flag<=data_temp[30];end //当flag=1,即data_temp经过左移后出现第一个1,跳出while循环,并执行下面的语句
fp_mari<=data_temp[29:20]; //尾数部分取data_temp除最高位(高位隐含1的方式)的后十位
fp_exp<=n_fix_int+bias-cnt; //指数部分计算
cnt<=0;
end
end
else begin //输入数据为正数的情况下
data_temp<={fix_int,fix_fra};
flag<=data_temp[30];
if(flag==1) begin //判断除符号位后的第一位是1时,执行if语句
cnt<=1;
fp_mari<=data_temp[29:20];
fp_exp<=n_fix_int+bias-cnt; end
else begin
while(flag==0)begin
data_temp<=data_temp<<1;
cnt<=cnt+1'b1;
flag<=data_temp[30];end
fp_mari<=data_temp[29:20];
fp_exp<=n_fix_int+bias-cnt;
cnt<=0;
end
end
end
endmodule
一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!