jenya7 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба У меня в 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); есть другое решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 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); есть другое решение? Через промежуточный сигнал надо все делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 18 минут назад, Flip-fl0p сказал: Через промежуточный сигнал надо все делать. Ещё выход можно объявить не out а buf. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 1 hour ago, Flip-fl0p said: Через промежуточный сигнал надо все делать. я и сделал через промежуточный сигнал. все равно ошибка. 1 hour ago, _sda said: Ещё выход можно объявить не out а buf. этого я и хочу избежать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 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 вроде как поддерживает и чтение выходных портов внутри архитектурного тела. Но работает криво и не всегда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 1 hour ago, Flip-fl0p said: Всё просто: Вообще VHDL 2008 вроде как поддерживает и чтение выходных портов внутри тела модуля. Но работает криво и не всегда. спасибо. я читал что стоит избегать использование inout. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 1 minute ago, jenya7 said: спасибо. я читал что стоит избегать использование inout. Его не стоит избегать, а надо просто понимать что inout - это двунаправленный порт доступный только на выходных пинах. И применяется именно в качестве двунаправленного порта. Например шина данных DRAM памяти. Внутри самой ПЛИС никаких двунаправленных портов нет и попытка описать логику через такой порт - банальная ошибка в проектировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 2 hours ago, Flip-fl0p said: Его не стоит избегать, а надо просто понимать что inout - это двунаправленный порт доступный только на выходных пинах. И применяется именно в качестве двунаправленного порта. Например шина данных DRAM памяти. Внутри самой ПЛИС никаких двунаправленных портов нет и попытка описать логику через такой порт - банальная ошибка в проектировании. как чувствовал. :) у меня эти выходы с entity мапируются на выходы в топ entity. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться