2016-04-04 11 views
-2

4x4行列の各列の長さを決定します。各列の長さは、各列の下端から上に数えられ、最初にアクセスされた '1'からしかカウントされません。行列内の列の長さを決定する

1110 
0111 
0110 
0001 

列1 = 1、列2 = 3、COLUMN3 = 3、Column4 = 4等...

誰もが、私はこれを行うことができますどのように任意のアイデアを持っていますか?私はこれまで、各列を抽出する関数の横に行列を生成しようとしました。

type col_mat is array (0 to 3) of std_logic; 
type matrix is array (0 to 3, 0 to 3) of std_logic; 

signal M: matrix; 
signal temp_col : col_mat; 
signal count : unsigned (1 downto 0):= "00"; 

function extract_col(x: matrix; column : integer) return col_mat is 
variable ret: col_mat; 
begin 
    for i in col_mat'range loop 
     ret(i) := x(i,column) 
    end loop; 
    return ret; 

end function; 

begin 
    if rising_edge(clk) then 
     temp_col<= extract_col(M, to_integer(count)); 
     count <= count+1; 
    end if; 
end process; 
+2

行にはどのようにして底面と上面がありますか?列を意味しますか?あなたのサンプルテキストは、1つのベースのインデックスを使用しますが、VHDLコードはゼロベースのインデックスを使用します。あなたの質問を確認してください。 – Paebbels

+0

私は今編集しました。行を書くつもりはありません – Craig3832

+0

だから、列ベクトルの中で最も高いビット位置を探したいのですか?一般的な方法は、1)ベクトルを反転させること、 2)新しいベクトルを生成し、2進数を2の補数に変換する。 3)両ベクトル=>の論理積は、a 1がMSBの位置にある場合に、1つのホットエンコード値を与える。次に、小さなLUTを使って結果を得ることができます。行列がかなり小さいので、別のオプションは、値をデコードするLUTに各列ベクトルを供給することです。 – dieli

答えて

0

あなたはプライオリティエンコーダを記述しているし、その様子から、あなたはそれがターゲットデバイスに基づいていくつかのクロック・レートの上限に実行することができ、1クロックで動作を意味している(あなたが合成するだろうと仮定した場合) 。

優先順位のエンコードは、ifステートメント、caseステートメント、exitを持つループステートメント(Martin Zabelがコメントしたもの)、ロジック演算子または条件付きシグナル割り当てを組み合わせて記述することができます。

この特定の用途では、ループステートメントは最もコンパクトで、1つはプロセスに追加されています。

次のコードは、a Minimal, Complete, and Verifiable exampleに詳しく解説されています。

結果は配列タイプインデックス(0から始まる)の観点からのものです。

カウント名の列のパイプラインレジスタと、 '1'が見つかった(found_1)、最も高い行の値 '1'が(想像上の名前の行)であることを指定する信号のレジスタを追加しました:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity column is 
end entity; 

architecture foo of column is 

    type col_mat is array (0 to 3) of std_logic; 
    type matrix is array (0 to 3, 0 to 3) of std_logic; -- (row,column) 

    -- signal M: matrix; 

    -- 1110 
    -- 0111 
    -- 0110 
    -- 0001 
    -- 
    -- Column1=1, Column2=3, Column3=3, Column4=4 etc... 
    -- 
    -- column0 = 0, column1 = 2 column2 = 2, column3 = 3 
    -- (matrix is defined so (0,0) is the upper left hand corner) 
    -- Looking for the highest column index occupied by a '1' 

    signal M: matrix := ( -- for demo provide matrix default value 
        ('1','1','1','0'), -- row 0 
        ('0','1','1','1'), 
        ('0','1','1','0'), 
        ('0','0','0','1') -- row 3 
       ); 

    -- signal temp_col: col_mat; 
    signal count:  unsigned (1 downto 0):= "00"; 

    function extract_col(x: matrix; column: integer) return col_mat is 
    variable ret: col_mat; 
    begin 
     for i in col_mat'range loop 
      ret(i) := x(i,column); -- was missing semicolon 
     end loop; 
     return ret; 
    end function; 

    -- added signals: 
    signal clk:  std_logic := '1'; -- rising_edge() requires 0 -> 1 trans 
    signal found_1: std_logic := '0'; 
    signal column: unsigned (1 downto 0); 
    signal row:  integer range 0 to 3; 
    signal mat_col: col_mat; 
begin 

UNLABELED: 
    process (clk) 
     variable temp_col: col_mat; -- made temp_col a variable, use immediately 
    begin 
     if rising_edge(clk) then 
      temp_col := extract_col(M, to_integer(count)); -- was signal 
      -- priority encoder:        -- added loop 

      for i in temp_col'RIGHT downto temp_col'LEFT loop -- highest first 
       if temp_col(i) = '1' then 
        found_1 <= '1'; 
        column <= count; 
        row <= i; 
        exit; 
       else 
        found_1 <= '0'; 
       end if; 
      end loop; 
      mat_col <= temp_col; -- added 
      count <= count + 1; 
     end if; 
    end process; 

CLOCK: -- Added clock process 
    process 
    begin 
     wait for 10 ns; 
     clk <= not clk; 
     if now > 90 ns then 
      wait; 
     end if; 
    end process; 
end architecture; 

し、シミュレートするとき、これは与える:

column.png

を私が使用するツールは、デルタサイクル波形を行わないと変数は、時間の概念を持っていないので、私はmat_colを追加しました。 temp_colは、割り当てられた直後に値を使用できるようにする変数になっています(更新された信号値は現在のシミュレーションサイクルでは使用できません)。

また、私はあなたの質問からMのデフォルト値を提供しているのを見ることができます。

関連する問題