Vhdl 如何不稳定地改变信号值?

Vhdl 如何不稳定地改变信号值?,vhdl,Vhdl,除了计数之外,所有的都是信号。a0i和boi的值应在启用变为0或1时立即响应。我试着使用这个变量。但它不允许我在进程之外使用。 将最后两个if条件放在另一个过程中 if(rising_edge(clk)) then count := count + 1; if count = 3 then enable <= 1; elsif count = 6 then enable <= 0; count := 0;

除了计数之外,所有的都是信号。a0i和boi的值应在启用变为0或1时立即响应。我试着使用这个变量。但它不允许我在进程之外使用。

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

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;

此过程对启用信号非常敏感,因此,无论何时启用发生变化(与时钟无关),这些语句都将立即异步生效。解决方案1:使用如蓝图所述的2个过程

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

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

Maybee,boolean类型更适合您的信号/变量enable_i 如果enable_i仅在进程内部使用,则可以删除转换以启用 在状态机中包括数据路径和多路复用器,我认为这是它的一部分,这不是一个好的设计选择。
你也可以从你的过程中得到下面这两个等式

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;
然后,您不能再使用IF语句,但可以使用WHEN语句:

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

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

从您的模拟波形来看,您似乎没有在灵敏度列表中包括enable、a_0、b_0、a_1和b_1,但我不能确定,因为您没有发布完整的示例。由于您在if rising_EdgeLk之外测试上述5个信号的值,因此需要将它们包括在内。这些值仅在clk下降沿更新,因为假定clk是灵敏度列表中唯一的内容,即下次评估过程时


它应该像编写的那样具有其他功能,尽管您可以使用else而不是单独测试enable=0,以稍微提高可读性。合成通常会忽略敏感度列表,它只是使模拟更有效,因此如果要合成,它应该已经工作。

是否为启用和计数设置了默认值?请发布完整的流程块。注:启用将转换为寄存器,因此在比较和将启用设置为值之间存在延迟。此外,启用的更改不能在同一个周期内进行评估,因为它是一个信号。从您的模拟波形来看,在我看来,您没有将启用、a_0、b_0、a_1和b_1包含在灵敏度列表中,但我不能确定,因为您没有发布完整的示例。因为您在rising_EdgeLk之外测试它们的值,所以需要将它们包括在内。另外,您可以使用else而不是单独测试enable=0。将您的建议和blueprint的建议混合在一起后,就成功了:@Raviraj这很奇怪。你会犯什么样的错误?您是否在上述流程之外设置了这些行?也许您可以尝试在enable='0'周围添加括号,但我不确定这是否更好。
a0i <= a_0 when enable = '0' else a_1;
boi <= b_0 when enable = '0' else b_1;