集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2270|回复: 2

请教Verilog的问题

[复制链接]
miwueshine 发表于 2010-12-17 16:30:46 | 显示全部楼层 |阅读模式
我想用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 [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
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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-28 09:16 , Processed in 0.055257 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表