2013-02-19 124 views
0

我正在尝试使用32位地址对字节通道写入使能进行编码。但是,当我尝试访问(读取或写入)大于x1F的地址时,使用GHDL编译时会出现“浮点异常8”。下面是一些代码片段:ghdl浮点异常8

entity data_mem is 

port(addr : in std_logic_vector(31 downto 0); 
    enable : in std_logic; 
    rd : in std_logic; 
    wr : in std_logic; 
    we : in std_logic_vector(3 downto 0); 
    din : in std_logic_vector(31 downto 0); 
    -- outputs 
    dout : out std_logic_vector(31 downto 0); 
    ack : out std_logic 
    ); 
end data_mem; 

architecture structure of data_mem is 

type mem_type is array (31 downto 0) of std_logic_vector(31 downto 0); 
signal mem : mem_type := ((others => (others => '0'))); -- initialize to zero 

begin 

mem_write : process(addr,enable, wr, we, din) 
begin 
    if (enable = '1') then 
    if (wr = '1') then 
     if (we(0) = '1') then 
     mem(to_integer(signed(addr)))(7 downto 0) <= din(7 downto 0) after 2 ns; 
     end if; ... 

所以,当我在测试平台地址设置为x0000_001F或更低,它编译,而不是当我把x0000_0020或更大。

+1

完整的可运行示例可能会有用。我认为vermaete已经发现了这个问题,但如果是这样的话,如果其他人能够重现症状,ghdl的诊断输出可能会更有用。 – 2013-02-19 17:34:52

回答

0

您正在使用signed进行地址转换。地址的类型很奇怪。由于您有32个地方可以将数据存储在内存中,因此地址只能使用6位(2^5 = 32)。保留signed时,位5是符号位。 0x1ff - >正面地址:OK。 0x20 - >否定地址:错误...

我猜想将signed更改为unsigned(来自ieee.numeric_std)将解决该问题。

+0

那么它应该如何编码,所以地址仍然是32位? mem(to_integer(addr))没有任何签名?是否有另一个关键字/命令使用?如果我没有使用signed,编译器会抱怨:prefix既不是函数名也不能被分片或索引 – David 2013-02-19 16:20:52

+0

mem(to_integer(UNSIGNED(addr)))(7 downto 0)<= din(7 downto 0)after 2 ns; – vermaete 2013-02-19 16:25:58

+0

库IEEE;使用IEEE.numeric_std.all; – vermaete 2013-02-19 16:33:51