我想我的标题说明了一切。我正在Altera FPGA上的NIOS2处理器上运行一个软件。有没有办法检测软件运行在哪个FPGA上?
回答评论中的问题:为什么我关心我在哪个FPGA上?对于生产,我们使用带有EPCS控制器的设计来对所有内容进行编程。与使用Quartus编程器的.jic流不同,此编程流对Quartus版本不敏感。不幸的是,对于新的EPCQ设备,您必须使用正确的等待状态和寻址模式对EPCQ的非易失性寄存器进行正确编程,以便FPGA能够正确配置。NIOS shell工具没有能力做到这一点(使用.jicflow的Quartus程序员可以做到),所以我写了一小段软件来实现这一点。EPCQ数据表中有一个表格,说明了根据FPGA系列和EPCQ的大小,等待状态应该是什么。EPCQ的规模我可以问EPCQ。FPGA家族我不知道该问谁。因此,现在对于每个项目,我都有自己的软件,数据硬编码为FPGA类型。我希望软件是通用的,而不是FPGA专用的,因此我需要知道我在哪个FPGA上。
- 如果您可以访问FPGA的JTAG端口,请通过IDCODE寄存器进行时钟并对其进行解码
- 如果您可以访问FPGA比特流文件(由于您即将对其进行编程,因此您似乎必须访问该文件),则稀疏文档标题中的字节是描述目标设备的字节。解码它们
- 由于比特流无论如何都是特定于设备的,因此在向NIOS报告设备类型的固件中公开自定义NIOS指令或已知内存位置(通过Avalon MM总线)
第三次操作的详细信息
您可以在合成时使用TCL(例如一些QSYS魔术)将项目范围的DEVICE_FAMILY属性作为参数(device_family
)注入到HDL模块中,然后在生成的逻辑中打开它,为每个族输出一个值。
例如,我基于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核心包装器中使用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 rom,但你已经明白了。
一旦你把它连接到每个项目的QSYS系统中,并重新构建它们,它就会按照你的要求去做。不过还是很难看。
有关此问题的其他处理方法,请参见http://www.alteraforum.com/forum/archive/index.php/t-33948.html