在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 137|回复: 2

[转贴] 定点数与截位

[复制链接]
发表于 昨天 22:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[color=var(--weui-FG-HALF)]信号处理里面,数据通常都是有限位宽的定点数。一般来说,定点数相对浮点数来说电路面积小,运算速度快,运算精度高,缺点就是动态范围小一些。定点数通常表示成(M,N)的形式。M代表了定点数的位宽,如果是有符号数,则最高位用于表达符号,实际定点数只有M-1位;N代表定点数小数点的位置左移了N位,实际的数据为定点数表示的整数/2^N。  通常,通过精心设计M、N的值,定点数动态范围这个缺点可以规避掉。    信号处理了常见的一个操作就是把数据由一个定点经过floor或者round变成另一个定点。    如图1,是无符号数clip模块,将din(DI_LEN,DI_LEN_FRAC)截位到dout(DO_LEN,DO_LEN_FRAC)。

module uclip(dout,din);parameter DI_LEN                 = 19 ;parameter DI_LEN_FRAC         = 9 ;parameter DO_LEN                 = 10 ;parameter DO_LEN_FRAC         = 2 ;parameter DI_FRAC_MSB                = DI_LEN-(DI_LEN_FRAC-DO_LEN_FRAC)-1 ;parameter CLIP                        = DI_FRAC_MSB+1-DO_LEN ;
input [DI_LEN-1:0]        din;output [DO_LEN-1:0]        dout;
wire [DI_FRAC_MSB+1:0] dout_tmp ;assign dout_tmp = {1'b0,din[DI_LEN-1DI_LEN_FRAC-DO_LEN_FRAC)]} ;
reg [DO_LEN-1:0]        dout ;always @(*)begin        if(dout_tmp[DI_FRAC_MSB+1O_LEN] =={(CLIP+1){1'b0}} )                dout = dout_tmp[DO_LEN-1:0] ;        else                dout = { DO_LEN{1'b1} } ;endendmodule    如图2,是无符号数round模块,将din(DI_LEN,DI_LEN_FRAC) round到dout(DO_LEN,DO_LEN_FRAC)。

module uclip_r(dout,din);parameter DI_LEN                 = 19 ;parameter DI_LEN_FRAC                 = 9 ;parameter DO_LEN                 = 10 ;parameter DO_LEN_FRAC                 = 2 ;parameter DI_FRAC_MSB                = DI_LEN-(DI_LEN_FRAC-DO_LEN_FRAC)-1 ;parameter CLIP                        = DI_FRAC_MSB+1-DO_LEN ;
input [DI_LEN-1:0]        din;output [DO_LEN-1:0]        dout;
wire [DI_FRAC_MSB+2:0] din_round;wire [DI_FRAC_MSB+2:0] din_ext ;wire ext_bit = (DI_LEN_FRAC==DO_LEN_FRAC)?1'b0:din[DI_LEN_FRAC-DO_LEN_FRAC-1] ;assign din_ext = {1'b0,din[DO_LEN-1],din[DI_LEN-1I_LEN_FRAC-DO_LEN_FRAC],ext_bit} ;assign din_round = din_ext + 1'b1 ;
uclip #(DI_FRAC_MSB+3,DO_LEN_FRAC+1,DO_LEN,DO_LEN_FRAC) u_uclip(.din(din_round),.dout(dout));endmodule    如图3,是有符号数clip模块,将din(DI_LEN,DI_LEN_FRAC)截位到dout(DO_LEN,DO_LEN_FRAC)。

module sclip(dout,din);parameter DI_LEN                 = 19 ;parameter DI_LEN_FRAC                 = 9 ;parameter DO_LEN                 = 10 ;parameter DO_LEN_FRAC                 = 2 ;parameter DI_FRAC_MSB                = DI_LEN-(DI_LEN_FRAC-DO_LEN_FRAC)-1 ;parameter CLIP                        = DI_FRAC_MSB+1-DO_LEN ;
input signed [DI_LEN-1:0]        din;output signed [DO_LEN-1:0]        dout;
wire [DI_FRAC_MSB:0] dout_tmp ;assign dout_tmp = din[DI_LEN-1DI_LEN_FRAC-DO_LEN_FRAC)] ;
reg signed [DO_LEN-1:0]        dout1 ;reg signed [DO_LEN-1:0]        dout ;always @(*)begin        if( (dout_tmp[DI_FRAC_MSBO_LEN-1] =={(CLIP+1){1'b0}} ) || (dout_tmp[DI_FRAC_MSB:DO_LEN-1] =={(CLIP+1){1'b1}} ) )                dout1 = $signed(dout_tmp[DO_LEN-1:0]) ;        else                dout1 = $signed({dout_tmp[DI_FRAC_MSB],{(DO_LEN-1){~dout_tmp[DI_FRAC_MSB]}}} ) ;    if((dout1[DO_LEN-1]==1'b1)&&(dout1[DO_LEN-2:0]=={(DO_LEN-1){1'b0}}))        dout = dout1 + 1'b1 ;    else        dout = dout1;end
endmodule    如图4,是有符号数round模块,将din(DI_LEN,DI_LEN_FRAC) round到dout(DO_LEN,DO_LEN_FRAC)。

module sclip_r (dout,din);  parameter DI_LEN = 19;  parameter DI_LEN_FRAC = 9;  parameter DO_LEN = 10;  parameter DO_LEN_FRAC = 2;  parameter DI_FRAC_MSB = DI_LEN - (DI_LEN_FRAC - DO_LEN_FRAC) - 1;  parameter CLIP = DI_FRAC_MSB + 1 - DO_LEN;
  input [DI_LEN-1:0] din;  output [DO_LEN-1:0] dout;
  wire signed [DI_FRAC_MSB+2:0] din_round;  wire [DI_FRAC_MSB+2:0] din_ext;  wire ext_bit = (DI_LEN_FRAC == DO_LEN_FRAC) ? 1'b0 : din[DI_LEN_FRAC-DO_LEN_FRAC-1];  assign din_ext   = {din[DI_LEN-1], din[DI_LEN-1:DI_LEN_FRAC-DO_LEN_FRAC], ext_bit};  assign din_round = (din_ext + 1'b1);
  sclip #(DI_FRAC_MSB + 3, DO_LEN_FRAC + 1, DO_LEN, DO_LEN_FRAC) u_sclip ( .din (din_round), .dout(dout));endmodule下面以pi作为一个例子,看从(32,16)截位到(13,,10)的结果
pi(32,16)(13,10)
matlabround(pi*2^16)round(pi*2^10)
定点数2058873217
-pi(32,16)(13,10)
matlabround(-pi*2^16)round(-pi*2^10)
定点数-205887-3217
    弄个测试程序测试一下,如下图5

module tb() ;
wire [31:0] pos_pi = 32'd205887;wire [31:0] neg_pi = $signed(-205887);wire [12:0] pos_pi_clip ;wire [12:0] neg_pi_clip ;
sclip_r #(32,16,13,10) u0_sclip_r(        .din(pos_pi),        .dout(pos_pi_clip));
sclip_r #(32,16,13,10) u1_sclip_r(        .din(neg_pi),        .dout(neg_pi_clip));
initial begin        #100        $display("pos_pi is %d and pos_pi_clip is %d",$signed(pos_pi),$signed(pos_pi_clip)) ;        $display("neg_pi is %d and neg_pi_clip is %d",$signed(neg_pi),$signed(neg_pi_clip)) ;        #100        $finish ;endendmodule执行vcs -R tb.v sclip_r.v sclip.v,结果与matlab一致 640?wx_fmt=png&from=appmsg.jpg   定点数与截位就介绍到这里,下篇介绍除法。

[color=rgba(0, 0, 0, 0.9)][backcolor=var(--weui-BG-2)]数字信号处理设计[color=rgba(0, 0, 0, 0.3)]6


[color=rgba(0, 0, 0, 0.9)][backcolor=var(--APPMSGCARD-BG)][color=rgba(0, 0, 0, 0.55)]数字信号处理设计 · 目录
[color=var(--weui-FG-0)][backcolor=var(--weui-BG-5)]















发表于 11 小时前 | 显示全部楼层
这文字排版实在无语
 楼主| 发表于 6 小时前 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-20 20:29 , Processed in 0.017992 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表