重温FPGA设计流程(五、调用DDS IP核产生正弦波)

创建工程,DDS_test。在IP Catalog中搜索DDS,选择其中一个DDS Compiler,双击打开。
重温FPGA设计流程(五、调用DDS IP核产生正弦波)_第1张图片
重温FPGA设计流程(五、调用DDS IP核产生正弦波)_第2张图片
开发板系统频率为100MHz, 根据输出频率的计算公式,相位步进间隔= (fout / fdds_in) * 2^N (N 为前面相位的位宽),所以如果用系统的频率作为DDS的输入频率,相位步进间隔= (1k / 100M)* 2^16 = 0.65536,显然这在verilog 中无法实现,所以我们要设法使DDS IP 核的输入频率较小。这里我们通过对系统频率进行分频,获得 100KHz,作为DDS的输入频率,此时相位步进间隔为 655。
创建顶层.V文件。

module dds_top(
        input rst_n,
        input clk_100M,
        output data_tvalid,
        output [7:0] data_tdata
    );
reg [9:0]cnt;
reg clk_100K;
always @(posedge clk_100M or negedge rst_n)begin
    if(!rst_n)begin
        cnt<=10'd0;
        clk_100K<=0;
    end
    else if(cnt==10'd499)begin
        cnt<=10'd0;
        clk_100K <= ~clk_100K;
    end   
    else begin
        cnt<=cnt+1'b1;
    end
end
reg [15:0] phase_tdata;
always @(posedge clk_100K or negedge rst_n)begin
    if(!rst_n)begin
        phase_tdata<=16'd0;
    end
    else if(phase_tdata < 16'b1111_1111_1111_1111)begin
        phase_tdata <= phase_tdata + 10'd655; // (1k / 100k) * 2^16 =655
    end
    else begin
        phase_tdata<=16'd0;
    end
end
dds_compiler_0 dds_inst(
        .aclk(clk_100K),
        .s_axis_phase_tvalid(1'b1),
        .s_axis_phase_tdata(phase_tdata),
        .m_axis_data_tvalid(data_tvalid),
        .m_axis_data_tdata(data_tdata)
);
endmodule

创建仿真.V文件

module simu(
    );
reg rst_n;
reg clk_100M;
wire data_tvalid;
wire [7:0] data_tdata;
dds_top dds_top_inst(
    .rst_n(rst_n),
    .clk_100M(clk_100M),
    .data_tvalid(data_tvalid),
    .data_tdata(data_tdata)
);  
always #5 clk_100M = ~clk_100M;
initial begin
    rst_n=0;
    clk_100M=0;
    #10;
    rst_n=1;
    #1000000;
    $stop;
end
endmodule

显示波形设为模拟型,右键点击Waveform style ——>Analog
数值设置为有符号Radix——>Signal Decimal
重温FPGA设计流程(五、调用DDS IP核产生正弦波)_第3张图片

你可能感兴趣的:(FPGA)