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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: rosshardware

[原创] 数字典型电路知识结构地图,请大家参考,也希望积极补充!

[复制链接]
发表于 2018-10-24 09:54:19 | 显示全部楼层
回复 50# rosshardware

两个小问题:
1.



  1. module UNSIGEN_MIN


复制代码
是否应为



  1. module UNSIGN_MIN // unsign


复制代码


2.



  1. else if (din > min) begin
  2.                             min <= din;
  3.                       end


复制代码

是否应为




  1. else if (din < min) begin
  2.                             min <= din;
  3.                       end


复制代码
 楼主| 发表于 2018-10-24 10:29:12 | 显示全部楼层
回复 51# wjcdx


    恩,应该是din < min的时候,把din 赋值给min
 楼主| 发表于 2018-10-24 17:20:55 | 显示全部楼层
下面在讲讲饱和和截位,为什么要做饱和和截位,因为在之前的加法,乘法设计中讲到,按照理论位宽为A和B的两个数相加,则所得的和位宽为Max(A,B)+1, 乘积的位宽为A+B,而我们数字信号处理,往往是一长串的计算公式,比如(x0+x1)*y0*y1, 假设x0, x1, y0,y1的位宽分别为A,B,C,D,则,该计算公式最后结果的额位宽为max(A+B)+C+D ,可以看出,随着运算级数增加,位宽为成倍增加,所以从电路实现角度,后级运算实现的面积会越来越大,因此,我们需要对处理过程的数据进行饱和和截位,调整中间处理的位宽。
发表于 2018-10-24 21:54:43 | 显示全部楼层
回复 53# rosshardware


   顶一下
发表于 2018-10-24 23:30:29 | 显示全部楼层
不错,能够坚持这么久      
 楼主| 发表于 2018-10-26 10:54:14 | 显示全部楼层
上面讲了饱和截位和原因,主要针对信号处理的位宽作缩减,饱和主要针位宽的高位进行处理,类似于信号限幅,截位主要针对位宽低位,效果就是扔掉小数的后几位,也就是精度降低。 饱和和截位对信号的性能会有影响,但是通常会通过饱和和截位后的仿真评估这种影响对实际的系统是否能够接受。下面讲讲饱和和截位的实现,信号处理,通常都是处理有符号数,所以就以有符号的饱和和截位为例介绍:

饱和 (Saturation) Demo:
不考虑对称,因为前面跟大家提到过负数表示范围是不对称的,比如3bit的数据,有符号数表示-4~3,即以0位中心,负数极值是-4,正数极值是3,而不是4.

module DATA_SAT #(
                             parameter DIN_WIDTH                             = 16,
                             parameter DOUT_WIDTH                          = 8
                             )
                            (
                            input          signed  [DIN_WIDTH-1 : 0]       data_in,
                            output reg  sigend  [DOUT_WIDTH-1 : 0]    data_out,
                            output reg                                                sat_ind
                            );

localparam   signed [DIN_WIDTH-1:0]  POS_MAX = {{(DIN_WIDTH-DOUT_WIDTH+1){1'b0}},
                                                                              {DOUT_WIDTH-1{1'b1}}};
localparam   signed [DIN_WIDTH-1:0]  NEG_MAX = {{(DIN_WIDTH-DOUT_WIDTH+1){1'b1}},
                                                                              {DOUT_WIDTH{1'b0}}};


always @(*) begin
       if ($signed(data_in) > $signed(POS_MAX)) begin
             data_out = POS_MAX[DOUT_WIDTH-1:0];
             sat_ind   = 1'b1;
       end
       else if ($signed(data_in) < $signed(NEG_MAX)) begin
             data_out = NEG_MAX[DOUT_WIDTH-1:0];
             sat_ind   = 1'b1;
       end      
       else begin
             data_out = din[DOUT_WIDTH-1:0];
             sat_ind   = 1'b0;
       end
end
endmodule

如果考虑对称饱和,则需要把负值最大饱和到正值极大值的相反值,下面给出对称饱和RTL代码示例:

module DATA_SAT #(
                             parameter DIN_WIDTH                             = 16,
                             parameter DOUT_WIDTH                          = 8
                             )
                            (
                            input          signed  [DIN_WIDTH-1 : 0]       data_in,
                            output reg  sigend  [DOUT_WIDTH-1 : 0]    data_out,
                            output reg                                                sat_ind
                            );

localparam   signed [DIN_WIDTH-1:0]  POS_MAX = {{(DIN_WIDTH-DOUT_WIDTH+1){1'b0}},
                                                                              {DOUT_WIDTH-1{1'b1}}};
localparam   signed [DIN_WIDTH-1:0]  NEG_MAX = {{(DIN_WIDTH-DOUT_WIDTH+1){1'b1}},
                                                                              {DOUT_WIDTH{1'b0}}};


always @(*) begin
       if ($signed(data_in) > $signed(POS_MAX)) begin
             data_out = POS_MAX[DOUT_WIDTH-1:0];
             sat_ind   = 1'b1;
       end
       else if ($signed(data_in) < $signed(NEG_MAX)) begin
             data_out = {NEG_MAX[DOUT_WIDTH-1:1],1‘b1}; // Symmetry process for negative maximum
             sat_ind   = 1'b1;
       end      
       else begin
             data_out = din[DOUT_WIDTH-1:0];
             sat_ind   = 1'b0;
       end
end
endmodule

下一节介绍CUT的实现
 楼主| 发表于 2018-10-26 11:19:46 | 显示全部楼层
对于截位,我们也已有符号数为例子介绍,截位也要分为两种情况,即截位后的小数是按照最小或者最大取整,还是四舍五入,通常的算法需要做四舍五入,同时如果在按照取整方式,实现相对简单,因此我们以四舍五入的处理方式来示例。需要注意的是,在极值的时候,四舍五入是无法表示极值的范围,需要特殊处理,比如我们把4bits有符号数,截位1位,4bits有符号表示范围是-8~7, 截位1位,相当于除2,剩余的数的范围就是-4~3.5, 按照四舍五入方式,就应该是是-4~4,显然,3bits的数据,能够表示的范围就只有-4~3,因为极值就不能按照五入的方式处理,同时,一般也考虑对称截位,最终结果为-3~3.

module DATA_CUT #(
                               parameter DIN_WIDTH                                                =    16,
                               parameter DOUT_WIDTH                                             =    10
                              )
                              (
                               input             signed [DIN_WIDTH-1:0]                         din,
                               output reg     signed [DOUT_WIDTH-1:0]                       dout
                             );

localparam  CUT_WIDTH = DIN_WIDTH - DOUT_WIDTH;

always @(*) begin
      if (din[DIN_WIDTH-1 : CUT_WIDTH] == {1'b0,{(DOUT_WIDTH){1'b1}}}) begin // Postive max
            dout = din[DIN_WIDTH-1 : CUT_WIDTH];
      end
      else if (din[DIN_WIDTH-1 : CUT_WIDTH] == {1'b1,{(DOUT_WIDTH){1'b0}}}) begin Negative max
            dout = {din[DIN_WIDTH-1 : CUT_WIDTH+1],1'b1};
      end
      else begin // Middle value , cut with 0.5 round
            dout = din[DIN_WIDTH-1 : CUT_WIDTH] + {{(DOUT_WIDTH-1){1'b0}},data_in[CUT_WIDTH-1]};
      end
end

endmodule
 楼主| 发表于 2018-10-26 14:21:01 | 显示全部楼层
NCO (Numeric Controlled Oscillator),即数控振荡器,产生数字化的本地载波,其目标是产生一个理想的正弦波或余弦波,更确切地说是产生一个频率可变的正弦波样本,相当于传统中频调制解调中的本振。NCO是数字通信技术中应用最多的模块单元之一,信号源,数字上、下变频,载波及本地载波产生等通常都要用到NCO。实现算法包括查表类(桑德拉、Taylor展开),流水线类(CORDIC、角度旋转算法)两大类,用FPGA实现时,前者占用较多的RAM资源,后者占用较多的LE资源(组合逻辑和寄存器)。我们介绍的是角度旋转算法。
传统的实现方法采用查找表,简单、准确,但其存放相位到幅度转换的查找表ROM 的大小和相位精度的位数成指数关系。当精度要求很高的时候需要大容量ROM,使系统的处理速度降低。一些改进的查表法通过压缩ROM 空间实现。比如利用奇偶对称性的存储内容映射技术、基于地址内容的曲线拟合技术和基于存储内容的分段差分技术,都是以增加处理逻辑的复杂性和处理时延为代价的,但这3 种高效技术能够有效的减少存储资源。
随着微电子技术的发展,使用实时计算来替代查表能有效地提高系统处理速度。在实时算法中, 泰勒级数法和反函数求值法是不错的选择,但泰勒级数法的实现需要乘法器,在硬件的复杂性和速度上受到一些限制;反函数求值法在速度上要比坐标旋转数字计算机( CORDIC, Coordinate Rotat ion Digital Computer) 算法慢。而CORDIC 算法在硬件实现上只需要移位和加/减法即可完成复杂的计算功能,能很好地兼顾速度、精度、简单、高效等方面;而Madisetti算法进一步优化了CORDIC算法,对各方面的性能进行折中考虑,使其更适合于NCO的实现。
NCO采用全数字技术,具有分辨率高、频率转换时间快、相位噪声低等特点。将其应用于电子设备中,可以大大简化系统,降低成本。
发表于 2018-10-27 16:54:42 | 显示全部楼层
出个文档吧
发表于 2018-10-29 12:57:13 | 显示全部楼层
太棒了 楼主   谢谢无私奉献
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-25 16:24 , Processed in 0.024315 second(s), 6 queries , Gzip On, Redis On.

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