2

どのようにしますか?

私はこれに非常に慣れていません。これは十分に簡単だと確信していますが、方法がわかりません

ここにいくつかの擬似コードがあります

port(x,y: in std_logic_vector (2 downto 0) -- 3 bit input that is basically counted eg ("000", "001", "010"... "111", "000" ...)
    q_out : out integer); -- this is just an example

signal temp_q_out: integer;

when x (or y) increments -- THIS IS THE PART I CAN'T GET
    temp_q_out <= temp_ q_out + 1;


case temp_q_out is
    when 0 q_out <= 7
    when 1 q_out <= 12
    when 2 q_out <= 4
    when others q_out <= 100

x または y がインクリメントするときだけ temp_q_out をカウントし、それ以外のときはカウントしないようにするにはどうすればよいですか? x または y が変化するまで出力 q_out を常に 7 にし、x または y が再び変化してから 2 になるまで 12 にします。通常、出力はすぐに 100 になります。

どんな助けでも大歓迎です

みんな乾杯:-)

4

2 に答える 2

1

非同期ロジックでやりたいことを安全に行う方法はないと思います。これを合成すると仮定すると、クロック入力が必要です。x次に、との以前の値を保存しy、新しい値が古い値と等しいかどうかをチェックするプロセスを追加できます。次に例を示します。

process(clk)
  variable prev_x, prev_y : std_logic_vector(2 downto 0) := (others => '0');
begin
  if rising_edge(clk) then
    if (x /= prev_x) or (y /= prev_y) then
      temp_q_out <= temp_q_out + 1;
    end if;
    prev_x := x;
    prev_y := y;
  end if;
end process;

于 2013-05-06T14:03:35.823 に答える
0

プロセスを使用します。プロセスはアトミック ステートメントのように実行されます。それらの中で変数を使用できます。次のプロセスは、x 信号と y 信号をリッスンします。いずれかが変更されると、プロセスは順次実行されます。

process(x, y)
variable tmpX: integer := -1;
variable tmpY: integer := -1;
begin
    if (x = tmpX + 1) or (y = tmpY + 1) then
        temp_q_out <= temp_ q_out + 1;
    tmpX := x;
    tmpY := y;
end process;

プロセスの最初の実行は特定のケースに依存するため、必要に応じて「-1」の値を変更してください。

于 2013-05-04T12:51:35.100 に答える