在处理同一问题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输出上),改变每个时钟周期。
通过编译我的代码没有错误,但通过模拟它我面临一个非常奇怪的行为,我无法理解原因,所以解决方案。
为什么tel_pin和RAM_ADDR之间存在这样的转换,不允许我输出所有的RAM数据?地址似乎正确增加但我不知道为什么MEMORY(0)重复2个时钟周期。
答案 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