Как определить, на какой 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

Другие вопросы по тегам