DDS发生器的verilog实现(三)
前面讲解了正弦波发生器和DDS基础知识,这篇文章主要讲解如何在fpga上实现DDS发生器,同时对上一篇的文章进行补充。
确定频率控制字的DDS发生器
首先对初始条件做一假设:相位累加寄存器的位宽为n=32
位,用来存储离散正弦波的RAM规格为256*8bit,使用的采样频率fc=50Mhz
,要求DDS输出波形的频率为f0=1Mhz
。则可以通过前面的公式f0 = fc * M / 2^n
,可以计算出频率控制字M = 85899345
,直接在正弦波发生器的代码上进行修改即可:
module ex_dds(
input wire clk, //50Mhz
input wire rst_n,
output wire [7:0] o_wave
);
parameter FRQ_W = 32'd85899346;//频率控制字M,现在要求目标频率为1Mhz,相位累加器为32位,所以M=85899346;
reg [31:0] phase_sum;
wire [7:0] addr;
//相位累加器
always @(posedge clk)begin
if(!rst_n)
phase_sum <= 32'd0;
else
phase_sum <= phase_sum + FRQ_W;
end
assign addr = phase_sum[31:24];
sp_ram_256x8 sp_ram_256x8_inst (
.clka(clk), // input clka
.wea(1'b0), // input [0 : 0] wea
.addra(addr), // input [7 : 0] addra
.dina(8'd0), // input [7 : 0] dina