有人验证过池保勇那篇论文里△Σ调制器结构正确性吗
- //池保勇论文24bit_modulator
- module modulator_24bit (clk, Reset,dither_en,Frac, Frac_k);
- input clk, Reset,dither_en;
- input[23:0] Frac;
- output[2:0] Frac_k;
- wire [2:0] Frac_k;
- //reg[21:0] A2, B3, A3, B2, A4;
- reg [2:0] sum5_k;
- wire[23:0] sum1,sum2,sum3,sum4,sum5,sum2dm,sum3dm,sum4dm,sum3dm_A,sum3dm_B,sum5_k_b,Frac_back;
- reg [23:0] sum2d,sum3d,sum4d;
- assign sum1 =Frac+ Frac_back;
- assign sum2 = sum1 + sum2d;
- assign sum3 = sum2d + sum3d;
- assign sum4 = sum3d + sum4d;
- assign sum5 = sum2dm + sum4dm + sum3dm;
- assign sum2dm = {sum2d[23],sum2d[21:0],1'b0};//两倍
- //assign sum3dm = sum3dm_A + sum3dm_B;//1.5倍
- assign sum3dm = sum3d + sum3dm_B;//1.5倍
- assign sum4dm = {sum4d[23],1'b0,sum4d[22:1]};//0.5倍
- //assign sum3dm_A = {sum3d[23],sum3d[21:0],1'b0};//左移操作,代表乘2
- assign sum3dm_B = {sum3d[23],1'b0,sum3d[22:1]};//右移操作,代表除2
- //assign sum5_k = sum5[23:21];
- assign sum5_k_b = {sum5_k,21'b1_0000_0000_0000_0000_0000};
- assign Frac_back = ~sum5_k_b + 1'b1;
- assign Frac_k = sum5_k + 3'b001;
- always @(posedge clk or posedge Reset)
- begin
- if(Reset)
- sum2d <= 24'h0;
- else
- sum2d <= sum2;
- end
- always @(posedge clk or posedge Reset)
- begin
- if(Reset)
- sum3d <= 24'h0;
- else
- sum3d <= sum3;
- end
- always @(posedge clk or posedge Reset)
- begin
- if(Reset)
- sum4d <= 24'h0;
- else
- sum4d <= sum4;
- end
- always @(posedge clk or posedge Reset)
- begin
- if(Reset)
- begin
- sum5_k <= 3'b000;
- end
- else
- begin
- sum5_k <= sum5[23:21] +3'b001;
- //bout <= bout_pre +5'b01011- 4'b 1000;
- end
- end
- endmodule
用Verilog编写在modelsim中仿真,但是应该怎么看平均值呢?我是定义一个64位reg,把量化值不断累加来看,但是结果好像不太对
前面一张标注不太清楚
1. 结果不好是怎么个不好法? 输出enob不够? 最好贴个输出的fft
2. 输入是24bit位宽, 那么输出的enob肯定到不了24bit的. 内部的加法器什么的都会有溢出.
3. 其实可以先跑simulink模型的
4. 输入一个定值看均值其实不是好的仿真方法, 最好的方法是看频谱.
欢迎讨论
还要一个是信号输入编码, 图里的信号明显用的是2的补码
这个帖子里有详细的讨论http://bbs.eetop.cn/viewthread.php?tid=131503
在modelsim中,跑出来的均值就不对,变化很大。
看了好久大概理了一下思路
1、由于调制器是对量化误差进行调制,所以输入信号与量化值要做差,由于需要减法操作,所以所有的值都是补码形式(输入值也是带符号的补码)。
1.1、补码形式的乘除不同于原码形式;
补码形式的除2操作:符号位不变,且连同符号位到次低位右移1位,如1101右移后为1110。
补码形式的乘2操作:符号位不变,次次高位到最低位左移1位,次高位甩掉,(很容易就把大数舍去)如1101左移为1010.最低位补0;
但是补码形式的乘2操作会将大数湮没,±4通过右移的方法最后变成了0,这个问题应该怎么解决?还是我移位操作的方式不对?
第二个问题是在他的框图中sum3d是变为1.5倍还是2.5倍(我都试过,结果都不对),
第三个问题为什么最后的输出要加上001,如果加上001的话,每次加上一个正值,肯定是影响平均值的吧?
第四个问题,我理解反馈的量化值进行取反加一是把一个值变为它的相反数,这是为了与输入做差,所以取反加一并不是为了转为补码(因为是将符号位也同时取反了),这样理解对不对
你可以先推导一下他的传输函数,放在matlab 里先防一下。