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