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

Считать состояние выхода

У меня в entity есть выходы

REG_OUT_SEL1  : out std_logic_vector(5 downto 0);
REG_OUT_SEL2  : out std_logic_vector(5 downto 0);

мне нужно через интерфейс (SPI) писать туда значения и считывать текущее состояние выходов

signal out_sel1 : std_logic_vector(5 downto 0);
signal out_sel2 : std_logic_vector(5 downto 0);

out_sel1 <= REG_OUT_SEL1;
out_sel2 <= REG_OUT_SEL2;

when ST_WORD_READ =>
    when X"0022" => sspi_data_out <= "0000000000" & out_sel1;
    when X"0023" => sspi_data_out <= "0000000000" & out_sel2;


when ST_WORD_WRITE =>
    when X"0022" => REG_OUT_SEL1 <= sspi_data_in(5 downto 0);
    when X"0023" => REG_OUT_SEL2 <= sspi_data_in(5 downto 0);

получаю ошибку

Quote

Error (10309): interface object "REG_OUT_SEL1" of mode out cannot be read. Change object mode to buffer.

но мне не хочется делать
REG_OUT_SEL1  : inout std_logic_vector(5 downto 0);

есть другое решение?

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


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

1 hour ago, jenya7 said:

У меня в entity есть выходы


REG_OUT_SEL1  : out std_logic_vector(5 downto 0);
REG_OUT_SEL2  : out std_logic_vector(5 downto 0);

мне нужно через интерфейс (SPI) писать туда значения и считывать текущее состояние выходов


signal out_sel1 : std_logic_vector(5 downto 0);
signal out_sel2 : std_logic_vector(5 downto 0);

out_sel1 <= REG_OUT_SEL1;
out_sel2 <= REG_OUT_SEL2;

when ST_WORD_READ =>
    when X"0022" => sspi_data_out <= "0000000000" & out_sel1;
    when X"0023" => sspi_data_out <= "0000000000" & out_sel2;


when ST_WORD_WRITE =>
    when X"0022" => REG_OUT_SEL1 <= sspi_data_in(5 downto 0);
    when X"0023" => REG_OUT_SEL2 <= sspi_data_in(5 downto 0);

получаю ошибку

но мне не хочется делать
REG_OUT_SEL1  : inout std_logic_vector(5 downto 0);

есть другое решение?

Через промежуточный сигнал надо все делать.

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


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

18 минут назад, Flip-fl0p сказал:

Через промежуточный сигнал надо все делать.

Ещё выход можно объявить не out а buf.

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


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

1 hour ago, Flip-fl0p said:

Через промежуточный сигнал надо все делать.

я и сделал через промежуточный сигнал. все равно ошибка.

1 hour ago, _sda said:

Ещё выход можно объявить не out а buf.

этого я и хочу избежать.

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


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

33 minutes ago, jenya7 said:

я и сделал через промежуточный сигнал. все равно ошибка.

этого я и хочу избежать.

Всё просто:

REG_OUT_SEL1  : out std_logic_vector(5 downto 0);
REG_OUT_SEL2  : out std_logic_vector(5 downto 0);

signal out_sel1 : std_logic_vector(5 downto 0);
signal out_sel2 : std_logic_vector(5 downto 0);

signal iREG_OUT_SEL1 : std_logic_vector(5 downto 0); -- Внутренний сигнал для выдачи наружу и чтения
signal iREG_OUT_SEL2 : std_logic_vector(5 downto 0); -- Внутренний сигнал для выдачи наружу и чтения


out_sel1 <= iREG_OUT_SEL1;                -- Читаем наш внутренний сигнал
out_sel2 <= iREG_OUT_SEL2;                -- Читаем наш внутренний сигнал

REG_OUT_SEL1 <= iREG_OUT_SEL1;                 -- Выдаем наш внутренний сигнал наружу
REG_OUT_SEL2 <= iREG_OUT_SEL2;                -- Выдаем наш внутренний сигнал наружу

when ST_WORD_READ =>
    when X"0022" => sspi_data_out <= "0000000000" & out_sel1;
    when X"0023" => sspi_data_out <= "0000000000" & out_sel2;


when ST_WORD_WRITE =>
    when X"0022" => iREG_OUT_SEL1 <= sspi_data_in(5 downto 0);     
    when X"0023" => iREG_OUT_SEL2 <= sspi_data_in(5 downto 0);

Вообще VHDL 2008 вроде как поддерживает и чтение выходных портов внутри архитектурного тела. Но работает криво и не всегда.

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


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

1 hour ago, Flip-fl0p said:

Всё просто:

Вообще VHDL 2008 вроде как поддерживает и чтение выходных портов внутри тела модуля. Но работает криво и не всегда.

спасибо. я читал что стоит избегать использование inout.

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


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

1 minute ago, jenya7 said:

спасибо. я читал что стоит избегать использование inout.

Его не стоит избегать, а надо просто понимать что inout - это двунаправленный порт доступный только на выходных пинах.  И применяется именно в качестве двунаправленного порта. Например шина данных DRAM памяти. Внутри самой ПЛИС никаких двунаправленных портов нет и попытка описать логику через такой порт - банальная ошибка в проектировании. 

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


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

2 hours ago, Flip-fl0p said:

Его не стоит избегать, а надо просто понимать что inout - это двунаправленный порт доступный только на выходных пинах.  И применяется именно в качестве двунаправленного порта. Например шина данных DRAM памяти. Внутри самой ПЛИС никаких двунаправленных портов нет и попытка описать логику через такой порт - банальная ошибка в проектировании. 

как чувствовал. :) у меня эти выходы с entity мапируются на  выходы в топ entity.

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


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

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

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

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

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

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

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

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

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

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