FC2カウンター FPGAの部屋 2007年06月16日
FC2ブログ

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

FPGAの部屋

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

VHDLにおけるifdefの代わり

何かVHDLの時にifdefを使いたいという要求があるみたいだが、私も if generate を使って代わりにしている。
これがサンプルコードだ。

    BRAM16I : if ISETUP_ADDR_WIDTH=13 generate -- 8Kbyteの場合
        BLKRAM16GEN : for i in 0 to 3 generate
            blkram16 : ramb16_s18 port map(
                di => int_reg_din(15+16*i downto 16*i),
                dip => gnd2,
                en => vcc,
                we => bram_we(1+2*i),
                ssr => gnd,
                clk => clk,
                addr => adr_node(12 downto 3),
                do => bram_dout(15+16*i downto 16*i)
            );
        end generate;
    end generate;
    
    BRAM8I : if ISETUP_ADDR_WIDTH=14 generate -- 16Kbyteの場合
        BLKRAM8GEN : for i in 0 to 7 generate
            blkram8 : ramb16_s9 port map(
                di => int_reg_din(7+8*i downto 8*i),
                dip => gnd1,
                en => vcc,
                we => bram_we(i),
                ssr => gnd,
                clk => clk,
                addr => adr_node(13 downto 3),
                do => bram_dout(7+8*i downto 8*i)
            );
        end generate;
    end generate;


constantで指定した値 ISETUP_ADDR_WIDTH=13、つまりアドレスが13ビット(8Kbyte)の時にはRAMB16_S18を、SETUP_ADDR_WIDTH=14、つまりアドレスが14ビット(16Kbyte)の時にはRAMB16_S9を使うようになっている。

あれ、今良く見てみると end generate の後にラベル名を忘れている。これでも通るんだね。。。
  1. 2007年06月16日 11:03 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラの詳しい説明

キャラクタ・ディスプレイ・コントローラはVHDLをVerilog2001に変更中だ。何しろ、腕が痛くて入力が難しいので遅々として進まないが2つファイルを変換済み。
ここでもう一度キャラクタ・ディスプレイ・コントローラの原理について説明しようと思う。
キャラクタ・ディスプレイ・コントローラはディスプレイに文字のみを表示する。文字しか表示しないならば、文字の画像データをキャラクタROMに入れておいて、文字コードを指定すれば、その文字がディスプレイ上に表示するという動作で十分だ。これでビットマップのディスプレイ・コントローラよりもフレーム・バッファの容量を減らすことが出来る。
例えば640X480ドットのビットマップ・ディスプレイ・コントローラを考えた場合に、RGB1ビットずつ3ビットの時には640X480X3bit = 921,600bit必要となる。
キャラクタ・ディスプレイ・コントローラの場合は640X480ドット・ディスプレイで8X8ドットのキャラクタとすると80X60文字表示できる。1文字RGB3ビット+キャラクタ7ビット=10ビットとすると、80X60X10 = 86,000ビットとなる。よって、Spartan3 Starter Kitでもフレーム・バッファに内部Block RAMを使用することが出来るようになる。(キャラクタROMに8X8X128 = 8.1288ビット、そのほかに必要)
そもそもディスプレイのアナログRGB信号は、Red,Green,BlueとH_SYNC, V_SYNC信号がある。
これから、その説明をする。
ディスプレイの右から横に振られるラインのドットを光らすことで画像を書き出している。そのライン上のドットが640ドットあることになる。次に今書いたラインの下に、次のラインを書く。ライン(ラスタ)は480本ある。
次のラインに移動するための同期信号がH_SYNCである。1画面書いた後に、元の位置に戻る同期信号がV_SYNCだ。

キャラクタを表示する時に、例えば画面の最初の行に A と言う文字を2つ書いたとする。display_method_070613.png

図1 ディスプレイの画面表示の最初の部分(図の色は逆です)

char_disp_ctler_3_070524.png

図2 キャラクタ・ディスプレイ・コントローラブロック図

図1の最初の A キャラクタの最初の行(ピンクで囲まれた部分)が図2のシフトレジスタに取り込まれる。図1の左側からシフトされて、図2のRGBのそれぞれの判定回路に送られる。フレーム・バッファにはRGBのビットがあって、そこが1でないと判定回路はキャラクタROMからのシフトデータが1でも、いつも0となる。
例えば、Rだけが1でGBがどちらも0ならば、最初のシフトデータ"00111000"に従って、R信号だけが出力されて、最初のラインの最初のドットに反映される。それが最初のラインの最初のキャラクタ分の8ドットだが、次は次のキャラクタの最初のデータ8ビットがシフトレジスタにロードされ、同様に処理される。緑色の線で囲まれた部分。
それを80文字(1ライン文)書くと、次のラインを書くことになる。最初の文字の次のラインは"00101000"なので、このキャラクタROMからの出力をシフトレジスタにロードして同様に比較し信号に出力する。これらの処理のために垂直カウンタからの下位アドレス3ビットがキャラクタROMに供給されている。
更にフレーム・バッファにアドレスを供給するカウンタは最初のラインの80文字分をカウントした後、次のラインの時には0に戻る。これを8ライン分繰り返す。8ライン分終了したら、次の下に表示するキャラクタのアドレスに移る。(10進で80、0x50)
  1. 2007年06月16日 06:10 |
  2. VGAコントローラ
  3. | トラックバック:0
  4. | コメント:4