1、ROM存储1/4周期正弦信号构造DDS详解DATA(2047-addr(i)+1); elseif(flag(i)==2) dds_out(i)=-ROM_DATA(addr(i)-2048+1); else dds_out(i)=-ROM_DATA(4095-addr(i)+1); end end end end plot(dds_out); 3.DDS的解释 Xilinx的DDS核的UserGuide中队DDS做了很详细的说明,本节不再重复此内容,本节将叙述一种全新的DDS理解方式。这种理解方式解决了频率控制字长于ROM表深度时DDS的理解上的问题
4、 output[13:0]D_COS ); parameterpinc=32’d4294967;//10k reg[31:0]addr_temp=32’d0; reg[9:0]addra,addrb; regmark_a,mark_b; always@(posedge(clk_10M))//复位 begin if(rst==0) addr_temp《=32‘d0; else addr_temp《=addr_temp+pinc; end always@(posedge(clk_10M))//1/4周期控制 begin case(addr_temp
5、[31:30]) 2’b00: begin addra《=addr_temp[29:20]; mark_a《=0; addrb《=~addr_temp[29:20]; mark_b《=0; end 2‘b01: begin addra《=~addr_temp[29:20]; mark_a《=0; addrb《=addr_temp[29:20]; mark_b《=1; end 2’b10: begin addra《=addr_temp[29:20]; mark_a《=1; addrb《=~addr_temp[29:20]; mark_b
6、《=1; end 2‘b11: begin addra《=~addr_temp[29:20]; mark_a《=1; addrb《=addr_temp[29:20]; mark_b《=0; end endcase end //ROM表读取 ROM_SIN_1k18rom_dds( .clka(clk_10M),//inputclka .addra(addra),//input[9:0]addra .douta(D_SIN[12:0]),//output[12:0]douta .clkb(clk_10M),//inputclkb .addrb
7、(addrb),//input[9:0]addrb .doutb(D_COS[12:0])//output[12:0]doutb ); regsin_mark_temp; regcos_mark_temp; assignD_SIN[13]=sin_mark_temp; assignD_COS[13]=cos_mark_temp; //此处ROM没有添加register,因此输出和地址有一个周期的延时,故Mark也要有一周期延时 always@(posedge(clk_10M)) begin si