|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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) | matlab | round(pi*2^16) | round(pi*2^10) | 定点数 | 205887 | 3217 | -pi | (32,16) | (13,10) | matlab | round(-pi*2^16) | round(-pi*2^10) | 定点数 | -205887 | -3217 | 弄个测试程序测试一下,如下图5module 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一致
定点数与截位就介绍到这里,下篇介绍除法。
[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)]
|
|