2016-08-22 3 views
-1

в VHDL все строки кода выполняются параллельно, так как его машина. Я хочу создать эту ОЗУ, которая считывает определенный регистр из блока ram на выход, и только «потом» записывает в тот же регистр вход. мой код выглядит следующим образом:Прочитайте, затем напишите RAM VHDL

architecture Behavioral of RAM is 

type ram_t is array (0 to numOfRegs-1) of std_logic_vector (rLength-1 downto 0); 
signal ram_s: ram_t; 
signal loc : integer; 

begin 

process(clk) 
begin 
    if(rising_edge(clk)) then 
     if(we='1') then 
      dataout <= ram_s(loc); -- reads the 'old' data to the output 
      ram_s(loc) <= datain; -- writes the 'new' data to the RAM 
      loc <= conv_integer(addr); 
     end if; 
    end if; 
end process;     
end Behavioral; 

есть подобный случай представлен here.

, так что я хотел бы спросить, мой код работает нормально, или есть необходимость в настройке, например, в случае задержки половины тактового цикла, и если да, то как его реализовать. Я очень клондер для VHDL благодарит за ваше терпение и помощь.

ive добавить тестовое тестовое моделирование ниже. как видно, данные не работают вообще.

testbench i've simulated

+0

Он сделал то, что вы хотите в симуляции? –

+1

Вы хотите читать данные только при включенной записи? –

ответ

1

Ваш вопрос не предъявляет Minimal, Verifiable and Complete example, не имея возможности повторить свои результаты.

Одним из последствий этого является то, что ответы могут быть неоднозначными, если есть одна или несколько причин проблемы в частях вашего кода, которые не показаны.

Комментарий Брайана о том, что вы не читаете данные, когда мы являемся недействительными, является острым и будет отвечать за «U» в цикле часов слева от вашего желтого маркера в вашей форме волны.

Существует также проблема с сигналом loc. Сигналы запланированы для обновления, и обновление не происходит, пока какой-либо процесс, который планируется возобновить в текущем цикле моделирования, не возобновляется и не приостанавливается.

Это означает, что целочисленная версия вашего адреса задерживается и не будет отображаться в процессе до следующего нарастающего фронта.

Крепление loc, сделав его переменный в качестве альтернативы конвейерной datain и перемещения dataout заданий выполняются в следующих изменениях в процесс RAM:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; -- standard package 

entity ram is 
    generic (
     ADDRLENGTH: natural := 8; 
     RLENGTH: natural := 16; 
     NUMOFREGS: natural := 256 
    ); 
    port (
     clk:  in std_logic; 
     we:   in std_logic; 
     addr:  in std_logic_vector (ADDRLENGTH - 1 downto 0); 
     datain:  in std_logic_vector (RLENGTH - 1 downto 0); 
     dataout: out std_logic_vector (RLENGTH - 1 downto 0) 
    ); 

end entity; 

architecture behavioral of ram is 

    type ram_t is array (0 to NUMOFREGS - 1) of 
      std_logic_vector (RLENGTH - 1 downto 0); 
    signal ram_s: ram_t; 

    -- signal loc: integer; -- USE VARIABLE in process instead 

begin 

    process(clk) 
    variable loc: integer; -- MAKE loc variable so it's immediately available 
    begin 
     if rising_edge(clk) then 
      loc := to_integer(unsigned(addr)); -- MOVED so READ works 
      if we = '1' then 
       -- dataout <= ram_s(loc); -- reads the 'old' data to the output 
       ram_s(loc) <= datain; -- writes the 'new' data to the ram 
       -- loc <= conv_integer(addr); 
      end if; 
      dataout <= ram_s(loc); -- MOVED reads the 'old' data to the output 
     end if; 
    end process;     
end architecture behavioral; 

Там также свобода заполнения декларации лица и преобразование из conv_integer с использованием пакета Synopsys std_logic_arith в to_integer в пакет numeric_std IEEE. С помощью цепочки инструментов, совместимой с -2008, вы можете вместо этого использовать пакет IEEE numeric_std_unsigned и отказаться от преобразования типа в unsigned.

Поскольку ram_test испытательный стенд был также не поставляла испытательный стенд был написан для репликации медийного сигнала изображения:

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

entity ram_tb is 
end entity; 

architecture foo of ram_tb is 
    constant ADDRLENGTH: natural := 8; 
    constant RLENGTH: natural := 16; 
    constant NUMOFREGS: natural := 256; 
    signal clk:  std_logic := '0'; 
    signal we:   std_logic := '1'; 
    signal addr:  std_logic_vector (ADDRLENGTH - 1 downto 0); 
    signal datain:  std_logic_vector (RLENGTH - 1 downto 0); 
    signal dataout: std_logic_vector (RLENGTH - 1 downto 0); 

begin 
DUT: 
    entity work.ram 
     generic map (
      ADDRLENGTH => ADDRLENGTH, 
      RLENGTH => RLENGTH, 
      NUMOFREGS => NUMOFREGS 
     ) 
     port map (
      clk => clk, 
      we => we, 
      addr => addr, 
      datain => datain, 
      dataout => dataout 
     ); 

CLOCK: 
    process 
    begin 
     if now = 500 ps then 
      wait for 200 ps; 
     else 
      wait for 100 ps; 
     end if; 
     clk <= not clk; 
     if now >= 1100 ps then 
      wait; 
     end if; 
    end process; 

STIMULI: 
    process 
    begin 
     for i in 0 to 2 loop 
      addr <= std_logic_vector(to_unsigned (i, ADDRLENGTH)); 
      case i is 
       when 0 => 
        datain <= x"00FF"; 
       when 1 => 
        datain <= x"FF00"; 
       when 2 => 
        datain <= x"FFFF"; 
      end case; 
      wait until falling_edge(clk); 
      if i = 1 then 
       we <= '0'; 
      end if; 
     end loop; 
     for i in 1 to 2 loop 
      addr <= std_logic_vector(to_unsigned (i, ADDRLENGTH)); 
      case i is 
       when 1 => 
        datain <= x"FF00"; 
       when 2 => 
        datain <= x"FFFF"; 
      end case; 
      wait until falling_edge(clk); 
     end loop;   
     wait; 
    end process; 

end architecture; 

И это порождало:

ram_tb_match.png

Если один написан адрес, который после этого считываются правильные данные.

Используемый имитатор не представляет сигналов в дампе осциллограмм (ограничения в объявлениях должны быть статическими), а rst не найден в той части предоставленной вами спецификации дизайна.

Как уже отмечалось ранее, нет никакой гарантии, что нет другой проблемы с частью вашей спецификации дизайна или testbench, не указанной в вашем вопросе.

Показанный тестовый стенд не является исчерпывающим.