我正在用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:
`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)
);
endmodulemodulator_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编辑二:
发布于 2015-04-02 23:16:14
多亏了dieli的评论,一切都很顺利。我在这里总结一下,以防它能帮助到其他人:
设置的相位增量(在我的例子中是“1100”)被添加到每个时钟周期。因此,由于我使用的是16位总线,我需要5461个时钟周期来实现一个sin/cos。然后,我们可以很容易地计算输出频率使用在数据表中给出的公式。若要查看使用Vivado的sin/cos波形,请右键单击sin/cos信号,然后选择“波形样式”,然后选择“模拟”。(请确保您运行模拟足够的时间。)
https://stackoverflow.com/questions/29235696
复制相似问题