1
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_arith.all;
    --use ieee.std_logic_unsigned.all;
    --use ieee.std_logic_signed.all;


    entity sobel is 
         port ( 
              top_left_pixel      : in  std_logic; 
              top_middle_pixel    : in  std_logic; 
              top_right_pixel     : in  std_logic; 
              middle_left_pixel   : in  std_logic; 
              middle_right_pixel  : in  std_logic; 
              bottom_left_pixel   : in  std_logic; 
              bottom_middle_pixel : in  std_logic; 
              bottom_right_pixel  : in  std_logic; 
              sobelx              : out std_logic; 
              sobely              : out std_logic 
         ); 
    end entity sobel; 

    architecture noddy of sobel is 
        signal p1 : std_logic := top_left_pixel;
        signal p2 : std_logic := top_middle_pixel;
        signal p3 : std_logic := top_right_pixel;
        signal p4 : std_logic := middle_left_pixel;
        signal p6 : std_logic := middle_right_pixel;
        signal p7 : std_logic := bottom_left_pixel;
        signal p8 : std_logic := bottom_middle_pixel;
        signal p9 : std_logic := bottom_right_pixel;

        signal sobelx_s : integer;
        signal sobely_s : integer; 

    begin 
        -- Same error on both these lines
         sobelx_s <= (p3 - p1) + ((p6 & '0') - (p4 & '0')) + (p9 - p7); 

         sobely_s <= (bottom_left_pixel - top_left_pixel) + ((bottom_middle_pixel & '0') - (top_middle_pixel & '0')) + (bottom_right_pixel - top_right_pixel); 

    end architecture noddy; 

経験がほとんどない VHDL でソーベル フィルターを作成しようとしています。このエンティティは、sobel アルゴリズムが入力データで機能するかどうかをテスト ベンチで試すためだけに作成されています。

助言がありますか?

すべての回答は非常に高く評価されています。完全な VHDL の初心者を役立つものに導くことができれば、大歓迎です。

4

2 に答える 2

2

そのコードはおなじみarchitecture noddyのようです:)少し変わっていると思いました...

代わりにこれを試してください(上記のリンクから):

entity sobel is

    port (
        top_left_pixel      : in  integer;
        top_middle_pixel    : in  integer;
        top_right_pixel     : in  integer;
        middle_left_pixel   : in  integer;
        middle_right_pixel  : in  integer;
        bottom_left_pixel   : in  integer;
        bottom_middle_pixel : in  integer;
        bottom_right_pixel  : in  integer;
        sobelx              : out integer;
        sobely              : out integer
    );

end entity sobel;
architecture noddy of sobel is

begin  -- architecture noddy

    sobelx <= (-1*top_left_pixel)+(-2*middle_left_pixel)+(-1*bottom_left_pixel)
              +(1*top_right_pixel)+(2*middle_right_pixel)+(1*bottom_right_pixel);
    sobely <= (-1*top_left_pixel)+(-2*top_middle_pixel)+(-1*top_right_pixel)
              +(1*bottom_left_pixel)+(2*bottom_middle_pixel)+(1*bottom_right_pixel);
end architecture noddy;
于 2012-05-09T14:52:25.380 に答える
1

まず、Sobel演算子は通常、畳み込みを使用してグレースケール画像に適用されます。または、そうでなければ、本当にバイナリイメージが必要な場合があります。したがって、Sobel行列は次のようになります。

-1 0 +1
-2 0 +2
-1 0 +1

水平方向の変更。これを元の画像で複雑にします。最初にグレースケール入力を試してから、バイナリイメージ入力を試してみてください。

VHDLエラーが発生する理由は、またはに()を追加したり、またはに計算を実行したりできないためです。数学演算子をオーバーロードするand型(おそらくここ)を使用する必要があります。そのためにライブラリを使用します(VHDL環境にはそれが必要です。これはかなり標準的です)。+std_logicstd_logic_vectorunsignedsignedsignednumeric_std

ただし、実際のエンティティがあり、その入力が実際の信号である場合は、である必要がありますstd_logic_vector次に、このグラフに従って、それらをsigned/にキャストする必要があります。unsigned

于 2012-05-09T15:02:45.783 に答える