过程如何在实践中进行评估

时间:2012-08-22 05:32:09

标签: vhdl fpga

我有两个过程'如下。

如果说A = 1,B = 2且C = 3,模拟中发生的事情是在rising_edge 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;

3 个答案:

答案 0 :(得分:4)

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

但是,我猜你实际上并没有描述你想要的东西。问题是你在两个进程的敏感性列表中有A和B.这意味着在过程AB中,每次A变化以及rising_edge(clk)为真时B都会变化。过程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信号,这不会引入额外的延迟,但需要一些路由资源,因此您仍然应该避免在不需要它的地方使用启用信号。

答案 1 :(得分:1)

我认为西蒙完美地回答了这个问题,只是为了进一步澄清这个问题: 如果数据的初始值为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发送的代码)。

答案 2 :(得分:0)

  

但我保证在将设计实现到fpga中时也是如此吗?

合成器生成一个与模拟器中VHDL行为相匹配的FPGA。如果没有,这是一个错误!

请注意,有一些“可接受的”偏差 - 例如,如果你错过了灵敏度列表中的右侧信号,合成器会认为你打算把它放在那里,但模拟器会假设你知道你是什么正在做,并且会有不匹配。就个人而言,我认为这种行为是一种错误,但它太过根深蒂固,太多工具,我不认为它会发生变化。

  

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

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

(不像大多数现代微处理器上的软件,其中所有内容“需要花费的时间”,并且通常是不可预测的,具体取决于缓存,TLB等的状态。)