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

2011.07.31

RX62Nでネットワークにアクセスできた

RX62NのETHERCやEDMACといったイーサネットコントローラを使う方法がわかってきました。

そして、受信したパケットをダンプするプログラムを作ってみました。
まずは、次の画面をご覧下さい。
Rx62nether

こんな感じで、パケットダンプができました。

さて、ご存知のとおり、ルネサスからはRX62N用のWebサーバのサンプルプログラムがリリースされています。しかし、ルネサスのサンプルは巨大なJPEGデータを含んでいるので、デフォルトで128kBytesを超えてしまっています。そのため、試用期間の切れたHEWではビルドできません。
また、Webサーバが提供するファイルを差し替えることが難しいという問題もありました。

そこで、RX-ELF-GCCを使ってコンパイルできるものを作ろうとしています。イーサのサンプルプログラムをGCCでコンパイルするには少々テクニックが必要ですが、128kByteの制限がないので巨大なプログラムでも作れます。

そういうわけで、今日は内蔵イーサネットコントローラの使い方を調べていました。

ルネサスのWebサーバサンプルで遊んでいていくつか気になったのは、LinkUP/LinkDownを検出できないので、DHCPクライアントが起動時に1回しか動作しないという問題がありました。
そこで、自分で作るプログラムでは、割り込みかをつかってLinkUP/Downを検出できるようにしようと思いました。

せっかくP54/LINK_STAという信号がCPUにあるのですから、これを使うことにしました。LINK_STAは普通の回路設計では、PHYにつながっています。LINK_STAを使って割り込みを有効にするために設定すべきレジスタは、


ETHERC.ECSIPR.LONG = 0x00000004; // LINK信号変化割り込みを許可
EDMAC.EESIPR.LONG |= (1 << 22);
ICU.IER[4].BYTE |= (1 << 0); // EINT Enable
ICU.IPR[8].BYTE = 1; // EINT Interrupt Level is 1

の4つです。

ETHERCの割り込みを使う場合には、EDMACの中のレジスタをいじらなければならないのがミソです。
これで、LINK_STA端子の遷移で割り込みがかかるようになりました。

しかし!!

この方法には大きな問題があったのです。LINK_STA端子は、通常、PHYの橙色LEDにつながっています。橙色LEDはリンクアップを示すLEDですが、通信が入ったときに点滅するのです!
すると、何かを受信するたびにLEDが点滅して、そのたびに割り込みがかかる・・・これに気が付くまで相当の時間がかかってしまいました。
「あれー、なんでLinkUPとDownを繰り返すんだろう・・」と、半日悩みました。

まぁ、PHYのレジスタをMDCでアクセスして点滅を止めてしまえばいいのですが、それでは通信が入ったときに点滅できないので、結局のところLinkUP/Downを割り込みで通知してもらうのは賢いやり方でないといえます。

わかったことは、内蔵イーサコントローラとイーサDMAコントローラは、メインメモリを介して、イーサネットのフレームをそのまま送受信する機能を持つということです。

ですから、TCP/IPを使うにはミドルウェア(イーサネットのフレームを解読したり組み立てたりするもの)が必要です。TCP/IPプロトコルスタックと内蔵ペリフェラルは、ブロックリードとブロックライトの関数だけでやりとりします。

ルネサスのWebサーバサンプルでは、TCP/IPプロトコルスタックにμIPを使っています。
次はμIPの解析をしていこうと思いますが、μIPといっても結構複雑(マクロを使ってぎっちぎちにコーディングされている)ので、これを使うのが良いのかどうか、ちょっと悩んでいます。

| | コメント (0)

2011.07.28

RX-MEGAの開発は着々と進んでいます

本日もRX-MEGAの開発は着々と進んでいます。

MARYのOLED基板とArduinoの液晶シールドをのせて両方とも絵を出してみました。
圧倒的にMARYのOLEDのほうが綺麗ですね。
(でも、最初の数ラインで黒い線が入ってしまうのが難点。)
Oledandnokia
作ったプログラムは本日のブログの最後に載せています。

それから、ようやく出荷の準備が整ってきました。基板のほかには、40ピンのコネクタや、背の高いオーディオ用ジャックなど、実装で好みが分かれそうコネクタは小袋に入れて提供することにしました。
RX62Nの上にピンヘッダを出したい人も、下にピンヘッダを出したい人もいるでしょうから。
Shukka

本日出荷しようと思ったのですが、佐川急便がすでに閉まってしまったので、明日になってしまいました。明日には確実に出荷ができそうです。申し訳ございません。

そもそも予定よりこんなに遅れたのは、USBのコネクタの実装不良が原因でした。USBコネクタのメーカーを変えたら、実装不良が多発。全部外して手作業で再実装していました。
今週末に、ちょっと遠いところの神社までいってお祓いしてきます。

それから、バイト君がArduinoの開発環境をRXduino用に移植してくれています。
どうでしょう?イメージカラーは紫色です。もうすぐコンパイルが通るそうです。
Ide1

ボードの設定のところに「究極のRX62Nボード」と、「RX-MEGA」と、「Interface誌付録のRX62N基板」があります。いずれは付録RX62N基板だけでもRXduinoが使えるようになります。

Ide2_2

紫の色は高貴な色だし、いいカラーだなと思っていたのですが、この配色ってよくよく考えてみるとバイキンマンの色ではないかーーっ!はーひふへほー

しかもMAC OSXで動いているという分けの分からない環境。Windowsでもそのまま動くといいのですが・・

もうここまで進めてしまったので、この色でいきます。
来週中くらいには、RXduinoのプログラムが、この環境の中からコンパイルできるようになると思います。WindowsでもMAC OSXでも。

それでは、MARY基板とNokia液晶のダブル駆動プログラムを載せます。


void setup() {
pinMode(PIN_BUZZ,OUTPUT);
// SPIクラス初期化
SPI.begin();
SPI.setBitLength(9);
SPI.setClockDivider(SPI_CLOCK_DIV16);
// OLEDライブラリの初期化
Init_OLED(MARY2); // MARY2のコネクタを使う
OLED_printf_Font(OLED_FONT_MEDIUM);
OLED_printf_Position(0, 0);
OLED_printf_Color(OLED_WHT, OLED_BLK);
}
void loop() {
int x1 = rand() & 127; // 四角をランダムに描画
int x2 = rand() & 127;
int y1 = rand() & 127;
int y2 = rand() & 127;
if(x1 > x2) {int tmp;tmp = x1;x1 = x2;x2 = tmp;}
if(y1 > y2) {int tmp;tmp = y1;y1 = y2;y2 = tmp;}
int color = (rand() << 1) ^ rand();
if(mode == 0) {
OLED_Fill_Rect(MARY2,x1,y1,x2-x1,y2-y1,color);
}
if(mode == 1)
{
SPI.port = spArduino;
unsigned char r,g,b;
r = rand();g = rand();b = rand();
NokiaLCD_fill(x1,y1,x2-x1,y2-y1,r << 16 | g << 8 | b);
}
if(digitalRead(PIN_SW) == 0) // ボタンが押されたら切り替え
{
mode = ++mode & 1;
if(mode == 0) {
Init_OLED(MARY2);
OLED_printf_Font(OLED_FONT_MEDIUM);
OLED_printf_Position(0, 0);
OLED_printf_Color(OLED_WHT, OLED_BLK);
OLED_printf_Font(OLED_FONT_MEDIUM);
OLED_printf_Position(0, 1);
OLED_printf_Color(OLED_WHT, OLED_BLK);
OLED_printf(MARY2,"TOKUSHU");
OLED_printf_Position(1, 3);
OLED_printf_Color(OLED_YEL, OLED_BLK);
OLED_printf(MARY2,"DENSHI");
OLED_printf_Position(1, 5);
OLED_printf_Color(OLED_BLU, OLED_BLK);
OLED_printf(MARY2,"KAIRO");
OLED_printf_Position(2, 7);
OLED_printf_Color(OLED_CYN, OLED_BLK);
OLED_printf(MARY2,"Inc.");
delay(1000);
}
if(mode == 1)
{
SPI.port = spArduino;
NokiaLCD_reset();
NokiaLCD_background(0x0000FF);
NokiaLCD_cls();
}
for(int i=0;i<100;i++)
{
digitalWrite(PIN_BUZZ,LOW);
delay(1);
digitalWrite(PIN_BUZZ,HIGH);
delay(1);
}
delay(100);
}

いまはまだmakefileとか使って結構面倒なコンパイルをしているのですが、IDEが完成すれば使うライブラリを指定しても自動化できるようになれいます。
Arduino風に書けるって本当に簡単で楽しいです。

| | コメント (0)

2011.07.27

RX62NのEXDMAで画像キャプチャは難しいかもしれない

RX62NのEXDMAを使って、CMOSイメージセンサの絵を取り込もうと思ったのですが、意外と難しいかもしれないということで躓きました。

CMOSイメージセンサOV7670の画像を、RX62NのEXDMAでSDRAM上に取り込み、それをMARYのOLED基板に表示しようと思っていました。

SDRAMの内容をMARYのOLED基板に表示させるのは難しくありませんでした。大抵のSDRAMの初期値は画像にすると縞模様です。
Sdramoled

で、EXDMAを使ってカメラの画像を取り込もうとしたのですが、どの信号をトリガにするかという問題があります。OV7670では、

HREFは _|~~~~~~|_|~~~~~~|_|~~~~~~|_|~~~~~~|_
VSYNCは ________________________________________|~~~~~~~~~~~~~~~~~~|__________

こんな感じなので、両方とも反転していてくれたほうが都合がよさそうです。
そこで、まずはOV7670の内部のレジスタを叩くため、I2Cの送信プログラムを作ります。
RX62NのI2Cペリフェラルは難解なので、簡単なソフトウェアでやったほうがいいでしょう。

で、OV7670のレジスタ0x15に0x0aを書き込むことでHREFとVSYNCの極性は反転できます。

さて、HREFをトリガとしてEXDMAを起動したときに困ったことに気が付きました。
EXDMAはデータバスから何かデータを取り込んでどこかへ転送しますが、SDRAMのデータバスとOV7670のデータバスが共通なのです。そしてOV7670はバスをインアクティブにできない。
だから、OV7670を直にRX62Nに接続することはできないのです。すくなくともOE付のCMOSイメージセンサでないといけません。

欲を言うと、FIFOがあったほうがいいでしょう。
今回、EDACKの周期をみていたら48MHzで測って5クロックだったのです。つまり、RX62Nは5クロックかけて1個のデータを取り込んでSDRAMに転送します。このタイミングはどうやらRX62Nの都合で決まるようで、カメラがどんなタイミングで出してきているかというのはお構いなしのようです。

もしかするとEXDMACのクラスタモードとかを使ったり、内蔵RAMを一時的なバッファにすればうまいことできるのかもしれません。まだよくわかりませんが。

実験中の風景はこんな感じです。
Cameraexdmaoled

今日はじめてEXDMACに触ってみた感触は、EXDMACはデータをキャプチャするよりも出すほうが強いんだろうなということでした。

| | コメント (2)

2011.07.25

RX-MEGAの販売開始と、キャラクタLCDのコントロール

大変お待たせいたしました!
構想から実現までだいぶん時間が経ってしまいましたが、RX-MEGA基板を販売開始いたします。

こちらのオンラインショップで、27個の数量限定で販売いたします。売り切れの際はごめんなさい。
https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=RXMEGA

RX-MEGA基板には、サポートなしと、サポート付との2種類があって、それぞれ12800円と19800円となります。
サポートというのは、具体的には、
 ① ソフトウェアとサンプルコードの提供(現在準備中です。今週中には提供開始できると思います)
 ② 技術的な相談の受付とトラブル対応
 ③ MITOUJTAG特別版の提供
です。

その提供するソフトウェアの中のひとつ、Arduino風のRXマイコンのプログラミング環境、
「RXduino アールエックスデュイーノ」ですが、本日も少し開発を進めました。キャラクタ液晶のコントロールクラスを実装しました。
次のムービーをご覧下さい。

コントロールコードや、キャラクタRAMの定義などもできます。
参考までにどんなコードを組んだのかを、以下に示します。



int count = 0;

LiquidCrystal lcd(12,11,10,5,4,3,2);

// 独自文字の定義

unsigned char heart[8] = {0x0a,0x1b,0x1f,0x1f,0x1f,0x0e,0x04,0x00};

unsigned char progress0[] = {0x0e,0x0e,0x15,0x0e,0x04,0x0a,0x11,0x11};

unsigned char progress1[] = {0x02,0x1d,0x1d,0x05,0x1e,0x12,0x0d,0x11};

unsigned char progress2[] = {0x0e,0x0e,0x15,0x0e,0x04,0x0a,0x11,0x11};

unsigned char progress3[] = {0x08,0x17,0x17,0x14,0x0f,0x09,0x16,0x11};

// 最初に1回だけ実行

void setup(){

lcd.begin(20,2);

lcd.createChar(0x00,heart);

lcd.createChar(0x08,progress0);

lcd.createChar(0x10,progress1);

lcd.createChar(0x18,progress2);

lcd.createChar(0x20,progress3);

lcd.writeDelay = 100; // 独自の拡張

lcd.print("RXduino/RX-MEGA\n");

lcd.print(" TOKUDEN Kairo");

lcd.write(0); // 外字(ハート)を表示

delay(1500);

lcd.clear();

lcd.writeDelay = 0;

lcd.print("println() ノ テスト\n");

}

// 繰り返し実行

void loop() {

lcd.setCursor(0,1);

lcd.print("Count=");

lcd.print(count);

count++;

lcd.print(" ");

lcd.write(((count >> 6) & 0x03) + 1);

if(count > 1000) {

lcd.clear();

lcd.writeDelay = 100;

lcd.print("モウスグ .NET MFガ\n");

lcd.print("キドウシ");

lcd.writeDelay = 300;

lcd.print("ナサソウデス");

lcd.print("(");

lcd.scrollDisplayLeft();

lcd.print(";");

lcd.scrollDisplayLeft();

lcd.print("_");

lcd.scrollDisplayLeft();

lcd.print(";");

lcd.scrollDisplayLeft();

delay(1000);

lcd.blink();

delay(2000);

lcd.noDisplay();

while(1) {}

}

}

どうです?簡単でしょ。
ArduinoのLiquidCrystalクラスの互換となるように作ってみました。
Arduinoの関数ってわかりやすくできているなーとつくづく思いました。

◆おまけ

5×8dotのフォントで作る人が可愛かったので、走らせてみました。

8bit機の頃の懐かしい雰囲気です。

| | コメント (0)

2011.07.24

Arduino風にRX62Nマイコンをプログラムしませんか?

RX-ELF-GCCでC++が動くようになってきたので、RX62NマイコンのプログラムをArduino風に作れるライブラリを作りました。
その名も「RXduino (アールエックスデュイーノ)」

まずは、下のムービーを見てください。
RX-MEGAボードにNokiaのLCDシールドを載せています。青いボタンを押すとLCDに長方形をいっぱい描きます。

で、これらのことを実現するために作ったのがArduino互換の関数たちです。


unsigned long mills();
unsigned long micros();
void delay(int ms);
void delayMicroseconds(int us);
void digitalWrite(int duino_portnum,DigitalWriteState value);
void pinMode(int duino_portnum,pinModeState state);
int digitalRead(int duino_portnum);
int pulseIn(int duino_portnum, int val, unsigned long timeout = 1000000);
int analogRead(int analog_portnum);
void analogWrite(int analog_portnum,int val8bit);
void analogWriteDAC(int dac_portnum,int val10bit);
SPI.begin() ;
SPI.end() ;
SPI.setBitLength(int bitLength);
SPI.setBitOrder(SPI_BIT_ORDER bitOrder) ;
SPI.setClockDivider(SPI_CLK_DIVIDER divider);
SPI.setDataMode(SPI_DATA_MODE mode);
SPI.transfer(unsigned long txbyte) ;
Serial.begin(int bps);
Serial.end();
Serial.available();
Serial.read();
Serial.write(char val);
Serial.write(const char *str);
Serial.write(const char *buf,int len);
Serial.print(int val, PRINT_TYPE print_type=NONE);
Serial.print(double val, int fpdigit=2);
Serial.print(const char *str);
Serial.println(int val, PRINT_TYPE print_type=NONE);
Serial.println(double val, int fpdigit=2);
Serial.println(const char *str);

使い方は、Arduinoを使ったことがある方なら説明しなくても不要ですね?
(かくいう私もArduinoは一度も使ったことはありません。)

それに、main()ではなく、setup()から始まりloop()を繰り返し実行するようにしました。
なので、Arduino用に作ったプログラムがRXマイコンで動いてしまうというわけです。
しかも、プログラムはすべてゼロから特電が書き起こしているので、コード自体のライセンスもGPLフリーになるのです。(GCCとかnewlibとかは後で考えるとする)

ちなみに上の動画のプログラムは、


// RX62NのGCCサンプルプログラム
// メイン
// (C)Copyright 2011 特殊電子回路
#include "iodefine_renesas.h"
// RXデュイーノライブラリ
#include "libtkdn/rxduino.h"
// Nokia液晶用ライブラリ
#include "nokia_lcd.h"
#include
CSPI SPI(spArduino); // SPIのインスタンス (グローバル変数)
 
void setup() {
Serial.begin(38400);
Serial.println("--------------------------------------------------------");
Serial.println("RX62N GCC and RXduino emvironment test");
Serial.print("Compiled at ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.println(__TIME__);
Serial.println("--------------------------------------------------------");
  // 14本のDigitaiピンを出力に
for(int i=0;i<14;i++) {
pinMode(i,OUTPUT);
}
  // 6本のアナログデジタル兼用ピンを入力に
for(int i=0;i<6;i++) {
pinMode(14 + i,INPUT);
}
// LEDのポートなどの初期化
for(int i=0;i<5;i++) {
pinMode(PIN_LED0 + i,OUTPUT);
}
// プッシュスイッチは入力に
pinMode(PIN_SW,INPUT);
  // SPIモジュールを初期化
SPI.begin();
SPI.setBitLength(9); // 9bitモード (RXならではの拡張!)
SPI.setClockDivider(SPI_CLOCK_DIV4);
  NokiaLCD_reset();
NokiaLCD_background(0x0000FF);
NokiaLCD_cls();
}
 
void loop() {
if(digitalRead(PIN_SW) == 0) {
unsigned char r,g,b; // ランダムな長方形を描画
r = rand();g = rand();b = rand();
NokiaLCD_fill(rand() & 0x7f, rand() & 0x7f, rand() & 0x7f, rand() & 0x7f,
r << 16 | g << 8 | b);
}
}

どうでしょう。こんな簡単なプログラムで動いちゃうんですから、不思議なものですね。

これからのフィジカルコンピューティングは国産のRXマイコンでいきましょう!
AVRと比べると、めちゃめちゃ速いですよ!

RXduinoのサンプルをこちらにアップロードしました。※バグとか、未完成の部分もまだ多いので、ご注意ください。

このプログラムは当社のお客様(MITOUJTAGとかSP6とかRX62Nのお客様)は無償でダウンロードしていただけます。Interface誌の付録RX62N基板で使えるはずです。

さらに、特電「究極のRX62Nボード」か「RX-MEGAボード サポート付き」をお買い上げのお客様には、ソースコードも提供しちゃいます!
これからもどんどん改良していくので、ご期待ください!

| | コメント (0)

2011.07.22

最新版rx-elf-gccをリリースしました。ビルド方法も公開

RXマイコン用GCCの最新版をリリースしました。Cygwinで動いてRXマイコン用の実行ファイルをコンパイルできます。このファイルは、以下のURLからどなたでもダウンロードしていただけます。
http://www.tokudenkairo.co.jp/rx62n/tkdn-20110720-gcc.tar.bz2

更新点は
従来のRX-ELF-GCCはROM化ができなかったので、その問題を解決した。
最新のGCC-4.6.1を用いた。
です。

このGCCを使うことで、HEWのように128kBytesの制約がなく、どんな大きなサイズのオブジェクトファイルでも生成していただくことができます。皆様そろそろHEWの試用期間が切れるころだとおもいますので、ぜひともGCCへの移行をご検討ください。
また、従来のRX-ELF-GCCには(KPITのも含めて)バグがあってうまくROM化用のMOTファイルを生成することができませんでした。詳しい経緯はこちらに書いたとおりですが、今回のリリースではその問題をFIXしました。

なお、どうやってビルドしたかについては、全8ページの詳しい手順書に纏めました。
Howtobuildrxgcc

 ・第1章 準備・・・環境についての説明
 ・第2章 ダウンロード・・・必要のソースファイルのURL
 ・第3章 GCCの前準備・・・多倍長演算ライブラリの構築方法
 ・第4章 binutilsの構築・・・さあ、本格的なビルドの開始
 ・第5章 パスの設定とnewlibの解凍・・・この手順を忘れると後で躓く
 ・第6章 GCCのビルド・・・オプションがたいへん!
 ・第7章 newlibの構築・・・最後のステップは結構たいへん

GCCのビルドは非常にセンシティブで、オプションを1つ間違えてしまうとコンパイルで失敗して何時間も無駄に費やしてしまいます。しかも、最初から最後までビルドすると8時間くらいかかり、成功するための手順はそんなに多くありません。私は今年の5月のゴールデンウィークはどこにもいかずに、ほとんどをGCCのビルドに費やしました。だから、この手順書は、私のゴールデンウィークをかけた集大成です。上手くビルドできる方法をようやく見つけた血と汗の結晶なのです。

この手順書を、当社のお客様向けに公開いたしますので、どうぞご覧下さい。
ビルド手順書はこちら

この手順書を使うと、GCCのビルド方法を完全に忘れてしまった頭でも迷うことなくビルドすることができます。現に私は2ヶ月ぶりにGCCをビルドしましたが、途中で躓くことなくスムーズにビルドできました。
なお、うちのバイト君がMAC OS用にRX-ELF-GCCのビルドに成功したそうです。MAC OSでもRXマイコンの開発ができるようになるかもしれません。もう一人のバイト君はLinux用にコンパイルしてくれています。

それでは、快適なRXマイコンライフをご堪能ください!



※MITOUJTAGや、Spartanボード、RX62Nボードをお買い上げのお客様

| | コメント (0)

2011.07.20

Spartan-6でArduino!? MARY!?

特電Spartan-6ボードに、ArduinoのシールドやMARYの拡張基板を乗せるための変換基板を企画しています。
Sp6duinoidea

基板の設計はだいたいできました。こんな感じになりました。
Sp6duinoidea2Sp6duinoidea1

これで、Spartan-6 FPGAからArduinoやMARYの拡張基板が操作できます!

で、気になるプロセッサですが、もちろんMicroBlazeといきたいところですが、MicroBlazeだとEDKが別途必要になってしまうので、Simple MicroBlazeというのを考えています。

Simple MicroBlazeというのは、論理合成済みのMicroBlazeでXILINXがネットリストで提供しているものです。これをインプリメントすれば、EDKを使わずにMicroBlazeが使えるようになるというものです。
ただし、ペリフェラルの構成は固定で、メモリも最大64kバイトまでしか使えないとか制約はあります。
しかし、ソフトウェアはGCCで開発できるので、特にEDKのSDKがなくても開発できるのではないかと期待しているものです。
Cygwinで動くようにコンパイルしたMicroBlaze用GCCは、私が作って配ります。

Simple MicroBlazeについてはXCell Journalに記載があるほか、アプリケーションノートxapp1141に詳細が書かれています。

近々、VHDLのソースと、論理合成して配置配線をした後のBitファイル、そしてArduino関数を使うためのライブラリ等を配布しようと思います。といってもこれから開発するので、リリースは2週間くらい後になるでしょうか。

で、なんて呼んだらいいでしょう。MicroBladuino・・というのは呼びにくいので、スパロクデュイーノかな。

| | コメント (0)

RX62NでArduinoシールドを操作!

RX-MEGA基板(改)にコネクタをのせて、Arduinoシールドを動かしてみました。

結果はこのとおり。
Rx62narduino

どうです!?この配色。
Arduinoシールドと、MARY拡張基板の同時駆動ができました!

I/Oポートのコントロールは、


int DigitalWrite(int duino_portnum, DigitalWriteState state);
int pinMode(int duino_portnum, pinModeState state);

で、行えます。
そのため、Arduino用に作成されたプログラムを簡単に移植できるだろうと思うわけです。

また、写真のNokio液晶のコントロールには、より高レベルな関数を用意していて、


・・・
void LCD_pixel(int x, int y, int colour);
int LCD_putc(int value);
void LCD_cls(void);
void LCD_window(int x, int y, int width, int height);
・・・
void LCD_fill(int x, int y, int width, int height, int colour);

これらの関数のおかげで簡単に描画できます。

こんな感じの関数を鋭意準備中です。


ところで、この紫色のRX-MEGA基板(改)は量産のため、部品とともに実装屋さんに送ってしまっているのですが、1枚だけ手元い残した基板に千石や秋月で部品を買ってきて手付けしようとしたら、結構な部品代になりました。だいたい5000~6000円分になりました。思ったよりてんこ盛りでびっくりです。
電子部品って、意外と高いものなのですね。

量産中の基板は、あと1~2日で実装が済んで、特電に届くと思います。

| | コメント (0)

2011.07.19

J-Writerの高速化をめざして

じつは、J-Writerと特電RXボード上のUSB-JTAGは、同じUSBマイコンをほぼ同じファームウェアを使っています。最近、RXのデバッグを高速にできるようにしたいと強く思い、この3連休を利用して高速化のための改良を行っていました。
題して、「J-WriterもRX62NのUSB-JTAGも3倍速くしちゃおうプロジェクト」です。

RX用のUSB-JTAGが速くなれば、J-Writerも速くなります。だからこの際一挙に両方改良してしまいます。

下の写真は特電 究極のRX62Nボードの写真です。
見てのとおり2つのUSBポートがあり、いま挿さっているUSBのほうがUSB-JTAGのものです。
Rx_usbjtag

このUSB-JTAGはオンボードの78Kマイコン(uPD78F0730)です。
そうです、トラ技の付録についてきたUSBマイコンです。

いままではuPD78F0730のI/Oポートをソフトウェアで上げ下げして、JTAG信号を作り出していました。
そのため、とても遅かったのです。だいたい●0kHzくらいしかでません。

そこで、今回、uPD78F0730に内蔵されているCSI10というシリアル通信モジュールを使って8bit分のJTAG信号をハードウェアで作ることにしました。CSI10は125kHz~8MHzまでのクロックに同期したシリアル通信を行ってくれます。

しかしCSI10は8bit固定なので、例えば27bitのJTAG信号を送信したいときには、8bit*3回+3bitと分けて送信しなければなりません。ここでポイントとなるのは、CSI10と汎用I/Oポートをうまく切り替えること。

78KマイコンはCSIとI/Oポートをセレクタで切り替えているのではなく、P1.0(クロック)についてはANDで、P1.2(MOSI)についてはORで共有させています。
P10blockP12block

したがって、一方のモジュールを無効にするときは注意が必要です。クロックはHに、データはLにしないともう一方のモジュールが動きません。

具体的には、ポートからCSIに切り替える場合は、

CSIC10.4 = 1; // アイドル時のCSIクロックをLにする
CSIM10 = 0xd0; // CSI有効
P1.0 = 1; // ポート側から出すクロックをHにする
P1.2 = 0; // ポート側から出すデータをLにする

このように、CSI側に切り替えてからポートのクロックをH出力にします。

CSIからポートに切り替える場合は、

P1.0 = 0; // ポート側から出すクロックをLにする
CSIM10 = 0x00; // CSI無効
CSIC10.4 = 0; // アイドル時のCSIクロックをHにする

と、ポートのクロックをLにしてからCSIを無効にするとひげが出ません。

これで、CSIとポートをスムーズに切り替えられます。そして8bit単位の高速な転送はCSIで、7bit以下の転送はポートで、と使い分けられるようになりました。

実際にCSIに送信データを送る部分はアセンブラ化して、


mov a,[hl]
?Ltxrx3:
mov SOTB10,a
incw hl
mov a,[hl]
?Ltxrx4:
bt CSIM10.0,$?Ltxrx4
dbnz b,$?Ltxrx3
pop hl

とすれば、配列から次の送信データを取ってくるのに3命令・20クロックサイクルでできます。78Kマイコンは最短で2クロック/1命令ですが、実際の命令では5~10クロックかかるので1μ秒に2命令くらいしか実行できません。意外と遅いのです。

苦労した結果、データの間隔は1.2~1.4μ秒にまで縮まりました。
78k_csi_tx

このCSI10というペリフェラルでJTAG信号を生成するには、データの送信だけではなく、受信もしなければならないので、プログラムはもっと複雑になりますが、間隔は3μ秒以下にすることができました。

高速化のネックとなるのは、トラ技BIOSとセットになっているUSBファームウェアの遅さです。USBファームウェアは内部にリングバッファを持っています。ユーザが用意したバッファ上のデータをUSBに送信するには、ユーザバッファ→リングバッファ→USB FIFOと2回の転送を行わなければなりません。受信の際も同様です。
このデータ転送はファームウェアの中と、割り込み処理ルーチンの中で、for文をブンブン回して行われていますが、1バイト転送するたびにif文でリングバッファの境界検査をしているので、とても遅いのです。
より高速化のためには、このしくみを抜本的に改良することが必須と考えています。

さて、こうしてCSI版のJTAG信号が効率よく出せるよう、ファームウェアを全面的に書き換えました。
その結果、バウンダリスキャンの速度が2.3倍になりました。

従来は、RX62Nを1回バウンダリスキャンするのに約9msかかっていました。
78kjtag_oldfirm

上の図はSDRAMのメモリテストの波形です。

それが、新しいファームウェアではRX62Nのスキャンに約4msになりました。
78kjtag_newfirm

USB越しなので時間が1ms単位なのは仕方がないとして、最短で2msまで縮められるはずです。

| | コメント (0)

2011.07.15

RX-MEGAボードが出来上がってきた

作り直していたRX-MEGAボードが出来上がってきました。
今度は紫色です。

Rxmega_new1

基板の紫にシルクの白、錫メッキの銀です。
なかなか上品な仕上がりでしょ?
Rxmega_new2

Arduinoコネクタを直しました。
で、シルクでコネクタの説明を入れました。
Rxmega_new3 Rxmega_new4

基板の拡張コネクタにもシルクで説明をいれています。
Rxmega_new5

これでいちいち回路図を見なくてもいいので、使い心地アップ間違いなし!?

ブログを書いていて思ったのですが、このブログの配色と一緒だ!
なお、基板は実装屋さんにも送っていて、来週の中ごろには実装が仕上がってくる見込みです。

| | コメント (0)

MITOUJTAGのUSB Blaster対応パッチをリリース!

MITOUJTAGのALTEAR USB Blaster対応パッチをリリースします!
奇しくもこれが、ブログ投稿1000件目の記事のようです。

下記のURLからUSB Blaster対応パッチをダウンロードして、適用してください。

http://www.tokudenkairo.co.jp/login/login.php?url=ublaster_patch.lzh

対象となるMITOUJTAGは、MITOUJTAG 2.1以降の各種バージョン(Pro, BASIC, Light)です。
ダウンロードしたファイルを展開し、中にあるsmartupdate.exeを実行してください。
貴方のパソコンの中にあるMITOUJTAGがアップグレードされます。
Mjupdate

そして、ケーブルの自動認識で、ALTERA USB Blasterが認識されるようになります。
Usbblaster3_2
ダサいアイコンですが、お許しください。

いつもどおりデバイスを認識したら、バウンダリスキャンやプログラミングしたり、開発を楽しんでください。
Usbblaster4

JTAGロジアナの速度は3~4msに1回サンプリングできます。USB Blasterの高速モードが使えるようになればもっと早くなるのかもしれませんが、それは試しておりません。

次は特電のPocket JTAG CableやJ-Writerを、ALTERAやXILINXのツールから認識させる方法を研究していきたいと思います。そういったUSB-JTAGケーブルの垣根をなくすことができたらいいなと思っています。

| | コメント (0)

2011.07.14

USB Blasterへの対応(2)

火曜日・水曜日と風邪でダウンしていました。まだ少し喉が痛いですが・・

で、今日から再びMITOUJTAGをUSBブラスターに対応させるための開発の再開です。

USBブラスターをCyclone2基板に接続し、
Cyclone2

開発中のMITOUJTAGを起動して、ケーブルにUSBブラスターを選択。
Usbblaster1

問題なくデバイスの自動認識と、バウンダリスキャンができました。
Usbblaster2

スキャン速度は毎秒50回程度です。
ちょっと遅めですが、デバイスの動作確認ならば許せる範囲でしょう。

それから、Cyclone2デバイスへのプログラミングもできました。
EP2C8の場合で、だいたい10秒くらいでした。
Lチカが光ったときのうれしさはたまりませんね。

あと、TerasicのMAX2 Micro Kitでも試してみたところ、そちらでも上手くいきました。
ただしMAX2 2210への書き込みはちょっと時間がかかるようで数分かかりました。
まだまだ改良の余地がありそうですね。

| | コメント (0)

2011.07.12

MITOUJTAGをUSB Blasterに対応させようと思います

決心しました。MITOUJTAGをUSB Blasterに対応させようと思います。

なぜかというと、最近のALTERAの評価ボードは、オンボードのUSB Blasterが乗っていて、外部のJTAGケーブルをつなぐことができないからです。

そこで、今日の朝からUSB Blasterのことをいろいろ調べて、MITOUJTAGからUSB Blasterを操作するためのドライバを作っています。

で、ようやく、デバイスの認識とバウンダリスキャンができるようになりました。
Usbblaster1

これは、MAX2 Micro Kit(MMK)のうえに乗っているMAX2の2210をスキャンして、EXTESTモードで端子をいじっているときの画面です。

Usbblaster2

このように、MMKのLEDを、MITOUJTAGの画面上からポチポチ操作できるようになりました。もちろん、スイッチの状態も読めています。

まだとても速度が遅いので、実用的には使い物にはなりません。
MAX2210で、1回のスキャンにだいたい0.8秒くらいかかります。

これはUSB Blasterを低速なGPIOモード(※勝手に命名)で動かしているからです。
高速なバイトモード(※勝手に命名)にすれば、100倍くらい速くなると思います。

高速なモードを有効にして、デバイスの書き込みができたりするようになるまでには、あと1日くらいかかりそうです。

| | コメント (1)

2011.07.08

RX-MEGA基板に間違いが・・とほほ

来週の月曜日ごろには発売を開始しようとしていたInterface誌付録基板用の拡張基板(RX-MEGA基板?豪華基板?)ですが、設計ミスがあったため、発売を延期します。

Rxmega

どんなミスかというと、Arduino用のコネクタが左右逆でした!!
この基板にArduinoのシールドを挿すと、電源が逆接されて壊れます。

とほほ・・

ということで基板の設計をやりなおして、昨日の木曜日の夕方に再度基板屋さんに出図しました。
出来上がりは来週木曜の予定。

でも、転んではただで起きません。せっかく基板を作り直すのですから、最初の設計で思い当たった点をいろいろ修正しました。

例えば、Arduinoコネクタや、50pinの拡張コネクタにシルクで説明を入れました。
Rxmega2top

Rxmega2bot

これで、ぐっと使いやすくなったはずです。
ほかにもネジ穴をGNDにしたり、軽微な配線の間違いを直したりと、いろいろ直すべきところを直しました。
また、次の基板ではレジストの色を紫色にしました。どんな仕上がりになるのかちょっと楽しみ。

予定としては、だいたい10日ほど遅れます。
今月の21日ごろには発売開始できればと思います。
といってもソフトのほうも遅れていたので、ちょうど良かったといえるかもしれません。

MARYのGPSもつないで動いたし、AD変換器も全チャネル試しました。DAもSDカードも大丈夫なようでした。USBホストも動きました。

もうこれ以上の間違いがないことを祈ります。
今月の21日ごろには発売開始できるよう頑張っています。

それから、「Arduinoは使わないので、問題のある基板でもいいから欲しい」という方がいらっしゃいましたらメールでご連絡ください。貴重な地球の資源で作ったものを捨てるのは勿体無いので、問題があることをご承知でご利用いただけるのであれば、安くお譲りしようかと思います。

Rxmegaboardonly

| | コメント (1)

2011.07.06

セミナー原稿の準備

明後日のセミナー原稿の準備で大忙しです。
DMAの実験結果をまとめたり、いままでの図表をまとめたり・・
Seminar_2
(※上の図をクリックしても大きくなりません。詳しくは会場で!)

去年のセミナーとくらべるとかなり分量の内容も増えています。
現在100ページ越えなので、80分で収まるように圧縮しています。
今日中にはできないかもしれません・・担当者さん、ごめんなさい!!

タイトルは「FPGAベースのPCIeシステムの設計・デバッグ実例」で、
●FPGAでPCI Expressを実現する4つの方法
●5分で分かるPCI Expressプロトコル概略
●汎用PCI Expressデバイス・ドライバ
●トランシーバ内蔵FPGA「Spartan-6 LXT」の実力
●DDR2メモリとDMAを使った高速データ転送装置を作るには
●PCI Expresコアの性能を決めるものは何か
●FPGAベースPCIeのデバッグ・ノウハウと事例
●まとめ

かなり充実した内容です。
特に、今年はSpartan-6LXTの内蔵EndPointの使い方と、調査した実力について詳しく説明するつもりです。
FPGAでPCI Expressを実現することにご興味をお持ちの皆様! ぜひ、ご来場ください。

| | コメント (0)

2011.07.05

PCI Expressセミナーのお知らせ

今週、7月8日(金)、秋葉原UDXカンファレンスにて
「高速インタフェース&インターコネクト・デザイン・ワークショップ2011」が開かれます。

今年も講演させていただきます。

題して
PCI ExpressをFPGA上で動かすための設計とデバッグ手法
――FPGAエンジニアが本当に知りたかった七つのポイント

Tst

このセミナーではFPGAユーザが本当に知りたかった
「PCI ExpressをFPGAで動かすにはどうしたらよいか」
という疑問にお答えします。

PCI Expressのしくみから、FPGAで実装する方法はもちろん、
Spartan-6LXTの内蔵PCI Express EndPointを利用する方法など、
有料のセミナーだからこそ話せる、本当の話をいたします。

今年は、昨年の内容に加えて、
 ・超高速オシロで見る、Spartan-6LXTのPCI Expressの実測波形
 ・DMAの高速化のための方法
 ・バグ発見の具体的事例
といった話題を追加してお話していきたいと思います。

■セミナー開催概要
名称 : 高速インターフェース インターコネクト・デザイン・
ワークショップ2011
会期 : 2011年 7月8日 [金]
開催時間: 9:30~18:00 (展示エリア10:00~17:30)
会場 : 東京・秋葉原UDXカンファレンス
[秋葉原駅前 秋葉原UDX南ウィング6F]
※有料のセミナーとなります

詳細はこちら
http://it.cqpub.co.jp/tse/201107IF/

今までPCI Expressのセミナーは古今東西数多く行なわれてきましたが、そういったセミナに参加してみたけれども、IPコアの宣伝や基板設計の話、インタフェース・チップの紹介だけ聞かされて満足できなかったという方もいらっしゃるのでしゃないでしょうか? または、CoreGenを言われるがままにポチポチ設定して「はい動きましたね」で終わるようなセミナもあったのではなかったでしょうか?
このセミナは違います。

IPコアの開発者が、PCI Express機器を自作する方法を解説するものです。
コア内部で動いている波形をお見せし、PCI Expressの何たるかを解説します。
特に、ArriaGXやSpartan-6といった比較的新しいFPGAでPCI Expressを動かすための方法についても解説します。

セミナーのお申し込みはこちらのページから行なえます。
なお、このセミナーは無料ではございません。
だから、無料セミナーでは決して喋れないようなディープな情報を提供します。
有料のセミナーだからこそ、「CoreGenの設定やベンダの宣伝だけじゃない実のある内容」をお伝えできるのです。

セミナー開催まであと3日ほどです。
多くの皆様のご参加をお待ちしております。

※ささやかながら講演者用ミニ展示スペースも用意してもらえる
ようなので、会場で見かけたら、ぜひ声をおかけください。

| | コメント (0)

MicroBlazeのAXI4でシステムの基礎となるデザイン

MicroBlazeで、組み込みシステムの基礎となるデザインができました。

特電Spartan-6ボードにイーサネットPHYをつないで、組み込みシステムのデザインのベースとなるものがあります。イーサ、DDR2、UARTがあるので、組み込みLinuxの基礎となりそうなデザインです。

Sp6mb

この基板自体はうちの元バイト君が残していったもので、裏面はちょっと見せられません。パスコンがパスコンの役割をなしていなかったりとかいろいろあるのですが、一応、動いてはいるようです。そんで、中身のFPGAのデザインを今作っています。

EDKの画面はこんな感じです。
Sp6axi4_1

内部バスはAXI4のインターフェースで出来ていて、DDR2、イーサネット、タイマ、UART、キャッシュ、GPIOが乗っています。イーサネットはRMIIのインタフェースでPHYと接続しています。

ここまで動かすのにいろいろ苦労しました。

まず、ethernetliteというIPコアを組み込んだのですが、使っているPHYチップはRMIIなので、MIIからRMIIへ変換してやらねればなりません。幸いEDKにはmii_to_rmiiというIPコアがあってこれを使えばいいのですが、EDKの中で配線をしても、Generate Netlistのエラーが出てうまくいきませんでした。
そこで、いったんEDKの外へ出して、メインのVHDLデザインの中でMIIの信号を折り返してmii_to_rmiiにつなぐようにしたら合成できるようになりました。(エラーメッセージが変なのでISE13.1のEDKのバグかもしれません)

Sp6axi4_5

EthernetLiteペリフェラルテストもPASSしています。
Sp6axi4_4

しかし、今度はそのようにして作ったデザインでDDR2メモリをテストすると、FAILしてしまいました。以前に、MicroBlaze+DDR2メモリだけで作ったデザインではうまく動いていたのですが、どうしてもこのデザインでは上手く動きません。
そこで、同じ内容で新しくデザインを作り直したら、DDR2メモリのテストも通るようになりました。

MHSファイルに差異はないので不思議ですね。

このボードのDDR2メモリは64MBytesのサイズがあるので、64MBytesまではPASSしています。
Sp6axi4_2

MITOUJTAGを使ったら、DDR2メモリのテスト中にメモリに読み書きが行われているのが見えました。
Sp6axi4_3

DDR2メモリはたぶん300MHz(600MHz)で動いています。
それにしてもMicroBlazeの熱いこと熱いこと。省エネではないですね。

いずれはMicroBlazeで組み込みLinuxを動かしたいと思っています。
しかし、EDKは何をやるにもツールが重すぎます。ちょっとハードウェアデザインを変更しただけで、ネットリストの生成や配置配線で20分くらいかかります。この重さのせいで大変多くの時間をロスした気がします。

Spartan-6のAXI4デザインのプロジェクトを固めて下に置いておきます。
ダウンロードはこちらから
このデザインが、EDKで何かを作ろうとされている皆様の参考になれば幸いです。
※ダウンロードの際にシリアル番号を聞かれたら、特電Spartan-6ボードや、EXPARTAN-6Tのシリアル番号を入力してください。

だから、Simple MicroBlazeにも興味を持っています。Simple Micro BlazeならEDK不要でWebPACKでも使えますし。Simple MicroBlazeでArduinoのシールドやMARYの拡張基板が動かせたらいいな・・なんてことを考えています。

| | コメント (0)

2011.07.01

RX62N拡張基板の動作確認

その後、Interface誌付録RX62Nボード用の拡張基板の動作確認を行いました。

まず、USB-JTAGです。これが動かないことには何もはじまらない。

しかしどうも調子が悪い。
その理由は、Interface基板の裏面のJP5にありました。
J5

JP5をショートすることによって、EMLE(エミュレータイネーブル)信号がプルアップされ、USB-JTAGが動くようになります。また、JP7をカットすることによってバウンダリスキャンが可能になります。

Rxmega_5

SDRAMはちょっと苦労しましたが動きました。今回のSDRAMは16bit幅なのですが、LONGサイズでアクセスするときに上下の16bitで同じデータが読み出されてしまうことがあります。SDAMOD.BEという制御レジスタを0にすると連続アクセスが無効になって、LONGサイズで読み出しても正しいデータが読み出されるのですが、動作速度が半分になります。そもそもこの連続アクセスというのがよくわからないのです。EXDMACのときだけ有効とも読めますし。

Rxmega_9

SDRAMに連続アクセスを使って良いのかどうかわかりませんが、仮に使えないとしても、メモリのバス幅が16bitなので、32bitの場合の半分の速度しか出ないのは諦めがつきます。


それから、オンボードのSPI ROMも動くようになりました。
Rxmega_7

イーサのPHYには、MicrelのKSZ8041TLというチップを使っています。QFPパッケージで、裏面の露出パッドもないため、自宅で試作の実装ができるためです。はじめて使うチップですが、マネージメントインタフェースのアドレスを00001に変更するだけであっさりと動きました。

これでイーサネットも動くようになって、例のWebサーバも動きました。
Rxmega_8

あとはSD/MMCカードのアクセスと、Arduino、Maryへのアクセス、USBホスト、オーディオ関係のテストが残っています。

◆追記◆

MARYのOLED拡張ボードに絵が出ました。
Rxmega_10

| | コメント (10)

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