2013-02-19 4 views
0

Я пытаюсь закодировать SRAM с 32-разрядным адресом с разрешением записи байтовой полосы. Но когда я пытаюсь получить доступ (читать или писать) адрес, отличный от x1F, я получаю «исключение с плавающей запятой 8» при компиляции с GHDL. Вот некоторые фрагменты кода:исключение с плавающей запятой 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 может быть полезен, если другие могут воспроизвести симптом. –

ответ

0

Вы используете signed для преобразования адреса. Довольно странный тип для адреса. Поскольку у вас есть 32 места для хранения данных в памяти, вы используете только 6 бит (2^5 = 32) для адреса. При сохранении signed бит 5 является битом знака. 0x1ff -> положительный адрес: ОК. 0x20 -> отрицательный адрес: Ошибка ...

Я думаю, что смена signed на unsigned (от ieee.numeric_std) решит проблему.

+0

Так как это должно быть закодировано, так адрес остается 32 бита? mem (to_integer (addr)) без каких-либо подписей? есть ли другое ключевое слово/команда для использования? Если я не использую подпись, компилятор жалуется: префикс не является ни именем функции, ни может быть нарезанным или индексированным – David

+0

mem (to_integer (UNSIGNED (addr))) (7 downto 0) <= din (7 downto 0) после 2 нс; – vermaete

+0

библиотека IEEE; используйте IEEE.numeric_std.all; – vermaete