基于Quartus 18.0 Nios IP核 新建Hello_world工程

此内容仅为个人学习笔记,如有不足之处,欢迎指正~

开发环境:Quartus Prime Standard 18.0

开发板型号:野火征途Pro

FPGA型号:EP4CE10F17C8

参考视频链接:正点原子手把手教你学FPGA之Nios II篇-基于开拓者V1_哔哩哔哩_bilibili

1. Platform Designer简介

2. Nios II 简介

Nios II 处理器通过 Avalon 总线与 ROM 和RAM 连接,其中 Avalon 总线用来传输指令与数据。除此之外,Qsys 系统还提供了一个 JTAG 接口,供用户下载和调试程序。

3. 创建Hello_world工程

流程:新建工程——硬件设计——软件设计

系统涉及到的模块:

1、时钟(Clock Source

clk IP 核的全称是 Clock Source,在这里设定我们整个系统的工作时钟频率。

2、nios2_qsys(Nios II(Classic) Processer

这是我们之前对Qsys介绍时了解到,这是整个Qsys的控制中心,起着分配中断、管理地址、调度内存等主要的控制作用,相当于大脑的低位吧,通过Avalon与外界进行通信。

3、片内存储(On-Chip-Memory

这里我们创建了两个片内存储器,ROM和RAM。这两个片内存储器都是利用FPGA的片上存储资源进行实现,除了用于存储指令和数据外,还是程序的运行空间。需要注意的是ROM的实现,在FPGA内部并没有专用的ROM资源,我们通过对 RAM 赋初值,并始终保持该值,使其变得只读,从而实现片内 ROM(只读存储器)。

4、串行通信(JTAG UART Intel FPGA IP

JTAG UART IP 核使用 JTAG 接口来实现上位机与 Qsys 系统之间的串行通信。JTAG UART IP 核为用户提供了 Avalon-MM 接口映射,屏蔽了复杂的 JTAG 接口协议。

5、System ID(Systerm ID Periheral

System ID IP核是一个具有Avalon接口的只读设备,它给每个Nios II系统生成一个唯一的标识符(ID),并将其写入 System ID 核的寄存器中。编译器和用户可以利用该 IP 核来验证编译后的可执行程序与配置到FPGA 中的硬件环境是否匹配。如果可执行程序中的 ID 与 FPGA 中 System ID 核所存储的 ID 不一致,那么程序在运行时可能会出错

3.1 新建工程

和新建FPGA工程步骤一样,起好工程名字(qsys_hello_world),确认好工程路径(将工程文件放在prj文件夹下),规划好工程文件夹组成。

3.2 搭建SOPC (system-on-a-programmable-chip )系统(硬件部分)

流程:搭建系统——配置系统——生成系统

最简单的Qsys系统,包含五个IP核:
        1. Clock Source(默认就有)
        2. Nios II(Classic) Processer
        3. On-Chip-Memory
        4. JTAG UART
        5. Systerm ID Periheral
第一步:打开Platform Designer
法一:点击Tools-Platform Designer法二:直接点击红框处

Quartus 17.1版开始的重大更新内容: 1. 增加了Stratix 10系列的器件库(Intel 真14nm工艺生产,内速度直接上1GHz,号称全世界最快的FPGA) 2. 集成了HLS编译器(免费),用于C/C++开发FPGA,主要用于信号处理和/或科学计算类设计应用,和一样用C/C++开发FPGA的OpenCL(免费)有一些区别。 3. 把一些Quartus内部集成的功能名字改了,让用户特别是初学者更容易理解这些功能的用处: 旧的名字 新的名字 Blueprint Interface Planner Qsys Platform Designer EyeQ Eye Viewer JNEye Advanced Link Analyzer LogicLock Logic Lock Region TimeQuest Timing Analyzer 破解器增加了抗single-event upset (SEU,可以翻译成单粒子翻转)的license内容,这个对某国禁运的功能支持2009年以后的大部分新器件,对于航空、航天、兵器、工业、电力、高铁、医疗仪器等等要求高可靠性的产品非常有价值。当然,这个license一样可以用在老版本的Quartus上,但是必需是用破解器破解过的Quartus,正版license是没有这个功能的,原因你懂得!SEU使用方法请参考器件的英文版数据手册,或者找骏龙科技要各个新系列FPGA的中文版的手册。 和这个SEU功能类似的还有加密功能的license,可以按照美国国防部标准的256位AES加密算法加密大部分新FPGA,至今还无人能解密,需要者自己联系骏龙科技。本人暂时不加入,因为这些太敏感的禁运东西加入太多了怕出问题。
<think>好的,我需要回答用户关于如何在Halcon中判断HObject是否为空的问题。首先,我要回忆一下Halcon的相关知识。根据用户提供的引用内容,特别是引用[1]和引用[2],判断HObject是否为空的方法是通过生成一个空对象,然后用test_equal_obj比较目标对象和空对象是否相等。 用户提到的步骤是使用gen_empty_obj生成空对象,然后用test_equal_obj进行比较。如果相等,说明目标对象为空。例如,在示例代码中,gen_rectangle1生成的矩形对象与空对象比较时,IsEqual1的值会不同。需要确认这些函数的用法是否正确,以及是否有其他可能的注意事项,比如对象的释放问题。引用[2]提到要避免HObject被错误释放,可能需要使用特定的方法来管理对象生命周期,比如设置不复制或延迟释放。 另外,用户可能想知道是否有其他方法,比如直接检查对象的属性,但Halcon的HObject可能没有直接的属性来判断是否为空,所以使用生成空对象并比较的方法可能是标准做法。还要注意不同版本的Halcon是否有差异,但用户提供的引用应该适用于一般情况。 最后,需要将步骤清晰地呈现出来,并确保代码示例正确无误。同时,生成相关问题时要围绕HObject的操作、生命周期管理和常见错误处理展开,帮助用户进一步理解。</think>在Halcon中判断HObject是否为空的标准实现方法如下: ### 实现步骤 1. **生成空对象**:使用$gen\_empty\_obj$函数创建空对象作为参照物 2. **对象比较**:通过$test\_equal\_obj$函数比较目标对象与空对象 3. **结果判断**:返回的布尔值$IsEqual$为$true$表示对象为空 ### 代码示例 ```cpp // 创建空对象 HObject EmptyObject; gen_empty_obj(&EmptyObject); // 创建待检测对象 HObject Rectangle; gen_rectangle1(&Rectangle, 30, 20, 100, 200); // 执行比较 HTuple IsEqual; test_equal_obj(EmptyObject, Rectangle, &IsEqual); // 输出结果 if (IsEqual.I() == 1) cout << "对象为空"; else cout << "对象有效"; ``` ### 注意事项 1. **对象生命周期**:使用$BusyNodeBase.CGlobeData.CNotDisposeHObject$避免误释放对象[^2] 2. **空对象复用**:建议将$gen\_empty\_obj$生成的空对象设为全局变量以提高效率 3. **跨语言交互**:在C#中需注意HObject与Bitmap的转换规范[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值