реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Учусь работать с памятью. (VHDL), вопрос новичка
asya
сообщение May 15 2005, 19:01
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



В общем пытаюсь записать че-нить в память и прочитать. Для этого по двунаправленной шине данных надо гонять эти данны в две стороны. и соответственно когда не надо источник данных отключать. Как? smile.gif
написал вот такое:
Код
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;

Работает не так как думал. А если точнее - как будто у памяти запоминание не срабатывает. smile.gif Т.е. когда жму кнопку - получаю отображение 01010101. Как только отпускаю - все единицы. Вообще не уверен с этим Z...
Там есть более ранние посты. Но там про моделирование спрашивается. А меня синтез интересует. Т.е. я на char смотрю постоянно что на тех линиях происходит. И когда надо записать - записываю, а когда не надо - перевожу порт в Z.
Go to the top of the page
 
+Quote Post
vetal
сообщение May 15 2005, 20:16
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



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

Код
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", и судя по построения примера более никаких изменения не произойдет.
Go to the top of the page
 
+Quote Post
asya
сообщение May 15 2005, 21:00
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



Цитата(vetal @ May 16 2005, 00:16)
Элементы хранения информации описываются так:
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-состоянию?
Go to the top of the page
 
+Quote Post
asya
сообщение May 15 2005, 21:18
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



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

Код
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;

результат как предсказывал в первом варианте. smile.gif сразу после прошивки на индикаторе горит x"55" и все. если я переключателями switch меняю адрес - все равно 55. жму кнопку - ничего не меняется. (только видно на других индикаторах, что we,oe и кнопка срабатывают).
Go to the top of the page
 
+Quote Post
asya
сообщение May 15 2005, 22:34
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



все. проблема решена. я там ставил верхний и нижний байты =1. а управление идет по 0. вот они оба и небыли выбраны. smile.gif поменял на 0. и все заработало. (с моей первой схемой, когда в else загоняется Z.
Go to the top of the page
 
+Quote Post
vetal
сообщение May 16 2005, 06:01
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



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


Когда сигнал we имеет неактивное значение, значение data не изменяется, следовательно он равен последнему назначенному ему значению, а это и есть триггер.
Все современные синтезаторы имеют в своем составе rtl vieweк, в котором можно проверять правильность описанного кода.
Go to the top of the page
 
+Quote Post
asya
сообщение May 16 2005, 23:30
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 4-02-05
Пользователь №: 2 412



Цитата(vetal @ May 16 2005, 10:01)
Когда сигнал 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 там ставить нельзя - синтезатор ругается со ссылкой на синхронность.

если неправ или плохой стиль или еще чего - поправьте, плз. но у меня так все работает пока что. smile.gif
Go to the top of the page
 
+Quote Post
vetal
сообщение May 17 2005, 07:00
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Вы зациклились на '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' сигналов используется только для работы с внешними по отношению к плис схемами (в некоторых он так же используется для реализации больших мультиплексоров), но ни в коем случае он не используется для описания внутренней логики работы плис.
Go to the top of the page
 
+Quote Post
kas
сообщение May 17 2005, 11:46
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 17-05-05
Из: Красноярск
Пользователь №: 5 108



Двунаправленная шина данных это только с наружи.
Внутри памяти шину данных надо разделить. Чтение отдельно, запись отдельно. А вот наружу уже можно вывести одну шину данных. Поставив на шину чтения данны тристабильные буфера.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 16:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016