|
基于坐标移位变换的dds(NCO)cordic
[复制链接]
用基于cordic算法写的dds的verilog程序,带modelsim的仿真程序,写这个主要是在做dds时想用cpld来做,但是我的cpld资源太少,只有570个LE,而我又想用12位以上的da,大家懂的,如果刷波表是做不来的,所以就写了这个基于cordic算法的dds,也可以说是一个nco,看怎么用,基于cordic算法的dds速度较快,因为其中用到了流水相结构。把这个代码稍微修改一下就可以利用硬件来实现求开方,以及对数,以及反正切非常方便,而且速度快,耗费资源少。
//level 2
always @ (posedge clk,negedge rst_n)
begin
if(!rst_n)
begin
x2 <=12'b0;
y2 <=12'b0;
z2 <=12'b0;
end
else
if(ena)
if(z1[11]==1'b0)
begin
x2 <= x1-{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};
y2 <= y1+{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};
z2 <=z1-12'h12e;//26deg
end
else
begin
x2<= x1+{y1[DATA_WIDTH-1],y1[DATA_WIDTH-1:1]};
y2<= y1-{x1[DATA_WIDTH-1],x1[DATA_WIDTH-1:1]};
z2<= z1+12'h12e;
end
end
这是其中一级流水线的verilog代码。
整体只耗费了505个LE,最快速度111.32M,即可实现两路正交正弦的输出。
此外dds中相位截断是个大问题,会使产生的信号变差,基于cordic的dds因为可以直接把地址寄存器和你的累加器位数做到一致所以可以免去相位截断的烦恼,同时可以提高精度,这里为了使cpld能装下我的代码,我就没有考虑相位截断了。
|
|