整数変数とvariableによる構造展開の例題として、もう一つ、乗算回路を示します。
これは、大きなビット数の乗算において、実用に使うには向かないですが、ビット数が少ない時には、十分使えますし、記述はシンプルな筆算形なので、分かりやすいと思います。
これは、大きなビット数の乗算において、実用に使うには向かないですが、ビット数が少ない時には、十分使えますし、記述はシンプルな筆算形なので、分かりやすいと思います。
#define N 8 #define M 4 // Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. declare multiply_%N%_%M% { input A[N], B[M]; output F[N+M]; func_in mult_do(A,B); } module multiply_%N%_%M% { integer i; variable pp[N+M], pa[N+M]; func mult_do { pa={M{0b0},A}; pp=0; generate(i=0;i<M;i++) pp = if(B[i]) pp+(pa << i) else pp;
NSLの構造展開のfor文を用いたバレルシフタの例。
整数変数やvariableは、出現順順次評価を行なうことに注意。
整数変数やvariableは、出現順順次評価を行なうことに注意。
// Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. #define N 8 #define M 4 declare shift_%N%_%M% { input A[N], B[M]; output F[N]; func_in shift_do(A,B); } module shift_%N%_%M% { integer i,sv; variable ps[N]; func shift_do { ps=A; sv=1; generate(i=0;i<M;i++) {
sv = sv << 1;
} F = ps; } }
除算をするのに、乗算器を使うというのもあんまりなんで、減算器を用いた、引き戻し法による除算回路を作ってみました。
マクロによるパラメタライズはあまりデバッグしていないので、異なるビット数だとバグがあるかもしれませんが、そのときはご容赦。
動作には、sfl2vlのベータ版(20091226版)で加えた修正が必要(かもしれない)。
マクロによるパラメタライズはあまりデバッグしていないので、異なるビット数だとバグがあるかもしれませんが、そのときはご容赦。
動作には、sfl2vlのベータ版(20091226版)で加えた修正が必要(かもしれない)。
// Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. #define N 8 #define M 4 declare divu_%N%_%M% { input A[N],B[M]; output Q[N],R[M]; func_in divu_do(A,B); func_out divu_done(Q,R); func_out divu_error; } module divu_%N%_%M% { reg QB[M], QQ[N+M]; wire sub_i1[N+1], sub_i2[N], minus; func_self sub(sub_i1,sub_i2); func sub { wire sub_o[N+1]; sub_o = {sub_i1} - {0b0,sub_i2}; minus=sub_o[N]; } func divu_do if(B==M'b0) divu_error(); else seq { reg bitcount[M]; for( {bitcount:=0; QB:=B; QQ:={M'b0,A};} ; bitcount <N ; bitcount++) {
} else { QQ := {(sub_o << 1)[N:N-M],(QQ[N-2:0]<<1)} |
(N+M)'b1; } } } divu_done(QQ[N-1:0],QQ[(N+M-1):N]); } }
バージョン番号を日付にしているけれど、一日に何度かアップデートすると、日付だけでは足りないですね。
と、それはともかく、ベータ版を200912226版にアップデートしました。
今回のアップデートは、Y君に指摘いただいた、レジスタ初期化の問題のほか、制御端子を用いて、評価式の中で結果を参照するときの問題を対策しました。
評価式の中で制御端子を起動した場合、場合によっては、処理系都合で、複数回の評価が発生します。その都度、制御端子の引数に対して、複数回数の代入が発生してしまい、そのことが原因で、競合検出回路によって、ハザードとなる件を対策しました。
なお、1箇所の制御端子が、処理系都合によって複数回評価される場合の対策なので、複数箇所で制御端子を起動している論理バグの回避策ではありません。
と、それはともかく、ベータ版を200912226版にアップデートしました。
今回のアップデートは、Y君に指摘いただいた、レジスタ初期化の問題のほか、制御端子を用いて、評価式の中で結果を参照するときの問題を対策しました。
評価式の中で制御端子を起動した場合、場合によっては、処理系都合で、複数回の評価が発生します。その都度、制御端子の引数に対して、複数回数の代入が発生してしまい、そのことが原因で、競合検出回路によって、ハザードとなる件を対策しました。
なお、1箇所の制御端子が、処理系都合によって複数回評価される場合の対策なので、複数箇所で制御端子を起動している論理バグの回避策ではありません。
メリークリスマス!
ということで、クリスマスバージョンのsfl2vlとともに、NSLによる除算回路のサンプルをお届けします。
Nは割られる数のビット数、Mは割る数のビット数を定義し、出力は、N-Mビットになります。
見れば見るほど平方根回路にそっくり、というか、平方根回路を少し変更しただけで作成しました。。この回路は乗算のコストが安いFPGA向けです。ASICで使う場合には、通常の引き戻し法か引き離し法などを使ってください。
ということで、クリスマスバージョンのsfl2vlとともに、NSLによる除算回路のサンプルをお届けします。
Nは割られる数のビット数、Mは割る数のビット数を定義し、出力は、N-Mビットになります。
見れば見るほど平方根回路にそっくり、というか、平方根回路を少し変更しただけで作成しました。。この回路は乗算のコストが安いFPGA向けです。ASICで使う場合には、通常の引き戻し法か引き離し法などを使ってください。
#define N 8 #define M 4 declare div_%N%_%M% { input A[N],B[M]; output F[N-M]; func_in div_do(A,B); func_out div_done(F); } module div_%N%_%M% { reg try[N-M]; wire mul_i1[N-M], mul_i2[M], mul_o[N]; func_self mul(mul_i1,mul_i2); func mul { mul_o = mul_i1*mul_i2; } func div_do seq { reg bitpos[N-M]; for( {bitpos:=1 << ((N-M)-1); try:=0; } ; bitpos != 0 ; bitpos := bitpos >> 1) { if(mul(try | bitpos,B).mul_o <= A) try := try | bitpos;
} div_done(try); } }
NSLで(整数の)平方根を求める回路を作成してみました。
なるべくシンプルにするための、サンプル回路なので、効率は悪いです。
ぎりぎりのタイミングに詰めたい場合には、for文ではなく、ifとgotoを使って、余分なステップが発生しないようにします。
やはり、性能が落ちるのは気持ち悪いので、20091223版で、対策しました。まだ、シミュレーションモードではハザードになるなど、若干不安定なので、引き続き、調整中。20091224版で、修正した(はず)。なお、このバージョンから、端子やレジスタへの代入の右辺に整数値を与えることができます。
コード整理のついでに、SFLでの、while構文は需要が少なそうなので、削除します。
この回路、結果が出るまでの時間が長いのと、Nの定義値によって時間が変わるので、結果をsqrt_doneのタイミングで出力します。
この回路の動作確認中、sfl2vlのバグがあったので、
対応するベータ版は、20091222版にアップしてあります。
これとほとんど同じ回路で割算も出来ます。
ぎりぎりのタイミングに詰めたい場合には、for文ではなく、ifとgotoを使って、余分なステップが発生しないようにします。
やはり、性能が落ちるのは気持ち悪いので、
コード整理のついでに、SFLでの、while構文は需要が少なそうなので、削除します。
この回路、結果が出るまでの時間が長いのと、Nの定義値によって時間が変わるので、結果をsqrt_doneのタイミングで出力します。
この回路の動作確認中、sfl2vlのバグがあったので、
対応するベータ版は、20091222版にアップしてあります。
これとほとんど同じ回路で割算も出来ます。
// Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. #define N 8 declare sqrt_%N% { input A[N]; output F[N/2]; func_in sqrt_do(A); func_out sqrt_done(F); } module sqrt_%N% { reg try[N/2]; wire mul_i[N/2], mul_o[N]; func_self mul(mul_i); func mul { mul_o = mul_i*mul_i; } func sqrt_do seq { reg bitpos[N/2]; for( {bitpos:=1 << ((N/2)-1); try:=0; };
bitpos != 0 ; bitpos := bitpos >> 1) { if(mul(try | bitpos).mul_o <= A) try := try | bitpos;
} sqrt_done(try); } }
最近、私のメールアドレスと名前を用いて、勝手にメーリングリストに登録したり、アダルトサイトに登録したりするイタズラが増えている。
アダルトサイトは、gmailがスパム扱いしてくれるので、実害がある訳ではないが、スパムフォルダに間違って登録されているメールがないかチェックする時に、自分のフルネームを使ったメールがアダルトサイトから来ているのを見ると、びっくりする。
不正アクセス禁止法の言う不正アクセスではないにせよ、多大な迷惑行為なので、いたずら者を、プロバイダから契約解除をさせるように、情報収集しておこうと思っている。
メールマガジンのサイトには迷惑行為を報告し、登録経緯の詳細を開示要求しておこう。
アダルトサイトは、gmailがスパム扱いしてくれるので、実害がある訳ではないが、スパムフォルダに間違って登録されているメールがないかチェックする時に、自分のフルネームを使ったメールがアダルトサイトから来ているのを見ると、びっくりする。
不正アクセス禁止法の言う不正アクセスではないにせよ、多大な迷惑行為なので、いたずら者を、プロバイダから契約解除をさせるように、情報収集しておこうと思っている。
メールマガジンのサイトには迷惑行為を報告し、登録経緯の詳細を開示要求しておこう。
IIJのモバイルサービスで購入すると割引があるということで、Emoble端末とクティオを購入した。

IIJからの説明では、PPPで接続するようなことが書かれていて、まずクティオのファームウェアをアップデートしろと紙が入っていた。
その上で、クティオのページを見ると、新ファームウェアでは、PPPがサポートされたとあるので、IIJはPPPで接続するのかと。。。
ところが、結果として、PPPではなく、IPを指定しないと、NO CARRIERで接続できなかった。
接続してしまえば、安定しているので、これはこれで、便利。
速度的にも問題はなさそうなので、家のADSLはもう不要かもしれない。
ただ、これまで、家では、NASを共有してマシン間のファイルの交換をしていたので、クティオと、家のLANとの接続方法をなんとかしないといけない。もちろん、有線・無線両用のルータを買えばよかったのだけれど、値段的には倍以上になるので。。(安物買いの・・か?)
もちろん、(無線接続先を切り替えればいいだけなので)手間をかけて、お金をかけずに使うこともできる。

IIJからの説明では、PPPで接続するようなことが書かれていて、まずクティオのファームウェアをアップデートしろと紙が入っていた。
その上で、クティオのページを見ると、新ファームウェアでは、PPPがサポートされたとあるので、IIJはPPPで接続するのかと。。。
ところが、結果として、PPPではなく、IPを指定しないと、NO CARRIERで接続できなかった。
接続してしまえば、安定しているので、これはこれで、便利。
速度的にも問題はなさそうなので、家のADSLはもう不要かもしれない。
ただ、これまで、家では、NASを共有してマシン間のファイルの交換をしていたので、クティオと、家のLANとの接続方法をなんとかしないといけない。もちろん、有線・無線両用のルータを買えばよかったのだけれど、値段的には倍以上になるので。。(安物買いの・・か?)
もちろん、(無線接続先を切り替えればいいだけなので)手間をかけて、お金をかけずに使うこともできる。
下記の新構文をサポートしたベータ版を作成しました。
20091219版(当面、WindowsGUI版のみ作成)
新構文の目的は、バレルシフタや乗算などの構造を展開できるライブラリの作成用途です。
例によって、あちこち大幅にコードを変更しているので、安定版になるまでは、
しばらくかかるかもしれませんが、評価をしないことには、進まないので、
積極的に使ってみてください。
1: 整数変数 integerとintegerで回すfor文を導入(これは、構造展開となり、同一クロックでの動作になります)
2: 一時端子 variableを導入
端子と異なり、同じ変数を使いまわすことが可能。ただし、代入のたびに新しくインスタンスを生成
3: 端子への代入において、文法上のあいまいさがない場合、右辺に整数を許可
4: 2項演算で、ビット数が確定できる場合、2項目に整数を許可
5: if文の条件式が整数式からなる場合、評価時の条件値による構造展開とした
使用例:
この例では、あまり有効活用していませんが。。。
20091219版(当面、WindowsGUI版のみ作成)
新構文の目的は、バレルシフタや乗算などの構造を展開できるライブラリの作成用途です。
例によって、あちこち大幅にコードを変更しているので、安定版になるまでは、
しばらくかかるかもしれませんが、評価をしないことには、進まないので、
積極的に使ってみてください。
1: 整数変数 integerとintegerで回すfor文を導入(これは、構造展開となり、同一クロックでの動作になります)
2: 一時端子 variableを導入
端子と異なり、同じ変数を使いまわすことが可能。ただし、代入のたびに新しくインスタンスを生成
3: 端子への代入において、文法上のあいまいさがない場合、右辺に整数を許可
4: 2項演算で、ビット数が確定できる場合、2項目に整数を許可
5: if文の条件式が整数式からなる場合、評価時の条件値による構造展開とした
使用例:
module x { integer i; variable v[8]; output f[8]; v=0; for(i=0;i<10;i++) v=v+i; f = v; }
この例では、あまり有効活用していませんが。。。
2件の言語仕様の拡張を実施(20091209版より)。
1:条件付き式
if(条件) 真の時の値 else 偽の時の値
例:
f=if(a>b) a else b;
2:リピート演算
リピート数 { 式 }
例:
f = 8{0b1};
これら二つの拡張は、マクロでライブラリを整備するときに活躍できるはず。
1:条件付き式
if(条件) 真の時の値 else 偽の時の値
例:
f=if(a>b) a else b;
2:リピート演算
リピート数 { 式 }
例:
f = 8{0b1};
これら二つの拡張は、マクロでライブラリを整備するときに活躍できるはず。
どうやら、一緒にアーカイブに入れているDLLが悪さをしているようだ。
iphlpapi.dllというマイクロソフトのDLLなのだけれど、こいつが、VISTA/7との互換性がないらしい。(VISTA/7には標準で機能が提供される)
ということで、これらのOSの時には、iphalapi.dllをパッケージから削除したインストールをしたいのだけれど、選択的なコピーというのは、インストールオプションにあったかな。。。?
LiveCygwinも /bin/iphlpapi.dl を削除してください。
7もVISTAも使っていないので、これで完全な対策になるか、今ひとつ確証はないですが、おそらく大丈夫じゃないかと。。。
iphlpapi.dllというマイクロソフトのDLLなのだけれど、こいつが、VISTA/7との互換性がないらしい。(VISTA/7には標準で機能が提供される)
ということで、これらのOSの時には、iphalapi.dllをパッケージから削除したインストールをしたいのだけれど、選択的なコピーというのは、インストールオプションにあったかな。。。?
LiveCygwinも /bin/iphlpapi.dl を削除してください。
7もVISTAも使っていないので、これで完全な対策になるか、今ひとつ確証はないですが、おそらく大丈夫じゃないかと。。。
秋月のモジュールが使えるという情報だけでは、作れない人がいそうなので、接続図を書いてみた。(回路図というほど大げさなものじゃないですね)
絵を描くのに、UNIX系のマシンでは、Tgifが使いやすいのだけれど、Windowsではなかなか使いやすいお絵描きソフトがない。(CygwinでTgif使ってもいいんだけれど。。)
ふと、MacOSXならTgifがコンパイルできるじゃないかと、試してみたらOK.
ただ、ALTキーが使えない?何か設定いるのかな。ショートカットの一部が使えないので不便だけれど、ソフトの使い勝手はこれがないと絵を描く気にならないほど便利。
追記: Xmodmapでメタキーの割当をすればよいというブログを見つけ、ALT問題は解決♪
絵を描くのに、UNIX系のマシンでは、Tgifが使いやすいのだけれど、Windowsではなかなか使いやすいお絵描きソフトがない。(CygwinでTgif使ってもいいんだけれど。。)
ふと、MacOSXならTgifがコンパイルできるじゃないかと、試してみたらOK.
ただ、ALTキーが使えない?何か設定いるのかな。ショートカットの一部が使えないので不便だけれど、ソフトの使い勝手はこれがないと絵を描く気にならないほど便利。
追記: Xmodmapでメタキーの割当をすればよいというブログを見つけ、ALT問題は解決♪
メモリとレジスタの値は、通常の式と同じようにビット幅を合わせて行なっていたが、宣言文での初期化では、ビット幅は推定可能なので、整数値を入れられるようにした。
mem hoge[256][8] = {0,1,2,3,4,5};
などという宣言が可能。
20091126版より。
mem hoge[256][8] = {0,1,2,3,4,5};
などという宣言が可能。
20091126版より。