3

ねえ、VHDL で AND 2 を組み合わせることはまったく可能かどうか疑問に思っていましSTD_LOGIC_VECTORSた。たとえば、文字を VGA モニターに出力する VHDL プログラムを作成しています。ベクトルPixelRow: IN STD_LOGIC_VECTOR(9 DOWNTO 0)とがありPixelColumn: IN STD_LOGIC_VECTOR(9 DOWNTO 0)ます。私がやろうとしているのSTD_LOGICは、2 つのピクセル ベクトルを取り、それらを別のベクトルと AND 演算する出力を用意することです。

    Output <= (PixelRow AND NOT "0000000000") OR (PixelColumn AND NOT "0000000000") OR      
              (PixelRow AND NOT "0111011111") OR (PixelColumn AND NOT "1001111111");

このコードを使用して、次のコードを簡素化できることを願っています。

    Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT   
              PixelRow(3) AND NOT PixelRow(4) AND NOT PixelRow(5) AND NOT PixelRow(6)      
              AND NOT PixelRow(7) AND NOT PixelRow(8) AND NOT PixelRow(9)))
          OR ((NOT PixelRow(0) AND PixelRow(1) AND PixelRow(2) AND PixelRow(3) AND 
              NOT PixelRow(4) AND PixelRow(5) AND PixelRow(6) AND PixelRow(7) AND 
              PixelRow(8) AND PixelRow(9)))
          OR ((NOT PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND 
              NOT PixelColumn(3) AND NOT PixelColumn(4) AND NOT PixelColumn(5) AND NOT 
              PixelColumn(6) AND NOT PixelColumn(7) AND NOT PixelColumn(8) AND NOT 
              PixelColumn(9)))
          OR ((PixelColumn(0) AND NOT PixelColumn(1) AND NOT PixelColumn(2) AND 
              PixelColumn(3) AND PixelColumn(4) AND PixelColumn(5) AND PixelColumn(6) 
              AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9)));

より大きなコード ブロックは、画面の周りにボックスを描画します。これを行うためのはるかに簡単な方法があることを願っています。このコードを単純化する方法を知っている人はいますか?

ありがとう

4

3 に答える 3

6

VHDL で 2 つの std_logic_vectors のビットごとの AND を取りたい場合は、次のようにします。

signal a : std_logic_vector(15 downto 0);
signal b : std_logic_vector(15 downto 0);
signal x : std_logic_vector(15 downto 0);

x <= a AND b;

残りのビット演算子については、Google がお手伝いします (非常に直感的で、AND、NAND、OR、NOR、NOT など)。

これを減らしたい場合:

Output <= ((NOT PixelRow(0) AND NOT PixelRow(1) AND NOT PixelRow(2) AND NOT   
...
          AND PixelColumn(7) AND PixelColumn(8) AND PixelColumn(9)));

それならとても簡単です。

AND 演算子の真理値表を見ると、次の唯一のシナリオであることがわかります。

output <= PixelRow(0) AND PixelRow(1) AND 
    ... AND PixelRow(8) AND PixelRow(9)

PixelRow = "1111111111" の場合は「1」に減少します。

SO、非同期的に、コードは次のように置き換えることができます:

output <= '1' when (PixelRow = "1111111111") else '0'

列と行の両方を一度に:

output <= '1' when (PixelRow = "1111111111") OR
                   (PixelColumn = "1111111111") else 
          '0';

上記のプリンシパルは、元の投稿で言及されている次のような他の操作に拡張できます。

other_value <= "0111011111";
output <= '1' when ((PixelRow AND (NOT(other_value))) = "111111111") else '0'

列を式に追加したり、操作を同期的に実行したりすることは、読者の演習として残されています。

于 2012-06-15T06:05:59.203 に答える
6

あなたが何をする必要があるか、および/または、何を1ビットに減らす必要があるかは私には明らかではありません。

確かに、同じサイズのベクトルを返すビット単位のベクトル演算子がありますandor

PixelRowとの間の等値/不等値をテストする必要がある場合は、次の"0000000000"いずれかを記述できます:PixelRow /= "0000000000"またはPixelRow = "0000000000".

ベクトルvect : std_logic_vector(7 downto 0)を単一ビットに縮小する必要がある場合bit : std_logic、最も簡単な方法はおそらくプロセスを使用することです。

process (vect) is
    variable tmp : std_logic;
begin
    tmp := '1';
    for I in 7 downto 0 loop
        tmp := tmp and vect(I);
    end loop;
    bit <= tmp;
end process;

これを頻繁に行う必要がある場合は、 afunctionではなく aprocessを定義してこれを行うことができます。

于 2012-06-14T05:55:47.330 に答える