2014-12-02 30 views
-1
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; 

除count之外的所有信号。一旦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.如何不定期更改信号值?

+0

您是否为'enable'和'count'设置了默认值?请发布完整的流程块。注意'enable'会被转换为一个寄存器,所以在比较和设置之间有一个延迟值。此外,启用的更改不能在同一个周期中进行评估,因为这是一个信号。 – Paebbels 2014-12-02 13:58:07

+0

从你的仿真波形来看,我觉得你没有在你的灵敏度列表中包含'enable','a_0','b_0','a_1'和'b_1',但我无法确定,因为你没有没有发布完整的例子。因为你在'rising_edge(clk)'之外测试了它们的值,所以需要包含它们。另外,您可以使用'else'而不是''enable = 0'的单独测试。 – QuantumRipple 2014-12-02 16:33:30

回答

0

把最后两个,如果在另一个进程

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

这个过程使能信号敏感,所以随时可启用变化的条件下,独立的时钟,该语句将立即生效(异步)

+0

它的工作。 :) – Raviraj 2014-12-02 17:58:09

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在状态机中包含数据路径和多路复用器(我认为这是其中的一部分)不是一个好的设计选择。
+0

混合你的建议和蓝图的建议后,它的工作:) – Raviraj 2014-12-02 17:59:37

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; 

注意,在这种情况下,多路转换器将锁之后。如果您对这些信号有时间问题,这可能很重要。

+0

当....不支持。这是一个错误。 – Raviraj 2014-12-02 17:57:14

+0

@Raviraj这很奇怪。你会得到什么样的错误?你提到的这个流程是否在流程之外?也许你可以尝试添加括号(enable ='0'),但我不确定它会更好。 – grorel 2014-12-02 23:24:33

0

从你的模拟波形,它看起来像你对我没有包括enablea_0b_0a_1,并b_1在你的敏感名单,但因为你没有发布完整的例子我不能肯定。由于您测试了if rising_edge(clk)之外的5个提到的信号的值,因此需要包括它们。这些值仅在clk的下降沿更新,因为假设clk是您的敏感性列表中唯一的东西,那就是下一次对该过程进行评估。

它应该是其他书面功能,尽管您可以使用else而不是enable = 0的单独测试,以获得轻微的可读性改进。合成通常会忽略灵敏度列表(它只是使仿真效率更高),所以如果要进行综合,它应该已经可以工作。

+0

好的。我添加了灵敏度列表,它的工作。 – Raviraj 2014-12-02 18:01:54