VHDL错误的RAM beahviour阅读

时间:2016-11-12 19:36:19

标签: vhdl modelsim

在处理同一问题1天后,也许是时候询问stackoverflow :(

在我的项目中,我有一个实体RAM,其代码如下:

for row in a:
    print " ".join(row)

主要实体使用此RAM实体。它在RAM中的数据设置方面工作正常。 什么是行不通的是保存以前从RAM中存储的数据。

主要实体的架构如下:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity RAM is
    --generic ( N : positive := 4 );
    port ( clk, w_on : in STD_LOGIC;
             data_in : in STD_LOGIC_VECTOR (3 downto 0);
             data_out : out STD_LOGIC_VECTOR (3 downto 0);
             address : in STD_LOGIC_VECTOR (2 downto 0));
end RAM;

architecture ram8x4 of RAM is
    type RAM_type is array (7 downto 0) of STD_LOGIC_VECTOR (3 downto 0);
    signal MEMORY : RAM_type;
    begin

    data_out <= MEMORY(conv_integer(address));

    process(clk, w_on)
        begin
        data_out <= MEMORY(conv_integer(address));
        if (clk = '0' and w_on = '1') then
            MEMORY(conv_integer(address)) <= data_in;
        end if;
    end process;

end ram8x4;

我的目标是在某些条件下,将所有RAM存储器从地址“000”开始到“111”,在输出中逐个设置(在tel_pin输出上),改变每个时钟周期。

通过编译我的代码没有错误,但通过模拟它我面临一个非常奇怪的行为,我无法理解原因,所以解决方案。

模拟给了我: enter image description here

为什么tel_pin和RAM_ADDR之间存在这样的转换,不允许我输出所有的RAM数据?地址似乎正确增加但我不知道为什么MEMORY(0)重复2个时钟周期。

1 个答案:

答案 0 :(得分:-2)

Fianlly我找到了解决方案:问题与接近VHDL编程的不同方式有关。在详细信息中,如果我有这样的代码:

architecture …
signal x : bit := ‘0’;
…
process(clk)
   begin
   …
   if a = b then
       x <= ‘1’;
   end if;
   if x = ‘1’ then
       y <= ‘1’;
   end if;
end process;

当流程开始并a=b时,第一个if会设置x=1,但第二个if不可见,但仍然考虑x=0。所以y <= '1'只会在下一次执行过程中完成。使用像C这样的软件语言时,第二个if将在同一个流程执行中执行。

一般情况下,VHDL信号在进程终止时设置,因此比较是上次执行进程时得到的值。

所以,回到这个问题,解决办法就是将条件边界设置为8(而不是7):counter < 9