Maverick_ 15 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба Есть проект в нем 5 модулей памяти (в нем выведены просто порты памятей наружу), мне необходимо читать и писать из/в них. Желательно c возможностью выбора памяти с которой работаю. Сделал genericmux.vhd который работает как мультиплексор и конвертирует так сказать шину avalon MM в сигналы управления памяти, т.е. сигналы портов памяти с возможностью писать и читать данные. Мультиплексор переключается перед началом передачи данных. Поскажите в чем может быть ошибка в описании или tcl скрипте? ЗЫ Здесь задумался про латентность, у меня данные не на следующем такте а через такт появляются... genericmux.vhd genericmux_hw.tcl Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба а что-то не работает или как ? но вообще, судя по тому что вы описываете, вам нужно маленький shared bus описать, латентность и регистровые слои которого, по вашему выбору) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба В том то и дело, что проверил не работает.. Да мне надо описать прослойку avalon MM - 5 портов памяти... В tcl скрипте не подскажите где прописать латентность/задержку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба 7 minutes ago, Maverick_ said: В tcl скрипте не подскажите где прописать латентность/задержку? чего не знаю, того не знаю) такие вещи я руками обычно пишу) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба Так я руками написал модуль ... Что еще нужно написать ? Помогите понять что не так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба 9 minutes ago, Maverick_ said: Так я руками написал модуль ... Что еще нужно написать ? Помогите понять что не так 1. Я бы для начала сделал его полностью асинхронным, чисто мультиплексоры. 2. Там где "case select_write is" с логикой проблемы. При переходе в case из одного состояния в другое будут храниться старые значения, а не устанавливаться 0. Может и еще где. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 11 июня, 2020 Опубликовано 11 июня, 2020 · Жалоба Приветствую! 29 minutes ago, Maverick_ said: Что еще нужно написать ? Помогите понять что не так Нам бы для начала самим понять что вы понять хотите Это не то что вам надо ? Думаю вам тут надо поставить реальное число задержки при чтении. set_interface_property avalon_slave_input readLatency 0 Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 июня, 2020 Опубликовано 12 июня, 2020 · Жалоба Всем спасибо. Разобрался... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 12 июня, 2020 Опубликовано 12 июня, 2020 · Жалоба Простое любопытство Кто-то сравнивал работу dma В burst и обычном блочном режиме, когда читаешь или пишешь блоками данных??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 17 июня, 2020 Опубликовано 17 июня, 2020 (изменено) · Жалоба On 6/13/2020 at 12:56 AM, Maverick_ said: В burst и обычном блочном режиме, когда читаешь или пишешь блоками данных??? речь про альтеру? dma вроде и подразмивает пересылку блоками/кусками через контроллер dma Изменено 17 июня, 2020 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 17 июня, 2020 Опубликовано 17 июня, 2020 · Жалоба Допустим альтера. Бурст режим тоже подразумевает работу с блоками данных Есть предложение что В блочном вроде быстрее, но данных должно быть много. Если маленькие пакеты и не часто то лучше burst Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 17 июня, 2020 Опубликовано 17 июня, 2020 · Жалоба Приветствую! 21 minutes ago, Maverick_ said: Бурст режим тоже подразумевает работу с блоками данных Вы как то путаете масло (сливочное) с маслом (машинным) . Бурст - это режим передачи данных по адресуемой шине при котором на один цикл адреса передается несколько слов данных. К DMA как то напрямую не имеет отношения. Что вы подразумеваете под "блочным режимом DMA" можно только догадываться - может вы имели ввиду scatter-gather режим DMA? В противовес "обычному" однократно - программируемому? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 июня, 2020 Опубликовано 19 июня, 2020 · Жалоба Сделал прослойку (genericmux.vhd) между одним портом блочных памятей HDL (пример описания блочной памяти bram_tpd.vhd) проекта и процессором на шине авалон MM Пытаюсь читать и писать в них... Во вложении скрин результата чтения и записи... Такое ощущение что ему не хватает такта или где-то проблема с адресами... Помогите пожалуйста разобраться... Числа я пишу по порядку... как мысль: Возможно в проблема, что не хватает сигнала chipselect? если добавить в genericmux.vhd (new_component_0 в qsys) : wr_en_0 <= '1' when avs_s0_write ='1' and chipselect_s0 ='1' else '0'; и тогда для одного порта будет process(avs_s0_read, avs_s0_write) begin -- if rst = '1' then -- we_commands <= '0'; -- elsif(rising_edge(clk)) then if avs_s0_read = '1' then we_commands <= '0'; elsif avs_s0_write = '1' and wr_en_0 = '1' then we_commands <= '1'; else we_commands <= '0'; end if; addr_commands <= avs_s0_address; data_in_commands <= avs_s0_writedata; avs_s0_readdata <= data_out_commands; --end if; end process; тогда интерфейс авалон порта будет иметь вид: avs_s0_read : in std_logic; avs_s0_write : in std_logic; chipselect_s0 : in std_logic; avs_s0_address : in std_logic_vector((ADDR_LENGTH-1) downto 0); avs_s0_writedata : in std_logic_vector((DATA_LENGTH-1) downto 0); avs_s0_readdata : out std_logic_vector((DATA_LENGTH-1) downto 0); и так сделать для всех 7 портов... genericmux_hw.tcl genericmux.vhd bram_tpd.vhd Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 19 июня, 2020 Опубликовано 19 июня, 2020 · Жалоба В асинхронном процессе в списке чувствительности должны быть указаны все входные сигналы, иначе вам синтезатор вместо комбинаторике сделает latch. У вас там как минимум не хватает wr_en_0. addr_commands <= avs_s0_address; data_in_commands <= avs_s0_writedata; avs_s0_readdata <= data_out_commands; надо вынести из процесса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 19 июня, 2020 Опубликовано 19 июня, 2020 · Жалоба 1 hour ago, andrew_b said: В асинхронном процессе в списке чувствительности должны быть указаны все входные сигналы, иначе вам синтезатор вместо комбинаторике сделает latch. У вас там как минимум не хватает wr_en_0. addr_commands <= avs_s0_address; data_in_commands <= avs_s0_writedata; avs_s0_readdata <= data_out_commands; надо вынести из процесса. Спасибо. Не знал, всегда думал что список чувствительности влияет только на симуляцию. Такое описание: process(avs_s0_read, avs_s0_write) begin -- if rst = '1' then -- we_commands <= '0'; -- elsif(rising_edge(clk)) then if avs_s0_read = '1' then we_commands <= '0'; elsif avs_s0_write = '1' then we_commands <= '1'; else we_commands <= '0'; end if; end process; addr_commands <= avs_s0_address; data_in_commands <= avs_s0_writedata; avs_s0_readdata <= data_out_commands; правильное ? все сигналы в списке чувствительности? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться