Есть модуль qsys:
Код
module SYNC
#(
parameter num_sync = 4, //число выходов синхронизаци
parameter period_cnt = 1 //счетчик на csi_clksys_clk, исходя из заданного периода
)
(
input csi_reset_n,
input csi_clksys_clk,
//сигнал синхронизации
output [(num_sync - 1) : 0] coe_sync
);
#(
parameter num_sync = 4, //число выходов синхронизаци
parameter period_cnt = 1 //счетчик на csi_clksys_clk, исходя из заданного периода
)
(
input csi_reset_n,
input csi_clksys_clk,
//сигнал синхронизации
output [(num_sync - 1) : 0] coe_sync
);
В tcl задается параметр period в мкс, из которого расчитывается значение счетчика period_cnt. А количество интерфесов coe_sync задается параметром num_sync.
Код
add_parameter num_sync NATURAL 1
set_parameter_property num_sync DEFAULT_VALUE 4
set_parameter_property num_sync DISPLAY_NAME "Number of sync signals"
set_parameter_property num_sync TYPE NATURAL
set_parameter_property num_sync UNITS None
set_parameter_property num_sync ALLOWED_RANGES {1:16}
set_parameter_property num_sync HDL_PARAMETER true
#Период синхроимпульсов, мкс
add_parameter period NATURAL 1
set_parameter_property period DEFAULT_VALUE 10000
set_parameter_property period DISPLAY_NAME "Period, mks"
set_parameter_property period TYPE NATURAL
set_parameter_property period UNITS None
set_parameter_property period ALLOWED_RANGES {1:5000000}
set_parameter_property period HDL_PARAMETER true
#значение счетчика на системной частоте исходя из периода
add_parameter period_cnt NATURAL 1
set_parameter_property period_cnt DERIVED true
set_parameter_property period_cnt DISPLAY_NAME "Period cnt, ticks"
set_parameter_property period_cnt TYPE NATURAL
set_parameter_property period_cnt ALLOWED_RANGES {1:1000000000}
set_parameter_property period_cnt HDL_PARAMETER true
add_parameter clksys_rate INTEGER
set_parameter_property clksys_rate SYSTEM_INFO CLOCK_RATE
set_parameter_property clksys_rate SYSTEM_INFO_ARG clksys
#
# connection point sys_reset
#
add_interface sys_reset reset end
set_interface_property sys_reset associatedClock clksys
set_interface_property sys_reset synchronousEdges DEASSERT
set_interface_property sys_reset ENABLED true
add_interface_port sys_reset csi_reset_n reset_n Input 1
#
# connection point clksys
#
add_interface clksys clock end
set_interface_property clksys clockRate 0
set_interface_property clksys ENABLED true
add_interface_port clksys csi_clksys_clk clk Input 1
proc elaborate {} {
# Generate sync ports
for {set i 0} {$i < [ get_parameter_value num_sync ]} {incr i} {
add_interface uart_sync$i conduit start
set_interface_property uart_sync$i associatedClock ""
set_interface_property uart_sync$i associatedReset ""
set_interface_property uart_sync$i ENABLED true
add_interface_port sync$i coe_sync_$i sync_pulse Output 1
set_port_property coe_sync_$i FRAGMENT_LIST "coe_sync@$i"
}
# Считаем значение делителя из периода
set divider_var [ expr [ get_parameter_value clksys_rate] / 1000 * [ get_parameter_value period] / 1000 - 1]
set_parameter_value period_cnt $divider_var
}
set_parameter_property num_sync DEFAULT_VALUE 4
set_parameter_property num_sync DISPLAY_NAME "Number of sync signals"
set_parameter_property num_sync TYPE NATURAL
set_parameter_property num_sync UNITS None
set_parameter_property num_sync ALLOWED_RANGES {1:16}
set_parameter_property num_sync HDL_PARAMETER true
#Период синхроимпульсов, мкс
add_parameter period NATURAL 1
set_parameter_property period DEFAULT_VALUE 10000
set_parameter_property period DISPLAY_NAME "Period, mks"
set_parameter_property period TYPE NATURAL
set_parameter_property period UNITS None
set_parameter_property period ALLOWED_RANGES {1:5000000}
set_parameter_property period HDL_PARAMETER true
#значение счетчика на системной частоте исходя из периода
add_parameter period_cnt NATURAL 1
set_parameter_property period_cnt DERIVED true
set_parameter_property period_cnt DISPLAY_NAME "Period cnt, ticks"
set_parameter_property period_cnt TYPE NATURAL
set_parameter_property period_cnt ALLOWED_RANGES {1:1000000000}
set_parameter_property period_cnt HDL_PARAMETER true
add_parameter clksys_rate INTEGER
set_parameter_property clksys_rate SYSTEM_INFO CLOCK_RATE
set_parameter_property clksys_rate SYSTEM_INFO_ARG clksys
#
# connection point sys_reset
#
add_interface sys_reset reset end
set_interface_property sys_reset associatedClock clksys
set_interface_property sys_reset synchronousEdges DEASSERT
set_interface_property sys_reset ENABLED true
add_interface_port sys_reset csi_reset_n reset_n Input 1
#
# connection point clksys
#
add_interface clksys clock end
set_interface_property clksys clockRate 0
set_interface_property clksys ENABLED true
add_interface_port clksys csi_clksys_clk clk Input 1
proc elaborate {} {
# Generate sync ports
for {set i 0} {$i < [ get_parameter_value num_sync ]} {incr i} {
add_interface uart_sync$i conduit start
set_interface_property uart_sync$i associatedClock ""
set_interface_property uart_sync$i associatedReset ""
set_interface_property uart_sync$i ENABLED true
add_interface_port sync$i coe_sync_$i sync_pulse Output 1
set_port_property coe_sync_$i FRAGMENT_LIST "coe_sync@$i"
}
# Считаем значение делителя из периода
set divider_var [ expr [ get_parameter_value clksys_rate] / 1000 * [ get_parameter_value period] / 1000 - 1]
set_parameter_value period_cnt $divider_var
}
Проблема в том, что вычисленный параметр period_cnt один на все интерфейсы sync.
А хотелось бы, чтобы для каждого интерфейса был свой параметр. Число параметров чтобы задавалось параметром num_sync. В интерфейсе задания параметров модуля в qsys должны появиться num_sync строк с параметрами периода.
Это возможно?