在VHDL中,何时才是使用Process语句的正确时间?

Ear*_*rlz 1 vhdl hdl

我现在正在第二或第三次学习VHDL。(这一次拥有一本非常好的和免费的电子书),我终于开始大量“获取”它。现在,我正在学习有关行为风格和流程陈述的知识,并且其中大部分是有意义的。但是,我在许多地方都读到,除某些情况外,应避免使用流程。我的意思是,从理论上讲,不是所有事情都可以在数据流中实现而不是在行为上实现吗?

何时确切应该使用流程声明?

Pet*_*ett 5

流程声明非常有用,在什么情况下您被告知不要使用它们?

在许多情况下,您将使用流程语句,下面将概述其中一些:

处理语句(用于综合)的最常见用法之一是描述与时钟信号同步的逻辑,例如,一个简单的计数器在不复位时每个时钟周期递增一次,其描述如下:

DATA_REGISTER : process(CLOCK)
begin
  if rising_edge(CLOCK) then
    if RESET = '1' then
      COUNTER <= (others => '0');
    else
      COUNTER <= COUNTER + 1; --COUNTER is assumed to be of type 'unsigned'
    end if;
  end if;
end process;
Run Code Online (Sandbox Code Playgroud)

随着设计变得越来越复杂,您不可避免地会在某个时候实现状态机,这将根据您选择实现的状态机的样式采用一个或多个过程。

对于行为代码,可以将过程与等待语句结合使用以生成测试向量或为真实系统的行为建模。这是一个来自我的测试平台的100MHz时钟发生器的基本示例:

architecture BEH of ethernet_receive_tb is  
  signal  s_clock : std_logic := '0'; --Initial assignment to clock kicks off the process.
begin
  CLOCKGEN : process(s_clock)
  begin
    s_clock <= not s_clock after 5 NS;
  end process CLOCKGEN;

...
Run Code Online (Sandbox Code Playgroud)

您还可以使用进程描述异步逻辑,在这种情况下,您需要将在进程中读取的所有信号都包括在敏感度列表中,并且需要确保始终定义任何输出,以避免推断出的锁存器。

IF_ELSE: process (SEL, A, B)
begin
  F <= B; -- Default assignment
  if SEL = '1' then
    F <= A;
  end if;
end process;
Run Code Online (Sandbox Code Playgroud)

希望您可以看到该流程语句非常有用,并且可以在许多不同的情况下使用它。希望这能回答您的问题!