Jump to content

    

вопрос по avalon MM

добрый день

есть вопрос по спецификация (стр 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 просто сомнения есть...

Edited by des00

Share this post


Link to post
Share on other sites

Добрый день,

если в слейве эти сигналы есть то нужны, а если нет то нет.

waitrequest или  readdatavalid использую когда обращение к памяти долгое, или преобразование данных в слейве идет и задержка на неопределенное количество тактов. 

Share this post


Link to post
Share on other sites

В Вашем примере 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 )

Share this post


Link to post
Share on other sites

Спасибо за помощь...

Share this post


Link to post
Share on other sites

Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest

Edited by new123

Share this post


Link to post
Share on other sites
44 minutes ago, new123 said:

Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest

 

можете привести пример описания слейва с waitrequest и readdatavalid или в мое описание приведенное выше их добавьте....

Share this post


Link to post
Share on other sites
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
Полистайте ссылку, там схем очень много про арбитраж шины при многих потребителей.

 

 

Снимок экрана от 2019-08-06 13-35-08.png

Снимок экрана от 2019-08-06 13-38-27.png

Edited by new123

Share this post


Link to post
Share on other sites
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,	
	.....
 )

 

Edited by new123

Share this post


Link to post
Share on other sites
9 минут назад, new123 сказал:

Вторая картинка мне подсказала источник всех багов на моем слейве (рукописный контроллер свой). 

Попробуйте сделать контроллер шины в виде автомата. А если найдете у Альтеры граф переходов состояний шины, то это будет вообще легко.

А если сделать с параметрами, то можно вообще выкрутить несколько вариантов и потом быстро их подстраивать под требования конкретного абонента шины...

Edited by iosifk

Share this post


Link to post
Share on other sites
6 hours ago, new123 said:

Если есть арбитр доступа, я бы такие сигналы не игнорил. Буквально недавно на этом попался. Арбитр появляется, когда на шине больше чем 2 устройства. 1 мастер, 2 слейва например. Второй слейв займет шину, вам на первый слейв прилетит waitrequest

 

То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств?

Share this post


Link to post
Share on other sites

Приветствую!

7 minutes ago, iglaz3 said:

То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств?

Waitrequest генерирует Slave когда он не готов обрабатывать запросы (read|write) от Master. Если ваш Slave всегда готов (как пионер), то можете не делать waitrequest логику в своем Slave.  Но в мастере вы ее реализовывать обязаны. У @new123 насколько я помню было 2 мастера.

Удачи. Rob.

Share this post


Link to post
Share on other sites
8 minutes ago, RobFPGA said:

Если ваш Slave всегда готов (как пионер), то можете не делать waitrequest логику в своем Slave.

 TCL позволяет настроить почти любую ситуацию с фиксированной задержкой.

Просто удивило:

Quote

Второй слейв займет шину, вам на первый слейв прилетит waitrequest

 

Share this post


Link to post
Share on other sites
4 hours ago, iglaz3 said:

То есть вы хотите сказать, что стандартное IP ядро on-chip RAM генерируемое без сигнала waitrequest, может не работать при наличии на шине более двух устройств?

у Вас есть исходники описания генерируемого IP ядро?

Edited by Maverick_

Share this post


Link to post
Share on other sites

Можно сделать что-то типа такого:

Спойлер

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;

 


 

 

Share this post


Link to post
Share on other sites

wolfman спасибо

 

Edited by Maverick_

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this