Я пытаюсь реализовать QAM-модулятор в SystemVerilog на Virtex 7 с Xilinx Vivado, и я застрял в генерации греха и cos локального генератора.Создание sin/cos на Virtex7 с Vivado
В частности, у меня есть входные сигналы I и Q (по 3 бита каждый), и я должен умножать их на косинус и синусоидальную волну соответственно. Умножение работает отлично, но мне нужен IP для генерации косинуса и синуса при частоте приема.
В этой цели, я глубоко прочитать документацию v6.0 DDS Compiler предоставленной по следующей ссылке, но я до сих пор застрял: http://www.xilinx.com/support/documentation/ip_documentation/dds_compiler/v6_0/pg141-dds-compiler.pdf
Кто-нибудь есть какие-либо предложения или пример кода, чтобы помочь мне?
Я благодарю вас заранее
EDIT: Пожалуйста, найти по настоящему Договору некоторых скриншотов и мой пример кода. Я не понимаю, почему sin/cos берут тезисы «странных» ценностей. Я правильно использовал dds_compiler?
скриншоты и проект Vivado (у меня нет еще право размещать его непосредственно): https://www.dropbox.com/s/xi5hralr2klk37s/dds_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)
);
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
Что именно не работает? Я использовал алгоритм CORDIC для генерации синуса/косинуса и отлично работает внутри Virtex 5. – dieli
Дорогой диели, благодарю вас за ваш ответ! Я только что отредактировал свой вопрос, чтобы быть более конкретным. – asonnino
Кажется, что генерируются грех и косинус. Если я правильно помню, установленный шаг фазы - это то, что добавляется каждый такт («1100» в вашем случае). Ширина фазы (снимок экрана 1) составляет 16 бит. Следовательно, для синуса/косинуса требуется около 5461 тактов. При частоте 100 МГц вы должны получить частоту 18,3 кГц для вашего синуса/косинуса. Я не знаю симулятор Vivado, но вы можете попытаться щелкнуть правой кнопкой мыши по sin [15: 0] и просмотреть как форму волны. – dieli