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

在VHDL中,何时是使用进程语句的正确时间?,vhdl,hdl,Vhdl,Hdl,我现在正在经历第二次或第三次学习VHDL的阶段。(这一次是用一个非常好的免费软件武装起来的)我终于开始“得到”很多了。现在我正在学习行为风格和过程陈述,其中大部分都是有意义的。然而,我在很多地方都读到,除了某些情况外,流程是要避免的。我的意思是,从理论上讲,难道不能用数据流而不是行为流来实现一切吗 什么时候应该明确使用流程语句 在可合成代码中,在需要将信息从一个时钟周期保存到另一个时钟周期的任何时候都需要进程。用行话来说是“存储状态” (请注意,流程可以由以下代码暗示: d <= q wh

我现在正在经历第二次或第三次学习VHDL的阶段。(这一次是用一个非常好的免费软件武装起来的)我终于开始“得到”很多了。现在我正在学习行为风格和过程陈述,其中大部分都是有意义的。然而,我在很多地方都读到,除了某些情况外,流程是要避免的。我的意思是,从理论上讲,难道不能用数据流而不是行为流来实现一切吗


什么时候应该明确使用流程语句

在可合成代码中,在需要将信息从一个时钟周期保存到另一个时钟周期的任何时候都需要进程。用行话来说是“存储状态”

(请注意,流程可以由以下代码暗示:

d <= q when rising_edge(clk);

d过程语句非常有用,在什么情况下您被告知不要使用它们

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

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;
数据寄存器:进程(时钟) 开始 如果上升沿(时钟),则 如果重置='1',则 计数器“0”); 其他的
计数器进程块是您的朋友

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

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


您可以将我的样式视为使用它们作为轻量级实体

你在哪里读到过应该避免的过程?他们是基本的IMHO@马丁汤普森不一定回避,但我想很容易被滥用?熟悉传统编程的人倾向于在不应该使用过程语句的时候使用过程语句,因为它提供了几乎是过程性的东西
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;
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;