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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2800|回复: 8

[讨论] 有人验证过池保勇那篇论文里△Σ调制器结构正确性吗

[复制链接]
发表于 2016-7-30 09:23:06 | 显示全部楼层 |阅读模式

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

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

x
我是用Verilog根据论文的结构写的代码,但是结果差强人意,希望有做过△Σ调制器的大神指点指点
 楼主| 发表于 2016-7-30 09:28:04 | 显示全部楼层
池保勇.PNG




  1. //池保勇论文24bit_modulator
  2. module modulator_24bit (clk, Reset,dither_en,Frac, Frac_k);
  3. input clk, Reset,dither_en;
  4. input[23:0] Frac;
  5. output[2:0] Frac_k;
  6. wire [2:0] Frac_k;

  7. //reg[21:0] A2, B3, A3, B2, A4;

  8. reg [2:0] sum5_k;
  9. wire[23:0] sum1,sum2,sum3,sum4,sum5,sum2dm,sum3dm,sum4dm,sum3dm_A,sum3dm_B,sum5_k_b,Frac_back;
  10. reg [23:0] sum2d,sum3d,sum4d;
  11. assign sum1 =Frac        + Frac_back;
  12. assign sum2 = sum1 + sum2d;
  13. assign sum3 = sum2d + sum3d;
  14. assign sum4 = sum3d + sum4d;
  15. assign sum5 = sum2dm + sum4dm + sum3dm;
  16. assign sum2dm = {sum2d[23],sum2d[21:0],1'b0};//两倍
  17. //assign sum3dm = sum3dm_A + sum3dm_B;//1.5倍
  18. assign sum3dm = sum3d + sum3dm_B;//1.5倍
  19. assign sum4dm = {sum4d[23],1'b0,sum4d[22:1]};//0.5倍
  20. //assign sum3dm_A = {sum3d[23],sum3d[21:0],1'b0};//左移操作,代表乘2
  21. assign sum3dm_B = {sum3d[23],1'b0,sum3d[22:1]};//右移操作,代表除2

  22. //assign sum5_k = sum5[23:21];
  23. assign sum5_k_b = {sum5_k,21'b1_0000_0000_0000_0000_0000};
  24. assign Frac_back = ~sum5_k_b + 1'b1;
  25. assign Frac_k = sum5_k + 3'b001;

  26. always @(posedge clk or posedge Reset)
  27. begin
  28.         if(Reset)
  29.                 sum2d <= 24'h0;
  30.         else
  31.                 sum2d <= sum2;
  32. end

  33. always @(posedge clk or posedge Reset)
  34. begin
  35.         if(Reset)
  36.                 sum3d <= 24'h0;
  37.         else
  38.                 sum3d <= sum3;
  39. end

  40. always @(posedge clk or posedge Reset)
  41. begin
  42.         if(Reset)
  43.                 sum4d <= 24'h0;
  44.         else
  45.         sum4d <= sum4;
  46. end

  47. always @(posedge clk or posedge Reset)
  48. begin
  49.         if(Reset)
  50.                 begin
  51.                 sum5_k <= 3'b000;
  52.                 end
  53.         else
  54.                 begin
  55.                 sum5_k <= sum5[23:21] +3'b001;
  56.                 //bout <= bout_pre +5'b01011- 4'b 1000;
  57.                 end
  58. end
  59. endmodule



复制代码
 楼主| 发表于 2016-7-30 09:30:34 | 显示全部楼层
本帖最后由 胭脂盗 于 2016-7-30 09:42 编辑

用Verilog编写在modelsim中仿真,但是应该怎么看平均值呢?我是定义一个64位reg,把量化值不断累加来看,但是结果好像不太对
 楼主| 发表于 2016-7-30 09:37:46 | 显示全部楼层
池保勇.PNG
前面一张标注不太清楚
发表于 2016-7-30 16:22:47 | 显示全部楼层
1. 结果不好是怎么个不好法? 输出enob不够? 最好贴个输出的fft
2. 输入是24bit位宽, 那么输出的enob肯定到不了24bit的. 内部的加法器什么的都会有溢出.
3. 其实可以先跑simulink模型的
4. 输入一个定值看均值其实不是好的仿真方法, 最好的方法是看频谱.
欢迎讨论
发表于 2016-7-30 16:26:09 | 显示全部楼层
还要一个是信号输入编码, 图里的信号明显用的是2的补码
这个帖子里有详细的讨论http://bbs.eetop.cn/viewthread.php?tid=131503
 楼主| 发表于 2016-7-31 12:19:44 | 显示全部楼层
回复 5# quantus

在modelsim中,跑出来的均值就不对,变化很大。
 楼主| 发表于 2016-7-31 20:16:42 | 显示全部楼层
回复 6# quantus

看了好久大概理了一下思路

1、由于调制器是对量化误差进行调制,所以输入信号与量化值要做差,由于需要减法操作,所以所有的值都是补码形式(输入值也是带符号的补码)。

1.1、补码形式的乘除不同于原码形式;


补码形式的除2操作:符号位不变,且连同符号位到次低位右移1位,如1101右移后为1110

   补码形式的乘2操作:符号位不变,次次高位到最低位左移1位,次高位甩掉,(很容易就把大数舍去)如1101左移为1010.最低位补0

但是补码形式的乘2操作会将大数湮没,±4通过右移的方法最后变成了0,这个问题应该怎么解决?还是我移位操作的方式不对?



第二个问题是在他的框图中sum3d是变为1.5倍还是2.5倍(我都试过,结果都不对),


第三个问题为什么最后的输出要加上001,如果加上001的话,每次加上一个正值,肯定是影响平均值的吧?


第四个问题,我理解反馈的量化值进行取反加一是把一个值变为它的相反数,这是为了与输入做差,所以取反加一并不是为了转为补码(因为是将符号位也同时取反了),这样理解对不对

发表于 2016-8-1 10:42:49 | 显示全部楼层
回复 8# 胭脂盗


    你可以先推导一下他的传输函数,放在matlab 里先防一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-1-12 01:46 , Processed in 0.023389 second(s), 10 queries , Gzip On, Redis On.

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