2

我有两个过程,如下所示。

如果说 A=1、B=2 和 C=3,模拟中发生的情况是在上升沿 B=1 和 C=2,这就是我想要的结果。

但是,当设计实现到 fpga 中时,我能保证这也是正确的吗?

让我担心的是与流程 BC 中的额外 if 状态相关的延迟。

AB : process(A,clk)
begin
  if rising_edge(clk) then
    B <= A;
  end if;
end process;

BC : process(B,clk)
begin
  if rising_edge(clk) then
    if (some_statement) then
      C <= B;
    end if;
  end if;
end process;
4

3 回答 3

4

B 将采用 A 的值(B=1),C 将采用 B 的值(C=2)。

但是,我想您实际上并没有描述您想要的内容。问题是您在两个进程的敏感度列表中有 A 和 B。这意味着在过程 AB 中,B 将在每次 A 更改以及何时更改时更改rising_edge(clk)。过程 BC 也是如此。假设您想描述两个系列寄存器,您的代码应该是

AB : process(clk)
begin
  if rising_edge(clk) then
    B <= A;
  end if;
end process;

BC : process(clk)
begin
  if rising_edge(clk) then
    if (some_statement) then
      C <= B;
    end if;
  end if;
end process;

在这种情况下,如果您将此代码综合到 FPGA 上,您将推断出两个寄存器。进程 BC 中的寄存器将使用连接到布尔输出的寄存器使能信号some_statement。如果some_statement已经是单个std_logic信号,这不会引入额外的延迟,但需要一些路由资源,因此您仍应避免在不需要的地方使用启用信号。

于 2012-08-22T06:40:36.193 回答
1

我认为 Simon 完美地回答了这个问题,只是为了进一步澄清这个问题:如果您的数据的初始值为 A=1、B=2 和 C=3,那么您将在模拟过程中获得以下信息:

  • 在启动期间 A=1、B=2 和 C=3
  • 在时钟 A=1、B=1 和 C=2 的第一个上升沿之后
  • 在时钟 A=1、B=1 和 C=1 的第二个上升沿之后
  • 之后,所有信号都将为 1。

if 语句的延迟必须超过“时钟周期”-“内部寄存器所需的保持时间”,否则会给您带来任何问题。除非您有一个极其复杂的逻辑,其中包含来自多个时钟域的信号,否则您的代码可能会出现问题(更准确的代码是 Simon 发送的代码)。

于 2012-08-22T08:12:36.017 回答
0

但是,当设计实现到 fpga 中时,我能保证这也是正确的吗?

合成器应该生成一个与您的 VHDL 在模拟器中的行为相匹配的 FPGA。如果没有,那就是bug!

请注意,存在一些“可接受的”偏差 - 例如,如果您错过了灵敏度列表中的右侧信号,合成器会假定您打算将其放在那里,但模拟器会假定您知道自己在做什么, 就会出现不匹配。就个人而言,我认为这种行为是一个错误,但它被太多工具根深蒂固,我认为它永远不会改变。

让我担心的是与流程 BC 中的额外 if 状态相关的延迟。

像您这样的时钟进程中的所有内容都在一个时钟滴答内“执行”。如果逻辑过多(例如,每个嵌套都if引入了新的逻辑层),您可能会发现时钟滴答的持续时间比您希望的要长。

(Not like software on most modern micros, where everything "takes as long as it takes", and is often unpredictable, depending on the state of caches, TLBs etc.)

于 2012-08-22T11:49:02.057 回答