シリアル経由で異なる (一定でない) 値を出力しようとしています。シリアル通信は正常に動作していますが、ASCII テーブルに基づいて、任意のサイズと値の整数/自然/std_logic_vector/unsigned/signed 型を 8 ビット std_logic_vectors の配列に変換する、洗練された合成可能な方法はないようです。私がやろうとしていることは珍しいことではないので、それは非常に奇妙です。
これを行う 1 つの方法は、大きなルックアップ テーブルを使用するか、if-elsif-else ステートメントの長くネストされたチェーンを使用することですが、これは非常に非効率的で洗練されていないように思えます。
これは合成しません:
eight_bit_result <= std_logic_vector(to_unsigned(character'pos(some_integer), 8));
ISE 14.7 は、一部のヘッダー ファイルが原因で発生したあいまいなエラーで中断します。機能したとしても、0 ~ 255 以外の値では機能しません。これを行う正しい方法は何ですか?
編集:
0 から 9999 までの整数値をカバーするための簡単で汚い関数を作成しました。クロックされたプロセスや追加のエンティティなどは必要ありません。これまでに提案された答えは、過度に複雑に見えます。
function get_ascii_array_from_int(i : integer range 0 to 9999) return char_array is
variable result : char_array(0 to 3) := (x"30", x"30", x"30", x"30"); -- 0000
begin
if i >= 0 then
if i < 1000 then
result(0) := x"30"; -- 0
result(1 to 3) := get_ascii_array_from_int_hundreds(i);
elsif i < 2000 then
result(0) := x"31"; -- 1
result(1 to 3) := get_ascii_array_from_int_hundreds(i-1000);
elsif i < 3000 then
result(0) := x"32"; -- 2
result(1 to 3) := get_ascii_array_from_int_hundreds(i-2000);
elsif i < 4000 then
result(0) := x"33"; -- 3
result(1 to 3) := get_ascii_array_from_int_hundreds(i-3000);
elsif i < 5000 then
result(0) := x"34"; -- 4
result(1 to 3) := get_ascii_array_from_int_hundreds(i-4000);
elsif i < 6000 then
result(0) := x"35"; -- 5
result(1 to 3) := get_ascii_array_from_int_hundreds(i-5000);
elsif i < 7000 then
result(0) := x"36"; -- 6
result(1 to 3) := get_ascii_array_from_int_hundreds(i-6000);
elsif i < 8000 then
result(0) := x"37"; -- 7
result(1 to 3) := get_ascii_array_from_int_hundreds(i-7000);
elsif i < 9000 then
result(0) := x"38"; -- 8
result(1 to 3) := get_ascii_array_from_int_hundreds(i-8000);
else
result(0) := x"39"; -- 9
result(1 to 3) := get_ascii_array_from_int_hundreds(i-9000);
end if;
else
result := (x"6e", x"65", x"67", x"23"); -- "neg#"
end if;
return result;
end get_ascii_array_from_int;
ご想像のとおり、他に 3 つのメソッドがあります。
この関数について何を言おうとしますが、数サイクル後ではなく、必要なときに正しい結果を生成し、シンプルでわかりやすいことを覚えておいてください。負の数と大きな数をカバーするように簡単に拡張できます。