前記事では、avr-gcc で生成したコードを実際に動かしてみたが、Tiny40 のコードは問題があるので、新しいベータ版がでるのを待つことにして命令のテストは先延ばしにした。
その間に、デバイスのデバッグをしたり、新しいデバイスを作ろうと思う。
タイマと割り込みコントローラ

最初に、プレスケーラの制御。TSM と PSR の設定 でプレスケーラをリセットする。10 を書くと TSM = 0/PSR = 1 でただちにリセットしてカウント開始。30 を書くと TSM = 1/PSR = 1 で、リセットのみ行う。
次に CS を 1 に設定して、プレスケーラなしで TCNT0 のカウント開始 。

これは、CS を 1 に設定して、1/8 プレスケーラを使ったとき。

これは、いろいろ設定して、FB で COMPB / FD で COMPA / FF で OVF が成立するようにしたもの。
内部リクエストは、FB と同時に出ているが、割り込みコントローラが受け付けるのは、1クロック後になった。 S1 で受け付けるのは、さらに 1 クロック(以上)後。

これが、3 つの割り込みが重なったときの挙動。COMPB(0B) は受け付けられるが、その間に COMPA(0A) と OVF(09) が起きる。OVF の方が優先度が高いので、次に受け付けられるのは、OVF 。最後に COMPA が受け付けられる。
以上、基本動作は大分できてきた。バグはいろいろあったが、もともと形式を整えただけで動くことを期待して作っていなかったので、全部省略。
SPI と インターフェイス変更
次は、SPI を作ることにした。USART の方が複雑なので、おなじシリアル系の SPI で練習してから挑む。
- rtavr-wk07.tar.gz
整理してみた。
//
// i_sck : ( SCK_IN ^ CPOL ) & ~SS_IN
// ___ ___ ___ ___ ___ ___ ___ ___
// _______| |___| |___| |___| |___| |___| |___| |___| |____
//
// CPHA=0 IN SFT IN SFT IN SFT IN SFT IN SFT IN SFT IN SFT IN SFT
// CPHA=1 SFT IN SFT IN SFT IN SFT IN SFT IN SFT IN SFT IN SFT IN
//
//
// SFT : +-----------------+
// | | DORD == 0 : ROL , 1 : ROR
// +-- C -- SPDR --+
//
// IN CPHA == 0 : C
// CPHA == 1 & DORD == 0 : SPDR[0]
// CPHA == 1 & DORD == 1 : SPDR[7]
//
// OUT CPHA == 0 & DORD == 0 : SPDR[7]
// CPHA == 0 & DORD == 1 : SPDR[0]
//
どうもこんな感じらしい。終了を検出するには、0 - 15 の 4 bit カウンタが都合が良い。
で、SPI を作ろうとして、ハタと困ってしまった。SPI は PORT と独立には作れない。PORT のサポートがないと機能として成立しない。で、PORT へのアサインの機能を作ろうとしたときに 今のインターフェイスでは、却って面倒なことになることが分かった。
というわけで、PORT から PIN/DDR/PORT を全部引き出して、上位レイヤの IOR で アサインすることにした。
アサインの方法は、A/B/C を全部並べて 24bit の PIN/DDR/PORT にして、generate でマッピング。

それらしい動作をさせることは出来た。いろいろ設定して、0xA5 を出力させているのだが、MSB からビット列が出力されている。転送終了で SPIF が 1 になって割り込みも発生できている。
実はうまく動くのは、これだけ。問題のひとつに、入力がうまくいっていないことがある。どうも tri-state の扱いについて基本的なことで間違えているようだ。まぁ、これはおいおいやる。

これは、2X を 0 にしたときの挙動。クロックのところがダメ。というより状態管理がダメ。
SPI にはいろいろな機能がある。マスタにして SS を入力にした場合は、SS が L になると割り込みが発生するとか。あと SPIF をプログラムでクリアするには、SPSR を read してから SPDR を read または write するとか。
これらも含めた状態管理がなんだか難しい。ちょっと甘かった。
設計しなおさないと いけなさそうだが、一旦スナップショット。
07A

- rtavr-wk07a.tar.gz

CPHA も それらしく。ただ、78 スライスも使っている。論理がごちゃごちゃしているのが敗因? もういちど見直してみよう。
実際に使う場合、マスターだけしか使わないと思うし、CPHA や CPOL も動的には変更しない。定数値を使えるようにすることで、規模は小さくなるはず。どれぐらい規模が違うのか調べてみることにする。
整理して 書きなおしたらうまくいった。
マスターでの SCK 周りはちょっと工夫した。出力する SCK と 内部処理でつかう SCK は、マスターでは別扱い。そうしないと 1 クロック 遅れてしまう。
07B
- rtavr-wk07b.tar.gz
// NORMAL (1) (2) (3) (4) (5) (6) (7)
// Number of Slice Flip Flops: 37 34 33 32 30 23 22 21
// Number of 4 input LUTs: 105 98 75 65 58 48 45 47
// Number of occupied Slices: 73 67 54 45 39 31 30 31
// Total Number of 4 input LUTs: 111 104 81 65 58 48 45 47
// Number of bonded IOBs : 38 37 35 35 35 35 35 35
// IOB Flip Flops : -
// Number of BUFGMUXs : 1
// Number of RAMB16BWEs : -
//
// (1) NO_WCOL , NO_PSV_SS
// (2) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1
// (3) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1, DORD=0
// (4) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1, DORD=0, CPOL=0, CPHA=0
// (5) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1, DORD=0, CPOL=0, CPHA=0, SPR=2
// (6) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1, DORD=0, CPOL=0, CPHA=0, SPR=1
// (7) NO_WCOL , NO_PSV_SS, FIXED_MSTR=1, DORD=0, CPOL=0, CPHA=0, SPR=0
整理しなおした。
オプションとして、規模を比較。FULL 機能は 73 スライスになった。多分使うのは、(4)あたり。39 スライスなら、まぁいいか。
細いバグはあるかも知れないが、だいたいこんな感じで良いだろう。次は USART か。
USART の作り方は、SPI でやった方法を踏襲しようと思う。できるだけフル機能で作って、定数も使えるようにする。定数を使えば Warning は出るが、最適化されて規模が小さくなる。特によく使う 8N1 のケースで無駄が多くならないようにする。また、USART にはいろいろな機能がありチップによって違う機能もあるが、Tiny2313 に準拠した上で、9bit の機能とかは後回しにする。SPIマスタ も後回しにするかも。
また、シフト動作などについても SPI のやりかたをベースにする。XCK は入力にもできるから 内部クロック生成と TX/RX 動作は ほぼ独立でないといけない。
それに、SPI 動作も配慮しないといけないから、結局 SPI のロジックを含んでいないと。
07C
- rtavr-wk07c.tar.gz
まったく動くものではないが、スナップショットを取っておく。IOR に組み込めて、シミュレーションの準備が出来たというだけだが、結構苦労する。
これを元にして、書き換えていくわけだ。いまのところ、8N1 だけで作って、だんだん拡張していく方針 -- ではあるが、それだけでも なかなか手強い。USART は少しばかり手間取りそう。
ところで、GPR の 通常クロック版も作りたいとは思っている。... のだがこれも難しい。16 bit 化してもポート数が増えるわけではないのだった。Rd/Rr の Read と (Rd の書き戻し or インデックスレジスタ更新: PREDEC/POSTINC) の合計 3 ポート必要だが、2 ポートしかない。
... というわけで 分散 RAM を使っての 16bit 化はあきらめ。分散 RAM にマッピングできないのを承知の上で 書いてみるつもり。
07D

- rtavr-wk07d.tar.gz
だいぶ形になってきた。送信は、0xa5 と 0x5a を 連続で UDR に書いたケース。1 つが終われば UDRE が 1 になって 2 つ終わって TXC が 1 になっている。
受信は、PORT を介さず内部で ループバック。実はまだダメなのだが、このケースでは読めている。
対応するフォーマットは以下のものだけにした。
// SUPPORTED FORMAT :
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | 1 | 7N1
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | 1 | 1 | 7N2
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | P | 1 | 7P1
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 1 | 8N1
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | P | 1 | 1 | 7P2
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 1 | 1 | 8P2
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | P | 1 | 8P1
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | 1 | 9N1
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | P | 1 | 1 | 8P2
// | 0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | 1 | 1 | 9N2
要するに スタートビットを除いたビット数が、8/9/10/11 のものだけ。ビット数も 7/8/9 のみ。9bit もサポートするが、パリティの代わりにソフトで値を决められるのみで機能が制限される。
こういうふうにして、カウンタの制御が楽になるようにした。書き方も定数を使うと規模が小さくなるようにしたつもり。
SPIマスタ機能サポートも検討中。もともとベースが SPI だけにたぶん大丈夫だろう。あとは、PORT がちゃんと入出力できれば ... 全体ができあがる。そうしたら version 番号を付けようと思う。
FPGA 基板が (香港ポストから)発送された。ぼちぼち rtavr の方も区切りを付けて、電子工作とツール整備に移りたい。
07E

- rtavr-wk07e.tar.gz
受信も出来た( つもり )。あまり代わり映えしないように見えるが、クロックの同期が入っている。パリティーなども対応した。
これも代わり映えしないのだが、右は同期モード。まったく同じように見えるわけで OK 。
さらに、規模縮小の為の定数化サポート。
// (FULL) (1) (2) (3)
// Number of Slice Flip Flops: 114 95 87 83
// Number of 4 input LUTs: 177 112 105 98
// Number of occupied Slices: 138 104 98 92
// Total Number of 4 input LUTs: 188 123 112 109
// Number of bonded IOBs : 37 35 35 35
// IOB Flip Flops : 1 1 1 1
// Number of BUFGMUXs : 1
// Number of RAMB16BWEs : -
//
// (1) 8N1 with UBRR (U2X=1)
// (2) 8N1 with UBRR_BITS(8)
// (3) 8N1 with FIXED_UBRR(107) (U2X=1)
規模はこんな感じになっている。(1) は、UBRR 以外を全部定数化したケース。これでだいぶ小さくなるが、UBRR は 12bit もあり、対応するカウンタの r_ps と合わせて 24 bit になる。
これに対しての対策 として まず bit 数を指定できるようにした。8bit までしか使わなければ、少々減る。それとは別の対策として 定数化もある。
まだつくっていないものとして SPI モードが残っている。 SPI と同じだけの機能があるから、規模が随分増えそう。ホストとの通信に USART 使うから SPI は絶対に使わないと思うので、基本的な機能だけで済ますつもり。
そういえば、TWI も作りたいのだった。ソフトで済ませられればそれでも良いかとは思うのだが、後々通信させたいので、マスター・スレーブ両方必要。作ってしまった方が楽なような気がする。
調べてみたら、tiny40 の TWI は、mega88 などの TWI とはまた違って スレーブのみの機能だった。ちなみに mega88 の TWI と mega8 の TWI ではまた違う。mega88 の方はいろいろ拡張されている。
いっそのこと USI ベースで簡易版にしようかとも思ったが、tiny40 の TWI が スレーブのみになったのは理由があるはずで、たぶん最適解なのだろうと思うと互換にしておいたほうが無難なような気がする。
あと、全体で変更したのは、割り込みの リセットライン。RX と UDRE は リセットラインは使わないのでは、パラメータから外した。
FPGA 基板は 成田に到着。中途半端に中断したくないので、しばらくは眺めるだけになるかも。
ついでなので今の規模。
789 rtavr.v
89 rtavr_defs.v
250 rtavr_gpr_16.v
639 rtavr_ior.v
100 rtavr_ior_port.v
344 rtavr_ior_spi.v
209 rtavr_ior_timer0.v
602 rtavr_ior_usart.v
110 rtavr_rom.v
216 rtavr_s0_fetch.v
604 rtavr_s1_decode.v
88 rtavr_sram_2KB.v
4040 total
ここから rtavr_defs.v , rtavr_ior_spi.v , rtavr_ior_usart.v を抜くと 3005 行。ifdef を多用するようになったから、その分も大きい。まぁそれにしても ... 随分と頑張ったものだ。
さて、双方向I/O をそろそろなんとかしないと。
ISE で top mododule でないからナントカカントカ言われてたので、薄々は気が付いていたのだが、やはりまずそうなので、rtavr_ior より一段 上の rtavr に持っていくことにした。
generate
genvar i;
for (i=0; i<8; i=i+1)
begin : port_a_out
assign PIN[i] = (PORTA[i] == 0) ? 0:1;
assign PORTA[i] = DDR[i] ? PORT[i]
: (~DDR[i] & PORT[i]) ? "H"
: "Z";
end
今はこういう風にしている。新しく "H" を覚えたので使ってみたが、実際にインプリメントしても これに関して Warning は出ていない。-- ひょっとしてこれでいけるのだろうか?
ただ、rtavr が トップモジュールのときはこれで良いのだろうが、組み込むと同じ問題になってしまう。なにか一般的な定義を見つけるか、サブモジュールのときは、PIN/PORT/DDR をさらに上位に持っていくか。... 上位にもっていくと tiny10 系の ポート機能を付けてみるときにややこしいことになる。かと言って Xilinx のプリミティブにすると シミュレータにかけられなくなるし。
また、USART の受信側。テストベンチでのループバックが出来るようになったのだが、クロック同期がちょっと変になった。それに、PORT の出力を PIN で読むことが出来ていないような.. (これは、XCK_IN と SS_IN で使っている)
もう少し検討が必要だ。
変になったのは、RXEN を 1 にする前に受信処理をしていたというバグだった。PORT の出力を PIN で読めないというのは単につないでなかったため。テストベンチ側でつながないといけないのを忘れていた。
PIN/PORT/DDR をさらに上位に持っていくかどうかは、RTAVR_PORT_ESCALATION / IOR_PORT_ESCALATION という define で切り分けることにした。 IOR_PORT_ESCALATION を undef すると IOR で tri-state の処理をするのだが、ISE では、どちらにしても 規模が同じで Warning も 同じになった。だが、Icarus Verilog ではどうも具合が悪い。
あと、generate するところをできるだけ共通化したくて function 使ってみたが、ISE では 同じものが出来るようだが、Icarus Verilog ではやはり具合が悪いので元に戻してしまった。
あと、現状のフルオプションで Implement してみた。
Number of Slice Flip Flops 452 3,584 12%
Number of 4 input LUTs 1,236 3,584 34%
Number of occupied Slices 797 1,792 44%
Total Number of 4 input LUTs 1,289 3,584 35%
Number used as logic 1,220
Number used as a route-thru 53
Number used for Dual Port RAMs 16
Number of bonded IOBs 10 195 5%
Number of BUFGMUXs 2 24 8%
Number of RAMB16BWEs 3 16 18%
フルオプションでは、50A には入らない。が、機能を削る指定をすればなんとか入りそう。
あと、これをするにあたり 、いくつかバグが見つかったので直している。
... 思い出した。入出力がなんとかなったら PWM も作りたかったのだった。あと、16bit タイマーも本当は欲しい。WDT や SLEEP もデコードだけして放置していた。WDT を入れるのなら 未定義命令での RESET も入れたいところ。SLEEP 入れるなら 消費電流の低減になるように配慮したいし、今やらないとしても ToDo リストに入れておかないと忘れてしまいそう。
07F
- rtavr-wk07f.tar.gz
機能を削る指定をしてみたのだが... 厳しい。704 スライス以下にしないといけないのだが、32biit LDS/STS を削っても 712 まで。これ以上削るのはちょっと困る。... で、タイマー機能の定数化をやっていないのに気がついた。1/1024 のプレスケーラとか OC0A/0C0B があるので、定数化でだいぶ稼げる。プレスケーラを指定する CS0 は、0 が設定できないといけないので少々工夫したが、... 1/8 のみを使い OC0A/0C0B を定数化すると 662 スライスにまでになった。1/64 を使い OC0A だけの 定数化 でも 683 スライス。これにLDS/STS を復活させて 697 。.. これなら 今後バグを修正しても(ちょっとだけ)余裕がある。
697 スライスになったときの設定と 結果。ちなみに、USART の SPI マスタ 機能を 1 パターンだけ実装できた。定数化すると 最適化で全部消えるから以下の結果には関係ない。
// CORE definition
`define SUPPORT_LDST32
// TIM0 configuration
//`define TIM0_EXPORT_PS // using when other timer is used
`define FIXED_CS0 3 // 0 : stopped 1: 1/1 2: 1/8 ..
`define FIXED_WGM0 0 //
`define FIXED_COM0B 0 //
`define FIXED_COM0A 0 //
//`define FIXED_OCR0B 127 //
`define FIXED_OCR0A 128 //
// USART configuration
//`define USART_LOCAL_LB
`define FIXED_MPCM 0 // 0:
`define FIXED_U2X 1 // prescaler option
`define FIXED_UMSEL 0 // 0: async 1:sync 3: spi master
`define FIXED_UPM 0 // parity 0: none 2: even 3: odd
`define FIXED_USBS 0 // stop-bit 0: st1 1: st2
`define FIXED_UCSZ 3 // 2: 7bit 3: 8bit 7: 9bit
`define FIXED_UDORD 0 // 0: LSB first 1: MSB first (only in spi)
`define FIXED_UCPHA 0 // clock phase 0: IN-SFT 1: SFT-IN (only in spi)
`define FIXED_UCPOL 0 // clock polarity 0: normal 1: reversed
//`define FIXED_UBRR 107 // boud parameter (12bit)
`define UBRR_BITS 8 // boud parameter (2 - 16)
// SPI configuration
//`define SPI_HAVE_WCOL
//`define SPI_HAVE_PSV_SS
`define FIXED_MSTR 1 // 1: Master 0: Slave
`define FIXED_DORD 0 // 0: MSB first 1: LSB first
`define FIXED_CPOL 0 // 0: Noraml SCK , 1: Reversed SCK
`define FIXED_CPHA 0 // 0:IN_ SFT order , 1: SFT_IN order
//`define FIXED_SPR 0 // 0: 1/2 CLK , 1: 1/4 CLK 2: 1/8 CLK
// 3: 1/16 CLK , 4: 1/32 CLK 5,6: 1/64 CLK
// 7: 1/128 CLK
結果
Number of Slice Flip Flops 394
Number of 4 input LUTs 1107
Number of occupied Slices 697
Total Number of 4 input LUTs 1151
そういえば割り込み番号が不連続なために 少し規模が大きくなっているようだ。IOレジスタのマッピングにしてもそう。rtavr で tiny40 用の avr-libc を少しでも流用しようとしたからこうなっているわけだ。
だが、周辺装置の互換性も高くはないし、意味がないような気がしてきた。新たに定義しなおして効率を取ったほうが得策だろう。IOレジスタの空間も空くし新しいデバイスを付けやすくなるというメリットもある。ちょっと考えてみよう。
さらに、思い出したのでメモ。tiny40 には、IOレジスタ経由で RAM にアクセスできる変な機能がある。何のためについているのか理解できなかったのだが、IOレジスタだから SBI/CBI ができて便利なのかも。あと rtavr は、インデックスレジスタはあっても 変位付きの命令がない。メモリアクセスは結構不便なようだ。C のコードを見ているとLDI x 2 でアドレスをロードして、ようやくメモリにアクセスできる。LDI + OUT で アドレスを設定してもコストは同じで レジスタの消費が少ないというメリットがある。LPM みたいなマクロになるだろうが、ないよりはマシかも。
幸いなことに RAM はデュアルポートで片側が空いている。この機能を作ってみるのも良いかも知れない。
07G
- rtavr-wk07g.tar.gz
そろそろ別記事にしようかと思ったのだが、もう少し続けることにした。
今回は、avr-gcc を少しいじって考えることがあった。
avr-libc で rtavr40 に対応したが、FPGAだから 割と自由に機能のアサインができる。
定義を作っておいて、avr-libc を使うときも 反映できると良さそうな気がしてきた。
具体的に書くと、rtavr_defs.v という定義から、rtavr_defs.h を自動生成して、それを使うと 正しい アサインになるようにする。
これにあたって、IOR へのアサイン方法を parameter から define に変更した。
定義可能なのは、- IOR への マッピング (各モジュールの BASE_ADDR)
- 各モジュール機能の PORT への割り当て
- 割り込みベクタ
なお、ヘッダファイルやツールは、soc/support に置いてある。
あと、割り込みコントローラでの優先順位の定義がバグっていた。番号の小さいものが優先度が高いようにしないといけない。
wire [4:0] v_int_vec = IOR_INT0 ? 1
`ifdef IOR_HAVE_TIM0
: IOR_TIM0_OVF ? 9
: IOR_TIM0_COMPA ? 10
: IOR_TIM0_COMPB ? 11
`endif
(後略)
もともと、こんな風になっているのだが、番号が全然間違っていた。
正しくは、COMPA が 11 , COMPB が 12, OVF が 13 。
これらの値は、define で rtavr_defs.v に持って行っているのだが、昇順に並べないと本当はいけない。 define にしたのは良いが 依存関係が出来てしまっている。
順番が前後しても優先度が変わるだけなので、あまり困ることはないかも知れないのだが、実は昇順にすると 規模が小さくなる。ここの部分は、ちょっと順番が違うだけで数スライス違う。変更する場合はよくよく考えた方が良いようだ。
上記のように正しく直すと 692 スライスまで減った。だが、COMPA/COMPB/OVF を 9/10/11 にしてみると 686 スライスまで減る。使っている 割り込みを 1-8 にきっちり詰めると ... 691 に増えたり。
あと、OC0A/OC0B を使えるようにしてみる。まだちゃんとした PWM の機能にはなっていないが、とりあえずは、COMPA/COMPB と OVF で ON/OFF を切り替えるぐらいは出来た。
これらの変更によっていままでのテストが動かなくなっている。全部直すのに手間がかかる。
ところで、インターフェイスに OP1_SEL/OP2_SEL/OP3_SEL という ALU の機能を選択する信号がある。それぞれ 3bit で 状態を持っているため 1 つにしてしまうと 規模が減るのでは?と思いやってみたところ ...
逆に 14 スライスも増えてしまった。見かけの FF を 6 つ減らしたのに 1 増える結果になっている。
この変更は、notyet/opx_sel.patch に置いた。
これらの信号線は独立した reg として記述してはあるが、実際は、どれか他の reg と 同じもので 最適化で 1 つになってたりするのだろう。それを 独立させてしまったので却って FF が増えたと思う。
規模を縮小するのは、なかなかに難しい。
書くのを忘れていた。IN/OUT での RAM アクセスを一応仕込んだ。(IOR_HAVE_RAMWIN) ただ、下位 256B しかアクセスできない。あと これを使う場合バス経由での RAM アドレッシングを IOR の 64B 分ずらしている。
どうせなら上位アドレスもどこかに置いて設定可能にしたい。上下の アドレスは空いてないから 3bit 分を どこかの隙間を見つけてマップするつもり。
ところで 64B ずらすのは不要だった。オリジナルも LD の アドレスと同じになるようにしている。
あと、ブロックRAMのデータファイル。拡張子はなんでも良いが、ISE ではデフォルトは、.mem 。
追加するときに all にしないといけないのが面倒なので .dat から .mem にすることにした。 - IOR への マッピング (各モジュールの BASE_ADDR)
(続く)
関連記事:
- AVR互換コアの仕様(メモ)
- AVR互換コアの仕様(その2)
- AVR互換コアの仕様(その3)
- AVR互換コア(その4)
- AVR互換コア(その5)
- AVR互換コア(その6 デバイス) この記事
- Tiny20/Tiny40
- AVR Toolchain
- AVR Toolchain (その2)
著作権について
ここで提示しているコードは正しく動作しないとはいえ、既に著作権は発生しています。
著作権は、すzが保持しており放棄はしていません。
教育目的および私用目的では、もともと著作権の範囲外なので自由につかえます。また、ライセンスとして、GPL を適用しています。GPL に従う範囲において 個別の許可なく使用することができます。許諾のための連絡も不要です。
なお、GPL なので、生成したバイナリを作り直せる範囲のソース開示が必要になります。FPGA だと 通常 チップ全体になってしまいます。また、開示したソースを GPL の範囲で再利用されることを妨げることはできなくなります。このコードを利用する場合この点に留意してください。
個別の許可を得れば、GPL 以外の条件での使用は可能です。が、作業中のものには許可は出さない予定です。作業が完了(もしくは中断)したとき、ライセンスは見直します。
なお、すでに公開してしまったものの、ライセンスを取り消すことはできないと考えていますが、ライセンスの追加は可能です。また、新しく公開するものについては、ライセンスしないことすら可能で、どのような制限もありません。変更する可能性がありますので、この点にも留意してください。