如何立即改变信号值?

时间:2014-12-02 12:54:00

标签: vhdl

if(rising_edge(clk)) then        
  count := count + 1;
  if count = 3 then
    enable <= 1;
  elsif count = 6 then
    enable <= 0;
    count := 0;             
  end if;
end if;

if enable = 0 then
  a0i <= a_0;
  boi <= b_0;
end if;

if enable = 1 then
  a0i <= a_1;
  boi <= b_1;
end if;

除计数外,所有信号都是。一旦enable变为0或1,a0i和boi的值应该响应。我尝试使用变量。但它不能让我使用过程。 I am getting the o/p as this. How ever I want to change the input as soon as enable signal change.

4 个答案:

答案 0 :(得分:0)

将最后两个if条件放在另一个进程中

Process(enable, a_0, b_0, a_1, b_1)
begin 
  If(enable = '0')THEN
       a0i <= ...
       ....
  ELSE
        .....
END IF;
END PROCESS;

此过程对使能信号很敏感,因此只要启用发生变化,独立于时钟,语句就会立即生效(异步)

答案 1 :(得分:0)

解决方案1:使用2个流程作为蓝图。

解决方案2:使用内部变量。

process(clk)
  variable count    : natural range of 0 to 6   := 0;
  variable enable_i : std_logic                 := '0';
begin
  if(rising_edge(clk)) then      
    count := count + 1;
    if count = 3 then
      enable_i := '1';
    elsif count = 6 then
      enable_i := '0';
      count    := 0;                
    end if;
  end if;

  if enable = '0' then
    a0i <= a_0;
    boi <= b_0;
  else
    a0i <= a_1;
    boi <= b_1;
  end if;

  enable <= enable_i;
end process;

一些提示:

  • 也许,类型布尔值更适合您的信号/变量enable_i
  • 如果enable_i仅在流程中使用,那么您可以将转化移至enable
  • 包括状态机中的数据路径和多路复用器(我认为这是它的一部分)不是一个好的设计选择。

答案 2 :(得分:0)

你也可以从你的过程中取出以下两个等式。

process(...)
 [...]
 if enable = 0 then
   a0i <= a_0;
   boi <= b_0;
 end if;

 if enable = 1 then
   a0i <= a_1;
   boi <= b_1;
 end if;
end process

然后你不能再使用IF语句了,但你可以使用WHEN语句:

a0i <= a_0 when enable = '0' else a_1;
boi <= b_0 when enable = '0' else b_1;

请注意,在这种情况下,多路复用器将位于锁存器之后。如果您对这些信号有时序问题,这可能很重要。

答案 3 :(得分:0)

从您的模拟波形中,我认为您未能在灵敏度中包含enablea_0b_0a_1b_1列表,但我不能确定,因为你没有发布完整的例子。因为您在if rising_edge(clk)之外测试了5个提到的信号的值,所以需要包含它们。这些值仅在clk的下降沿更新,因为假设clk是敏感列表中的唯一内容,即下次评估该过程时。

尽管您可以使用else而不是enable = 0的单独测试来提高可读性,但它应该是书面的功能。合成通常忽略敏感性列表(它只是使模拟更有效),所以如果你要合成它应该已经有效了。