BeMicro Max10+ESP-32(4)NCO x 2 + 乗算器


前回に続いてBeMicro Max10をCPU無しで使います。NCOを2つと乗算器でAM変調を試します。

NCO2つと乗算器でメモリやロジックエレメントをかなり使用するので、全てビット幅は12ビットにして節約します。

 

乗算器もQsysで配線したいので、QuartusのIP CatalogにあるLPM_MULTを使用するQsysコンポーネントを作ります。簡単のため入出力のビット幅は12ビット固定としてパラメータの編集画面は省略します。

Qsys画面に変調用のNCOとその周波数設定用のPIO、AM変調用の乗算器LPM MULT 12 12を追加します。変調用NCOの周波数設定用のPIOのアドレスは0x00000010にしました。

HDLの記述は、J3コネクタに乗算器の出力を繋ぐように変更します。

module ledtest (
	RST_N,
	CLK,
	LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8,
	DAC1, DAC2, DAC3, DAC4, DAC5, DAC6, DAC7, DAC8, DAC9, DAC10, DAC11, DAC12,
	SCLK, CS_N, MOSI, MISO
);
input CLK, RST_N;
output LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8;
output DAC1, DAC2, DAC3, DAC4, DAC5, DAC6, DAC7, DAC8, DAC9, DAC10, DAC11, DAC12;
input SCLK, CS_N, MOSI;
output MISO;
wire [31:0] nco0_in;
wire [31:0] nco1_in;
wire [11:0] mult_out;
wire [11:0] dac_in;

    unsaved u0 (
        .clk_clk                                                    (CLK),                                                    //          clk.clk
        .reset_reset_n                                              (RST_N),                                              //        reset.reset_n
        .spi_bridge_mosi_to_the_spislave_inst_for_spichain          (MOSI),          //   spi_bridge.mosi_to_the_spislave_inst_for_spichain
        .spi_bridge_nss_to_the_spislave_inst_for_spichain           (CS_N),           //             .nss_to_the_spislave_inst_for_spichain
        .spi_bridge_miso_to_and_from_the_spislave_inst_for_spichain (MISO), //             .miso_to_and_from_the_spislave_inst_for_spichain
        .spi_bridge_sclk_to_the_spislave_inst_for_spichain          (SCLK),          //             .sclk_to_the_spislave_inst_for_spichain
        .pio_nco0_export                                            (nco0_in),                                             //      pio_nco.export
        .nco_ii_0_in_valid                                          (1'b1),                                          //  nco_ii_0_in.valid
        .nco_ii_0_in_data                                           (nco0_in),                                           //             .data
        .pio_nco1_export                                            (nco1_in),                                             //      pio_nco.export
        .nco_ii_1_in_valid                                          (1'b1),                                          //  nco_ii_0_in.valid
        .nco_ii_1_in_data                                           (nco1_in),                                           //             .data
        .lpm_mult_12_12_0_result_data                               (mult_out),                               // lpm_mult_16_16_0_result.data
        .lpm_mult_12_12_0_result_valid                              ()                               //                        .valid
    );

assign dac_in = (mult_out[11] == 0) ? mult_out + 12'h800 : mult_out - 12'h800;
	 
assign LED1 = ! dac_in[11];
assign LED2 = ! dac_in[10];
assign LED3 = ! dac_in[9];
assign LED4 = ! dac_in[8];
assign LED5 = ! dac_in[7];
assign LED6 = ! dac_in[6];
assign LED7 = ! dac_in[5];
assign LED8 = ! dac_in[4];

assign DAC1 =  dac_in[11];
assign DAC2 =  dac_in[10];
assign DAC3 =  dac_in[9];
assign DAC4 =  dac_in[8];
assign DAC5 =  dac_in[7];
assign DAC6 =  dac_in[6];
assign DAC7 =  dac_in[5];
assign DAC8 =  dac_in[4];
assign DAC9 =  dac_in[3];
assign DAC10 =  dac_in[2];
assign DAC11 =  dac_in[1];
assign DAC12 =  dac_in[0];

endmodule

動作確認用のWindowsアプリからアドレス0x00000000にデータ20972を、アドレス0x00000010にデータ21を書き込みます。搬送波が1MHz、変調波が1kHzに設定されます。DACの出力にラジオを近づけ1000kHzを受信すると変調波が聞こえます。

追記:これでは変調度200%な気がします。変調波のレベルを下げなくては。