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

inout и операция not

Всем доброго времени суток!

Ниже изложенную проблему я довольно просто обошел, но мне стало интересно почему такое происходит и захотел разобарться в этом.

Есть такой код:

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 портами работать?

Заранее благодарен!

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


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

очень просто:

вы при моделировании при начальном сбросе устанавливаете регистр accC в "0000"

в тестбенче тоже задаёте ему значение. притом, в разрядах, где значение отличается от уже установленного "0" ( т.е. установлено "1") получаете конфликт на шине - неопределенное значение, которое после инверсии поступает на data_out.

not X = X

 

так что дело не в inout

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


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

Я в принципе с inout портами дела не имел. Вот хотелось бы узнать мнение более опытных по этому вопросу. Почему такое происходит, и как в таком случае правильно с inout портами работать?
Вопрос поднимался не единожды. Воспользуйтесь поиском.

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


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

Для работы с двунаправленными портами:

Делаешь две программы: одна читает из порта другая записывает в этот порт. Потом создаешь файл верхнего уровня в котором объединяешь две программы через 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;

 

В принципе это и есть ответ на твой вопрос

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


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

2 andrew_b: я все темы облазил =) видел темы про inout, в паре из них было как работать с такими портами, но все равно не очень въезжал. Да оно и не надо особенно было, я ж обошел проблему, а вот почему случился такой косяк у меня, мне стало просто интересно, захотел разобраться.

2 ZMaverickZ: Спасибо, в следущий раз, когда надо будет с ними работать воспользуюсь твоим советом.

2 Doka: я все равно что то не понял. Я когда моделирую, задаю значение этому порту даже после срабатывания сигнала reset_mac, и все равно такое происходит. Хотя вроде конфликта нету.

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


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

2 Doka: я все равно что то не понял. Я когда моделирую, задаю значение этому порту даже после срабатывания сигнала reset_mac, и все равно такое происходит. Хотя вроде конфликта нету.

 

А есть ли смысл вот в этом:

if reset_mac='1' then

 

accC<=(others=>'0');

 

Как обнулить это двунаправленное. Двунаправленному принципиально нужен буфер по третьему состоянию.

В любом случае это строка смысла не имеет.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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