2

我正在经历第二次或第三次学习 VHDL 的阶段。(这次配备了一本非常好且免费的电子书),我终于开始“获得”相当多的内容了。现在我正在学习行为风格和过程陈述,其中大部分是有道理的。但是,我在许多地方读到过,除了某些情况外,应避免使用流程。我的意思是,理论上不能一切都在数据流而不是行为中实现吗?

什么时候应该明确应该使用流程声明?

4

3 回答 3

7

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

在许多不同的情况下您会使用流程声明,我将在下面概述其中的一些:

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

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;

随着您的设计变得越来越复杂,您将不可避免地在某些时候实现状态机,这将使用一个或多个进程,具体取决于您选择实现的状态机的风格。

对于行为代码,您可以将进程与等待语句结合使用来生成测试向量或模拟真实系统的行为。这是一个非常基本的 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;

...

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

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

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

于 2012-04-19T15:59:02.093 回答
4

流程块是您的朋友。

他们提供了一种说法“这段代码是相关的。它的输入是 X、Y、Z,它驱动 A、B、C”。输入由敏感度列表记录(除非它是一个计时过程,在这种情况下它应该在您的评论中)。如果有其他任何东西驱动相同的信号,那么您将在模拟中收到警告、错误、X(取决于您的工具)。无论你得到什么,都很明显。

就个人而言,我很乐意在一个实体中编写多个流程,但每个人都有自己的风格。例如,如果我有多个管道阶段,则每个阶段都是一个过程。如果我有并行的非干扰路径,每个路径都将在一个单独的进程中。通过这种方式,代码被构造成小的、易于阅读的块。小的简单逻辑综合成小的快速块(通常)。

您可以将我的风格视为将它们用作轻量级实体。

于 2012-04-19T17:58:11.977 回答
2

在可综合代码中,只要您需要将信息从一个时钟周期保存到另一个时钟周期,就需要处理。行话中的“存储状态”。

(请注意,一个过程可以由代码暗示,例如

d <= q when rising_edge(clk);

)

如果代码不可综合,则流程对于让事件以特定顺序发生很有用:

p1: process
begin
   data <= "--------";
   WE <= '0';
   wait until reset = '1';
   wait until processor_initialised = '1';
   assert ACK = '0' report "ACK should be low!" severity error;
   data <= X"16";
   WE <= '1';
   wait until ACK = '1';
end process;

我的大部分代码每个实体都有一个进程。每个实体都做一些有用的、定义明确的、小到可以测试的任务

于 2012-04-19T15:55:14.420 回答