FPGA内のデータを記録するQsysコンポーネントを作ります。Qsys(Platform Designer)を起動して、IP CatalogのNew Componentをダブルクリックするか、[New…]ボタンをクリックしてComponent Editorを起動します。
コンポーネントに名前を付けます。
メニューからテンプレートを選択します。
信号線avs_s0_waitrequestは使わないので右クリックのメニューで削除します。
Verilogファイルを出力します。
ダイアログでファイル名を変更できないのでnew_component.vのまま保存して、エクスプローラ等で変更します。今回はMyMonitor.vに変更しました。
Qsys(Platform Designer)を開いたまま、Quartusに戻ってMyMonitor.vをプロジェクトに追加します。これは編集するMyMonitor.vをAnalysis & Synthesisでチェックするためで、コンポーネントが完成したあとプロジェクトから削除します。
16bits x 512wordsのデータを2チャンネル分記録したいので、32bits x 512wordsのRAM 2-PORTを作ります。ファイル名はram2_32x512.vにしました。
MyMonitor.vを編集します。次のようなメモリマップにするのでAvalonバスのアドレスavs_s0_addressは10ビットに変更します。
word 0-511: bit 31-16: CH2 memory, bit 15-0: CH1 memory word 512: bit 0: Write enable word 513: bit 3-0: Clock division ratio
`timescale 1 ps / 1 ps module MyMonitor ( input wire [9:0] avs_s0_address, // avs_s0.address input wire avs_s0_read, // .read output wire [31:0] avs_s0_readdata, // .readdata input wire avs_s0_write, // .write input wire [31:0] avs_s0_writedata, // .writedata input wire clock_clk, // clock.clk input wire reset_reset, // reset.reset input wire [31:0] coe_monitor // monitor ); reg wren; reg [3:0] div; reg [15:0] div_cnt; reg [8:0] addr; reg [31:0] coe_monitor_d; wire [31:0] q; always @(posedge clock_clk) begin if (reset_reset) begin wren <= 1; div <= 0; end else if (avs_s0_write && avs_s0_address == 10'h200) wren <= avs_s0_writedata[0]; else if (avs_s0_write && avs_s0_address == 10'h201) div <= avs_s0_writedata[3:0]; end always @(posedge clock_clk) begin if (reset_reset) begin div_cnt <= 0; addr <= 0; coe_monitor_d <= 0; end else if (wren) begin div_cnt <= div_cnt + 1; if ((div_cnt & ((1 << div) - 1)) == 0) begin addr <= addr + 1; coe_monitor_d <= coe_monitor; end end end ram2_32x512 ram2_32x512_inst ( .clock(clock_clk), .wraddress(addr), .data(coe_monitor_d), .wren(wren), .rdaddress((addr + 1) + avs_s0_address), .q(q) ); assign avs_s0_readdata = (avs_s0_address == 10'h200) ? wren : (avs_s0_address == 10'h201) ? div : (avs_s0_address == 10'h1ff) ? coe_monitor_d : q; endmodule
Analysis & Synthesisでチェックしてエラーがなくなったなら、Qsys(Platform Designer)のComponent Editorに戻ります。new_component.vを削除、代わりにMyMonitor.vを追加してAnalyze Synthesis Filesをクリックします。信号名にavs_、coe_、clock_、reset_を付けているので信号の種類が自動で判別されます。エラーがなければBlock Symbol画面を確認してComponent Editorを終了します。
avs_s0_addressが10ビットに変更され、16bits2チャンネルのデータを入力するコンジット型が追加されています。
Qsys(Platform Designer)に完成したMyMonitorコンポーネントを追加します。
接続します。
アドレスがぶつからないようにMyMonitorの開始アドレスを0x10000に変更します。
エラーがなければ[Generate HDL…]をクリックします。テンプレートを参考にしてトップモジュールを編集します。
16bits x 512wordsの2チャンネルの配線をmonitor1、monitor2という名前にしています。A/Dコンバータの出力をminitor1に接続しています。
`define CYCLE_1SEC 50000000 module SPIbridge ( input wire RST_N, input wire CLK, input wire SPI_NSS, input wire SPI_SCLK, output wire SPI_MISO, input wire SPI_MOSI, output wire [3:0] LED, input wire [7:0] ADC, output wire ENCODE, output wire I2S_SCK, output wire I2S_BCK, output wire I2S_LRCK, output wire I2S_DATA, output reg [7:0] DACA, output reg [7:0] DACB ); ... wire clk; // 73.75M wire [31:0] pio0; wire [31:0] pio1; wire [15:0] monitor1; wire [15:0] monitor2; ... reg [9:0] uadc_r; wire signed [9:0] adc; ... pll pll_inst ( .inclk0 (CLK), .c0 (clk) ); QsysCore QsysCore_inst ( .clk_clk (clk), .reset_reset_n (RST_N), .spi_slave_to_avalon_mm_master_bridge_0_export_0_mosi_to_the_spislave_inst_for_spichain (SPI_MOSI), .spi_slave_to_avalon_mm_master_bridge_0_export_0_nss_to_the_spislave_inst_for_spichain (SPI_NSS), .spi_slave_to_avalon_mm_master_bridge_0_export_0_miso_to_and_from_the_spislave_inst_for_spichain (SPI_MISO), .spi_slave_to_avalon_mm_master_bridge_0_export_0_sclk_to_the_spislave_inst_for_spichain (SPI_SCLK), .pio_0_external_connection_export (pio0), .pio_1_external_connection_export (pio1), .mymonitor_0_conduit_end_0_export ({ monitor2, monitor1 }) ); assign LED = ~pio0[3:0]; ... always @(posedge clk) begin uadc_r <= { ADC, 2'b00 }; end assign ENCODE = clk; assign adc = (uadc_r[9] == 0) ? uadc_r + 10'h200 : uadc_r - 10'h200; ... assign monitor1 = { adc, 6'h00 }; assign monitor2 = 16'h0000; ... endmodule
EP4CE6E22 AM/FMステレオラジオにMyMonitorコンポーネントを追加して、A/Dコンバータの出力をWindows版アプリで表示してみました。FMの放送局が6つ判別できます。クロックが73.75MHzなので82.5MHzの東京FMが8.75MHzに現れています。