前回追加した入出力共Avalon-STのFIFOにAndroid端末からAvalon-MM経由でデータを書き込み、その後FIFOの出力を入力に繋いでDACからループ出力させます。そのための独自のQsysコンポーネントFIFO Controllerを作ります。
Verilogの記述は次のようにシンプルです。
// fifo_controller.v // This file was auto-generated as a prototype implementation of a module // created in component editor. It ties off all outputs to ground and // ignores all inputs. It needs to be edited to make it do something // useful. // // This file will not be automatically regenerated. You should check it in // to your version control system if you want to keep it. `timescale 1 ps / 1 ps module fifo_controller #( parameter AUTO_CLK_CLOCK_RATE = "-1" ) ( input wire clk, // clk.clk input wire rst, // rst.reset input wire [31:0] fifo_in_data, // fifo_in.data input wire fifo_in_valid, // .valid output wire fifo_in_ready, // .ready output wire [31:0] fifo_out_data, // fifo_out.data output wire fifo_out_valid, // .valid input wire fifo_out_ready, // .ready input wire [31:0] loop_in_data, // loop_in.data input wire loop_in_valid, // .valid output wire loop_in_ready, // .ready output wire [31:0] loop_out_data, // loop_out.data output wire loop_out_valid, // .valid input wire loop_out_ready, // .ready input wire fifo_in_en, // fifo_in_en.export input wire fifo_out_en, // fifo_out_en.export output wire [31:0] monitor_out // monitor_out.export ); assign loop_in_ready = fifo_out_en == 1'b1 ? fifo_out_ready : 1'b1; assign fifo_out_valid = loop_in_valid; assign fifo_out_data = loop_in_data; assign fifo_in_ready = fifo_in_en == 1'b1 ? loop_out_ready : 1'b0; assign loop_out_valid = fifo_in_en == 1'b1 ? fifo_in_valid : loop_in_valid; assign loop_out_data = fifo_in_en == 1'b1 ? fifo_in_data : loop_in_data; assign monitor_out = loop_out_data; endmodule
Qsys上でFIFOと繋ぎます。
Top-levelのVerilogはこうなりました。
module ledtest (
RST_N,
CLK,
SPI_NSS,
SPI_SCLK,
SPI_MISO,
SPI_MOSI,
LED2,
LED4,
LED5,
DAC
);
input CLK, RST_N;
input SPI_NSS, SPI_SCLK, SPI_MOSI;
output SPI_MISO;
output LED2, LED4, LED5;
output [11:0] DAC;
wire [2:0] leds_sig;
wire [31:0] monitor_out;
spi_master u0 (
.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 (leds_sig),
.fifo_controller_0_monitor_out_export (monitor_out),
.fifo_controller_0_fifo_in_en_export (leds_sig[0]),
.fifo_controller_0_fifo_out_en_export (leds_sig[1])
);
assign LED2 = ! leds_sig[0];
assign LED4 = ! leds_sig[1];
assign LED5 = ! leds_sig[2];
assign DAC = {monitor_out[9:0], 2'b00};
endmodule
1024ワードのFIFOに1024ワードのインクリメンタルパターンを書いた場合と、700ワードを書いた場合の出力波形です。FIFOに書いた分でループします。