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が動くわけです。
このツールを使うと、何が嬉しいかということについては、次回説明します。
(つづく)
最近のコメント