FC2カウンター FPGAの部屋 2011年04月
fc2ブログ

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

FPGAの部屋

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

Spartan-3A Starter Kit用DVI出力拡張ボード(基板作成1)

現在、Spartan-3A Starter Kit用DVI出力拡張ボードの基板を作成中です。基板を作ったことがないので、苦労しています。部品は配置して配線を始めましたが、かなりグリットの操作に苦労しています。
Sp3AKit_ExtBoard_24_110430.png

CH7301CからDVI-Iコネクタに行く線は、マイクロストリップラインで計算すると50Ωインピーダンスにするためには、線幅3mmという計算になって、絶望的になりました。ツイッターで@rezeik8さんにコプレーナラインを教えていただきました。ありがとうございました。
線幅を0.5mmにした場合のGNDガード付きコプレーナラインの計算していただきました。35umの銅配線層、FR-4, 1.6mm基板、比誘電率4.5で、GNDガードと信号線のギャップが0.850mm、差動配線同士のギャップが0.84375mmでした。
時間がかかるので、次のテーマの”MIGを使ってみる”と並列してやろうと思う。基板作成してもらうためのパラメータの勉強も必要だしね。。。
  1. 2011年04月30日 04:43 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(回路図作成終了)

Spartan-3A Starter Kit用DVI出力拡張ボードの回路図の入力が終了しました。
下が回路図です。上の2つのICがaitendoのOV7670モジュールOV9655モジュールです。下のICがCH7301Cです。
Sp3AKit_ExtBoard_23_110427.png

これで回路図入力は終了ですが、1度、確認してから、基板を設計します。
  1. 2011年04月27日 05:52 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラ”でXUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラを実装して、CH7301Cの設定レジスタを設定して液晶ディスプレイにキャラクタを表示することができた。
表示ドット数は640×480ドットのVGAサイズでピクセルクロックは25MHz。下に表示タイミングの定義を記述したpackageファイルを示す。

-- 表示タイミングの定義

library ieee;
use ieee.std_logic_1164.all;

package disp_timing_pack is
    constant H_ACTIVE_VIDEO : integer := 640;
    constant H_FRONT_PORCH : integer := 16;
    constant H_SYNC_PULSE : integer := 96;
    constant H_BACK_PORCH : integer := 48;
    constant H_SUM : integer := H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

    constant V_ACTIVE_VIDEO : integer := 480;
    constant V_FRONT_PORCH : integer := 11;
    constant V_SYNC_PULSE : integer := 2;
    constant V_BACK_PORCH : integer := 31;
    constant V_SUM : integer := V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    constant H_DISPLAY_SIZE : integer := H_ACTIVE_VIDEO/8; -- 横80桁
    constant V_DISPLAY_SIZE : integer := V_ACTIVE_VIDEO/8; -- 縦60行
end disp_timing_pack;


Spartan-6を使用したSP605ボードで同様にキャラクタ・ディスプレイ・コントローラを実装して、キャラクタを液晶ディスプレイに表示した。これは、予め他のコンフィグレーションファイルがロードされていたからのようだ?電源ONの時に液晶ディスプレイに模様が表示がされていた。この設定を使ったので、CH7301Cの設定レジスタは設定されてたようだ。参考資料を下に示す。
SP605でキャラクタ・ディスプレイ・コントローラ3(実機でテスト)
SP605でキャラクタ・ディスプレイ・コントローラ4(CH7301C用のラッパー・ソースファイル)
SP605でもCH7301Cの設定レジスタを設定するべきだと思う。

現在使用しているCH7301Cの設定レジスタの設定値は、”XPS Thin Film Transistor(TFT) Controller (v2.00a)”の6ページの”Table 2: Chrontel CH-7301 Configuration Register Description”と同一の設定値を使用している。Table 2: Chrontel CH-7301 Configuration Register Descriptionを下に引用する。
XUPV5-LX110T_CDispC_1_110426.png

CH7301Cの設定レジスタを設定する回路は、OV7670のSCCB設定レジスタの設定回路のID_ADDRESSを0xECに変更して使用した。
SCCB設定レジスタ設定回路の資料。
SCCBインタフェース回路の実装1(タイミングチャート)
SCCBインタフェース回路の実装2(ブロック図の作成)
SCCBインタフェース回路の実装3(シミュレーション)
SCCBインターフェース回路の説明1(SCCB_Reg_Controller.vhd)
SCCBインターフェース回路の説明2(freqdiv.vhd、SCCB_reg_values_ROM.vhd)
SCCBインターフェース回路の説明3(One_Transaction_SCCB.vhd)
更に、OV9655のID_ADDRESSに書き換えたときの参考資料がここにある。

さて、CH7301Cへ出力している部分のラッパー・ソースファイルを下に示す。(2012/07/23:追記 ODDRの設定をミスっていました。VGA_RED, VGA_GREEN, VGA_BLUEがclk0 に同期しているのであれば、ODDRプリミティブをSAME_EDGEモードにする必要があります。下のラッパー・ソースファイルを書き換えました)

-- CharDispCtrlerTest.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;

library unisim;
use unisim.vcomponents.all;

entity CharDispCtrlerTest is
    port(
        clk : in std_logic;
        reset : in std_logic;
--        dvi_reset : in std_logic;
        
        dvi_xclk_p : out std_logic;    
        dvi_xclk_n : out std_logic;
        dvi_reset_b : out std_logic;
        dvi_hsync : out std_logic;
        dvi_vsync : out std_logic;
        dvi_de : out std_logic;
        dvi_d : out std_logic_vector(11 downto 0);
        dvi_sda : out std_logic;
        dvi_scl : out std_logic
    );
end CharDispCtrlerTest;

architecture RTL of CharDispCtrlerTest is

...

    -- CH7301C へ出力する
    dvi_reset_b <= '1';
    
    ODDR_dvi_xclk_p :  ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_xclk_p,
        C => clk90,
        CE => '1',
        D1 => '1',
        D2 => '0',
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_xclk_n : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '1',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_xclk_n,
        C => clk90,
        CE => '1',
        D1 => '0',
        D2 => '1',
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d0 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(0),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[0]
        D2 => VGA_GREEN, -- G[4]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d1 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(1),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[1]
        D2 =>VGA_GREEN, -- G[5]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d2 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(2),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[2]
        D2 => VGA_GREEN, -- G[6]
        R => reset_node,
        S => '0'
    );

    ODDR_dvi_d3 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(3),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[3]
        D2 => VGA_GREEN, -- G[7]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d4 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(4),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[4]
        D2 => VGA_RED, -- R[0]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d5 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(5),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[5]
        D2 => VGA_RED, -- R[1]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d6 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(6),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[6]
        D2 => VGA_RED, -- R[2]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d7 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(7),
        C => clk0,
        CE => '1',
        D1 => VGA_BLUE, -- B[7]
        D2 => VGA_RED, -- R[3]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d8 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(8),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[0]
        D2 => VGA_RED, -- R[4]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d9 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(9),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[1]
        D2 => VGA_RED, -- R[5]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d10 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(10),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[2]
        D2 => VGA_RED, -- R[6]
        R => reset_node,
        S => '0'
    );
    
    ODDR_dvi_d11 : ODDR generic  map(
        DDR_CLK_EDGE  =>  "SAME_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '0',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_d(11),
        C => clk0,
        CE => '1',
        D1 => VGA_GREEN, -- G[3]
        D2 => VGA_RED, -- R[7]
        R => reset_node,
        S => '0'
    );
    
    -- I2C 設定レジスタ設定回路
    I2C_setting_inst : SCCB_Reg_Controller port map(
        clk => clk0,
        reset => reset_node,
        SCL => dvi_scl,
        SDA => dvi_sda
    );
end RTL;


(2011/06/02:追加)
dvi_de, dvi_hsync, dvi_vsync の出力用FFがIOBにマップされないと画面が表示されないので、UCFファイルに下の制約を追加する。

INST "dvi_de" IOB = FORCE;
INST "dvi_hsync" IOB = FORCE;
INST "dvi_vsync" IOB = FORCE;


XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラのラッパー・ソースファイル2”に続く。
  1. 2011年04月26日 05:55 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(回路図作成中)

Spartan-3A Starter Kit用DVI出力拡張ボードの回路図を作成中です。大分書き上がってきました。SP605の回路図をかなり参考にしています。Spartan-6は2.5V IOなので、そこを3.3V IOに変更しています。
回路図は今日、仕事から帰ってきて書き加えれば、DVI部分は出来上がると思います。後はCMOSカメラ、OV7670とOV9655のインターフェース回路を搭載する予定です。
Sp3AKit_ExtBoard_22_110425.png

  1. 2011年04月25日 06:00 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110Tでキャラクタ・ディスプレイ・コントローラ

XUPV5-LX110TにCMOSカメラを付ける準備段階として、DVI-Iに出力してみようということで、キャラクタ・ディスプレイ・コントローラをXUPV5-LX110Tに移植している。同じCH7301Cの載っているSP605では、キャラクタ・ディスプレイ・コントローラで文字を表示できているので、簡単だと思っていた。
Spartan-6のSP605では、IOBのDDRレジスタはODDR2プリミティブだが、Virtex-5ではODDRプリミティブなので、それに変更してやってみたが動作しない。いろいろ出力ドライブ電流などの制約を変えてコンフィグレーションしていると、一度だけキャラクタが出力できた。やはり、回路的には間違ってなくて、何かのタイミングで表示できないようだ。ちなみに、だめな時はNO SIGNALになってしまう。
なぜ、SP605では表示できていて、XUPV5-LX110Tではだめなのか?がわかないが、”XPS Thin Film Transistor (TFT) Controller (v2.00a)”の6ページのTable 2: Chrontel CH-7301 Configuration Register Descriptionを見ると、CH7301Cの設定レジスタを設定する必要があるようだ。そこで、CH7301Cの設定レジスタを設定する回路を付加することにした。
CH7301CのWebサイトAN-41を見てみたが、このプロトコルだと、すでにOmivision社のSCCB設定レジスタを設定する回路を作ってあるので、そのアドレスを変更すれば良いようだ。XUPV5-LX110TやSP605のCH7301CのASはGNDに落ちているので、レジスタをWriteするためのDevice IDは0xEC番地になる。
そこを変更すればプロトコル的には同一のようなので、この回路を付加して、”XPS Thin Film Transistor (TFT) Controller (v2.00a)”の6ページのTable 2: Chrontel CH-7301 Configuration Register Descriptionの設定値を参考に設定してみることにする。

(2011/04/25:追加)
CH7301CにI2C回路を追加して、設定したところ表示ができました。やはり設定が必要のようです。よかったです。
XUPV5-LX110T_ChaDispC_1_110425.jpg

XUPV5-LX110T_ChaDispC_2_110425.jpg
  1. 2011年04月23日 21:07 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成6)

Spartan-3A Starter Kit用DVI出力拡張ボード用の部品シンボルの作成は、前回で終わったと思って、回路図を書き始めた。
Sp3AKit_ExtBoard_16_110422.png

よく見たら、アナログ電源用のLDOレギュレータが残っていた。TIの3.3VLDOレギュレータのTPS73633DBVTだ。データシートはここ

早速、TIの回路図ライブラリに回路図シンボルを作った。(Wizardで作って、少し改造した)
Sp3AKit_ExtBoard_17_110422.png

PCBシンボルをつくろうと思ったが、既存のシンボルを捜すと、prolibライブラリのSOT-23-5_MCが使えそうだった。Editして、Unitsをmm、Gridsを0.1mmにしてパッドを測ってみた。
Sp3AKit_ExtBoard_18_110422.png

TPS73633DBVTのExample Board Layoutとほとんど同じということがわかった。下の図にExample Board Layoutを引用する。2.7mmの部分が上のPCBシンボルでは2.74mmだが、使えそうだ。パッド長も1mmのところ1.32mmだった。
Sp3AKit_ExtBoard_19_110422.png

TPS73633DBVTのコンポーネントを作成した。
Sp3AKit_ExtBoard_20_110422.png

回路図にTPS73633DBVTのシンボルを入れてみると、良い感じだ。(実は1回、回路図シンボルが大きすぎて作り直した)
Sp3AKit_ExtBoard_21_110422.png
  1. 2011年04月22日 05:57 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成5)

今回は、Spartan-3A Starter Kitの100ピンのヒロセの拡張ボード用コネクタに接続できるレセプタクルのシンボルを作る。

レセプタクルの型番は、FX2-100S-1.27DS(71)日本語のデータシートがここにある

回路図シンボルは、Wizardのconnectorを選んで作成した。
Sp3AKit_ExtBoard_13_110420.png

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成3)”の要領でCTRL-Gキーを使用して、Grid合わせ、Half Grid合わせ、Quarter Grid合わせを切り替えて、PCBシンボルを作成した。
Sp3AKit_ExtBoard_12_110420.png

現在、2つを合わせてコンポーネントを作成しているが、100ピンもあると作業に飽きてしまう。本当に基板作成は地道な作業が多いと思う。

(2011/04/21) コンポーネントができた。
Sp3AKit_ExtBoard_14_110421.png

今まで作った部品のシンボルを並べてみた。ヒロセの100ピンコネクタが巨大になってしまった。
Sp3AKit_ExtBoard_15_110421.png
  1. 2011年04月20日 05:50 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

ISimでシミュレーションするときにunisimライブラリを使用する

VHDLで書いているときに、自分が使用するプリミティブなどのライブラリをuse する必要がある。
例えば、VHDLを使用して、Virtex-5で出力用のDDRレジスタ、ODDRを使用して、論理シミュレーションする場合には、unisimライブラリをuseする必要がある。

間抜けな話だが、これを忘れてしまって、少々悩んでしまった。備忘録として書いておく。

使用するボードはXUPV5-LX110Tで、キャラクタ・ディスプレイ・コントローラをDVI出力で出力しようとしている。
書いたVHDLソースの一部を下に貼っておく。

-- CharDispCtrlerTest.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;

entity CharDispCtrlerTest is
    port(
        clk : in std_logic;
        reset : in std_logic;
        
        dvi_xclk_p : out std_logic;    
        dvi_xclk_n : out std_logic;
        dvi_reset_b : out std_logic;
        dvi_hsync : out std_logic;
        dvi_vsync : out std_logic;
        dvi_de : out std_logic;
        dvi_d : out std_logic_vector(11 downto 0)
    );
end CharDispCtrlerTest;

    ODDR_dvi_xclk_p : ODDR
    port map(
        Q => dvi_xclk_p,
        C => clkdv,
        CE => '1',
        D1 => '1',
        D2 => '0',
        R => reset,
        S => '0'
    );
    
    ODDR_dvi_xclk_n : ODDR generic  map(
        DDR_CLK_EDGE  =>  "OPPOSITE_EDGE",  --  "OPPOSITE_EDGE"  or  "SAME_EDGE"
        INIT  =>  '1',      --  Initial  value  for  Q  port  (’1’  or  ’0’)
        SRTYPE  =>  "SYNC")  --  Reset  Type  ("ASYNC"  or  "SYNC")
    port map(
        Q => dvi_xclk_n,
        C => clkdv,
        CE => '1',
        D1 => '0',
        D2 => '1',
        R => reset,
        S => '0'
    );


Virtex-5用のODDRプリミティブを使用している。上のソースのようにunisimのuse宣言がないと、下のシミュレーションのように信号が'U'になってしまう。
ISim_2_110415.png

左のInstance and Process Nameウインドウを見ても、ODDRのインスタンスがない。
ISimでは下のようなワーニングが出ている。

WARNING:HDLCompiler:89 - "C:/HDL/FndISEWork/Virtex5_VLX110T/CharDispCtrler/CharDispCtrlerTest/CharDispCtrlerTest_synth/../CharDispCtrlerTest.vhd" Line 191: remains a black-box since it has no binding entity.


そこで、umisimライブラリ書き足した。

-- CharDispCtrlerTest.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;

library unisim;
use unisim.vcomponents.all;


こうすると、ちゃんと左のInstance and Process NameウインドウにODDRがインスタンスされて、シミュレーションが正常になった。
ISim_3_110415.png

unisimを書いていないと、ISimでエラーにならずにワーニングが出るだけだ。何でシミュレーションがおかしいのか、わからないので注意。
  1. 2011年04月17日 16:23 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

エレキジャック・フォーラムで展示してきました

今日はエレキジャック・フォーラムで画像テルミンとOV9655のSXGA表示デモ、ガイガーカウンターを展示してきました。
Elekijack_7_110416.jpg

Elekijack_8_110416.jpg

Elekijack_9_110416.jpg

来てきてくれた皆さん、ありがとうございました。皆さんにお会いできて嬉しかったです。
心配していた画像テルミンでしたが、まあなんとか、うまくいきました。積分しないとだめかと思っていましたが、CMOSカメラのゲインを上げて白飛びさせれば、ノイズが減ることが夕方になってわかりました。これだとバッチリです。後は音階の問題ですね。もう少し、手の大きさと音階をチューニング出来ればと思います。(白飛びの代わりに、ラプラシアンフィルタ処理をする前の画像に意図的に正の値を加算して、飽和演算しても良さそうですね?)
展示場所はメインステージが良く見えて良いところでした。はやぶさの川口先生の基調講演も良く見えました。とても良かったです。話がとてもうまいと思いました(あたりまえだと思いますが。。。)。

最後にスタッフの皆さん、ありがとうございました。ハンダゴテを貸していただいて助かりました。

展示物の説明を忘れていたので、書きます。
右のSpartan-3A Starter KitはCMOSカメラのOV9655を実装して、SXGAの画像を液晶ディスプレイに表示しています。画像バッファを8面持っていて、キャプチャ中止を指定できるので、デジカメのように使えます。DDR2 SDRAMにバッファしているので、電源が入っているときのみです。

左のSpartan-3A Starter KitはCMOSカメラのOV7670を実装していて、VGAの画像を液晶ディスプレイに表示しています。こっちはSimple MicroBlazeが入っていて、Spartan-3A Starter Kitの液晶ディスプレイを表示器として、CMOSカメラの設定情報をいじることができます。スイッチを操作することで、ラプラシアンフィルタ画像に切り替えられます。画像テルミンとして動作します。

4ビットRGB出力だと、擬似輪郭が出て、品質が悪いので、ますます、CH7301CのDVI-I出力ボードを作りたくなってきました。OV7670とOV9655用のソケットも実装できるようにしようかな?
  1. 2011年04月16日 20:48 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:2

DCMカスケード接続の罠(CLKDV編)2(解決編)

DCMカスケード接続の罠(CLKDV編)”で、DCMをカスケードする場合に1番目のDCMのLOCKED信号を反転して3クロック遅延して、2番目のDCMのリセットに入れる必要があることを学んだ。しかし、そのVHDLコードを書いて置かなかったので、備忘録として書いておく。(シミュレータはISE13.1のISim、FPGAはVirtex-5, xc5vlx110t-1ff1136使用)

最初に参考資料を示しておく。
1.”Virtex-II/-II Pro/-4/-5、Spartan-3/-3E/-3A/-3ADSP - 2 つの DCM を直列にカスケード接続する場合のルール
2.Virtex-4については、”Virtex-4 FPGA User Guide UG070 (v2.6) December 1, 2008”75ページ、Figure 2-5: Cascading DCMs

DCMモジュールのVHDLソースから示す。100MHzクロックをDCMで1/4倍(clkdv使用)して、2番目のDCMに入力し、25MHzの0度クロックと90度クロックを生成する。

-- DCM module

library ieee;
use ieee.std_logic_1164.all;
-- pragma translate_off
library unisim;
use unisim.vcomponents.all;
-- pragma translate_on
library work;

entity dcm_inst is
    port (
        clkin : in std_logic;
        reset : in std_logic;
        clkout : out std_logic;
        clk90 : out std_logic;
        locked : out std_logic
    );
end dcm_inst;

architecture RTL of dcm_inst is
component DCM
  generic (
     CLKDV_DIVIDE : real := 2.0;
     CLKFX_DIVIDE : integer := 1;
     CLKFX_MULTIPLY : integer := 4;
     CLKIN_DIVIDE_BY_2 : boolean := false;
     CLKIN_PERIOD : real := 10.0;
     CLKOUT_PHASE_SHIFT : string := "NONE";
     CLK_FEEDBACK : string := "1X";
     DESKEW_ADJUST : string := "SYSTEM_SYNCHRONOUS";
     DFS_FREQUENCY_MODE : string := "LOW";
     DLL_FREQUENCY_MODE : string := "LOW";
     DSS_MODE : string := "NONE";
     DUTY_CYCLE_CORRECTION : boolean := true;
     FACTORY_JF : bit_vector := X"C080";
     PHASE_SHIFT : integer := 0;
     SIM_MODE : string := "SAFE";
     STARTUP_WAIT : boolean := false
  );
    port ( CLKIN     : in  std_logic;
           CLKFB     : in  std_logic;
           DSSEN     : in  std_logic;
           PSINCDEC  : in  std_logic;
           PSEN      : in  std_logic;
           PSCLK     : in  std_logic;
           RST       : in  std_logic;
           CLK0      : out std_logic;
           CLK90     : out std_logic;
           CLK180    : out std_logic;
           CLK270    : out std_logic;
           CLK2X     : out std_logic;
           CLK2X180  : out std_logic;
           CLKDV     : out std_logic;
           CLKFX     : out std_logic;
           CLKFX180  : out std_logic;
           LOCKED    : out std_logic;
           PSDONE    : out std_logic;
           STATUS    : out std_logic_vector(7 downto 0)
          );
end component;
component BUFG 
  port (
    I   : in std_logic;
    O    : out std_logic
    ); 
end component;
component IBUFG 
  port (
    I   : in std_logic;
    O    : out std_logic
    ); 
end component;

signal clk_ibuf : std_logic;
signal clkfb : std_logic;
signal gnd, clk_node : std_logic;
signal clkdv_node, clkdv_bufg : std_logic;
signal clk_node2, clk90_node : std_logic;
signal clk90_bufg, clk_bufg : std_logic;
signal dcm1_locked : std_logic;
signal dcm2_reset : std_logic;
begin
    gnd <= '0';
    
    ibufg_inst : ibufg port map(
        i => clkin,
        o => clk_ibuf
    );
    
    dcm1 : dcm generic map(
        CLKFX_DIVIDE => 4,
        CLKFX_MULTIPLY => 1,
        CLKDV_DIVIDE => 4.0
    )port map(
        clkin => clk_ibuf,
        clkfb => clkfb,
        dssen => gnd,
        psincdec => gnd,
        psen => gnd,
        psclk => clk_ibuf,
        rst => reset,
        clk0 => clk_node,
        clk90 => open,
        clk180 => open,
        clk270 => open,
        clk2x => open,
        clk2x180 => open,
        clkdv => clkdv_node,
        clkfx => open,
        clkfx180 => open,
        locked => dcm1_locked,
        psdone => open,
        status => open
    );
    
    bufg_inst : bufg port map(
        i => clk_node,
        o => clkfb
    );
--    clkout <= clkfb;
    
    bufg_clkdv : bufg port map(
        i => clkdv_node,
        o => clkdv_bufg
    );
    dcm2_reset <= not dcm1_locked;
    
    dcm2 : dcm generic map(
        CLKDV_DIVIDE => 4.0
    )port map(
        clkin => clkdv_bufg,
        clkfb => clk_bufg,
        dssen => gnd,
        psincdec => gnd,
        psen => gnd,
        psclk => clk_ibuf,
        rst => dcm2_reset,
        clk0 => clk_node2,
        clk90 => clk90_node,
        clk180 => open,
        clk270 => open,
        clk2x => open,
        clk2x180 => open,
        clkdv => open,
        clkfx => open,
        clkfx180 => open,
        locked => locked,
        psdone => open,
        status => open
    );
    bufg_clk0_2 : bufg port map(
        i => clk_node2,
        o => clk_bufg
    );
    bufg_clk90 : bufg port map(
        i => clk90_node,
        o => clk90_bufg
    );
    
    clkout <= clk_bufg;
    clk90 <= clk90_bufg;
        
end RTL;


dcm1のリセットを反転して、dcm2のrst端子に入れてシミュレーションすると、下のようにdcm2のLOCKED信号が不定になってしまう。
Cascading_DCMs_110415.png


次に、SRL16プリミティブを使用して3クロック遅延させる。”Spartan-3デバイスでのシフト レジスタ(SRL 16)としてのルックアップテーブルの使用”参照。

(2011/04/23:修正)
3クロック遅延させるためには、A0=1, A1=1, A2=0, A3=0 とすれば良い基本的には3クロックだが、その下の修正コードでは、元のクロックにSRL16Eのクロックを接続しているので、4分周*3クロック=12クロック遅延させる。A0=0, A1=0, A2=1, A3=1。(下記にVirtex-5 ライブラリ ガイド (HDL 用)UG621 (v13.1) 2011 年 3 月 1 日の371ページから引用したSRL16Eのインスタンス例を示す)

SRL16E_inst : SRL16E
generic map (
 INIT => X"0000")
port map (
 Q => Q, -- SRL data output
 A0 => A0, -- Select[0] input
 A1 => A1, -- Select[1] input
 A2 => A2, -- Select[2] input
 A3 => A3, -- Select[3] input
 CE => CE, -- Clock enable input
 CLK => CLK, -- Clock input
 D => D -- SRL data input
);


これを参考に、上のVHDLコードを修正した。VHDLを下に示す。

-- DCM module

library ieee;
use ieee.std_logic_1164.all;
library unisim;
use unisim.vcomponents.all;
library work;

entity dcm_inst is
    port (
        clkin : in std_logic;
        reset : in std_logic;
        clkout : out std_logic;
        clk90 : out std_logic;
        locked : out std_logic
    );
end dcm_inst;

architecture RTL of dcm_inst is
component DCM
  generic (
     CLKDV_DIVIDE : real := 2.0;
     CLKFX_DIVIDE : integer := 2;
     CLKFX_MULTIPLY : integer := 4;
     CLKIN_DIVIDE_BY_2 : boolean := false;
     CLKIN_PERIOD : real := 10.0;
     CLKOUT_PHASE_SHIFT : string := "NONE";
     CLK_FEEDBACK : string := "1X";
     DESKEW_ADJUST : string := "SYSTEM_SYNCHRONOUS";
     DFS_FREQUENCY_MODE : string := "LOW";
     DLL_FREQUENCY_MODE : string := "LOW";
     DSS_MODE : string := "NONE";
     DUTY_CYCLE_CORRECTION : boolean := true;
     FACTORY_JF : bit_vector := X"C080";
     PHASE_SHIFT : integer := 0;
     SIM_MODE : string := "SAFE";
     STARTUP_WAIT : boolean := false
  );
    port ( CLKIN     : in  std_logic;
           CLKFB     : in  std_logic;
           DSSEN     : in  std_logic;
           PSINCDEC  : in  std_logic;
           PSEN      : in  std_logic;
           PSCLK     : in  std_logic;
           RST       : in  std_logic;
           CLK0      : out std_logic;
           CLK90     : out std_logic;
           CLK180    : out std_logic;
           CLK270    : out std_logic;
           CLK2X     : out std_logic;
           CLK2X180  : out std_logic;
           CLKDV     : out std_logic;
           CLKFX     : out std_logic;
           CLKFX180  : out std_logic;
           LOCKED    : out std_logic;
           PSDONE    : out std_logic;
           STATUS    : out std_logic_vector(7 downto 0)
          );
end component;
component BUFG 
  port (
    I   : in std_logic;
    O    : out std_logic
    ); 
end component;
component IBUFG 
  port (
    I   : in std_logic;
    O    : out std_logic
    ); 
end component;

signal clk_ibuf : std_logic;
signal clkfb : std_logic;
signal gnd, clk_node : std_logic;
signal clkdv_node, clkdv_bufg : std_logic;
signal clk_node2, clk90_node : std_logic;
signal clk90_bufg, clk_bufg : std_logic;
signal dcm1_locked : std_logic;
signal dcm2_reset : std_logic;
signal dcm2_reset_SRL16E : std_logic;
begin
    gnd <= '0';
    
    ibufg_inst : ibufg port map(
        i => clkin,
        o => clk_ibuf
    );
    
    dcm1 : dcm generic map(
        CLKFX_DIVIDE => 8,
        CLKFX_MULTIPLY => 2,
        CLKDV_DIVIDE => 4.0
    )port map(
        clkin => clk_ibuf,
        clkfb => clkfb,
        dssen => gnd,
        psincdec => gnd,
        psen => gnd,
        psclk => clk_ibuf,
        rst => reset,
        clk0 => clk_node,
        clk90 => open,
        clk180 => open,
        clk270 => open,
        clk2x => open,
        clk2x180 => open,
        clkdv => clkdv_node,
        clkfx => open,
        clkfx180 => open,
        locked => dcm1_locked,
        psdone => open,
        status => open
    );
    
    bufg_inst : bufg port map(
        i => clk_node,
        o => clkfb
    );
--    clkout <= clkfb;
    
    bufg_clkdv : bufg port map(
        i => clkdv_node,
        o => clkdv_bufg
    );
    dcm2_reset <= not dcm1_locked;
    
    SRL16E_inst : SRL16E generic map(
        INIT => X"FFFF")
    port map(
        Q => dcm2_reset_SRL16E,
        A0 => '0',
        A1 => '0',
        A2 => '1',
        A3 => '1',
        CE => '1',
        CLK => clk_ibuf,
        D => dcm2_reset
    );
    
    dcm2 : dcm generic map(
        CLKDV_DIVIDE => 4.0
    )port map(
        clkin => clkdv_bufg,
        clkfb => clk_bufg,
        dssen => gnd,
        psincdec => gnd,
        psen => gnd,
        psclk => clk_ibuf,
        rst => dcm2_reset_SRL16E,
        clk0 => clk_node2,
        clk90 => clk90_node,
        clk180 => open,
        clk270 => open,
        clk2x => open,
        clk2x180 => open,
        clkdv => open,
        clkfx => open,
        clkfx180 => open,
        locked => locked,
        psdone => open,
        status => open
    );
    bufg_clk0_2 : bufg port map(
        i => clk_node2,
        o => clk_bufg
    );
    bufg_clk90 : bufg port map(
        i => clk90_node,
        o => clk90_bufg
    );
    
    clkout <= clk_bufg;
    clk90 <= clk90_bufg;
        
end RTL;


修正後シミュレーション結果を下に示す。
Cascading_DCMs_2_110415.png

lockedも'X'状態にならないで、正常に'1'になった。
これで問題は解決した。

(注)
SRL16Eプリミティブを使用していると、インプリメント時にunisimをuseする必要があった。

library unisim;
use unisim.vcomponents.all;

  1. 2011年04月15日 14:02 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:0

ISimでシミュレーション時にSimulation Terminatedダイアログが出る

XUPV5-LX110T Development SystemでCMOSカメラの画像を表示するために、XGA用の1024*768*3bit(RGB)のフレームバッファを付けた回路を実装している。
VHDLで書き終えたので、ISE13.1のISimでシミュレーションしようとしたら、Simulation Terminatedダイアログが出て、シミュレーションできない。OSはWindows7 32ビット版 SP1。使用言語はVHDL。
ISim_1_110414.png

isim.log を見ても情報がない。

ISim log file
Running: ......(実行コマンド、一応伏せてあります)
This is a Full version of ISim.
Time resolution is 1 fs
# onerror resume
# wave add /
No active Database
# run 1000 ns
Unable to execute live simulation command.


Xilinx社のアンサーを探してみたら、”ISE Simulator (ISim) - 「Simulator is abnormally terminated」というエラー メッセージが表示される”が見つかった。
それによるとアロケートできるメモリが足りないようだ。Windows7 64bit版を使うか、Linux 64bit版を使うと4GBのメモリをアロケートできるそうだ。32bit版ではプロセスで2GBしかメモリをアロケート出来ないそうだ。残念。。。
ModelSimで確かめてみることにする。

(2011/04/25:追記)
Windows7 64ビット版、メモリ16GBでシミュレーションを行ったところ、ISimでエラボレートが完了して、シミュレーションを行うことができた。やはり、メモリの限界でシミュレーションができなかったようだ。
  1. 2011年04月14日 12:16 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:2

画像テルミン2

画像テルミンの実装が出来てきました。
やはり背景が大事です。画像のエッジ検出なので、当たり前といえば当たり前の気がします。
エッジ判定のスレッショルドもどれが良いのか良くわからないので、変更できるようにしたいです。
現状で出来ているのは、白い紙(エッジが際立つので)でやっています。手ではエッジがぼやけて難しかったです。
Elekijack_5_110414.jpg

これをラプラシアンフィルタ処理モードで見ると下のようになります。
Elekijack_6_110414.jpg

赤い線がエッジ感の距離を測っている部分です。この距離によって音の高さが変わります。赤い線はハードウェアで書いています。

光の当たり方で結果が変わるようです。ライトを持って行って当てるべきか?
あと、積分した方が良い気がします。CMOSカメラの設定をいじれるコンフィグレーションではないので、そっちにマージしてから、もう一度やってみようと思います。手では無理かも?背景によるといったところかと思います。
もう時間が無いので、CMOSカメラの設定をいじれるコンフィグレーションに載せただけとなるかもしれません。積分してノーマライズ出来れば良いのですが。。。
  1. 2011年04月14日 05:56 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

画像テルミン1

画像テルミンですが、手をCMOSカメラで撮影して、ラプラシアンフィルタ処理します。ラプラシアンフィルタ処理後の画像を使用し、どのように音の高さを決めるか?を考察しようと思います。
下に示すのが手の原画像です。
Elekijack_3_110413.jpg

まずは画面の縦方向の半分の位置の横のラインを考えます。画面の中心から前半部分と後半部分に分けます。
1.VGA信号規格に従って、前半部分で画面中央に近い位置のラプラシアンフィルタ出力値が高い場所を検索します。この位置をPositionFとします。
2.後半部分で画面中央に近い位置のラプラシアンフィルタ出力値が高い場所を検索します。これをPositionBとします。
3.PositionB - PositionFの値が手の幅(下図でピンクの矢印の範囲)になる。この値を正規化して、音の高さに反映させる。
Elekijack_4_110413.jpg

あれ、テルミンは、手を近づけると静電容量が大きくなるので、低い音で良いんですよね?そうなると、手を近づけて、手の幅が長くなると低い音になって、手が遠ざかって手の幅が短くなると高い音で大丈夫かな?2.演奏法の説明”によると、逆で、手を近づけると高い音、手を遠ざけると低い音だそうです。でも、それだと、何も無い時は高い音になるので、好ましくない感じがします。逆テルミンということで、手を近づけると低い音にしようと思います。

スレッショルドをどうするか?とか、いろいろ難しい面はあると思いますが、やってみようと思います。背景が問題だったら白い壁をバックにすれば良いかな?
  1. 2011年04月13日 05:37 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

ラプラシアンフィルタ処理後の画像

OV7670のディスプレイ回路に、3X3のラプラシアンフィルタをマージ出来ました。YUVモードでY(輝度信号)だけをラプラシアンフィルタで処理した出力です。
これが息子の顔のラプラシアンフィルタ処理画像です。
Elekijack_1_110410.jpg

下の方にかなりノイズが乗ってしまっています。ランダムノイズぽく、フレーム毎に白い点が出る位置が変わります。
今度は私の顔です。
Elekijack_2_110410.jpg

やはり黒っぽいところだと思うのですが、ノイズが乗っています。壁は白いので、あまり変動しないからかもしれません。微妙にYの値が変動するからでしょうか?
BAYERパターンをYUVに変更するときの特徴かもしれませんね?
さて、ここからカラー画像とラプラシアンフィルタ処理画像を切り替えられるようにします。次に、5フレーム程度積分して、値の大きい2点の距離を測定することにします。
  1. 2011年04月10日 20:42 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

ガイガーカウンターキットを作ってきました

昨日は初めてはんだづけカフェに行って、ガイガーカウンターキットを作ってきました。3331 Arts Chiyodaに初めて行ってきましたが、本当に場所も良く、良いところでした。アート系のお店?や展示会がズラーとありました。元学校ということがよくわかりました。庭も広く大きな木も植わっています。

はんだづけカフェは3階にあって、おしゃれなペインティング&一部ガラス張りで中が見えました。おしゃれな感じです。1時に中に入ると@felis_silvさんがいらっしゃいました。早速、ガイガーカウンターキットを購入して、つくりはじめました。数人、ガイガーカウンターキットを購入された方がいらして、一緒につくりはじめました。和やかな雰囲気でとても良かったです。半田ごては、はんだづけカフェで無料で貸していただきました。ありがとうございました。
最初は全部作れるかな?と思って、気乗りしないでつくりはじめたのですが、@felis_silvさんに実体配線図まで用意していただいたので、実体配線図を信じて、(時々回路図を確認しながら)作りました。子供の頃の雑誌(何だったか忘れましたが)の教訓だと実体配線図は信じるなというのがあったのですが、今回の実体配線図は正しかったです。。。(流石。。。)

下が実体配線図と回路図です。
Geiger_1_110410.jpg
Geiger_2_110410.jpg

そのうちにHALさんやSimさんもお見えになって、和気あいあいと作っていました。
1時間半ほどで最初の方がガイガーカウンターキットの組み立てを終了して完成しました。私は作るのが遅いので、3時間くらいかかりました。一応、全部出来ているかどうかを確認すると、GNDへのジャンパー線が抜けていることに気がついて、付けました。
いよいよ完成したので、@felis_silvさんに電圧の調整(500V位だったような?)をしていただいて、GM管を入れて、ウラン鉱石を近づけるとガガガ―という音が。。。やったー、出来ました。とっても嬉しかったので、はんだづけカフェでバンザイをしてしまいました。うれしー。。。
下が完成品の写真です。
Geiger_3_110410.jpg

基板部の拡大写真。
Geiger_4_110410.jpg

今回は、電源電圧3.3Vで調整していただきました。これでSpartan-3A Starter Kitに直結できます。

本当に、はんだづけカフェの皆さん、@felis_silvさん、ありがとうございました。楽しいひとときを過ごせました。雰囲気もとても良いし、また、はんだづけカフェに行ってみたいです。

家に帰ってきてから、自家栽培の野菜をガイガーカウンターで調べてみました。もう、茹でてあるのしか無かったですが、ガイガーカウンターが反応することはなかったです。一安心。ですが、ぽつりぽつりとは鳴ってますね。家の中に微量の放射性物質があるのかな?はんだづけカフェでは鳴らなかったような???

今回のガイガーカウンターキットについては、楢ノ木技研ヤマネコのマイコン実験室GM管頒布に情報があります。

注:このガイガーカウンターキットは、現在、販売されていません。約500Vの高電圧を使用しています。ユニバーサル基板ですし、電子工作の初級者には、お勧めできません。
  1. 2011年04月10日 05:09 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

2011年4月8日の日記

昨日の地震は大きかったですね。寝た後でしたが、地震で目が覚めました。
朝、ネットを見たら仙台で震度6強の地震だそうで、仙台の方は大丈夫でしょうか?
娘が大学に行くために仙台に引越しなんですが、引っ越せるんでしょうか?心配です。

さて、エレキジャック・フォーラムに出すために、Spartan-3A Starter KitにCMOSカメラを搭載して回路を作っています。
前回、Simple MicroBlazeを使って、基板上の液晶にCMOSカメラの設定を表示し、ロータリーエンコーダーでCMOSカメラの設定を変更できるようにした。でもそれは、CMOSカメラのモードがRGB444モードだったので、輝度信号を取り出してラプラシアンフィルタにかけるには不都合があった。
CMOSカメラがYUVモードのプロジェクトもあるのだが、それにはSimple MicroBlazeが入っていないので、Simple MicroBlazeの入っているプロジェクトにYUVモードのコードをマージした。
昨日動作させたところ、問題なく動作したので、今度は、ラプラシアンフィルタというか3X3ピクセルを使用したフィルタモジュールを切りだして、付け加える予定だ。
問題はフィルタの部分はVHDLで書いてあるので、Verilogに直すか?それともそのままVHDLで使うか思案中。。。とりあえず、実績のあるVHDLで切りだして試してみようか?
ますます、Verilog専用シミュレーターではシミュレーションできなくなってしまう。。。
  1. 2011年04月08日 05:29 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

エレキジャック・フォーラム2011での作品展示

エレキジャック・フォーラム2011で作品展示をすることになりました。

デジタルカメラもどきとういう題で、Spartan-3A Starter KitにCMOSカメラを付けたシステムを展示しようと思っていました。
元々、Spartan-3A Starter Kitのスイッチの切り替えで、画像キャプチャアドレスを切り替えることが出来て、キャプチャ停止も設定できるので、電源を切ると忘れるデジカメです。これをそのまま、OV7670とOV9655のシステムを2台展示してもいいのですが、それだけでは面白くありません。(セミナにも応募してあるので、消極的だった。。。)

Makeの時に、展示して、あまりうまく行かなかった画像音楽演奏装置No.1No.2も展示可能です。CMOSカメラのパラメーターを修正して、オート機能のオン、オフ、色合い、明るさを変更できるようにしてあるので、良いところまでイケルと思います。もう少し、その照明にコンペア、アジャストする機能を付け加えると良いと思います。ですが、やはり、手の色は手のひらの照明に対する角度で、だいぶ色が変わることがわかりました。現在のアルゴリズムでは、いろいろな人のいろいろな手のかざし方や、色の音楽情報を塗ったパネルの照明に対する角度で大分状況が変わります。
天井の蛍光灯を当てにせずに、こっちから照明を当てれば良いかもしれません。

今回は、もし出来ればですが、Makeでお問い合わせの多かった画像テルミンに挑戦してみようかと思います。今度は白黒画像でラプラシアンフィルタをかけてエッジ検出して、エッジの距離で音の高さを調整しようか?と思っています。ですが、ピントがずれるので、ずれたところでエッジ検出が出来るかどうか問題ですね。

何しろ片手間でやっているようなもんですから、なかなか本格的にアルゴリズムを考え、実証していく体制にはありませんね。。。

RGB各4ビットでカメラ画像を出力しているのが残念です。現在シンボルを作って基板を作ろうとしているDVI-I拡張ボードが完成すれば、DVI出力、RGB各8ビットで出力できるのですが。。。
  1. 2011年04月06日 05:31 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成4)

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成3)”でDVI-IコネクタのPCBシンボルを作り、”DesignSpark PCBで回路図シンボルのWizardを試す”で回路図シンボルを作成した。
だが、やはり、回路図シンボルのWizardでやはりconnectorを選ぶべきでは?ということで、回路図シンボルを作り直した。
回路図シンボルのWizardでのSpcify the pins required on this Symbolの値を下に示す。
Sp3AKit_ExtBoard_8_110405.png

出来上がった回路図シンボルはこれ。箱を少し伸ばしたので、前のWizardのWidth across symbolは520くらいでも良かったかも?
Sp3AKit_ExtBoard_9_110405.png

次にコンポーネントを作成した。DVI-Iコネクタには、C1,C2などの番号でないピン名があるが、Componet pinにピン名を書けば回路図に反映される。
Sp3AKit_ExtBoard_10_110405.png

今まで作成した回路図シンボルを回路図に表示した。
Sp3AKit_ExtBoard_11_110405.png

かなりシンボルが出来てきた。もう一息かな?
  1. 2011年04月05日 05:35 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCBで回路図シンボルのWizardを試す

基板を作成するためにDVI-IコネクタのPCBシンボルを作成して、回路図シンボルを作っている。

回路図シンボルを作る際にLibrary Managerを開いて(Libraryアイコンをクリック)、Schematic Symbolsタブをクリックしたときに、Wizard...のボタンがハイドされずに選択することができる。これは回路図シンボルでもWizardを走らせられるようだ。
DesignSpark_PCB_131_110404.png

前回、チュートリアルを参考に回路図シンボルを作ったときはWizardを使わずに自分で書いたが、今度は回路図シンボルをWizardを使用して作ってみようと思う。

Wizard...のボタンをクリックすると、Symbol Wizardダイアログが出る。次へ(N)>ボタンをクリックする。
DesignSpark_PCB_132_110404.png

Use Technology File:にチェックを入れた。Default.stfを選択した。
DesignSpark_PCB_133_110404.png

Rectangleを選択した。
DesignSpark_PCB_134_110404.png

次はデフォルト値にした。次へ(N)>ボタンをクリックする。
DesignSpark_PCB_135_110404.png

Pins on left:を22、Pins on right:を10に設定した。
DesignSpark_PCB_136_110404.png

DVI-I_Connetorという名前を付けて、回路図ライブラリにセーブした。(完了ボタンをクリックした)
DesignSpark_PCB_137_110404.png

回路図シンボルが作成された。
DesignSpark_PCB_138_110404.png

定形の回路図シンボルならばWizardで簡単に作ることができた。
  1. 2011年04月04日 05:55 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

ナルニア国物語 第3章 アスラン王と魔法の島(映画)を見てきました

昨日は3Dでナルニア国物語 第3章 アスラン王と魔法の島を見てきました。東日本大震災後で初めての映画でした。イーアスの映画館はまだ復旧していないので、シネプレックスで見てきました。
イーアスは被害がひどいようです。まだ復旧していません
イオン下妻も映画館もだめですが、新しい建物の専門店街もまだ開店していないそうです
という訳で、行ける映画館が少ないです。シネプレックスも地震で上映中止になる場合があるという掲示がありました。
映画は面白かったです。録画してある第2章を見ようと思います。
  1. 2011年04月04日 05:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter Kit用DVI出力拡張ボード(シンボル作成3)

今回は大物。DVI-IコネクタのPCBシンボルを作った。ウィザードにDVI-Iコネクタの項目が無いので、グリットを工夫しながら作った。

DVI-IコネクタはDigi-Key品番 WM4435-ND、これにジャックポットを付ける。なおDVI-IコネクタはMolex社製で、型番は0743201007。DVI-Iコネクタのピン配置はDigital Visual Interfaceに書いてあった。

DVI-Iコネクタの設計図の中のRECOMMENDED PCB LAYOUT を参考にPCBレイアウトを作る。RECOMMENDED PCB LAYOUT を下に引用する。
Sp3AKit_ExtBoard_3_110403.png

これを見て、DesignSpark PCBのPCBシンボルを作成した。
Unitsはinchesにした。
Sp3AKit_ExtBoard_4_110403.png

Gridは0.010とした。
Sp3AKit_ExtBoard_5_110403.png

これで、CTRL+GでHalf Grid, Quarter Grid, Tenth Gridを切り替えて使うことにした。
例えば、左下のパッド(ピンク矢印)をコピーしてその上のパッド(緑矢印)を作るときは、下のPOS:を見ながらコピーしたパッドを動かした。間隔が0.075inchなので、左下のパッドに合わせてからGridで7グリッド動かし、Half Gridに設定して、1グリッド動かすとちょうど0.075間隔になる。
Sp3AKit_ExtBoard_6_110403.png

後で、パッドの間隔を確かめるためにMeasure Gapアイコンをクリックして、2つのパッドを選択するとパッド間のギャップを計測することができる。
Sp3AKit_ExtBoard_7_110403.png

このPCBシンボルは、NO PLATE HOLE(たぶん穴だけでスルーホールでない穴?)があるが、Xilinx社のML505ボードの裏面の写真を見るとDVI-Iコネクタの位置にNO PLATE HOLEが無い?いろいろなDVI-Iコネクタがあるのか?

PCBシンボルはできたので、順序が逆だが、回路図シンボルを作る。
  1. 2011年04月03日 06:14 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

2011年3月のFPGAの部屋のアクセス数

2011年3月のFPGAの部屋のアクセス数は41,725アクセスだった。皆さん、見ていただいてありがとうございます。
今月は特に3/11からのアクセスが少なかった。東日本大震災で、皆さんそれどころではなかったと思う。私も金曜日、土曜日は停電、断水で風呂にも入れずに、不安な夜を過ごした。それでも、津波の被害を受けられたからから見れば、被害はとても軽い。電気が通って、ブログが見られて、とても嬉しかったことを覚えている。

下に今月の日別アクセス集計を示す。やはり、3/11以降減っているが、極端に少なくなったわけではないようだ。
FPGA_room_March_1_110401.png

2011年のアクセス数の集計を下に示す。
FPGA_room_March_2_110401.png

  1. 2011年04月01日 20:54 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

MicroBlazeクロスコンパイラを試す3(自分のソフトウェアで試した)

(FC2ブログに画像を貼れないので、後で貼ります)

自分で作ったSpartan-3A Starter KitのCMOSカメラの設定を制御するソフトウェアをMicroBlazeクロスコンパイラでコンパイルしてみることにした。

ソフトウェアのlcd_rot_cont.c とlcd_rot_cont.hをWindowsから、Fedora14のSpa3SKit_Cam_SMMディレクトリに持ってきた。
MB_CCompiler_7_110401.png

SDKで作ってあるので、インクルードファイルをWindowsから、Fedora14のSpa3SKit_Cam_SMM/SDK_Includesディレクトリに持ってきた。
MB_CCompiler_8_110401.png

Spa3SKit_Cam_SMMディレクトリのMakefileのファイル名を変更した。-I ./SDK_Includes -include lcd_rot_cont.h を追加した。
makeすると、lcd_rot_cont.oはできたがmicroblaze_register_handler とmicroblaze_enable_interrupts がないと言われた。
MB_CCompiler_9_110401.png

色々ライブラリの解決が面倒そうだ。ハードとソフトを修正すれば、使わないようにもできるが、とりあえずペンディングとする。lcd_rot_cont.oはできたので、使うことができると思う。
MB_CCompiler_10_110401.png

次は、SMMのシミュレーション方法について、勉強させていただこうと思う。
  1. 2011年04月01日 05:22 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0