DE0-Nanoテスト
SystemBuilderが生成したプロジェクトを手直ししてとりあえずの環境を整えた。
フォルダをRTL/IP/制約/プロジェクト本体に分けて、保存するようにし、Subversionでバージョン管理する。
Xilinxと比べてわかったのは、vivadoでは制約のXDCでピン配置まで管理するが、AlteraのQuartusでは制約のSDCはあくまでタイミング情報のみ保持し、ピン配置などはプロジェクト管理ファイルの.qsfで管理するということが違うようだ。
まあ、わかってしまえばどうということの無い差。
Psuh SWとDIP SWをLEDに直結するデザインから始めて、PLL IPを使ってクロックの逓倍を行い、適当な回路でLEDをチカチカさせるところまでできた。
乗っているデバイスがトランシーバーなしのEのためか、PLLは機能がそんなに無い単純なものだった。
Xilinxで作った非同期リセットからクロックごとの同期リセットを作るリセットブリッジ回路とかも移植した。
LEDをチカチカさせるのは、LFSRを使って行った。
LFSR部分のコードを以下に示す。
module LFSR_RANDOM8 ( input wire CLK , input wire SYNC_RST , input wire UPDATE , output wire [7:0] RANDOM ); //======================================================= // REG/WIRE declarations //======================================================= //Mersenne prime Linear Feedback Shift Register reg [ 12:0] LFSR_13 ; reg [ 16:0] LFSR_17 ; reg [ 18:0] LFSR_19 ; reg [ 30:0] LFSR_31 ; reg [ 60:0] LFSR_61 ; reg [ 88:0] LFSR_89 ; reg [106:0] LFSR_107 ; reg [126:0] LFSR_127 ; always @( posedge CLK ) begin if(SYNC_RST == 1'b1)begin LFSR_13 <= 1'b1; LFSR_17 <= 1'b1; LFSR_19 <= 1'b1; LFSR_31 <= 1'b1; LFSR_61 <= 1'b1; LFSR_89 <= 1'b1; LFSR_107 <= 1'b1; LFSR_127 <= 1'b1; end else begin if(UPDATE == 1'b1)begin //Shift LFSR_13 [ 12:1] <= LFSR_13 [ 11:0] ; LFSR_17 [ 16:1] <= LFSR_17 [ 15:0] ; LFSR_19 [ 18:1] <= LFSR_19 [ 17:0] ; LFSR_31 [ 30:1] <= LFSR_31 [ 29:0] ; LFSR_61 [ 60:1] <= LFSR_61 [ 59:0] ; LFSR_89 [ 88:1] <= LFSR_89 [ 87:0] ; LFSR_107 [106:1] <= LFSR_107 [105:0] ; LFSR_127 [126:1] <= LFSR_127 [125:0] ; //LSB Generation (from Xilinx xapp 052) LFSR_13 [ 0] <= LFSR_13[12] ^ LFSR_13[3] ^ LFSR_13[2] ^ LFSR_13[0] ; //13 13,4,3,1 LFSR_17 [ 0] <= LFSR_17[16] ^ LFSR_17[13] ; //17 17,14 LFSR_19 [ 0] <= LFSR_19[18] ^ LFSR_19[5] ^ LFSR_19[1] ^ LFSR_19[0] ; //19 19,6,2,1 LFSR_31 [ 0] <= LFSR_31[30] ^ LFSR_31[27] ; //31 31,28 LFSR_61 [ 0] <= LFSR_61[60] ^ LFSR_61[59] ^ LFSR_61[45] ^ LFSR_61[44] ; //61 61,60,46,45 LFSR_89 [ 0] <= LFSR_89[88] ^ LFSR_89[50] ; //89 89,51 LFSR_107 [ 0] <= LFSR_107[106] ^ LFSR_107[104] ^ LFSR_107[43] ^ LFSR_107[41] ; //107 107,105,44,42 LFSR_127 [ 0] <= LFSR_127[126] ^ LFSR_127[125] ; //127 127,126 end end end assign RANDOM[0] = LFSR_13 [ 0] ; assign RANDOM[1] = LFSR_17 [ 0] ; assign RANDOM[2] = LFSR_19 [ 0] ; assign RANDOM[3] = LFSR_31 [ 0] ; assign RANDOM[4] = LFSR_61 [ 0] ; assign RANDOM[5] = LFSR_89 [ 0] ; assign RANDOM[6] = LFSR_107 [ 0] ; assign RANDOM[7] = LFSR_127 [ 0] ; endmodule
LEDごとの周期がなるべく被らないようにしたい→周期が互いに素なら最大周期になる→LFSRの周期は長さをNとすると2^N-1→2^N-1の形で素数になるメルセンヌ素数にすればいいだろうという考え。
長さが決まったら、最大周期になるタップ位置はXilinxが公開しているアプリケーションノートに乗っているので、そこから拾い出す。
これを実装した状態でLEは22,320個中の515個を使用しており、まだまだ余裕。
組み合わせで513LE、レジスタで499LEと出ているので、現在はレジスタネックだと思われる。
とりあえず、リファレンスデザインのSDRAMコントローラやらI2Cなんかを移植するか…
PLLの条件を変えて何回か合成してみたが、Fmaxが270〜300MHz程度になるので、当分250MHzで開発する。