2012-04-19 237 views
0

我正在经历第二次或第三次学习VHDL的阶段。 (这次装备非常好,免费e-book),我终于开始“获得”相当多。现在我正在学习行为风格和过程声明,其中大部分都是合理的。但是,我读过很多地方,除了某些情况下,应避免进程。我的意思是,理论上不能将所有事情都用数据流而不是行为来实现?在VHDL中何时适合使用Process语句?

何时应该明确应该使用过程语句?

+0

你在哪里读过应该避免的过程?他们几乎是根本的恕我直言! – 2012-04-19 15:55:36

+1

@MartinThompson不一定避免,但容易被滥用,我猜?熟悉传统编程的人们倾向于使用过程语句,因为它提供了几乎程序化的东西 – Earlz 2012-04-19 16:15:28

回答

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; 

我的大多数代码每个实体都有一个进程。每个实体都会执行一些有用的,定义明确的和足够小的可测试任务

4

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

有许多不同的情况下,你可以使用一个过程声明,我将概述其中的几个如下:

一(合成)过程叙述中最常见的用法是描述其中的逻辑是同步的时钟信号,例如一个简单的计数器递增每一个时钟周期时不复位可以被描述为:作为您的设计越来越复杂,你将不可避免地在某种程度上实现状态机

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; 

,这将使用一个或多个进程,具体取决于您选择实现的状态机的风格。

对于behavorial代码,您可以结合等待语句使用进程生成测试向量或模拟真实系统的行为。下面是从我的测试平台中获取的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; 

希望你能看到进程语句是非常有用的,你会在很多不同的情况下使用它。我希望这回答你的问题!

3

过程块是你的朋友。

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

就个人而言,我会很高兴在单个实体中编写多个进程,但每个人都有自己的风格。例如,如果我有多个流水线阶段,每个阶段都是一个流程。如果我有平行的非干涉路径,每个路径都将处于一个单独的过程中。通过这样做,代码被构造成小而易读的块。小的简单逻辑综合成小的快速块(一般来说)。

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