首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Vivado在Virtex7上生成sin/cos

用Vivado在Virtex7上生成sin/cos
EN

Stack Overflow用户
提问于 2015-03-24 14:49:26
回答 1查看 2.3K关注 0票数 3

我正在用Xilinx在Virtex 7上实现SystemVerilog中的QAM调制器,并且我被困在产生本机振荡器的sin和cos上。

更具体地说,我有输入I和Q信号(每个3位),我必须用余弦和正弦波分别乘以它们。乘法工作很好,但我需要一个IP来产生余弦和正弦在一个给定的频率。

为此,我深入阅读了在以下链接中提供的DDS编译器v6.0的文档,但我仍然被困住了:0/dds 141-dds-编译器

有人有什么建议或示例代码来帮助我吗?

我提前感谢你

编辑:

请在下面找到一些截图和我的示例代码。我不明白的是,为什么罪恶/科斯会接受这些“奇怪”的价值观。我正确地使用了dds_compiler吗?

截图和Vivado项目(我还没有直接发布它的权限):compiler.zip?dl=0

modulator.sv:

代码语言:javascript
复制
    `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:

代码语言:javascript
复制
    `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

编辑二:

对于后验,完整的代码是可用的这里;详细信息和解释可以在中找到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 23:16:14

多亏了dieli的评论,一切都很顺利。我在这里总结一下,以防它能帮助到其他人:

设置的相位增量(在我的例子中是“1100”)被添加到每个时钟周期。因此,由于我使用的是16位总线,我需要5461个时钟周期来实现一个sin/cos。然后,我们可以很容易地计算输出频率使用在数据表中给出的公式。若要查看使用Vivado的sin/cos波形,请右键单击sin/cos信号,然后选择“波形样式”,然后选择“模拟”。(请确保您运行模拟足够的时间。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29235696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档