2

2 つの std_logic_vectors があるとします。

inputA : std_logic_vector(31 downto 0)
inputB:  std_logic_vector(31 downto 0)

連結を使用してシフトinputAするにはどうすればよいですか?inputB

左または右に 1 桁シフトする方法は知っていますが、N 桁を右 (または左) にシフトする方法がわかりません。注: これはクロックレス回路であり、標準の vhdl シフト演算子を使用できません。

連結以外の他の技術やアイデアも同様に高く評価されます。

4

2 に答える 2

7

これを行う最も簡単な方法は、次のようなものです。

library ieee;
use ieee.numeric_std.all;
...
output <= std_logic_vector(unsigned(inputA) srl to_integer(unsigned(inputB)));

(ところで、クロックレス回路であることは、シフト演算子を使用できるかどうかとは関係ありません。それを決定するのはデータ型です。このシフト操作は、シンセサイザーによって、さらに何かを書いた場合と同じロジックに変換されます。 case ステートメントが複雑で、すべて手作業で展開されています。)

于 2012-09-16T18:31:20.110 に答える
3

私はwjlのアプローチを好みますが、連結を使用する方法を具体的に求められた場合は、これを試してください:

function variable_shift(i : std_logic_vector, num_bits : integer) 
   return std_logic_vector is
   constant zeros : std_logic_vector(num_bits-1 downto 0) := (others => '0');
begin
   return i(i'high-num_bits downto i'low) & zeros;
end function;

std_logic_vector(パラメータに1秒かかるように書くこともできますがnum_bits、基本的には数値なので、常に数値ベースの型を使用します)

于 2012-09-17T10:15:17.507 に答える