GRAF[exp] 0 9 апреля, 2008 Опубликовано 9 апреля, 2008 · Жалоба Всем доброго времени суток! Ниже изложенную проблему я довольно просто обошел, но мне стало интересно почему такое происходит и захотел разобарться в этом. Есть такой код: library IEEE; use IEEE.std_logic_1164.all ,IEEE.numeric_std.all; entity NOT_test is port( clk: in std_logic; reset_mac: in std_logic; accC: inout signed(41 downto 0); data_out: out signed(40 downto 0) ); end NOT_test; architecture arch of NOT_test is begin process(clk, reset_mac) begin if reset_mac='1' then accC<=(others=>'0'); data_out<=(others=>'0'); elsif clk'event and clk='1' then data_out<=not(accC(40 downto 0)); end if; end process; end arch; Это просто тестовый проект, что бы выявить неработающую часть в реальном проекте. Проблема такая: порту accC при моделировании назначается "000000000000000000000100010000000000000000", на выходе на порте data_out получаем "11111111111111111111X111X1111111111111111", т.е. там где у порта inout были "1" на выходе после операции not получается "Х". Я в принципе с inout портами дела не имел. Вот хотелось бы узнать мнение более опытных по этому вопросу. Почему такое происходит, и как в таком случае правильно с inout портами работать? Заранее благодарен! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 9 апреля, 2008 Опубликовано 9 апреля, 2008 · Жалоба очень просто: вы при моделировании при начальном сбросе устанавливаете регистр accC в "0000" в тестбенче тоже задаёте ему значение. притом, в разрядах, где значение отличается от уже установленного "0" ( т.е. установлено "1") получаете конфликт на шине - неопределенное значение, которое после инверсии поступает на data_out. not X = X так что дело не в inout Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 10 апреля, 2008 Опубликовано 10 апреля, 2008 · Жалоба Я в принципе с inout портами дела не имел. Вот хотелось бы узнать мнение более опытных по этому вопросу. Почему такое происходит, и как в таком случае правильно с inout портами работать? Вопрос поднимался не единожды. Воспользуйтесь поиском. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 апреля, 2008 Опубликовано 10 апреля, 2008 · Жалоба Для работы с двунаправленными портами: Делаешь две программы: одна читает из порта другая записывает в этот порт. Потом создаешь файл верхнего уровня в котором объединяешь две программы через if и обязательно должно быть else "zzzzz" (количество z - твоя разрядность порта). Для более полного понимания можешь открыть описание на inout буфер. :) Просматривая форум и наткнулся на http://electronix.ru/forum/index.php?showtopic=45434 Проводник - он и есть однонаправленный буфер. Есть вход. Есть выход. Под двунаправленным понимается двунаправленная шина. Реализация такой шины возможна только при наличии контактов I/O и буфера для реализации ZZZZ состояния. Посмотрите структуру шинника 74245. Если управление избыточно, минимизируйте. На базе таких шинников много чего через Плис прогнать можно. И никого не волнует Ваш протокол обмена по этой (этим) двунаправленной шине (шинам) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ap6 is port ( busa : inout std_logic_vector(7 downto 0); busb : inout std_logic_vector(7 downto 0); dir : in std_logic; oe_n : in std_logic ); end ap6; Architecture rtl of ap6 is begin busa <= busb when (dir = '0' and oe_n = '0') else (others => 'Z'); busb <= busa when (dir = '1' and oe_n = '0') else (others => 'Z'); end rtl; В принципе это и есть ответ на твой вопрос Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GRAF[exp] 0 10 апреля, 2008 Опубликовано 10 апреля, 2008 · Жалоба 2 andrew_b: я все темы облазил =) видел темы про inout, в паре из них было как работать с такими портами, но все равно не очень въезжал. Да оно и не надо особенно было, я ж обошел проблему, а вот почему случился такой косяк у меня, мне стало просто интересно, захотел разобраться. 2 ZMaverickZ: Спасибо, в следущий раз, когда надо будет с ними работать воспользуюсь твоим советом. 2 Doka: я все равно что то не понял. Я когда моделирую, задаю значение этому порту даже после срабатывания сигнала reset_mac, и все равно такое происходит. Хотя вроде конфликта нету. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 10 апреля, 2008 Опубликовано 10 апреля, 2008 · Жалоба 2 Doka: я все равно что то не понял. Я когда моделирую, задаю значение этому порту даже после срабатывания сигнала reset_mac, и все равно такое происходит. Хотя вроде конфликта нету. А есть ли смысл вот в этом: if reset_mac='1' then accC<=(others=>'0'); Как обнулить это двунаправленное. Двунаправленному принципиально нужен буфер по третьему состоянию. В любом случае это строка смысла не имеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться