2013-10-03 2 views
0

У меня есть этот кодКак инициализировать std_logic_vector?

--RAM module 
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.numeric_std.all; 

entity RAM is 
    generic(
    address_length, data_length : integer); 
    port(
    addr  : in std_logic_vector(address_length-1 downto 0); 
    dat  : inout std_logic_vector(data_length-1 downto 0); 
    rd, wr, en : in bit); 
end entity RAM; 

architecture RAM_impl of RAM is 
    type mem is array(2**address_length-1 downto 0) of std_logic_vector(data_length-1 downto 0); 
begin 
    process(rd, wr, en)is 
    variable cont : mem; 
    begin 
    if(en = '1')then 
     if(wr = '1' and rd = '0')then 
     cont(to_integer(unsigned(addr))) := dat; 
     end if; 
     if(rd = '1' and wr = '0')then 
     dat <= cont(to_integer(unsigned(addr))); 
     end if; 
    end if; 
    end process; 
end architecture RAM_impl; 


--Test module 
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.numeric_std.all; 

entity Example4RAM is 
end entity Example4RAM; 

architecture Tester of Example4RAM is 
    signal rd, wr, en : bit; 
    signal str  : std_logic_vector(15 downto 0); 
    signal ext  : std_logic_vector(7 downto 0); 
begin 
    module : entity work.RAM(RAM_impl) 
    generic map(
     address_length => 16, 
     data_length => 8) 
    port map(str, ext, rd, wr, en); 
    tt : process is 
    begin 
    str <= X"0001"; 
    ext <= "00000000"; 
    rd <= '0'; wr <= '1'; 
    wait for 5 ns; 
    en <= '1'; 
    wait for 5 ns; 
    rd <= '0'; wr <= '0'; 
    wait for 10 ns; 
    rd <= '1'; wr <= '0'; 
    end process; 
end architecture Tester; 

Когда я запускаю моделирования на этом RAM модуль вектора ул инициализирует хорошо, но внутр вектор остается инициализирован. В RAM-модуле str находится в векторе, а ext - вне вектора. Это как-то проблема, и кто-нибудь знает решение? (Я изменил источник со вчерашнего дня, но он не работает)

+1

Не видя сущности RAM (и, возможно, архитектуры), мы можем только догадываться в темноте. Если второй параметр (почему бы не использовать именованную ассоциацию?) - это «выход» или «inout», ответ, вероятно, прямо там. –

+0

Брайан намекает, что если ext является подключением к данным в ОЗУ и имеет связанный с ним драйвер (например, режим inout), для ext (RAM, process tt) есть два драйвера. Эффективное значение ext - это разрешение двух драйверов. Все разрешения «U и все» 0 для всех «U», std_logic_vector - это разрешенный тип или подтип (-2008). Без описания дизайна ОЗУ трудно предсказать, как добиться успеха, если вы не будете приводить ext во все «Z» в процессе tt до чтения ОЗУ и, возможно, также не в ОЗУ, когда rd не соответствует действительности. – user1155120

+0

Отредактированный код выше, проверьте ОЗУ. Я новичок в VHDL, поэтому любое предложение будет полезно. – Dejan

ответ

2

Я добавил модуль ОЗУ и слегка поработал с тестовым стимулом (ext приводится во все «Z», когда wr недействителен (поведенческая модель не требует удержания . над)

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity RAM is 
    generic (
     constant address_length: natural := 16; 
     constant data_length:  natural := 8 
    ); 
    port (
     signal str:  in  std_logic_vector (address_length-1 downto 0); 
     signal ext:  inout std_logic_vector (data_length-1 downto 0); 
     signal rd:  in  BIT; 
     signal wr:  in  BIT 
    ); 
end entity; 

architecture RAM_impl of RAM is 
    type ram_array is array (natural range address_length-1 downto 0) 
     of std_logic_vector (data_length-1 downto 0); 
    signal mem_array: ram_array; 
begin 


MEMORY: 
    process (str, ext, rd, wr) 
     variable addr: natural range 0 to 2**address_length -1 ; 
    begin 
     addr := TO_INTEGER(UNSIGNED(str)); -- heed the warnings 
     if wr = '1' then 
      mem_array(addr) <= ext; 
     end if; 
     if rd = '0' then 
      ext <= (others => 'Z'); 
     else 
      ext <= mem_array(addr); 
     end if; 
    end process; 


end architecture; 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
-- use IEEE.numeric_std.ALL; 

entity Example4RAM is 
end entity Example4RAM; 

architecture Tester of Example4RAM is 
signal rd,wr,clk: bit; 
signal str: std_logic_vector(15 downto 0); 
signal ext: std_logic_vector(7 downto 0); 
begin 

module: 
    entity work.RAM(RAM_impl) 
     generic map (
      address_length=>16, 
      data_length=>8 
     ) 
     port map (
      str, 
      ext, 
      rd, 
      wr 
     ) 
    ; 

tt: 
    process 
    begin 
     str<=X"0001"; 
     ext<="00000000"; 
     wait for 5 ns; 
     rd<='0';wr<='1'; 
     wait for 5 ns; 
     rd<='0';wr<='0'; 
     ext <= (others => 'Z'); -- ADDED 
     wait for 10 ns; 
     rd<='1';wr<='0'; 
     wait for 20 ns; -- ADDED 
     str <=X"0002"; -- ADDED 
     wait for 20 ns; -- ADDED 
     wait; 
    end process; 
end architecture Tester; 

изменение на стимул включает в себя изменение адреса ОЗУ, показывая, что чтение неинициализированный возвращает местоположение и «U в (ии на форме волны):

RAM write followed by RAM read with a subsequent different address

ghdl -a exampleram.vhdl 
ghdl -r Example4RAM --wave=Example4RAM.ghw 
../../../../libraries/ieee/numeric_std-body.v93:2098:7:@0ms:(assertion warning): 
NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0 
open *.ghw 

По существу, процесс и привод RAM будут иметь все «Z», когда либо один из них не должен вызывать значение. Запись перед чтением скрывает значения «U» от адреса str X «0001». Как видите, если адрес изменен на место, которое не инициализировано, отображается сообщение «U». Резолюция предоставляет данные считывания ОЗУ или предоставляет данные записи в массив ОЗУ на двунаправленной шине данных (ext).

(Это было сделано на Mac с версией mcode ghdl (прямое компиляция, как и для Windows, не требующая явной разработки) и отображаемая с использованием GTKWave).

Предупреждение об утверждении (обнаружение метаданных) происходит от значения по умолчанию, присвоенного str (все «U») в нулевое время (@ 0ms).

+0

Спасибо человеку, что это! – Dejan

Смежные вопросы