Maverick_ 15 5 августа, 2019 Опубликовано 5 августа, 2019 (изменено) · Жалоба добрый день есть вопрос по спецификация (стр 16) имеется сигнал waitrequest и readdatavalid. Для слейва они нужны? Можно ли попросить посмотреть мое описание слейва: Spoiler прилагаю также tcl скрипт # TCL File Generated by Component Editor 17.1 # Fri Jul 26 17:03:31 EEST 2019 # DO NOT MODIFY # # dualport_ram "dualport_ram" v1.0 # RocketBoards.org 2019.07.26.17:03:31 # Dualport memory Avalon slave MM IP # # # request TCL package from ACDS 16.1 # package require -exact qsys 16.1 # # module dualport_ram # set_module_property DESCRIPTION "Dualport memory Avalon slave MM IP" set_module_property NAME dualport_ram set_module_property VERSION 1.0 set_module_property INTERNAL false set_module_property OPAQUE_ADDRESS_MAP true set_module_property AUTHOR RocketBoards.org set_module_property DISPLAY_NAME dualport_ram set_module_property INSTANTIATE_IN_SYSTEM_MODULE true set_module_property EDITABLE true set_module_property REPORT_TO_TALKBACK false set_module_property ALLOW_GREYBOX_GENERATION false set_module_property REPORT_HIERARCHY false # # file sets # add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" "" set_fileset_property QUARTUS_SYNTH TOP_LEVEL dualport_ram set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false set_fileset_property QUARTUS_SYNTH ENABLE_FILE_OVERWRITE_MODE false add_fileset_file dualport_ram.vhd VHDL PATH ip/dualport_ram/dualport_ram.vhd TOP_LEVEL_FILE # # parameters # # # module assignments # set_module_assignment embeddedsw.dts.compatible dev,dualport-ram set_module_assignment embeddedsw.dts.group rams set_module_assignment embeddedsw.dts.vendor dsa # # display items # # # connection point avs_s0 # add_interface avs_s0 avalon end set_interface_property avs_s0 addressUnits WORDS set_interface_property avs_s0 associatedClock clk0 set_interface_property avs_s0 associatedReset rst0 set_interface_property avs_s0 bitsPerSymbol 8 set_interface_property avs_s0 burstOnBurstBoundariesOnly false set_interface_property avs_s0 burstcountUnits WORDS set_interface_property avs_s0 explicitAddressSpan 0 set_interface_property avs_s0 holdTime 0 set_interface_property avs_s0 linewrapBursts false set_interface_property avs_s0 maximumPendingReadTransactions 0 set_interface_property avs_s0 maximumPendingWriteTransactions 0 set_interface_property avs_s0 readLatency 0 set_interface_property avs_s0 readWaitTime 1 set_interface_property avs_s0 setupTime 0 set_interface_property avs_s0 timingUnits Cycles set_interface_property avs_s0 writeWaitTime 0 set_interface_property avs_s0 ENABLED true set_interface_property avs_s0 EXPORT_OF "" set_interface_property avs_s0 PORT_NAME_MAP "" set_interface_property avs_s0 CMSIS_SVD_VARIABLES "" set_interface_property avs_s0 SVD_ADDRESS_GROUP "" add_interface_port avs_s0 avs_s0_address address Input 12 add_interface_port avs_s0 avs_s0_read read Input 1 add_interface_port avs_s0 avs_s0_write write Input 1 add_interface_port avs_s0 avs_s0_readdata readdata Output 64 add_interface_port avs_s0 avs_s0_writedata writedata Input 64 set_interface_assignment avs_s0 embeddedsw.configuration.isFlash 0 set_interface_assignment avs_s0 embeddedsw.configuration.isMemoryDevice 0 set_interface_assignment avs_s0 embeddedsw.configuration.isNonVolatileStorage 0 set_interface_assignment avs_s0 embeddedsw.configuration.isPrintableDevice 0 # # connection point avs_s1 # add_interface avs_s1 avalon end set_interface_property avs_s1 addressUnits WORDS set_interface_property avs_s1 associatedClock clk1 set_interface_property avs_s1 associatedReset rst1 set_interface_property avs_s1 bitsPerSymbol 8 set_interface_property avs_s1 burstOnBurstBoundariesOnly false set_interface_property avs_s1 burstcountUnits WORDS set_interface_property avs_s1 explicitAddressSpan 0 set_interface_property avs_s1 holdTime 0 set_interface_property avs_s1 linewrapBursts false set_interface_property avs_s1 maximumPendingReadTransactions 0 set_interface_property avs_s1 maximumPendingWriteTransactions 0 set_interface_property avs_s1 readLatency 0 set_interface_property avs_s1 readWaitTime 1 set_interface_property avs_s1 setupTime 0 set_interface_property avs_s1 timingUnits Cycles set_interface_property avs_s1 writeWaitTime 0 set_interface_property avs_s1 ENABLED true set_interface_property avs_s1 EXPORT_OF "" set_interface_property avs_s1 PORT_NAME_MAP "" set_interface_property avs_s1 CMSIS_SVD_VARIABLES "" set_interface_property avs_s1 SVD_ADDRESS_GROUP "" add_interface_port avs_s1 avs_s1_address address Input 12 add_interface_port avs_s1 avs_s1_read read Input 1 add_interface_port avs_s1 avs_s1_write write Input 1 add_interface_port avs_s1 avs_s1_readdata readdata Output 64 add_interface_port avs_s1 avs_s1_writedata writedata Input 64 set_interface_assignment avs_s1 embeddedsw.configuration.isFlash 0 set_interface_assignment avs_s1 embeddedsw.configuration.isMemoryDevice 0 set_interface_assignment avs_s1 embeddedsw.configuration.isNonVolatileStorage 0 set_interface_assignment avs_s1 embeddedsw.configuration.isPrintableDevice 0 # # connection point clk1 # add_interface clk1 clock end set_interface_property clk1 clockRate 0 set_interface_property clk1 ENABLED true set_interface_property clk1 EXPORT_OF "" set_interface_property clk1 PORT_NAME_MAP "" set_interface_property clk1 CMSIS_SVD_VARIABLES "" set_interface_property clk1 SVD_ADDRESS_GROUP "" add_interface_port clk1 b_clk clk Input 1 # # connection point clk0 # add_interface clk0 clock end set_interface_property clk0 clockRate 0 set_interface_property clk0 ENABLED true set_interface_property clk0 EXPORT_OF "" set_interface_property clk0 PORT_NAME_MAP "" set_interface_property clk0 CMSIS_SVD_VARIABLES "" set_interface_property clk0 SVD_ADDRESS_GROUP "" add_interface_port clk0 a_clk clk Input 1 # # connection point rst0 # add_interface rst0 reset end set_interface_property rst0 associatedClock clk1 set_interface_property rst0 synchronousEdges DEASSERT set_interface_property rst0 ENABLED true set_interface_property rst0 EXPORT_OF "" set_interface_property rst0 PORT_NAME_MAP "" set_interface_property rst0 CMSIS_SVD_VARIABLES "" set_interface_property rst0 SVD_ADDRESS_GROUP "" # # connection point rst1 # add_interface rst1 reset end set_interface_property rst1 associatedClock clk1 set_interface_property rst1 synchronousEdges DEASSERT set_interface_property rst1 ENABLED true set_interface_property rst1 EXPORT_OF "" set_interface_property rst1 PORT_NAME_MAP "" set_interface_property rst1 CMSIS_SVD_VARIABLES "" set_interface_property rst1 SVD_ADDRESS_GROUP "" полностью корректное подключение к шине Avalon MM описание блочной памяти или есть нюансы? Может какие то сигналы шины Avalon MM я упустил? PS просто сомнения есть... Изменено 9 августа, 2019 пользователем des00 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarantul 0 5 августа, 2019 Опубликовано 5 августа, 2019 · Жалоба Добрый день, если в слейве эти сигналы есть то нужны, а если нет то нет. waitrequest или readdatavalid использую когда обращение к памяти долгое, или преобразование данных в слейве идет и задержка на неопределенное количество тактов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 5 августа, 2019 Опубликовано 5 августа, 2019 · Жалоба В Вашем примере waitrequest и readdatavalid не обязательны, По TCL если я правильно понял что данные ,будут записаны на следующий такт после прихода write то: set_interface_property avs_s1 writeWaitTime 1 ну и вот так будет точнее: set_interface_property avs_s1 readLatency 1 set_interface_property avs_s1 readWaitTime 0 Сигнал reg_we1 устанавливается в домене a_clk, а используется в b_clk ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 6 августа, 2019 Опубликовано 6 августа, 2019 · Жалоба Спасибо за помощь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 6 августа, 2019 Опубликовано 6 августа, 2019 (изменено) · Жалоба Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest Изменено 6 августа, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 6 августа, 2019 Опубликовано 6 августа, 2019 · Жалоба 44 minutes ago, new123 said: Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest можете привести пример описания слейва с waitrequest и readdatavalid или в мое описание приведенное выше их добавьте.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 6 августа, 2019 Опубликовано 6 августа, 2019 (изменено) · Жалоба 1 hour ago, Maverick_ said: можете привести пример описания слейва с waitrequest и readdatavalid или в мое описание приведенное выше их добавьте.... извините, vhdl совсем не силен. А пример запросто. Нечто подобное и у меня, кроме NIOS + различные мои нагромождения. https://www.intel.cn/content/dam/altera-www/global/zh_CN/pdfs/literature/hb/nios2/edh_ed51007.pdf Вторая картинка мне подсказала источник всех багов на моем слейве (рукописный контроллер свой). Я делал write при поднятом waitrequest от другого slave и терял данные. Тему недавно создавал про потерю из FIFO Полистайте ссылку, там схем очень много про арбитраж шины при многих потребителей. Изменено 6 августа, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 6 августа, 2019 Опубликовано 6 августа, 2019 (изменено) · Жалоба 1 hour ago, Maverick_ said: пример описания слейва с waitrequest я может не правильно вопрос понял про пример. Пример кода? Да вот dma контроллер мне выдает, я на них цепляюсь своими контроллерами как slave и по шине avalon общаюсь, загоняю/читаю данные в двухпортовую память module pcie ( output wire pcie_dma_mem_rd_waitrequest, output wire [255:0] pcie_dma_mem_rd_readdata, output wire pcie_dma_mem_rd_readdatavalid, input wire [0:0] pcie_dma_mem_rd_burstcount, input wire [255:0] pcie_dma_mem_rd_writedata, input wire [17:0] pcie_dma_mem_rd_address, input wire pcie_dma_mem_rd_write, input wire pcie_dma_mem_rd_read, input wire [31:0] pcie_dma_mem_rd_byteenable, input wire pcie_dma_mem_rd_debugaccess, output wire pcie_dma_mem_wr_waitrequest, output wire [255:0] pcie_dma_mem_wr_readdata, output wire pcie_dma_mem_wr_readdatavalid, input wire [0:0] pcie_dma_mem_wr_burstcount, input wire [255:0] pcie_dma_mem_wr_writedata, input wire [17:0] pcie_dma_mem_wr_address, input wire pcie_dma_mem_wr_write, input wire pcie_dma_mem_wr_read, input wire [31:0] pcie_dma_mem_wr_byteenable, input wire pcie_dma_mem_wr_debugaccess, } module my ( input wire clk_rd, input wire clk_wr, input wire reset, output reg [17:0] address_wr, output wire [255:0] data_wr, input wire wait_wr, output wire start_wr, ..... ) Изменено 6 августа, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 6 августа, 2019 Опубликовано 6 августа, 2019 (изменено) · Жалоба 9 минут назад, new123 сказал: Вторая картинка мне подсказала источник всех багов на моем слейве (рукописный контроллер свой). Попробуйте сделать контроллер шины в виде автомата. А если найдете у Альтеры граф переходов состояний шины, то это будет вообще легко. А если сделать с параметрами, то можно вообще выкрутить несколько вариантов и потом быстро их подстраивать под требования конкретного абонента шины... Изменено 6 августа, 2019 пользователем iosifk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 6 августа, 2019 Опубликовано 6 августа, 2019 · Жалоба 6 hours ago, new123 said: Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 6 августа, 2019 Опубликовано 6 августа, 2019 · Жалоба Приветствую! 7 minutes ago, iglaz3 said: То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств? Waitrequest генерирует Slave когда он не готов обрабатывать запросы (read|write) от Master. Если ваш Slave всегда готов (как пионер), то можете не делать waitrequest логику в своем Slave. Но в мастере вы ее реализовывать обязаны. У @new123 насколько я помню было 2 мастера. Удачи. Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 6 августа, 2019 Опубликовано 6 августа, 2019 · Жалоба 8 minutes ago, RobFPGA said: Если ваш Slave всегда готов (как пионер), то можете не делать waitrequest логику в своем Slave. TCL позволяет настроить почти любую ситуацию с фиксированной задержкой. Просто удивило: Quote Второй слейв займет шину, вам на первый слейв прилетит waitrequest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 6 августа, 2019 Опубликовано 6 августа, 2019 (изменено) · Жалоба 4 hours ago, iglaz3 said: То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств? у Вас есть исходники описания генерируемого IP ядро? Изменено 6 августа, 2019 пользователем Maverick_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wolfman 0 8 августа, 2019 Опубликовано 8 августа, 2019 · Жалоба Можно сделать что-то типа такого: Спойлер elsif rising_edge(clk) then if (avl_readdatavalid) then avl_waitrequest <= '0'; avl_readdatavalid <= '0'; else if (avl_read) then avl_waitrequest <= '1'; avl_readdatavalid <= '1'; for i in 0 to (AVL_ADDRESS_WIDTH-1) loop if ((to_integer(unsigned(avl_address(AVL_ADDRESS_WIDTH-1 downto 2)))) = i) then for j in 0 to ((avl_byteenable) loop if (avl_byteenable(j) = '1') then avl_readdata(((j*8)+7) downto (j*8)) <= intdata(i)(((j*8)+7) downto (j*8)); end if; end loop; end if; end loop; end if; end if; end if; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 10 августа, 2019 Опубликовано 10 августа, 2019 (изменено) · Жалоба wolfman спасибо Изменено 10 августа, 2019 пользователем Maverick_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться