FC2カウンター FPGAの部屋 画像のエッジ検出3(シミュレーション)
FC2ブログ

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

FPGAの部屋

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

画像のエッジ検出3(シミュレーション)

画像のエッジ検出2(方式の検討”の続き。

最初に注意。この記事では水平ラインの最初を0ラインと記述しています。その他の記事では最初の水平ラインを1ラインと記述しているものがあるのでご注意ください。


一応、縦横斜めエッジ検出のVHDLソースが出来上がったので、シミュレーションをしてみた。
その前に、ちょっと方式の説明をする。縦と斜めのエッジを検出するためにBRAMに1ライン分の輝度データを保存している。BRAMのWriteアドレスとReadアドレスは、偶数ラインと奇数ラインでアドレスを分けている。最上位ビットを0にしたり、1にしたりしている。例えば0ライン目(最初のライン)はWriteアドレス(bram_wr_addr) が000、Readアドレス(bram_rd_addr) が400から始まる。(BRAMは2ポートSRAMです) 次の1ライン目はWriteアドレスが400、Readアドレス が000となる。こうやって競合しないようにBRAMを使用する。
h_valid_flagは横方向に比較できることを示すフラグ信号で、ラインの最初だけ0でその後は1となる信号だ。v_valid_flagは縦、斜め方向に比較できることを示すフラグ信号で、つまり0ライン(最初の水平ライン)だけ0で、それ以外のラインは1となる。
以上を踏まえてCamera_Controller.vhd の全ソースを貼ろうと思ったが、400行近くあるのでやめた。比較部分だけを貼ることにする。

    -- 1クロック前のBRAMの出力と現在の値の1クロック前の値を保持
    process(clk) begin
        if clk'event and clk='1' then
            if reset='1' then
                bram_data_1d <= (others => '0');
                y_data_1d <= (others => '0');
            else
                if r_w='1' then
                    y_data_1d <= cam_ydata_2d;
                    bram_data_1d <= bram_data;
                end if;
            end if;
        end if;
    end process;
    
    -- 縦横斜めピクセルの引き算の絶対値
    process(cam_ydata_2d, bram_data) begin -- 縦
        if unsigned(cam_ydata_2d) >= unsigned(bram_data) then
            vertical_comp_val <= unsigned(cam_ydata_2d) - unsigned(bram_data);
        else
            vertical_comp_val <= unsigned(bram_data) - unsigned(cam_ydata_2d);
        end if;
    end process;
    process(cam_ydata_2d, y_data_1d) begin -- 横
        if unsigned(cam_ydata_2d) >= unsigned(y_data_1d) then
            horizontal_comp_val <= unsigned(cam_ydata_2d) - unsigned(y_data_1d);
        else
            horizontal_comp_val <= unsigned(y_data_1d) - unsigned(cam_ydata_2d);
        end if;
    end process;
    process(cam_ydata_2d, bram_data_1d) begin
        if unsigned(cam_ydata_2d) >= unsigned(bram_data_1d) then
            skew_comp_val <= unsigned(cam_ydata_2d) - unsigned(bram_data_1d);
        else
            skew_comp_val <= unsigned(bram_data_1d) - unsigned(cam_ydata_2d);
        end if;
    end process;

    -- 比較器 (縦横斜めのYデータを比較してエッジを検出する)
    process(h_valid_flag, v_valid_flag, vertical_comp_val, horizontal_comp_val, skew_comp_val) begin
        if h_valid_flag='0' and v_valid_flag='0' then -- hとvのvalid_flag が0の時は比較しない
            ydata_out <= '0' & cam_ydata_2d(7 downto 1);
        elsif h_valid_flag='1' and v_valid_flag='0' then -- 最初の水平ラインの時は水平方向だけ比較する
            if horizontal_comp_val>=Edge_Threshold_Def then
                ydata_out <= CONV_STD_LOGIC_VECTOR(Edge_Value_Def, 8) or ('0' & cam_ydata_2d(7 downto 1));
            else
                ydata_out <= '0' & cam_ydata_2d(7 downto 1);
            end if;
        elsif h_valid_flag='1' and v_valid_flag='1' then -- 比較
            if vertical_comp_val>=Edge_Threshold_Def or horizontal_comp_val>=Edge_Threshold_Def or skew_comp_val>=Edge_Threshold_Def then -- 縦横斜めどれかがスレッショルドを超えていたらEdge_Value_Defをセット
                ydata_out <= CONV_STD_LOGIC_VECTOR(Edge_Value_Def, 8) or ('0' & cam_ydata_2d(7 downto 1));
            else
                ydata_out <= '0' & cam_ydata_2d(7 downto 1);
            end if;
        else
            ydata_out <= '0' & cam_ydata_2d(7 downto 1);
        end if;
    end process;


ModelSimでのシミュレーションの0ライン目を下に示す。
edge_detect_7_091105.png

上の図でr_w が1の時が輝度データで、cam_ydata_2dのr_w が1の時が輝度データである。ydata_outはエッジ検出値を含んだ輝度データで、これが、Camera_Controller.vhd のデータ出力である。bram_wr_addr、bram_rd_addr はそれぞれBRAMのWriteアドレス、Readアドレスだ。下の、vertical_comp_val は縦の差分の絶対値、horizontal_comp_val は横の差分の絶対値、skew_comp_val は斜めの差分の絶対値を示す。ここではh_valid_flag が輝度データ2個目から1になるが、v_valid_flagは0のままとなる。
次の1水平ライン目のシミュレーションを下に示す。
edge_detect_8_091105.png

bram_wr_addr、bram_rd_addr は初期値が400、000となり、0ライン目とは逆になっている。h_valid_flag が輝度データ2個目から1になり、v_valid_flagも1になっているのがわかる。

これでシミュレーションは大体大丈夫だと思うので、インプリして実機でテストすることにする。
  1. 2009年11月05日 05:54 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1282-a3e81458
この記事にトラックバックする(FC2ブログユーザー)