影响NCO杂散度的一般就是两个条件一个是输入的位宽,一个是输出的量化位宽,输出在8位的情况下,随着输入位宽的加大,杂散度最后处于50dbc左右就保持不变了,输出量化位宽在16位的情况下,随着输入位宽的加大,杂散度最后处于100dbc左右就保持不变了。
一般设计的时候尽量使用查找表的模式,使用Cordic算法虽然也能算出,但是保不准最后综合成啥样,主要是移位用的太多,加减法也用的太多而且又比较复杂,尽量还是使用查找表来的舒服些。
查找表的使用最简单压缩ROM的方式就是使用波形对称法,具体就是基本的一个波形变化,最高两位作为象限值,将各个象限值一个一个对应到第一象限上完成输出。代码如下:
相位对称
2'b00:begin
sin_addr_r <= iaddr_in;
cos_addr_r <= iaddr_in;
end
2'b01:begin
sin_addr_r <= 16'd32767-iaddr_in;
cos_addr_r <= 16'd32767-iaddr_in;
end
2'b10:begin
sin_addr_r <= iaddr_in-16'd32767;
cos_addr_r <= iaddr_in-16'd32767;
end
2'b11:begin
sin_addr_r <= 16'd65535-iaddr_in;
cos_addr_r <= 16'd65535-iaddr_in;
end
default:begin
sin_addr_r <= sin_addr_r;
cos_addr_r <= cos_addr_r;
end
幅值对称:
2'b00: begin
sin_r1 <= dout_sin;
cos_r1 <= dout_cos;
end
2'b01: begin
sin_r1 <= dout_sin;
cos_r1 <= ~(dout_cos) + 1'b1;
end
2'b10: begin
sin_r1 <= ~(dout_sin) + 1'b1;
cos_r1 <= ~(dout_cos) + 1'b1;
end
2'b11: begin
sin_r1 <= ~(dout_sin) + 1'b1;
cos_r1 <= dout_cos;
end
default:begin
sin_r1 <= sin_r1;
cos_r1 <= cos_r1;
end
其实写起来有想法了还是比较简单的,IC设计就是这样,脑子里面有想法,电路有个大概模样,编码还是不难的~~