asya 0 15 мая, 2005 Опубликовано 15 мая, 2005 · Жалоба В общем пытаюсь записать че-нить в память и прочитать. Для этого по двунаправленной шине данных надо гонять эти данны в две стороны. и соответственно когда не надо источник данных отключать. Как? :) написал вот такое: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 15 мая, 2005 Опубликовано 15 мая, 2005 · Жалоба Вы же сами написали: 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", и судя по построения примера более никаких изменения не произойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asya 0 15 мая, 2005 Опубликовано 15 мая, 2005 · Жалоба Элементы хранения информации описываются так: 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", и судя по построения примера более никаких изменения не произойдет. <{POST_SNAPBACK}> Хммм. Ну а что тогда будет при вашем описании, когда we не равно 1? Имхо так и останется на data поданная x"55". нет? Или потому что это процесс, то пока we=1 то информация подается, а когда не равно 1, то просто ничего не подключено, что и соответсвует Z-состоянию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asya 0 15 мая, 2005 Опубликовано 15 мая, 2005 · Жалоба написал как вы и сказали сделать по второму варианту. :) вот код: 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 и кнопка срабатывают). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asya 0 15 мая, 2005 Опубликовано 15 мая, 2005 · Жалоба все. проблема решена. я там ставил верхний и нижний байты =1. а управление идет по 0. вот они оба и небыли выбраны. :) поменял на 0. и все заработало. (с моей первой схемой, когда в else загоняется Z. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 16 мая, 2005 Опубликовано 16 мая, 2005 · Жалоба Хммм. Ну а что тогда будет при вашем описании, когда we не равно 1? Имхо так и останется на data поданная x"55". нет? Или потому что это процесс, то пока we=1 то информация подается, а когда не равно 1, то просто ничего не подключено, что и соответсвует Z-состоянию? Когда сигнал we имеет неактивное значение, значение data не изменяется, следовательно он равен последнему назначенному ему значению, а это и есть триггер. Все современные синтезаторы имеют в своем составе rtl vieweк, в котором можно проверять правильность описанного кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asya 0 16 мая, 2005 Опубликовано 16 мая, 2005 · Жалоба Когда сигнал we имеет неактивное значение, значение data не изменяется, следовательно он равен последнему назначенному ему значению, а это и есть триггер. Все современные синтезаторы имеют в своем составе rtl vieweк, в котором можно проверять правильность описанного кода. <{POST_SNAPBACK}> то бишь если стоит задача считать из памяти, после записывания в нее, то надо переводить информационные пины в Z состояние, а потом читать. и как я пока что для себя решил, делать это в другом if в том же процессе. например так: if ((we='0') and (we'event)) then --пишем в память end if; if (we='1') then --информационную шину в Z data<=(others=>'Z'); end if; а делать так, потому что просто else там ставить нельзя - синтезатор ругается со ссылкой на синхронность. если неправ или плохой стиль или еще чего - поправьте, плз. но у меня так все работает пока что. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vetal 0 17 мая, 2005 Опубликовано 17 мая, 2005 · Жалоба Вы зациклились на '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' сигналов используется только для работы с внешними по отношению к плис схемами (в некоторых он так же используется для реализации больших мультиплексоров), но ни в коем случае он не используется для описания внутренней логики работы плис. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kas 0 17 мая, 2005 Опубликовано 17 мая, 2005 · Жалоба Двунаправленная шина данных это только с наружи. Внутри памяти шину данных надо разделить. Чтение отдельно, запись отдельно. А вот наружу уже можно вывести одну шину данных. Поставив на шину чтения данны тристабильные буфера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться