2015-03-24 8 views
1

Я пытаюсь реализовать 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 
+0

Что именно не работает? Я использовал алгоритм CORDIC для генерации синуса/косинуса и отлично работает внутри Virtex 5. – dieli

+0

Дорогой диели, благодарю вас за ваш ответ! Я только что отредактировал свой вопрос, чтобы быть более конкретным. – asonnino

+0

Кажется, что генерируются грех и косинус. Если я правильно помню, установленный шаг фазы - это то, что добавляется каждый такт («1100» в вашем случае). Ширина фазы (снимок экрана 1) составляет 16 бит. Следовательно, для синуса/косинуса требуется около 5461 тактов. При частоте 100 МГц вы должны получить частоту 18,3 кГц для вашего синуса/косинуса. Я не знаю симулятор Vivado, но вы можете попытаться щелкнуть правой кнопкой мыши по sin [15: 0] и просмотреть как форму волны. – dieli

ответ

0

Все отлично работало благодаря комментарию диели. Я приведу его здесь, если он может помочь кому-то другому:

Добавленный шаг фазы («1100» в моем случае) добавляется каждый такт. Поэтому, поскольку я использую 16-битную шину, мне нужно около 5461 тактов для одного sin/cos. Затем мы можем легко вычислить выходную частоту, используя формулу, приведенную в техническом описании. Чтобы увидеть волну sin/cos с Vivado, щелкните правой кнопкой мыши по сигналу sin/cos и выберите «тип волны», а затем «Analog». (Убедитесь, что вы запускаете симуляцию в течение достаточного времени.)

Смежные вопросы