我现在正在第二或第三次学习VHDL。 (这次装备了非常好的免费软件e-book),我终于开始大量地“获取”它了。现在,我正在学习有关行为风格和流程陈述的知识,并且其中大部分是有意义的。但是,我在许多地方都读到,除某些情况外,应避免使用流程。我的意思是,从理论上讲,不是所有事情都可以在数据流中实现而不是在行为上实现吗?
什么时候应该明显使用流程说明?
该过程语句非常有用,在什么情况下您被告知不要使用它们?
[在很多情况下,您将使用流程语句,下面将概述其中一些:
[过程语句(用于综合)的最常见用法之一是描述与时钟信号同步的逻辑,例如,一个简单的计数器,它在未复位时每个时钟周期都会递增:
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;
希望您能看到process语句非常有用,并且您将在许多不同的情况下使用它。我希望这能回答您的问题!
过程块是您的朋友。
他们提供了一种说法:“此代码块是相关的。它的输入是X,Y,Z,并且驱动A,B,C”。输入由敏感度列表记录(除非这是一个定时的过程,在这种情况下,应在您的注释中)。如果其他任何因素产生相同的信号,那么您将得到警告,错误和X(在仿真中)(取决于您的工具)。无论您得到什么,它都是显而易见的。
我个人很高兴在单个实体中编写多个流程,但是每个人都有自己的风格。例如,如果我有多个管道阶段,则每个阶段都是一个过程。如果我有平行的无干扰路径,则每个路径都将处于单独的过程中。通过这种方式,可以将代码结构化为易于阅读的小块。小型简单逻辑综合为小型快速块(通常)。
您可以将我的样式视为将它们用作轻型实体。
在可综合代码中,只要您需要将信息从一个时钟周期保留到另一个时钟周期,就<>。用术语“存储状态”。 ((请注意,诸如以下代码可能暗含一个过程>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;
我的大多数代码每个实体只有一个进程。每个实体都执行一些有用的,定义明确的,尚不足以测试的任务