我有两个过程'如下。
如果说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;
答案 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,那么在模拟过程中您将得到以下信息:
if语句的延迟必须大于“时钟周期” - “内部寄存器所需的保持时间”会给您带来任何问题。除非你有一个非常复杂的逻辑,包含来自多个时钟域的信号,否则你的代码会遇到一些风险(代码更准确是Simon发送的代码)。
答案 2 :(得分:0)
但我保证在将设计实现到fpga中时也是如此吗?
合成器应生成一个与模拟器中VHDL行为相匹配的FPGA。如果没有,这是一个错误!
请注意,有一些“可接受的”偏差 - 例如,如果你错过了灵敏度列表中的右侧信号,合成器会认为你打算把它放在那里,但模拟器会假设你知道你是什么正在做,并且会有不匹配。就个人而言,我认为这种行为是一种错误,但它太过根深蒂固,太多工具,我不认为它会发生变化。
让我担心的是与BC过程中额外if状态相关的延迟。
像你这样的时钟进程中的所有内容都会在一个时钟周期内“执行”。如果逻辑太多(例如,每个嵌套的if
引入了一个新的逻辑层),您可能会发现时钟节拍的持续时间比您想要的要长。
(不像大多数现代微处理器上的软件,其中所有内容“需要花费的时间”,并且通常是不可预测的,具体取决于缓存,TLB等的状态。)