答案很清楚。它是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语句中的同步代码或块中的其他内容引起的。
答案 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;