「Navre AVR clone」の編集履歴(バックアップ)一覧はこちら
Navre AVR clone - (2013/10/28 (月) 02:46:10) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
長々とステートマシンを記述するのは苦手で、最定期なデータ構造を探るためにも、処理を簡単に変更できるよう、
ステートマシンの代わりに、ソフトプロセッサを使用することにした。
複数FPGAに積むので、小型であること。ソフトウェアの開発が簡単にできるよう、gcc対応であることを条件に、
OpenCoresで探したところ、Navre AVR clone(正確にはNavré AVR clone)を見つけたので、
調べたことの備忘録としてこのページにまとめる。
*Navre AVR cloneとは
-http://opencores.org/project,navreで公開されているAVRコンパチブルのソフトプロセッサ
-周辺回路や割り込み、スリープは実装されていない
-命令セットは、http://en.wikipedia.org/wiki/Atmel_AVR_instruction_setの&br()Instruction set inheritanceの項目のClassic Core up to 8K Program Spaceまで対応
-無条件分岐のIJMP命令(アドレスを16bitで指定)は対応しているが、&br()JMP命令(アドレスを22bitで指定)は対応していないようなのでプログラムは64Kwordまでのようだ。
-本来のAVRでは、データ空間にレジスタ・IOもマッピングされてるが、&br()ソースファイルを見たところ、NavreAVRではデータ空間に他のものがマッピングされておらず別々のものとして使ってるみたい?
--つまり、データ空間はアドレス幅そのままの64Kbyte全て使えるかも?
-IO空間は64byteしか無いけどIN・OUT命令では、IO空間のアドレス幅は6bitまでなので、それ以上に拡張することはできないかも?
--IO空間が足りなければデータ空間にマッピングすればいいか?(本家AVRはそうなってるらしい)
*ソフトウェアの開発
AtmelStudioを入れても、実際使うのはコンパイルに必要な物だけなので、無駄が多い。
また、メモリの容量などは実際のAVRとは違うものになるため、自分でリンカスクリプトを書くことになる。
→ AVR Toolchainをインストールしてコマンドラインで開発したほうがよさそう
**ソフト設計・コーディング
普通のAVRとだいたい同じだと思う
**ビルド
参考:http://www.clarestudio.org/elec/avr/gcc-1.html
ビルドする簡単な手順はおそらく
#highlight(none){{{
avr-gcc mmcu=avr2 -c hoge.c
avr-gcc mmcu=avr2 -o hoge.elf hoge.o
avr-objcopy -I elf32-avr -O ihex hoge.elf hoge.hex}}}
その後、Verilogの$readmemhシステムタスクでFPGAのROMの初期値としてプログラムを読み込むために
IntelHexファイルを$readmemh用に変換
#highlight(none){{{
avr-objcopy -I ihex -O verilog hoge.hex hoge_memh.txt}}}
あとは、VerilogのROM用コードを以下のようにすればFPGAに回路がロードされた時、プログラムがブロックメモリに置かれる
参考:[[Altera Recommended HDL Coding Styles>http://www.altera.com/literature/hb/qts/qts_qii51007.pdf]]のExample 14–26. Verilog HDL RAM with Initialized Contents と Example 14–27. Verilog HDL RAM Initialized with the readmemb Command
#highlight(none){{{
}}}
長々とステートマシンを記述するのは苦手で、最定期なデータ構造を探るためにも、処理を簡単に変更できるよう、
ステートマシンの代わりに、ソフトプロセッサを使用することにした。
複数FPGAに積むので、小型であること。ソフトウェアの開発が簡単にできるよう、gcc対応であることを条件に、
OpenCoresで探したところ、Navre AVR clone(正確にはNavré AVR clone)を見つけたので、
調べたことの備忘録としてこのページにまとめる。
*Navre AVR cloneとは
-http://opencores.org/project,navreで公開されているAVRコンパチブルのソフトプロセッサ
-周辺回路や割り込み、スリープは実装されていない
-命令セットは、http://en.wikipedia.org/wiki/Atmel_AVR_instruction_setの&br()Instruction set inheritanceの項目のClassic Core up to 8K Program Spaceまで対応
-無条件分岐のIJMP命令(アドレスを16bitで指定)は対応しているが、&br()JMP命令(アドレスを22bitで指定)は対応していないようなのでプログラムは64Kwordまでのようだ。
-本来のAVRでは、データ空間にレジスタ・IOもマッピングされてるが、&br()ソースファイルを見たところ、NavreAVRではデータ空間に他のものがマッピングされておらず別々のものとして使ってるみたい?
--つまり、データ空間はアドレス幅そのままの64Kbyte全て使えるかも?
-IO空間は64byteしか無いけどIN・OUT命令では、IO空間のアドレス幅は6bitまでなので、それ以上に拡張することはできないかも?
--IO空間が足りなければデータ空間にマッピングすればいいか?(本家AVRはそうなってるらしい)
*ソフトウェアの開発
AtmelStudioを入れても、実際使うのはコンパイルに必要な物だけなので、無駄が多い。
また、メモリの容量などは実際のAVRとは違うものになるため、自分でリンカスクリプトを書くことになる。
→ AVR Toolchainをインストールしてコマンドラインで開発したほうがよさそう
**ソフト設計・コーディング
普通のAVRとだいたい同じだと思う
**ビルド
参考:http://www.clarestudio.org/elec/avr/gcc-1.html
ビルドする簡単な手順はおそらく
#highlight(none){{{
avr-gcc mmcu=avr2 -c hoge.c
avr-gcc mmcu=avr2 -o hoge.elf hoge.o
avr-objcopy -I elf32-avr -O ihex hoge.elf hoge.hex}}}
ビルドしたプログラムが、メモリに乗る容量か確認
#highlight(none){{{
avr-size hoge.elf}}}
その後、FPGA内蔵メモリブロックの初期値としてプログラムを読み込むために
IntelHexファイルを$readmemhシステムタスク用に変換
#highlight(none){{{
avr-objcopy -I ihex -O verilog hoge.hex hoge_memh.txt}}}
あとは、VerilogのROM用コードを以下のようにすればFPGAに回路がロードされた時、プログラムがブロックメモリに置かれる
参考:[[Altera Recommended HDL Coding Styles>http://www.altera.com/literature/hb/qts/qts_qii51007.pdf]]のExample 14–26. Verilog HDL RAM with Initialized Contents と Example 14–27. Verilog HDL RAM Initialized with the readmemb Command
#highlight(none){{{
module ram_with_init #(
parameter depth = 11,
parameter width = 16,
) (
output reg [width-1:0] q,
input wire [width-1:0] d, // ROMの場合不要
input wire [depth-1:0] a,
input wire we, // ROMの場合不要
input wire clk
);
reg [width-1:0] mem [0:(1<<depth)-1];
initial
begin
$readmemb("hoge_memh.txt", ram);
end
always @ (posedge clk) begin
if (we) // ROMの場合不要
mem[a] = d; // ROMの場合不要
q = mem[a];
end
endmodule}}}