Как определить, на какой Altera FPGA я работаю из программного обеспечения, работающего на процессоре NIOS2
Я думаю, что мой заголовок говорит обо всем. Я использую программное обеспечение на процессоре NIOS2 на ПЛИС Altera. Есть ли какой-нибудь способ определить, на какой именно FPGA запущено программное обеспечение?
Чтобы ответить на вопрос в комментарии: Почему меня волнует, на какой я FPGA? Для производства мы используем конструкцию с контроллером EPCS для программирования всего. Этот поток программирования не чувствителен к версиям Quartus, в отличие от потока.jic с использованием программатора Quartus. К сожалению, для новых устройств EPCQ необходимо правильно запрограммировать энергонезависимый регистр EPCQ с надлежащими состояниями ожидания и режимом адресации, чтобы FPGA была настроена правильно. Инструменты оболочки NIOS не имеют возможности сделать это (программист Quartus с.jic flow делает это), поэтому я написал небольшую часть программного обеспечения, которая делает это. В таблице данных EPCQ есть таблица, в которой указано, какие состояния ожидания должны быть в соответствии с семейством FPGA и размером EPCQ. Размер EPCQ Я могу спросить EPCQ. Семья ПЛИС Я не знаю, кого спросить. Таким образом, теперь для каждого проекта у меня есть свой программный продукт с данными, жестко закодированными в тип FPGA. Я хочу, чтобы программное обеспечение было общим, а не специфичным для ПЛИС, поэтому мне нужно знать, на какой ПЛИС я работаю.
1 ответ
- Если у вас есть доступ к порту JTAG ПЛИС, пропустите через регистр IDCODE и декодируйте его.
- Если у вас есть доступ к файлу потока битов FPGA (что, как вам кажется, необходимо, поскольку вы собираетесь его программировать) в редко документированном заголовке, это байты, которые описывают целевое устройство. Расшифруйте их.
- Поскольку потоки битов в любом случае будут зависеть от устройства, предоставьте пользовательскую инструкцию NIOS или известную ячейку памяти (через шину Avalon-MM) в микропрограмме, которая сообщает тип устройства в NIOS.
Подробности о 3-м варианте
Вы можете использовать TCL во время синтеза (например, некоторую магию QSYS), чтобы ввести свойство DEVICE_FAMILY всего проекта в модуль HDL в качестве параметра (device_family
), затем включите это внутри сгенерированной логики, чтобы вывести значение для каждого семейства.
Например, это я основал adv_seu_detection_common.v
а также adv_seu_detection_core_hw.tcl
(найдите их в каталоге Quartus ip):
module crcblock_atom ( regout );
parameter device_family = "Stratix III";
output wire [7:0] regout;
generate
if ( (device_family == "Stratix III") ||
(device_family == "Arria II GZ") ||
(device_family == "Stratix IV") ) begin: generate_crcblock_atom1
assign regout = 1;
end
else if ( (device_family == "Arria V") ||
(device_family == "Cyclone V") ) begin: generate_crcblock_atom2
assign regout = 2;
end
else begin: generate_crcblock_atom
assign regout = 3;
end
endgenerate
endmodule
Затем вам нужно установить параметр device_family
соответственно. Вы можете сделать это в оболочке ip-core, используя следующий частично недокументированный код в xxxxx_hw.tcl
это делает параметр скрытым и автоматически заполняет его из настроек проекта:
# | device_family
add_parameter device_family STRING
set_parameter_property device_family VISIBLE false
set_parameter_property device_family SYSTEM_INFO {DEVICE_FAMILY}
set_parameter_property device_family HDL_PARAMETER true
set_parameter_property device_family AFFECTS_GENERATION true
Вам все равно придется обернуть это как пользовательскую инструкцию NIOS или сделать так, чтобы она выглядела как Avalon-MM, но вы поняли идею.
Как только вы подключите его к системе QSYS для каждого проекта и восстановите их все, он выполнит то, что вы просили. Это все еще довольно уродливо, хотя.
Для другой обработки этого вопроса см. http://www.alteraforum.com/forum/archive/index.php/t-33948.html