さて、相変わらずこちらの本。
FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?
- 作者: 小林優
- 出版社/メーカー: 技術評論社
- 発売日: 2011/09/22
- メディア: 大型本
- 購入: 3人 クリック: 31回
- この商品を含むブログ (19件) を見る
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していく。