这里有一些VHDL代码,用于读取和写入我想要了解的内存地址。基本思想是,如果我们有一个上升的时钟边沿并且写入被启用(we = '1'
),那么我们修改名为ram
的数组并在其中存储data
。然后我们将刚刚读取的地址分配给addr_reg
,然后在流程之外我们将地址ram
的{{1}}内容分配给addr_reg
以便读取输出。< / p>
q
在这种情况下,过程&#34;更慢&#34;比硬编码的行process(clk) begin
if(rising_edge(clk)) then
if(we = '1') then
ram(addr) <= data;
end if;
-- Register the address for reading
addr_reg <= addr;
end if;
end process;
q <= ram(addr_reg);
?换句话说,我们是否在q <= ram(addr_reg);
读取前一个值,同时向addr_reg
写入一个新值,以便在下一个时钟边沿读取该值?或者是在过程中分配addr
后触发的硬编码行q <= ram(addr_reg);
,因此我们正在阅读我们刚刚编写的值,即addr_reg
?
要获得完整的答案,我正在寻找有关此代码的时钟事件时间表的详细说明。
答案 0 :(得分:1)
在rising_edge(clk)
上,ram
和addr_reg
都会使用新内容进行更新。此更新内容的效果在clk
的上升沿(组合q <= ram(addr_reg)
)之后(一个增量周期)可见,它将立即显示新值。
所以你正在阅读我们刚写的价值,即数据。这种情况的信号如下所示。