Worldmaster 0 27 июня, 2023 Опубликовано 27 июня, 2023 · Жалоба Здравствуйте. Делаю программу для передачи данных через FT601. Возникли некоторые вопросы. Буду благодарен всем кто подскажет что тут не так. В общем к делу: Создал файл package где определил свои типы для проекта. type DataBuffer is array (0 to MaxUSBBufferLength-1) of std_logic_vector(7 downto 0); Далее определил буфер и связал его с буфером в компоненте: signal fifo_buffer_src :DataBuffer; -- общий буфее приимоопередачи Далее в самом коде сделал чтобы при первых 8 тактах буфер заполнялся значениями индекса от 0 до 8. process (GCLK) begin if rising_edge(GCLK) then if CurrentState_src = Complete then test_cnt <= 0; StartWork_src <= '0'; -- disable transmision end if; if CurrentState_src = idle then if test_cnt >= MaxUSBBufferLength then RW_src <= '1'; -- write to bus ChannelNum_src <= "00000001"; -- write to channel number StartWork_src <= '1'; -- enable transffr else --fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length)); fifo_buffer_src(test_cnt) <= "10101010"; test_cnt <= test_cnt+1; end if; end if; end if; end process; вот блок где происходит заполнение вообще не работает. Цитата --fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length)); fifo_buffer_src(test_cnt) <= "10101010"; проверяю работу в modelsim. В целом вроде бы отрабатывает так как и задумано но в буфере почему то всегда xx. Что я сделал не так то?? Вроде бы все компилится без ошибок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В приведенном коде криминала не видно. Наличие X (а не U) на шине говорит о конфликте драйверов: на шину выставляются значения из разных мест. Замените std_logic на std_ulogic в определени DataBuffer и посмотрите, что будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 08:33, andrew_b сказал: Наличие X (а не U) на шине говорит о конфликте драйверов: на шину выставляются значения из разных мест. Да нет у меня такого. Буфер inout но запись я провожу только в одном месте. В 28.06.2023 в 08:33, andrew_b сказал: Замените std_logic на std_ulogic в определени DataBuffer и посмотрите, что будет. Заменил вот так: type DataBuffer is array (0 to MaxUSBBufferLength-1) of std_ulogic_vector(7 downto 0); Modelsim отказался компилить с ошибкой: "non resolved signal has multiple source" Вот полный код модуля. Заполняю же только один раз. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use IEEE.numeric_std.all; library work; use work.types_package.all; entity top is port ( FTDI_CLK: in std_logic; led: out std_logic; led2: out std_logic; btn: in std_logic; txe_src : in std_logic; rxe_src: in std_logic; wr_src: out std_logic; BE_src : inout std_logic_vector(3 downto 0); DATA_1_src : inout std_logic_vector(7 downto 0); DATA_2_src : inout std_logic_vector(7 downto 0); DATA_3_src : inout std_logic_vector(7 downto 0); DATA_4_src : inout std_logic_vector(7 downto 0) ); end top; architecture structural of top is -- компоненты создаются с таким же именем как entity component OSC generic ( FREQ_DIV: in integer := 100; DEVICE: in string := "GW2A-18" ); port ( OSCOUT: out std_logic ); end component; ----------------------------------------------------------------------- component Debounce port ( base_clk : in std_logic; btn_signal : in std_logic; out_signal : out std_logic ); end component; ----------------------------------------------------------------------- component Blinker generic ( MaxDelay:INTEGER := 50_000_000 --frequency ); port ( in_clk : in std_logic; out_signal : out std_logic ); end component; ----------------------------------------------------------------------- component USB_BRIDGE port ( in_clk : in std_logic; txe_n : in std_logic; rxf_n: in std_logic; wr_n: out std_logic; BE : inout std_logic_vector(3 downto 0); DATA_1 : inout std_logic_vector(7 downto 0); DATA_2 : inout std_logic_vector(7 downto 0); DATA_3 : inout std_logic_vector(7 downto 0); DATA_4 : inout std_logic_vector(7 downto 0); signal StartWork: std_logic; signal fifo_buffer :inout DataBuffer; -- общий буфее приимоопередачи signal RW: std_logic; -- чтение или запись signal ChannelNum: in std_logic_vector(7 downto 0); -- номер канала signal CurrentState: out machine_mode ); end component; ----------------------------------------------------------------------- signal debounce_out : std_logic; signal state_out : std_logic; signal GCLK : std_logic := '0'; -- параметры для пвключения передачи по USB signal StartWork_src: std_logic := '0'; signal fifo_buffer_src :DataBuffer; -- общий буфее приимоопередачи signal RW_src: std_logic := '0'; -- чтение или запись signal ChannelNum_src: std_logic_vector(7 downto 0); -- номер канала signal CurrentState_src: machine_mode := idle; signal test_cnt: integer:=0; ----------------------------------------------------------------------- begin osc_inst: OSC generic map ( FREQ_DIV => 2, DEVICE => "GW2AR-18" ) port map ( OSCOUT => GCLK ); BUTTON1: Debounce port map ( base_clk => GCLK, btn_signal => btn, out_signal => debounce_out ); led2 <= debounce_out; LED1: Blinker generic map( MaxDelay => 5 ) port map ( in_clk => GCLK, out_signal => state_out ); led <= state_out; ----------------------------------------------------------------------- USBFIFO: USB_BRIDGE port map ( in_clk => FTDI_CLK, txe_n => txe_src, rxf_n => rxe_src, wr_n => wr_src, BE => BE_src, DATA_1 => DATA_1_src, DATA_2 => DATA_2_src, DATA_3 => DATA_3_src, DATA_4 => DATA_4_src, StartWork => StartWork_src, fifo_buffer => fifo_buffer_src, RW => RW_src, ChannelNum => ChannelNum_src, CurrentState => CurrentState_src ); ------------------------------------------------------------------------------ -- основннй ппоцесс ддя ооладкииооппавки process (GCLK) begin if rising_edge(GCLK) then if CurrentState_src = Complete then test_cnt <= 0; StartWork_src <= '0'; -- disable transmision elsif CurrentState_src = idle then if test_cnt >= MaxUSBBufferLength then RW_src <= '1'; -- write to bus ChannelNum_src <= "00000001"; -- write to channel number StartWork_src <= '1'; -- enable transffr else fifo_buffer_src(test_cnt) <= std_ulogic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length)); --fifo_buffer_src(test_cnt) <= "10101010"; test_cnt <= test_cnt+1; end if; end if; end if; end process; end architecture; Ну точно. Изменил fifo_buffer как in и сразу стал нормально отображать. Но тогда вопрос. А почему нельзя inout?? Или как правильно использовать inout сигналы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба замените fifo_buffer_src(test_cnt) <= std_ulogic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length)); на fifo_buffer_src(test_cnt) <= std_logic_vector(to_unsigned( test_cnt, fifo_buffer_src(test_cnt)'length)); зачем вам тип std_ulogic_vector почему не использовать просто std_logic_vector ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 09:45, Maverick_ сказал: зачем вам тип Потому что выше было сказано: В 28.06.2023 в 08:33, andrew_b сказал: Замените std_logic на std_ulogic в определени DataBuffer Вот и заменил. Но std_logic_vector не меняет ситуации. Как правильно организовать общий буфер? Если это вообще возможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба мой совет опишите отдельным компонентом двупортовую память и сделайте логику записи и чтения в буффер. Я б на Вашем месте сделал бы две памяти одна на запись, другая чтение с/в inout порта. В данном Вашем описании Вы можете писать и читать одновременно потому что у Вас вход inout (можете сделать только вход и думаю все будет симулироваться). опишите корректно получение данных с inout порта. Управления переключения с чтения на запись и наоборот я в Вашем описании не вижу для буффера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 10:05, Maverick_ сказал: Управления переключения с чтения на запись и наоборот я в Вашем описании не вижу для буффера Как это сделать то? Есть пример какой нибудь простенький? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба 58 minutes ago, Maverick_ said: зачем вам тип std_ulogic_vector почему не использовать просто std_logic_vector ??? Этот тип не даёт вам выстрелить себе в ногу. Советую узнать, что такое resolution function в VHDL. @Worldmaster, как, по-вашим ожиданиям, работает порт inout? 6 minutes ago, Worldmaster said: Как это сделать то? Есть пример какой нибудь простенький? Поиск по форуму по слову inout. Например: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 10:38, andrew_b сказал: @Worldmaster, как, по-вашим ожиданиям, работает порт inout? у FT601 порт двунаправленный. Если мне нужно считать данные то вначале я отправляю команду на чтение и потом должен считать нужное количество байт. То есть при чтении буду данные с порта записывать в буфер. Если надо отправить то я предварительно в буфер запишу данные и потом при обработке транзакции выставляю команду на запись и отправляю данные из буфера в порт FT. Это то что хотелось бы. Я в основном мыслю как разработчик С++. Тут наверное есть какие то нюансы. а при таком подходе: PORT ( Read_Write : in std_logic; Data_in_out : inout std_logic_vector(2 downto 0); Data_in : in std_logic_vector(2 downto 0); qata_out : out std_logic_vector(2 downto 0)); END test; Получается что нужно в 3 раза больше памяти или нет?? Или тут логика другая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба 1 minute ago, Worldmaster said: у FT601 порт двунаправленный. Если мне нужно считать данные то вначале я отправляю команду на чтение и потом должен считать нужное количество байт. И у вас тоже порт двунаправленный. Но двунаправленным портом нужно управлять. Когда надо, делать выходом, входом он является всегда. 7 minutes ago, Worldmaster said: Получается что нужно в 3 раза больше памяти или нет?? Непонятно, откуда взялось 3 раза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 11:08, andrew_b сказал: Непонятно, откуда взялось 3 раза. Ну вот же выделено 3 сигнала: Data_in_out : inout std_logic_vector(2 downto 0); Data_in : in std_logic_vector(2 downto 0); qata_out : out std_logic_vector(2 downto 0)); Как посмотреть какую схему он создаст из этого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба Это просто пример использования двунаправленного порта. 3 minutes ago, Worldmaster said: Как посмотреть какую схему он создаст из этого? Отсинтезировать и посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 11:21, andrew_b сказал: Отсинтезировать и посмотреть. У меня GOWIN FPGA Designer что то в нем нет такой функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба 2 hours ago, Worldmaster said: Если надо отправить то я предварительно в буфер запишу данные и потом при обработке транзакции выставляю команду на запись и отправляю данные из буфера в порт FT. Вам это для только симуляции или синтезировать тоже будете? Если второе, то так работать не будет (ни с какими inout и пр). Не бывает в железе generic памяти с проиэвольным доступом откуда угодно. В железе память вообще напрямую не доступна - только через порты, которых у неё ограниченное количество и с ограниченными возможностями. (Я сейчас не рассматриваю память, которую синтезатор может сделать на регистрах - у такой может быть практически любое количество портов). И что бы синтезатор понял, что из вашего массива надо сделать память, его описание и способы доступа к нему должны быть весьма определёнными. Каждый порт описывается определённым набором сигналов, а сама память обычно располагается целиком внутри какого нибудь модуля. Весь доступ снаружу идет через порты (эти самые сигналы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 28 июня, 2023 Опубликовано 28 июня, 2023 · Жалоба В 28.06.2023 в 13:32, xvr сказал: Вам это для только симуляции или синтезировать тоже будете? Не совсем понял. Сейчас я хочу организовать для теста простую пересылку команд на комп и обратно. Ну и может попытаться как то наладить управление ПЛИС со стороны компа. В 28.06.2023 в 13:32, xvr сказал: Весь доступ снаружу идет через порты (эти самые сигналы). Это вы к тому что надо сделать отдельный компонент чтоли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться