2

我正在尝试在带有 Xilinx Vivado 的 Virtex 7 上的 SystemVerilog 中实现 QAM 调制器,但我一直无法生成本地振荡器的 sin 和 cos。

更具体地说,我将 I 和 Q 信号(每个 3 位)作为输入,我必须分别将它们与余弦波和正弦波相乘。乘法工作正常,但我需要一个 IP 以给定频率生成余弦和正弦。

为此,我已深入阅读以下链接提供的 DDS 编译器 v6.0 的文档,但我仍然卡住: http ://www.xilinx.com/support/documentation/ip_documentation/dds_compiler/v6_0/pg141- dds-compiler.pdf

有没有人有任何建议或示例代码来帮助我?

我提前谢谢你

编辑:

请在下面找到一些屏幕截图和我的示例代码。我不明白为什么 sin/cos 采用这些“奇怪”的值。我是否正确使用了 dds_compiler?

截图和 Vivado 项目(我还没有权限直接发布):https ://www.dropbox.com/s/xi5hralr2klk37s/dds_compiler.zip?dl=0

调制器.sv:

    `timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 31.03.2015 07:41:17
// Design Name: 
// Module Name: modulator
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module modulator(
    input  logic        clk,
    input  logic [2:0]  I,
    input  logic [2:0]  Q,
    output logic [18:0] p1,
    output logic [18:0] p2,
    output logic        tvalid
    );

    // internal signals
    logic [15:0] sin,cos;

    // carrier generation
    dds_compiler_0 dds_compiler_0_inst(
        .aclk(clk),
        .m_axis_data_tdata({sin,cos}),
        .m_axis_data_tvalid(tvalid)
    );

    // multiplier
    mult_gen_0 mult_gen_0_inst_1(
        .CLK(clk),
        .A(I),
        .B(cos),
        .P(p1)
    );
    mult_gen_0 mult_gen_0_inst_2(
            .CLK(clk),
            .A(Q),
            .B(sin),
            .P(p2)
        );

endmodule

modulator_testbench.sv:

    `timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 31.03.2015 07:41:17
// Design Name: 
// Module Name: modulator_testbench
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module modulator_testbench();

    // test signals
    logic        clk;
    logic [2:0]  I, Q;
    logic [18:0] p1,p2;
    logic        tvalid;

    // generate clock
    always begin clk=1; #5; clk=0; #5; end

    // instantiate dut
    modulator dut(
        .clk(clk),
        .I(I),
        .Q(Q),
        .p1(p1),
        .p2(p2),
        .tvalid(tvalid)
    );

    // start simulation
    initial begin
        #65;
        I=3'd1;  Q=3'd1; #10;
        I=-3'd1; Q=3'd1; #10;
        I=3'd3;  Q=-3'd3; #10;
        I=-3'd3; Q=-3'd1; #10;
        I=3'd1;  Q=-3'd1; #10;
    end

endmodule

编辑二:

对于后验性,完整的代码可在此处获得;细节和解释可以在论文中找到。

4

1 回答 1

1

多亏了dieli的评论,一切都很好。我在这里总结一下,以防它可以帮助别人:

每个时钟周期都会添加设置的相位增量(在我的情况下为“1100”)。因此,由于我使用 16 位总线,我需要大约 5461 个时钟周期来处理一个 sin/cos。然后,我们可以使用数据表中给出的公式轻松计算输出频率。要使用 Vivado 查看正弦/余弦波,请右键单击正弦/余弦信号并选择“波形样式”,然后选择“模拟”。(确保您运行模拟足够的时间。)

于 2015-04-02T23:16:14.857 回答