Verilog的问题

eeleader   2010-12-30 13:14 楼主
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/ 欢迎光临网上店铺!

回复评论 (2)

你想提的是什么问题呢?也没有说明啊!
我爱电子!
点赞  2010-12-30 16:36
楼主没说自己的目的啊!
点赞  2011-1-7 12:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复