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 计数?我希望我的输出 q_out 一直为 7,直到 x 或 y 发生变化,然后为 12,直到 x 或 y 再次发生变化,然后为 2。通常发生的情况是输出立即变为 100。

任何帮助将不胜感激

干杯伙计们:-)

4

2 回答 2

1

我认为没有一种安全的方法可以使用异步逻辑来做你想做的事情。假设你想合成这个,你需要一个时钟输入。然后,您可以添加一个存储 和 以前值的进程,xy检查新值是否等于旧值。这是一个例子:

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 回答