« 2007年6月 | トップページ | 2007年8月 »

2007.07.29

FPGAが論理合成しなくても動く(3)

では、今回は新製品のうちの機能の1つ「Advanced JTAG Function Generator」における具体的な記述例をみてみましょう。

Advanced JTAG Function Generatorを使ってFPGAを動かすには、まずピン定義ファイルというものを作ります。例えば、こんな感じです。

--------------------------------
LED_O 2:D11 C11 D12 D13
PSW_IN 2:C14 C13 B14 C15
--------------------------------
この記述はAVNET製のFPGA評価基板でLEDとプッシュスイッチを操作するための信号を定義したものです。どういう名前の信号がどのピンにつながっているか、ということだけを記述しています。この評価基板では、4つのLEDは、FPGAのD11,C11,D12,D13番ピンに。プッシュスイッチは、JTAGチェーンのC14,C13,B14,C15番ピンにつながっています。
ピン定義ファイルを作るには、特別に難しいハードの知識が必要というわけではありません。回路図が読めればピン定義ファイルは書くことができるでしょう。

このピン定義ファイルを作ると、Advanced JTAG Function Generatorツールは自動でスクリプトの雛型を作ってくれます。 デフォルトの雛型では、すべてのピンをハイインピーダンスにするようになっていますので、ユーザはピンを操作したいとおりに記述を追加していきます。

#include "led.h"
JEXPORT int jmain(void)
{
 LED_O <= "Z";
 PSW_IN <= "Z";

 for(int i=0;i<100;i++)
 {
  LED_O <= ~i;
  if((int)PSW_IN[0] == 0) break; // 押されたらbreak
  Sleep(100);
 }
 return 0; // 正常終了時は0を返す
}

上のスクリプトで赤い文字で書いた部分がユーザが追加したスクリプトです。

こんな感じで、スクリプトを書くと、そのとおりにFPGAが動きます。上のリストで大文字のLED_OやPSW_INと書いたものは、システムが定義した変数です。これらの変数はピン定義ファイルに書かれたものをシステムが自動的に解釈するものなので、ユーザが明示的に宣言しなくても自動的に使用することができます。

これらの変数に値を代入したり値を読み出すことによって、実際のハードウェアが動いて操作されるわけです。
つまり、ユーザは個々のFPGAのアーキテクチャは一切気にせずに、どの端子をどのように動かすか、というアルゴリズムの開発に注力することができるようになるわけです。

文法上、普通のC言語とは違う点がいくつかあります。

まず、JTAG信号に値を代入するには、VHDLと同じように<=演算子を使うことです。
それから、信号の特定の範囲を切り出すには、VHDLと同じように(a downto b)という記述が使えることです。
さらに、[0]や(0)などでもバスの特定のビットにアクセスできます。

例えば、SDRAMのアドレスバスなんかでは次のような記述も可能です。

SD_ADDR_OP(7 downto 0) <= "00000000";
SD_ADDR_OP(10) <= "0";
int addr=0;SD_ADDR_OP <= addr;

VHDLと似ているので簡単ですね。

また、信号の値を読み出すには、int型の変数に代入すればよいので簡単です。

int data <= FLASH_ROM_DATA(7 downto 0);

秋月などによくあるような汎用的な液晶ディスプレイに文字を表示させたいならば、サブルーチンを定義してしまうのがよいでしょう。

void lcd_putc(char c)
{
 LCD_D = c;LCD_E <= "H"; LCD_RS = "H"; LCD_RW = "L";
 LCD_E <= "L";
}
と記述すればアルゴリズムを再利用できますので、便利です。
フラッシュROMを消去するシーケンスを発動させたいならば、
// step1
FLA_ADDR <= 0xaaa;
FLA_DATA <= 0xaa;
FLA_WE <= "L"; // 書き込みパルス
FLA_WE <= "H";
// step2
FLA_ADDR <= 0x555;
FLA_DATA <= 0x55;
FLA_WE <= "L"; // 書き込みパルス
FLA_WE <= "H";
// step3
FLA_ADDR <= 0xaaa;
FLA_DATA <= 0x80;
FLA_WE <= "L"; // 書き込みパルス
FLA_WE <= "H";
// step4
FLA_ADDR <= 0xaaa;
FLA_DATA <= 0xaa;
FLA_WE <= "L"; // 書き込みパルス
FLA_WE <= "H";
・・・(続く)

のようにすればよいのです。
まるで、テストベクタのようですが、このように記述したとおりに、そのままFPGAが動くわけです。

このツールを使うと、何が嬉しいかということについては、次回説明します。

(つづく)

| | コメント (0)

2007.07.28

FPGAが論理合成しなくても動く(2)

それでは、AVNET製のFPGA評価ボードを使って、この新製品のデモを行ってみます。

このボードは購入したデフォルトの状態では、電源を入れるとサンプルのアプリケーションが起動して、液晶の画面に"Memec V4FX12"と表示されるようになっています。その後、FPGA内の(おそらく)PowerPCが起動してLEDを点滅させるデモを行うようになっています。

※ 動画→フラッシュへの変換にはハンブルソフトさんのフラッシュ変換ツールを
使用させていただきました。とてもすばらしいソフトですね。早速、有料版を注文しました!

ところが、今回の「FPGAが論理合成しなくても動く」新製品を動作させると、FPGAの動作をパソコンでコントロールできるようになり、C言語で記述したとおりの動作を強制的に行わせることができます。 その結果、液晶には「Hello!! スイッチ ヲ オシテクダサイ」と表示され、押しボタンスイッチを押すとその近くのLEDが点滅する、というデモが動作を開始します。(上の基板の写真をクリックしてください。動画で見ることができます)

この動画をみている限りでは、FPGAにそのような動作をするデザインが書き込まれているように思われますが、実際にはFPGAには何も書き込まれていません。FPGAの中はデフォルトのサンプルのままです。

従来の論理合成による動作方法がコンパイラ的な処理によってFPGAを動作させていたのに対して、この新製品はFPGAインタプリタ的に動作をさせるのが特徴です。インタプリタであるが故に、ソースの変更から実機の動作までの時間を非常に短くすることができるのです。

つづく

| | コメント (0)

2007.07.27

FPGAが論理合成しなくても動く

先日のIPAXで発表した、新製品について、少しづつ書いていこうと思います。

IPAXの前日に特許出願を行ったこの新製品は、
「FPGAが論理合成しなくても動く」というものです。

普通、FPGAを動かすには、ソースコードをVHDLやVerilogで書いて論理合成にかけ、
特定のアーキテクチャにフィットさせなければなりません。
誰もがごくあたりまえのようにこの過程が行っているわけなのですが、
4つの大きな難関があるのです。

①VHDLやVerilogは、C言語などのソフトウェア言語に比べて難しいこと。
②FPGAを動かすには、個々のFPGAのアーキテクチャに対する知識が必要なこと。
③デバイスに合った論理合成ツールを使わなければならないこと。
④最後に、論理合成にはべらぼうな時間がかかることです。

こんな面倒なことをやらないと、FPGAは全く動いてくれないのです。
あたりまえのようなことなのですが、ソフトで作るときに比べると、けた違いに面倒です。

例えば、FPGAの動作はステップ実行やブレークができません。
作ったら作ったとおりに、ハードウェアの速度で走り出します。

たとえば、「FPGAに液晶ディスプレイをつなぎ、I2Cのメモリから読み出した文字列を表示させる」というアプリケーションを作ろうとしたとき、どのくらいでできるでしょうか?
どんなに慣れた人でも、液晶ディスプレイやI2Cのメモリとの正しいインタフェース方法をみつけるために、何度も何度も論理合成を繰り返すのではないでしょうか?

そのうえ最近のFPGAでは、論理合成に掛かる時間はどんどん長くなっています。
ちょこっとソースを修正して論理合成を行うたびに、毎回何十分もかかってしまうようでは、効率が悪くなってしまいます。

特殊電子回路はこれらの問題を解決する新しいツールを開発しました。

それはFPGAが論理合成しなくても動くというものです。
C言語で書いたソースのとおりに、FPGAの端子が動きます。
論理合成が必要ないので、ソースを変更した5秒後には新しいデザインでどんなFPGAでも動きます。

詳細はすこしづつ説明していきたいと思います。
どうぞご期待ください。


| | コメント (2)

2007.07.17

V850用JTAG-ICE開発のつづき(2)

V850用JTAG-ICEがだいぶん安定して動作するようになってきました。

Jicev850_3_1

CPUの停止とリスタートも問題なし。
逆アセンブラについては、PREPARE命令とDISPOSE命令、SWITCH命令などはまだですが、通常よく使われる命令に関してはだいたいOKです。
RAM上へなら任意のプログラムをダウンロードすることもできます。
あとはシングルステップ実行とブレークポイントですが、これは結構大変そう。

ところで、このJTAG-ICEは、全く同じユーザインタフェースで、V850、SH7144、SH7750R、SH7780、ARM7TDMI、ARM9TDMI、MIPS32に対応することができました。結構頑張っていろいろなCPUに対応してきたつもりなのに、まだ両手で数えられる程度のアーキテクチャしかサポートしていないんですね。
Jicev850_2
次は何のCPUにしましょうか。MicroBlazeにするか、VRにするか、XScaleにするか。

| | コメント (0)

2007.07.16

V850用JTAG-ICE開発のつづき

そういうわけで、V850のデバッガの開発を続けています。
開発3日目にして、ようやく、逆アセンブラらしきものが動き始めました。

Jicev850_1

V850は、DRSTという端子をHにすると、JTAGデバッグができるようになります。
いろいろあって、レジスタやメモリの内容を自在に読み書きできるまでに、かなりの苦労をしました。
今では、汎用プログラムレジスタやシステムレジスタの読み出しは完璧。

ただし、ブレークとリスタートがまだ不安定です。
逆アセンブラに出てくるレジスタ番号や定数なども、まだ怪しいです。
これはあと数日で解決できるでしょう。

| | コメント (0)

2007.07.13

V850のデバッガの開発を始めました

ここ数週間、ブログの更新が滞っております。
じつはものすごい忙しさで更新しているひまがありませんでした。

先々月始めごろには抱えていた案件が14件あったのですが、
いくつか解決(&納品)して現在9件にまで減りました。

現在ものすごい勢いで進めている案件は4件です。
残りの5件は原稿執筆だったり、当分先の話だったり、自社製品開発だったりします。
切羽詰ってるのは4件のみ。
リアルタイムOSのように頑張ってます。

というわけで、少し余裕が出てきたので、
その中の1つである「V850用JTAGデバッガ」の開発にようやく着手できるようになりました。

まずはユーザモードのプログラムを作って、CPUに慣れることにします。
Interface誌5月号をみながら、付録基板に電源をいれてみると、
・・・・・・・・・・
・・・・・・・・・・
なんじゃこりゃ。

シリアル通信を使ったプログラムを作ろうとすると、とにかく開発がやりにくい。
頻繁にジャンパピンを抜き差ししなきゃいけなかったり、
フラッシュROMの書き込みが遅い(全領域に書いてる?)のは、まあいいでしょう。

USB越しにはユーザが気軽にリセットをかけられないんですね。
リセットするにはJ3のどちらかの端子をGNDに落とせばよいのですが、
どっちをGNDに落とせばよいのか、基板を見てもぱっとわからないんですよね。
なぜかというと、この基板、シルクが全くないから。
オープンドレインのICをリセット回路に使ったという点では、前回よりは進歩しているようですが。
基板にシルクがないので、リセット以外にも、どこに何の信号が出ているのやら・・

そんなこんなで、LEDチカチカから始めて、CPUに慣れるまでに午前中を費やしてしまいました。
レジスタの内容とメモリの内容をダンプするだけの、
ユーザモードで動く、簡単なデバッガを作って遊んでみました。

とにかく、
プログラムのダウンロードと実行で、ジャンパを切り換えなければいけないし、リセットをかけなければなりません。
フラッシュの書き込みの際には、USB-シリアル越しのTeraTerm等はDisconnectしなければならない。

JTAGデバッガからあれば、アプリケーションの開発はより便利になるでしょう。
これは是非とも急いで作らねば。

というわけで木曜の午後からずっとデバッガの開発をしています。
現在、CPUを停止させられるけど元の処理に復帰できない、というレベルです。
JTAGデバッガ上から内蔵I/Oの任意の番地に値を書き込めるという程度のことはできるようになったので、LEDチカチカ程度はできます。

ここから先は意外と大変です。
連休中に少し進むといいのですが

| | コメント (0)

« 2007年6月 | トップページ | 2007年8月 »