Перейти к содержанию
    

Учусь работать с памятью. (VHDL)

В общем пытаюсь записать че-нить в память и прочитать. Для этого по двунаправленной шине данных надо гонять эти данны в две стороны. и соответственно когда не надо источник данных отключать. Как? :)

написал вот такое:

entity memory_t is
   Port ( switch : in std_logic_vector(7 downto 0);
     button4 : in std_logic;
     data : inout std_logic_vector(15 downto 0);
    address : out std_logic_vector(17 downto 0);
    led,char : out std_logic_vector(7 downto 0);
    ce,ub,lb,we,oe : inout std_logic
 
 );
end memory_t;

architecture Behavioral of memory_t is

begin
    ce<='0'; 
    ub<='1'; lb<='1'; 

    led<=(ce,ub,lb,we,oe,button4,'0','0');

    address(17 downto 8)<="0000000000";
    address(7 downto 0)<=switch;
    char<=data(7 downto 0);

    process(button4) 
    begin
    if button4='1' then
 data(7 downto 0)<="01010101";
 we<='0'; oe<='1';
    else
   data(7 downto 0)<="ZZZZZZZZ";
 we<='1'; oe<='0';
    end if;
    end process;

end Behavioral;

Работает не так как думал. А если точнее - как будто у памяти запоминание не срабатывает. :) Т.е. когда жму кнопку - получаю отображение 01010101. Как только отпускаю - все единицы. Вообще не уверен с этим Z...

Там есть более ранние посты. Но там про моделирование спрашивается. А меня синтез интересует. Т.е. я на char смотрю постоянно что на тех линиях происходит. И когда надо записать - записываю, а когда не надо - перевожу порт в Z.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы же сами написали:

 

if (button='1') then
data<=...
else
data<=(others=>'Z');
end if;

 

У вас и получился z-буфер на вход которого подается x"55", c управляющим сигналом "button4". Остальные сигналы в процессе - мультиплексоры.

 

Элементы хранения информации описываются так:

1.Latch (применять не рекомендуется)

process(we)

begin

if (we='1') then

data<=ваш сигнал.

end if;

end process;

 

2.DFF

 

process(we)

begin

if (we'event and we='1') then -- по фронту сигнала we

data<=....;

end if;

end process;

 

Если вы по одному оз приведенных шаблонов построите схему, то при первом нажатии кнопки получите значение x"55", и судя по построения примера более никаких изменения не произойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Элементы хранения информации описываются так:

1.Latch (применять не рекомендуется)

process(we)

begin

if (we='1') then

data<=ваш сигнал.

end if;

end process;

 

2.DFF

 

process(we)

begin

if (we'event and we='1') then -- по фронту сигнала we

data<=....;

end if;

end process;

 

Если вы по одному оз приведенных шаблонов построите схему, то при первом нажатии кнопки получите значение x"55", и судя по построения примера более никаких изменения не произойдет.

Хммм. Ну а что тогда будет при вашем описании, когда we не равно 1? Имхо так и останется на data поданная x"55". нет? Или потому что это процесс, то пока we=1 то информация подается, а когда не равно 1, то просто ничего не подключено, что и соответсвует Z-состоянию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

написал как вы и сказали сделать по второму варианту. :)

вот код:

 

architecture Behavioral of memory_t is

begin
    ce<='0'; 
    ub<='1'; lb<='1'; 

    led<=(ce,ub,lb,we,oe,button4,'0','0');

    address(17 downto 8)<="0000000000";
    address(7 downto 0)<=switch;
    char<=data(7 downto 0);
    we<=not button4;  --запись разрешена, когда кнопка нажата (срабатывает по нулю)
    oe<=button4;   --вызод разрешен, когда кнопка НЕ нажата (аналогично)

    process(we) 
    begin
    if ((we='0') and we'event) then
 data(15 downto 0)<=x"5555";
--  we<='0'; oe<='1';
--    else
--    data(7 downto 0)<="ZZZZZZZZ";
--  we<='1'; oe<='0';
    end if;
    end process;



end Behavioral;

результат как предсказывал в первом варианте. :) сразу после прошивки на индикаторе горит x"55" и все. если я переключателями switch меняю адрес - все равно 55. жму кнопку - ничего не меняется. (только видно на других индикаторах, что we,oe и кнопка срабатывают).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все. проблема решена. я там ставил верхний и нижний байты =1. а управление идет по 0. вот они оба и небыли выбраны. :) поменял на 0. и все заработало. (с моей первой схемой, когда в else загоняется Z.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хммм. Ну а что тогда будет при вашем описании, когда we не равно 1? Имхо так и останется на data поданная x"55". нет? Или потому что это процесс, то пока we=1 то информация подается, а когда не равно 1, то просто ничего не подключено, что и соответсвует Z-состоянию?

 

Когда сигнал we имеет неактивное значение, значение data не изменяется, следовательно он равен последнему назначенному ему значению, а это и есть триггер.

Все современные синтезаторы имеют в своем составе rtl vieweк, в котором можно проверять правильность описанного кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда сигнал we имеет неактивное значение, значение data не изменяется, следовательно он равен последнему назначенному ему значению, а это и есть триггер.

Все современные синтезаторы имеют в своем составе rtl vieweк, в котором можно  проверять правильность описанного кода.

то бишь если стоит задача считать из памяти, после записывания в нее, то надо переводить информационные пины в Z состояние, а потом читать. и как я пока что для себя решил, делать это в другом if в том же процессе. например так:

if ((we='0') and (we'event)) then

--пишем в память

end if;

if (we='1') then

--информационную шину в Z

data<=(others=>'Z');

end if;

 

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

 

если неправ или плохой стиль или еще чего - поправьте, плз. но у меня так все работает пока что. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы зациклились на 'Z' состоянии, и по этому вам не ясна суть.

Синтезатор правильно ругается, т.к. у вас we назначен как клок.

 

Для примера приведу регистр ИР35.

 

entity ir35 is
    port
    (
    c    : in std_logic;
    r    : in std_logic;
    d    : in std_logic_vector(7 downto 0);
    q    : out std_logic_vector(7 downto 0)
    );
ent ir35;

architecture rtl of ir15 is
    signal q_reg    : std_logic_vector(7 downto 0);
begin
    q<=q_reg;
    reg:process(r,c)
    begin
 if (r='0') then
     q_reg<=(others=>'0');
 elsif (c'event and c='1') then
     q_reg<=d;
 end if;
    end process;
end rtl;

 

Описание:

q_reg - триггеры регистра

d - вход данных регистра

q - выход, состояние триггеров регистра

с - тактовые импульсы

r - сигнал сброса

Когда сигнал "r" имеет активный уровень('0'), все триггеры "q_reg" регистра "ir35" сбрасываются, в противном случае при приходе фронта(положительного) тактового импульса "c" в триггеры "q_reg" записывается значение со входа "d". Сигнал "q" транслирует значение триггеров "q_reg" на выход.

При неактивном уровне уровне('1') сигнала сброса "r", и отсутствии фронта на тактовом входе "c" регистра. Никаких изменений в схеме не происходит, т.е. в регистре "q_reg" хранится информация.

 

Состояние 'Z' сигналов используется только для работы с внешними по отношению к плис схемами (в некоторых он так же используется для реализации больших мультиплексоров), но ни в коем случае он не используется для описания внутренней логики работы плис.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Двунаправленная шина данных это только с наружи.

Внутри памяти шину данных надо разделить. Чтение отдельно, запись отдельно. А вот наружу уже можно вывести одну шину данных. Поставив на шину чтения данны тристабильные буфера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...