FC2カウンター FPGAの部屋 Avalon-MMスレーブペリフェラル4(Nios2 IDEで7セグLEDをテスト)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Avalon-MMスレーブペリフェラル4(Nios2 IDEで7セグLEDをテスト)

KiCADをいじっていたので、前回と間が空いてしまったが、ダイナミック点灯7セグメントLEDのAvalon-MMスレーブペリフェラルをNios2 IDEでファームを作って動作チェックをしてみることにした。
まずはQuartus2のProgrammerでボードに書き込んでみた。そうすると7セグメントLEDはオール0を表示した。とりあえず合っているが、少し明るさが暗い感じだ。ダイナミック点灯の1KHzに周波数が高すぎるのか?それとも分周をミスって周波数が高いのかはわからない(オシロを持っていないので)後で実際に値を表示してみればわかると思う。
Nios2 9.0 IDEを立ち上げて、新しいboard_diagを作った。具体的にはFile メニューからNew -> NiosⅡ C/C++ Application を選択した。New Project ダイアログが起動した。
Name にboard_diag_7segと入れてPTFファイルを選択し、Finishボタンをクリックして、Board Diagnosticsテンプレートを生成した。
AvalonMMslave7seg_21_090829.png

Nios2 9.0 IDEの左のペインのboard_diag_7segのところで右クリックして、Build Projectを選択してプロジェクトをビルドした。
AvalonMMslave7seg_22_090829.png

board_diag_7seg_syslib\Debug\system_description\system.h にAvalonMM_Slave_Dyna7seg_0 configurationが出来ていた。

/*
* AvalonMM_Slave_Dyna7seg_0 configuration
*
*/

#define AVALONMM_SLAVE_DYNA7SEG_0_NAME "/dev/AvalonMM_Slave_Dyna7seg_0"
#define AVALONMM_SLAVE_DYNA7SEG_0_TYPE "AvalonMM_Slave_Dyna7seg"
#define AVALONMM_SLAVE_DYNA7SEG_0_BASE 0x00000020
#define AVALONMM_SLAVE_DYNA7SEG_0_SPAN 32
#define AVALONMM_SLAVE_DYNA7SEG_0_TERMINATED_PORTS ""
#define ALT_MODULE_CLASS_AvalonMM_Slave_Dyna7seg_0 AvalonMM_Slave_Dyna7seg


これからファームを書いて、7セグメントLEDをテストしする。
最初にboard_diag.cの既存の7セグメントLEDのテストルーチンを改造した。オリジナルは2ケタの7セグメントLEDに00からFFの表示をするものだった。今回のボードは8桁あるので、2桁ずつ00からFFまで表示するようにした。下にそのCコードを示す。

static void SevenSegCount( void )
{
  alt_u32 count;
  
  for (count = 0; count <= 0xff; count++)
  {
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+4, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+8, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+12, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+16, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+20, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+24, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+28, count>>4);
    usleep(500000);
  }
}


上のコードに書き換えて、他のところもつじつまの合わない部分を書き換えて、左側のペインのboard_diag_0 で右クリックしてRun As -> Nois Ⅱ Hardware を選択しmakeした。
その結果、表示が全く読めない。ただし、全部のLEDに同じ数字がそろうときにはきちんと読むことができる。
次に、先ほどのコードをしたように変更して、全部の7セグLEDに同じ表示が出るようにした。

static void SevenSegCount( void )
{
  alt_u32 count;
  
  for (count = 0; count <= 0xff; count++)
  {
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+4, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+8, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+12, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+16, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+20, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+24, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+28, count&0xf);
    usleep(500000);
  }
}


そうするときちんと表示されてたのだが、Dを表示した後にFになっている。Eが抜けているようだ。B27segDec.vのソースを見るとEを表示する記述が抜けていた。失敗。。。早速、Eを表示する記述を書き加えた。
表示がおかしいのは、7セグLEDのダイナミック点灯の周波数が高くて、スイッチング用のトランジスタが間に合っていないのが原因じゃないかと思う。
上記の項目を修正して、もう一度Quartus2でコンパイル、Nios2 9.0 IDEでBuild Projectを行った。
今度はEは点灯したが、やはり表示がおかしい。


わかりました。ケアレスミスです。それは。。。

AvalonMM_Slave_Dyna7seg.vファイルのseven_seg_digitを接続するのを忘れていました。道理でこれでは表示がおかしくなるはずです。

assign seven_seg_digit = drive_led;


を追加しました。これで正常になるでしょう。元も直しておきました。でもQuartus2ではエラーにならないんですね。ISEでは確実にピンがなくなり、UCFと合わないので、Translateでエラーが出ます。
これでまた、もう一度やり直して、Consoleでボードと通信ができるようになりました。下はNios2 9.0 IDEの一番下のConsoleペインです。Main Menuからd: Seven Segmeent Menuを選択するためにSelect Choiceに d +リターンキーを入力します。
AvalonMMslave7seg_24_090903.png

Seven Segment Menuからa: Count From 0 to FF. を選択するために a +リターンキーを入力します。b:は実装してありません。
AvalonMMslave7seg_25_090903.png

そうすると、ボードの7セグメントLED8個が4つの組で00からFFまでカウントを始めました。良かった。ケアレスミスでした。
AvalonMMslave7seg_090904.jpg

紆余曲折、途中でKiCADに浮気するというアクシデントはあったが、曲がりなりにもAvalon-MMスレーブペリフェラルを実装することができて、良かった。
  1. 2009年09月04日 06:06 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1221-1e30b341
この記事にトラックバックする(FC2ブログユーザー)