組み込みRAMをQsysでNios IIに接続する

さて、相変わらずこちらの本。

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

今回は前回作成したような組み込みRAMをNios IIに接続してアクセスしてみる。


Mega Wizardではいろいろな構成のRAMやROMを作ることができる。
RAMやROM、ポート数、バス幅やサイズだ。
バス幅やサイズに関しては、2^nの幅・サイズで構成することができる。
8bitより大きいバス幅の場合、Nios IIからはどのように見えるのだろうか?
試しに、32bits x 32wordsのメモリを作ってみる。
組み込みRAMの宣言

module ram (
	clock,
	data,
	rdaddress,
	wraddress,
	wren,
	q);

	input	  clock;
	input	[31:0]  data;
	input	[4:0]  rdaddress;
	input	[4:0]  wraddress;
	input	  wren;
	output	[31:0]  q;

これにAvalon MMに接続できるようなラッパーを書く。

module test_ram(
	// Avalon bus
	input wire in_clk,
	input wire in_reset,
	input wire [4:0] in_address,
	input wire in_write_enable,
	input wire in_read_enable,
	input wire [31:0] in_write_data,
	output wire [31:0] out_read_data);
	//
	// 32bits x 32words eRAM
	//
	ram ram_32bitsx32words(
		.clock(in_clk),
		.data(in_write_data),
		.rdaddress(in_address),
		.wraddress(in_address),
		.wren(in_write_enable),
		.q(out_read_data));
endmodule

これをQsysでNios IIと共に組み込むと、4bytes x 32words = 128bytesのメモリー領域にマップされる。
こいつを、Nios II softwareからアクセスしてみる。

#include "system.h"
#include "io.h"
int main()
{ 
	unsigned long read_value;
	IOWR_32DIRECT(TEST_RAM_0_BASE, 0x00000000, 0x01234567);
	IOWR_32DIRECT(TEST_RAM_0_BASE, 0x00000004, 0x89abcdef);
	read_value = IORD_32DIRECT(TEST_RAM_0_BASE, 0x00000000);
	printf("%x, ", read_value);
	read_value = IORD_32DIRECT(TEST_RAM_0_BASE, 0x00000004);
	printf("%x, ", read_value);
  /* Event loop never exits. */
  while (1);

  return 0;
}

これでNios IIからDWORDサイズでword毎にアクセスできる。
モリーマップを見てみると、以下のようになっている。

  • メモリ先頭アドレス: word 0の[7:0]
  • メモリ先頭アドレス + 1: word 0の[15:8]
  • メモリ先頭アドレス + 2: word 0の[23:16]
  • メモリ先頭アドレス + 3: word 0の[31:24]

となっていることが分かる。
なのでDWORDで1 wordずつ一括で書いていく場合なら、アドレスはsizeof(DWORD) = 4ずつincrementしていく。