あなたはプライオリティエンコーダを記述しているし、その様子から、あなたはそれがターゲットデバイスに基づいていくつかのクロック・レートの上限に実行することができ、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;
し、シミュレートするとき、これは与える:
を私が使用するツールは、デルタサイクル波形を行わないと変数は、時間の概念を持っていないので、私はmat_colを追加しました。 temp_colは、割り当てられた直後に値を使用できるようにする変数になっています(更新された信号値は現在のシミュレーションサイクルでは使用できません)。
また、私はあなたの質問からMのデフォルト値を提供しているのを見ることができます。
行にはどのようにして底面と上面がありますか?列を意味しますか?あなたのサンプルテキストは、1つのベースのインデックスを使用しますが、VHDLコードはゼロベースのインデックスを使用します。あなたの質問を確認してください。 – Paebbels
私は今編集しました。行を書くつもりはありません – Craig3832
だから、列ベクトルの中で最も高いビット位置を探したいのですか?一般的な方法は、1)ベクトルを反転させること、 2)新しいベクトルを生成し、2進数を2の補数に変換する。 3)両ベクトル=>の論理積は、a 1がMSBの位置にある場合に、1つのホットエンコード値を与える。次に、小さなLUTを使って結果を得ることができます。行列がかなり小さいので、別のオプションは、値をデコードするLUTに各列ベクトルを供給することです。 – dieli