文章目录
如何添加GHRD工程并进行修改——以添加UART外设为例
硬件开发使用 Platform Designer/Qsys的设计流程:
1、准备工作(开发板确定及GHRD工程获取):
首先确定使用的开发板,并在对应开发板厂商官网下载对应的GHRD工程文件。例如我这里采用DE1-SoC,则在友晶科技官网找到该板子对应的CD,里面即包含我们所需要的de1_soc_GHRD工程。
DE1 GHRD的下载地址:http://www.terasic.com.cn/cgi-bin/page/archive.pl?Language=China&CategoryNo=180&No=870&PartNo=4#contents
2、将GHRD工程加到Qsys/platform中
将我们GHRD的soc_system工程双击打开,可添加到Quartus中,我这里采用的是Quartus17.1
点击这个platform标志,自动打开platform design工具
将GHRD对应的qsys文件打开
如下可以看到,我们的GHRD工程已经加入进来,接下来学习如何修改GHRD工程
3、修改GHRD工程(以添加UART外设为例)
3.1 首先添加UART外设
首先在界面左侧的IP核位置,搜索UART找到并双击
双击后进行IP核的配置,配置方法和之前FPGA中添加IP核的方法是一样的,这里不进行配置的讲解,因此直接默认添加,重点学习如何在platform中进行信号间的连线
我这里添加了两个UART的外设:
- 连线之前我们需要掌握如下的几个知识点:
- UART IP核提供了一个Slave总线与主机相连,若想能对其寄存器进行读写操作,那么就需要将Slave接口连接到Master接口上。
- 在含有HPS的SoC系统中,ARM和FPGA采用AXI总线进行通信,三种形式:H2F_AXI_Master总线,F2H_AXI_Slave总线,H2F_LW_AXI_Master总线。(前两个高速桥最高支持128位宽)
- UART是一个数据吞吐量很小的设备,在连接的时候,选择轻量级的桥即可,保证其使用最低的时钟频率即可通信,便于其他需要高时钟频率的逻辑更好的进行时序优化。
- UART 和 H2F轻量桥采用相同的时钟域
- UART的复位端口连接clk_0模块的复位端口即可
- external_connection 端口需要分配到芯片的物理引脚上,该端口包括uart_tx 和 uart_rx俩信号。因此直接将此端口导出即可。在对应的export一列双击该信号即可实现导出,为便于识别,可将导出名改成uart_0/uart_1
中断优先级的分配:
irq为中断请求信号,同时双核的ARM支持f2h_irq0 和 f2h_irq1,我们这里只需要将uart中的 irq 接到 f2h_irq0
至此可进行UART IP信号端口的连接(主要是hps_0,clk_0,uart_0,uart_1四个模块之间的连接)
补充:还可以根据uart ip核端口连接,进行其他I2C以及PIO等ip核的添加以及端口信号连接。
分配组件基地址
添加uart后,下方信息框会出现 UART IP地址范围域其他设备冲突的错误,因此可用platform中提供的自动分配基地址的方式纠错。
首先为了防止自动分配的时候,影响其他添加好的IP,先对其他IP基地址锁定。点击锁的符号即可
然后在上方栏点击:System——Assign Base Address,报错消失。
3.2 生成 Qsys 系统的HDL文件
将配置后的Qsys系统,生成对应的HDL代码,上方栏Generation——Generation HDL,默认verilog语言,生成
等待…成功后关闭
3.3 添加 uart_0 和 uart_1的端口到quartus工程中
上方栏Generation——show Instantiation Template 表示打开系统例化模板,我们即可看到新添加的uart端口,将其从系统例化模块中复制,然后打开quartus的GHRD顶层文件,将其添加进去即可。
添加进去后,修改它们的例化名并在端口列表中进行括号内信号线的定义
修改完成后,关闭platform designer工具,目前就完成了uart 模块的引脚添加和分配
3.4 引脚分配
首先分析综合,无报错后打开pin planner,看到我们添加的 fpga_uart的端口。修改电平标准为3.3V-LVTTL,然后根据手册进行引脚分配。
分配后全编译即可,这地方和以往FPGA引脚分配是一样的
至此使用GHRD添加外设完成.
4、编译好的工程配置到FPGA的三种方式
若想将工程编译好的信息配置到FPGA,可采用如下三种方式:
- 直接将sof文件,通过JTAG下载到开发板
- 将sof文件转换成jic文件,后烧写到5CSE中,设置FPGA从5CSE中启动
- 将编程好的文件转换成二进制数据流文件**(.rbf),然后放在SoC的启动镜像SD卡**中,在 UBoot启动阶段 将其配置到FPGA。
注意:rbf文件有两种,分别是经过压缩和未经过压缩的。
uboot阶段配置fpga:需要使用未经压缩的rbf格式文件。
在Linux应用程序中配置fpga时,需要使用经压缩的rbf文件。
也就是说生成的经过压缩的rbf文件是不支持uboot阶段配置fpga的。
rbf文件如何生成:可在 关于Quartus II rbf文件生成 的博文中进行查看。