极术小能手 · 2022年03月14日

【课程实验 LAB2】实现你的首个SoC:下载比特流到 FPGA 和使用 Keil 调试

实验前请点击获取配套资料

关于LAB2

  • 在本实验中, 你将动手实现一个基于 CortexM0 的 SoC 基础软硬件系统, 然后通过 Modelsim 对系统功能进行仿真, 仿真通过后, 使用 Vivado 搭建系统并将其下载配置到 FPGA 板卡中, 然后使用 Keil 进行实际上板调试.
  • 本实验旨在加深大家对基于 CortexM0 的 SoC 的理解, 熟悉各个软件的基本使用方法, 所以本实验的软件部分和硬件部分都非常简单.
  • 在进行本实验之前, 你应该已经理解了硬件设计的涵义, 掌握了四种 verilog 关键字语法: always, assign, if, case, 而且掌握了模块例化的基本方式. 另外, 你还应当对 AHB 总线协议有一定的了解.

下载比特流到 FPGA

上一小节中, 我们通过仿真验证了 SoC 的功能, 接下来我们将系统实现在 FPGA 上, 进行上板调试.

打开 Vivado 软件, 点击 Create Project, 创建一个新的工程.

image.png
创建工程
点击 Next, 给工程命名为 "CortexM0_SoC", 工程文建立在 "/Task2/vivado/" 文件夹下. 记得检查一下下方显示的工程路径是否合理.

image.png
工程命名与文件夹选择
点击 Next, 选择工程类型为 RTL Project.

image.png
选择工程类型
点击 Next, 进入源文件添加界面, 因为我们的设计源文件都在 "/Task2/rtl" 下, 所以这里点击 Add Directory, 直接将 "/Task2/rtl" 目录添加进来.

image.png
添加源文件
点击 Next, 进入约束文件添加界面, 我们已经在 "/Task2/vivado/" 中为你准备好了约束文件 "pin.xdc", 将这个文件添加进来即可.

image.png
添加约束文件
什么是约束文件?
本实验中的约束文件用于将设计的外部端口连接到 FPGA 的物理引脚上.
除了引脚约束之外, 约束文件还可以用于时钟约束, 常用于静态时序分析 (STA).
不同的开发工具采用的约束文件格式是不同的, Vivado 中的约束文件以 .xdc 为后缀.
本实验中的约束文件
打开 "/Task2/vivado/pin.xdc":

##clk
set_property PACKAGE_PIN D4 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]

##RSTn
set_property PACKAGE_PIN T9 [get_ports RSTn]
set_property IOSTANDARD LVCMOS33 [get_ports RSTn]

##DEBUGGER
set_property PACKAGE_PIN H14 [get_ports SWDIO]
set_property IOSTANDARD LVCMOS33 [get_ports SWDIO]
set_property PACKAGE_PIN H12 [get_ports SWCLK]
set_property IOSTANDARD LVCMOS33 [get_ports SWCLK]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets SWCLK]

上述代码中, clk 管脚约束到 FPGA 开发板上的 50MHZ 时钟; RSTn 管脚约束到 SW0 开关, 开关向上拨时, 连接到电源 VDD 上, 此时 SoC 才可以工作.

点击 Next, 选择 FPGA 芯片型号, 首先在 Family 栏处选择 Artix-7, 然后在下方列表中选择 xc7a35tftg256-2.

image.png
选择 FPGA 型号
之后一直点击 Next, 直到出现工程创建完成的界面, 点击 Finish, 完成 Vivado 工程的创建. 在进入 Vivado 主界面后, 可以在 Source 窗口的 Hierarchy 标签页中看到我们的设计文件, 仿真文件和约束文件. 若要对某个文件临时进行编辑, 以约束文件为例, 我们可以双击 "pin.xdc", 该文件的内容会被显示到右侧的编辑窗口中.

Hierarchy 和 Libraries

  • Hierarchy 标签页是对设计的层次化展示, 便于我们直观理解多个模块之间的调用关系. Vivado 会自动选择设计的顶层文件, 并标上30图标. 你也可以通过右键文件选择 Set as Top 将任意文件设为顶层文件. 注意, RTL 分析, 综合和实现的对象都是顶层文件.
  • Libraries 标签页是对所有文件的平铺罗列, 方便用户添加和删除文件.

image.png
Vivado 工程主界面
然后点击左侧导航栏下方的 Generate Bitstream, 这时 vivado 将会依次执行 RTL 分析 (RTL Analysis), 综合 (Synthesis), 实现 (Implementation) 和 生成比特流文件 (Generate Bitstream) 四个步骤. 最终生成的比特流文件用于 FPGA 的配置.

等待 Vivado 运行一段时间后, 可以看到弹出的比特流下载成功提示窗口, 关闭该窗口.

image.png
比特流下载成功提示窗口
点击左侧导航栏中 Open Implemented Design 下的 Schematic 选项, 可以看到综合和布局布线得到的原理图.

image.png
进入 Schematic 界面
image.png
Schematic 界面
点击 Schematic 标签旁的 Device, 可以看到设计对 FPGA 内部资源的占用情况.

image.png
Device 界面
接下来进行板卡的连接. 使用两条数据线将 FPGA 板卡上的两个 Micro-USB 接口与 PC 上的两个 USB 接口连接起来.

image.png
板卡连接

为什么是两个接口?

  • 标有 JTAG & UART 的接口是 FPGA 的下载配置接口, 用于比特流文件或其他配置文件的下载.
  • 标有 DAP-Link 的接口是 CMSIS 调试接口, 用于 FPGA 中实现的 CortexM0 的调试. 该接口与板卡上的 CMSIS-DAP 调试器连接, 该调试器的另一端连接在 FPGA 的引脚上, 这些引脚通过约束文件与 CortexM0 的 SWDIO 和 SWCLK 这两个调试信号连接.

确保连线无误后, 依次点击左侧导航栏中的 Open Target -> Auto Coonnect, 进行 PC 与 FPGA 的连接. 连接成功后, 依次点击 Program Device -> xc735t_0 开始比特流下载, 等待比特流下载完成后便可进行下一步的调试.

image.png
连接 FPGA

思考
我们知道, 下载比特流文件是将硬件电路配置到 FPGA 中, 那么我们的软件程序是如何被下载到 FPGA 中的呢?还记得我们使用 keil 生成的 "code.hex" 文件对 RAM 进行了初始化. 所以在生成比特流文件时, RAM 的初始数据, 即程序的指令代码也就成为了比特流文件的一部分, 被下载到了 FPGA 中.

万物皆可命令行
没错, Vivado 同样采用 TCL 命令, 可以使用命令行和脚本进行操作.如果你有兴趣就自己去学习尝试吧~

使用 Keil 调试

在前几个小节中, 我们已经将整个软硬件系统都下载到了 FPGA 中, 但是由于软件实现的是一个循环计数器, 我们无法通过外部的显示器件来观察程序的运行情况, 所以我们只能够通过调试器深入 Cortex-M0 内部, 去观察其寄存器值的变化情况.

这时候, 我们就需要用到 Keil 的调试功能了, 打开 Keil 的 Options 选项卡, 进入 Debug 一栏, 左边是仿真设置, 右边是调试设置, 在前几个小节中, 我们已经提前将该栏设置到了调试模式, 所以这里我们直接进行连接和调试即可.

连接

首先进行调试器的连接. 在建立连接时必须保证两点:

  • 比特流已经下载完成, 且 FPGA 没有被复位 (指 FPGA 芯片复位, 对应板卡中间的复位按键), SoC 在使能状态 (板卡上 SW0 向上拨开), FPGA 不断电. 这样才可以保证 Cortex-M0 软核中的调试接口能够正常工作.
  • 在 1 的基础上, 打开 PC 的设备管理器的端口一栏, 确保 PC 上检测到了调试数据线所连接的端口, 且端口准备就绪. 这样才可以保证 PC 与调试端口能够顺利连接.

image.png
正常情况下 PC 应当检测到两个端口
点击进入 Debug 页面右上角的 settings 进入调试器的设置, 注意选择调试接口为 SW, 这时会看到右侧出现了调试器的设备 ID 和名称, 说明已经成功建立连接, 点击 OK 完成连接. 若右侧显示未找到设备或连接失败, 则再次确认上述两个连接条件, 或尝试拔下数据线再重新插上.

image.png
调试器设置

调试

连接完成后, 点击 Keil 工具栏中的02-15图标进入调试, 这时会发现调试界面和 LAB1 中用到的仿真界面基本是一样的, 只是调试界面中运行的是实际板卡中的程序, 而不是软件仿真的程序.

单步运行程序, 可以观察到 r0 的值在 0-4 循环, 说明程序在 FPGA 中能够正常运行.

image.png
调试界面

END

文章来源:

推荐内容

更多内容请关注微处理器系统结构与嵌入式系统设计专栏
推荐阅读
关注数
113
内容数
20
电子科技大学示范性微电子学院开设的「微处理器系统结构与嵌入式系统设计」课程配套实验,原链接:[链接]
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息