Process 从ROM或RAM获取值时的定时差异

Process 从ROM或RAM获取值时的定时差异,process,vhdl,fpga,ram,rom,Process,Vhdl,Fpga,Ram,Rom,所以我很难理解用vhdl从ram或rom中获取值所需的时间。我知道在ram中插入数据发生在时钟的上升沿,并采用一个时钟,如我所举的例子,但在获取数据方面,从内存获取数据是否需要一个时钟,然后再获取另一个时钟周期以获取数据以输出,这意味着获取数据需要2个时钟周期 process(clk) begin if(rising_edge(clk)) then if(write_en = '1') then mem(to_integer(unsigned(address))) &

所以我很难理解用vhdl从ram或rom中获取值所需的时间。我知道在ram中插入数据发生在时钟的上升沿,并采用一个时钟,如我所举的例子,但在获取数据方面,从内存获取数据是否需要一个时钟,然后再获取另一个时钟周期以获取数据以输出,这意味着获取数据需要2个时钟周期

 process(clk)
 begin
 if(rising_edge(clk)) then
    if(write_en = '1') then
       mem(to_integer(unsigned(address))) <= incoming_data;--insert data
    end if;
 end if;
end process;
out_data <= mem(to_integer(unsigned(address))); -- takes 2 clock cycles to get data ?
过程(clk)
开始
如果(上升沿(clk)),则
如果(write_en='1'),则

mem(to_integer(unsigned(address))否,需要1个时钟周期:

在代码中有两个并发进程。一个是明确的:

process(clk)
begin
  if(rising_edge(clk)) then
    if(write_en = '1') then
      mem(to_integer(unsigned(address))) <= incoming_data;--insert data
    end if;
  end if;
end process;
此行的作用是将一个事件置于事件队列中,以在下一个增量周期中驱动正确的
mem
值(假设结果是信号
mem
发生了一些变化)。事件队列是模拟器的“待办事项”列表;增量循环是模拟器的一次迭代;下一次迭代将在当前迭代中执行的所有进程挂起后发生

因此,下一个迭代周期发生,信号
mem
获得其新值。信号
mem
位于第二个(隐式)过程(并发信号分配)的隐式灵敏度列表中。因此,第二个过程开始执行,执行信号分配到
out\u data
的行,并且(与执行任何包含信号分配的行一样)将事件放入事件队列,以将目标信号-
out\u data
在这种情况下-驱动到一个新值(再次假设该值应该更改)

因此,信号
out\u data
的变化总是在信号
mem
变化后的一个增量周期内发生。我们已经确定信号
mem
在信号
clk
的任何上升沿后改变一个增量周期,因此我们可以看到信号
out\u data
在信号
clk
的任何上升沿后改变两个增量周期


虽然在编写VHDL时注意delta循环是非常重要的,但是如果我们采用一种好的、传统的风格,我们通常不需要担心它们。因此,我们可以说信号
out\u data
在信号
clk
的任何上升沿上发生变化,或者换句话说,在信号
write\u en
的任何变化之间有一个时钟周期的延迟,
输入数据
地址
以及信号上的任何相应更改
输出数据

很好的解释,现在让我们假设输出数据表达式如下:请原谅我上面的错误,我在完成之前无意中发布了。很好的解释,现在让我们假设在进程内的第二个if语句之后,我们将“out_data”信号赋值。现在,如果上升沿为真并写入_en='1',则分配给mem的信号将导致一个事件,而分配给out的信号将导致另一个事件,即在同一迭代中发生两个事件?我想我最近正在深入思考delta循环,而最终我只想知道out_数据是否在分配给mem的同一个上升时钟上获得其值。如果你在进程中的第二个If语句之后放置
out_数据
信号分配,然后,
输入数据
输出数据
之间的延迟将是两个时钟周期。在执行包含信号分配的每一行时,将对右侧进行采样,并将一个事件放入事件队列中,以驱动左侧达到该值。这两个赋值将在相同的增量周期中执行。因此,将在相同的增量周期中对右侧和右侧进行采样。因此,对
传入的\u数据的任何更改都需要两次迭代过程才能影响
输出数据
。您尝试实现的功能似乎是一个“读旧;写新”RAM,除非您尝试执行异步读取(不确定原因)。我会将
移出\u数据
赋值,这样它就在clk的进程中(从而同步)。这将导致RAM将值写入
mem
中的指定地址,并读取指定地址的旧值;输出将在下一个时钟周期可用。一些好的信息这是不足以检测和解释问题原因的代码。请发一封信。
out_data <= mem(to_integer(unsigned(address))); -- takes 2 clock cycles to get data ?
process(address, mem)
begin
  out_data <= mem(to_integer(unsigned(address))); -- takes 2 clock cycles to get data ?
end process;
mem(to_integer(unsigned(address))) <= incoming_data;--insert data