miwueshine 发表于 2010-12-17 16:30:46

请教Verilog的问题

我想用Verilog实现定点数与浮点数间的转换,下面是一段代码,编译时老是出现错误,请各位帮帮我,谢谢!
编译错误为:
Error (10119): Verilog HDL Loop Statement error at fixfp.v(56): loop with non-constant loop condition must terminate within 250 iterations
好像是while的跳出条件设定不符合,由于我是初学FPGA及Verilog,所以可能出现一些低级的错误,我改不出来了,希望给我指导下。
module fixfp(clk,data,qout);

input clk;
input data;//输入数据的32位定点数data,(1,15,16)

output qout; //输出的浮点数18位(1,7,10)

reg qout;
reg fp_s;         //输出浮点数1位的符号位
reg fp_exp;        //输出浮点数7位的指数位
reg 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<=fp_s;
        qout<=fp_exp;
        qout<=fp_mari;
end

wire fix_s;                //定点数的符号位               
wire fix_int;        //定点数的整数部分
wire fix_fra;    //定点数的小数部分

assignfix_s=data,       
        fix_int=data,
        fix_fra=data;

reg data_temp;       
reg flag;
reg cnt;                //当定点数的整数部分的第一位为零时,左移data,记录左移的次数d的计数器

wire n_fix_int,bias;        //定点数整数部分的位数及浮点指数部分的偏移量

assignn_fix_int=7'd15;
assignbias=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;
                if(flag==1) begin   //判断除符号位后的第一位是1时,执行if语句
                cnt<=1;
                fp_mari<=data_temp;       
                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;end        //当flag=1,即data_temp经过左移后出现第一个1,跳出while循环,并执行下面的语句
                       
                        fp_mari<=data_temp;        //尾数部分取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;
                if(flag==1) begin   //判断除符号位后的第一位是1时,执行if语句
                cnt<=1;
                fp_mari<=data_temp;       
                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;end
                               
                                fp_mari<=data_temp;
                                fp_exp<=n_fix_int+bias-cnt;
                                cnt<=0;
                end       
        end
       
end
endmodule

wangxia6112 发表于 2010-12-17 17:03:12

always@(posedge clk)
begin
      if(data==32'd0)//判断输入数据data是否为0
      fp_s<=0;
      fp_exp<=0;
      fp_mari<=0;
end
上面这段中需要修改如下(语法)
always@(posedge clk)
begin
      if(data==32'd0)//判断输入数据data是否为0
      begin
            fp_s<=0;
            fp_exp<=0;
            fp_mari<=0;
      end
end

如果有多条语句,一定要加begin......end

miwueshine 发表于 2010-12-20 10:18:50

谢谢你的意见,呵呵,我是初学者,这种错误可能出现,希望您能给我检查下其他的地方:)
页: [1]
查看完整版本: 请教Verilog的问题