gpt4 book ai didi

fpga - 使用 Vivado 在 Virtex7 上生成 sin/cos

转载 作者:行者123 更新时间:2023-12-05 06:44:24 25 4
gpt4 key购买 nike

我正尝试在带有 Xilinx Vivado 的 Virtex 7 上的 SystemVerilog 中实现 QAM 调制器,但我对本地振荡器的 sin 和 cos 的生成感到困惑。

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

为此,我深入阅读了以下链接提供的 DDS Compiler 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

调制器_测试台.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

编辑二:

对于后验性,完整代码可用here ;详细信息和解释可以在 paper 中找到.

最佳答案

感谢 dieli 的评论,一切正常。我在这里总结它以防它可以帮助其他人:

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

关于fpga - 使用 Vivado 在 Virtex7 上生成 sin/cos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29235696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com