是否有可能在'case is when'结构中使用一个进程?

时间:2014-10-25 12:10:10

标签: process case vhdl fpga

答案很清楚。它是VHDL中合法的编程方式吗?例如;

case (i) is
        when 0=>
             process() is begin
                counter:=0;
             end process;
end case;

提前感谢您的回复。

编辑Brian Drummond的回复:

我知道在案例中它可以使用选择性块。但是在那些块中,行是按顺序执行还是同时执行?

例如;

case (i) is
            when 0=>

                    if reset='1' then

                        giden_data<='0';
                        k:=0;
                        i:=0;
                        s_clk<='0';

                    elsif reset='0' and rising_edge(clk) then

                        giden_data<=CR(k);

                        if k<7 then

                        k:=k+1;

                        elsif k=7 then

                        giden_data<='0';

                        end if;

                        i:=0;

                    end if;
end case;

是否可以在案例陈述中使用同步过程(如在&#39;过程中使用的那样)? ISE为上面的代码提供了错误;

Unexpected embedded clock statement in sequential description for signal <giden_data>.

我想知道错误是由case语句中的同步代码或块中的其他内容引起的。

3 个答案:

答案 0 :(得分:1)

简答:不。 case ... is是一个顺序语句,必须放在一个进程中,而不是相反。

在VHDL-2008中,可以将进程放在case ... generate语句中,但这可能不是您想要的。这取决于你想要完成的任务。

修改更新的问题

您写道:

case (i) is
  when 0=>
    if reset='1' then
      giden_data<='0';
      k:=0;
      i:=0;
      s_clk<='0';
    elsif reset='0' and rising_edge(clk) then
      giden_data<=CR(k);
      if k<7 then
        k:=k+1;
      elsif k=7 then
        giden_data<='0';
      end if;
      i:=0;
    end if;
end case;

适当的结构是:

if reset='1' then
  giden_data<='0';
  k:=0;
  i:=0;
  s_clk<='0';
elsif rising_edge(clk) then
  case (i) is
    when 0=>
      giden_data<=CR(k);
      if k<7 then
        k:=k+1;
      elsif k=7 then
        giden_data<='0';
      end if;
      i:=0;
  end case;
end if;

整个块需要包装在一个进程中。这可能无法实现您的目标,但您使用的结构因各种原因无法正常工作。

现在,使用VHDL-2008,您可以切换到case ... generate,如上所述,但这会导致您的案例评估在编译时保持静态,因此如果您对根据信号值在运行时切换逻辑,您需要扩展/修改上述内容以满足您的需求。 (另请参阅Brian Drummond的回答)

编辑以回复评论

您写道:

  

好的,但是我问我是否不使用进程但是使用我在进程中编写的代码,是否按顺序或同时执行?

不能在流程之外使用顺序代码(case语句,if语句等)。而且,合成的VHDL不像软件那样“执行”。所发生的是物理逻辑是从代码中推断出来的,并且本质上它们存在并同时运行(物理上,而不是算法上)。至于算法如何有效地运作,它取决于你的设计。

但是,对于您要完成的任务,为什么不能在流程中使用case语句?

process
begin
  case i is
    when 0 =>
      -- code that only operates when i = 0
    when 1 =>
      -- code that only operates when i = 1
    ...
  end case;
end process;

这不能以什么方式实现你的目标?

答案 1 :(得分:1)

没有。但是从你后来的评论

  

我想在适合特定条件时运行特定的块。

您可以从Process中的Case语句中获得所需内容。

Process(clock,reset) is
   variable counter : integer;
begin
   if reset = '1' then
      counter := 0;
   elsif rising_edge(clock) then
      case (i) is
      when 0 =>
         counter := 0;
      when 1 =>
         counter := counter + 1;
      when 2 =>
         counter := counter - 1;
      when others =>
         null;  -- nothing happens to counter
      end case;
   end if;
end process;

在每个时钟周期中,测试i的当前值并执行其中一个特定块。如果这不是您想要的,我们需要更好的描述。

代码的工作方式就好像Case选择的行按顺序执行,然后进程执行所选块中的所有行,并在时钟边沿之后立即完成。

请注意,信号和变量在一个过程中表现不同:如果您使用C语言编写软件,变量将遵循您熟悉的规则。但是信号的行为方式不同,因为它们是进程之间通信的方法。 见this Q&A for more information on how signals and processes work.

答案 2 :(得分:0)

VHDL具有with并发分配,与case类似于顺序语句,可能看起来像:

with i select
  counter <=  0 when 0,
             -1 when others;