xilinx_wiki-ChipDebug
商品列表
5年前
8年前

Nexys 4 DDR - Microblaze入门

[图片]

概观

本指南将逐步介绍使用适用于Nexys 4 DDR FPGA板的Vivado IP Integrator创建基于Microblaze的硬件设计。

在本教程结束时,您将拥有:

在Xilinx Vivado中创建了基于Microblaze的硬件(HW)设计
在Xilinx Vivado SDK(软件开发工具包)中创建了一个.C项目,使用上一步中显示的硬件设计显示Hello World
在SDK控制台和Tera Term上显示最终输出
先决条件

硬件

Digilent Nexys 4 DDR FPGA板和Micro USB电缆,用于UART通信和JTAG编程

软件

Xilinx Vivado 2015.X与SDK包。

董事会支持文件

董事会支持文件
这些文件将描述电路板上的GPIO接口,使您可以更轻松地选择FPGA板并添加GPIO IP模块
关于如何为Vivado安装Board支持文件,请遵循此Wiki指南(适用于Digilent 7系列FPGA板的Vivado Board文件)

教程

Microblaze是Xilinx的软IP核,它将完全在Xilinx FPGA通用存储器和逻辑结构中实现微处理器。在本教程中,我们将使用Vivado IP Integrator工具添加Microblaze IP块。

除了Microblaze IP模块,我们还想在Nexys 4 DDR上使用DDR2 SDRAM组件。因此,我们的设计中将添加MIG(存储器接口生成器)IP模块。

最后,将添加UART(通用异步接收器/发送器)IP模块,以便在主机PC和运行在Nexys 4 DDR上的软核处理器核心之间进行通信。

一般设计流程

I. Vivado

打开Vivado并选择Nexys 4 DDR板
创建一个新的Vivado项目
在新项目中创建空块设计工作区
使用IP集成工具添加所需的IP块并构建硬件设计
验证并保存块设计
创建HDL系统包装器
运行设计综合与实现
生成位文件
导出硬件设计,包括生成的位流文件到SDK工具
启动SDK
现在,硬件设计将导出到SDK工具。Vivado到SDK的交接是通过Vivado在内部完成的。我们将使用SDK创建一个软件应用程序,该应用程序将通过从Vivado导入硬件设计信息来使用定制的板接口数据和FPGA硬件配置。

II。SDK

创建新的应用程序项目并选择默认的Hello World模板
程序FPGA
通过选择正确的UART COM端口和波特率来运行配置


1.创建一个新项目

当您第一次运行Vivado时,这将是您可以创建新项目或打开最近项目的主要启动窗口。

1.1)单击“ 创建新项目”。选择项目名称和位置,以便没有空格。这是项目名称,文件名和位置路径遵循的重要命名约定。Underscore是空白空间的绝佳替代品。优良作法是为Vivado Projects提供专用文件夹,最好具有尽可能小的路径长度。示例:C:/ Vivado_Projects。为您的项目命名并选择项目位置,然后单击下一步。
[图片]

1.2)选择项目类型作为RTL项目。离开不要指定源未选中状态,然后单击下一步。
[图片]

1.3)如果您已按照Board Support File Wiki指南进行操作,请单击“下一步”并选择“ 板”。从过滤器选项中为供应商,显示名称和电路板修订版本进行必要的选择。Nexys 4 DDR应显示在选择列表中。选择正确的电路板名称不匹配将导致错误。
[图片]

1.4)显示新项目设计源和目标设备的摘要。单击完成。
[图片]

2.创建新的块设计

2.1)这是主项目窗口,您可以在其中创建基于IP的块设计或添加基于RTL的设计源。左侧的流导航器面板提供了有关如何创建硬件设计,执行模拟,运行合成和实现以及生成位文件的多个选项。您还可以使用硬件管理器直接从Vivado使用生成的RTL项目位文件对电路板进行编程。对于我们的设计,我们将使用IP Integrator创建新的块设计。
[图片]

2.2)在左侧,您应该看到Flow Navigator。在IP Integrator下选择Create Block Design。为您的设计命名,没有任何空格。
[图片]

2.3)创建一个空的设计工作区,您可以在其中添加IP块。单击“ 添加IP”图标添加IP内核。这应该从Xilinx IP存储库打开预构建的IP块目录。搜索“Microblaze”并双击它以将IP块添加到空设计中。
[图片]

3.添加Microblaze IP和自定义

3.1)这是Xilinx Microblaze IP模块。添加新IP块后,用户可以通过单击Run Block Automation消息提示或双击块本身来自定义块属性。
[图片]

3.2)选择Run Block Automation,将使用默认设置打开自定义助手窗口。
[图片]

3.3)更改块选项中的默认设置,如下所示,然后单击“ 确定”。这将使用我们的新用户设置自定义块。
[图片]

3.4)运行块自动化将自动生成一组额外的IP块,这些块将根据上一步中选择的选项自动添加到我们的硬件设计中。不要单击“运行连接自动化”。
[图片]

4.定制时钟向导IP块

4.1)双击时钟向导(clk_wiz_1)IP块。
[图片]

4.2)为CLK_IN1 选择系统时钟。
[图片]

4.3)选择Output Clocks选项卡。
[图片]

4.4)选择clk_out2输出频率为“200.000”(Mhz)并将Reset Type设置为Active Low。左侧面板显示块的GUI表示及其内部设置。观察到复位引脚现在将读为复位。这以图形方式表示低电平有效的内部设置。
[图片]

4.5)现在转到端口重命名选项卡。这将为您提供时钟向导IP 块的输入和输出的摘要。单击确定以完成时钟向导的块自动化。不要选择“运行连接自动化”。
[图片]

5.添加UART IP块

5.1)转到 添加IP并搜索“UART”。
[图片]

5.2)选择AXI Uartlite IP块。
[图片]

5.3)这将为现有设计添加UART块。我们需要一个UART控制器来在Host-PC上的终端窗口和Nexys 4 DDR硬件之间进行通信。
[图片]

6.首次运行连接自动化

6.1)现在从Designer Assistance栏消息提示中选择Run Connection Automation。这将打开“运行连接自动化”窗口。选择ext_reset_in,如图所示。将显示该接口的说明以及可用的信号选项。选择reset作为板部件接口。
[图片]

6.3)现在选择所有可用连接,然后单击“ 确定”。完成此步骤将连接到目前为止已添加和自定义的所有IP块。除了执行可用IP块的自动连接之外,还将在我们的设计中添加名为microblaze_0_axi_periph的新IP块。两个信号引脚复位,并且还将添加sys_clock。引脚信号指向右侧,表示它们是时钟向导块(clk_wiz_1)和复位时钟向导块(rst_clk_wiz_1_100M)的输入。
[图片]

注意,RESETN输入引脚和CLK_OUT2在输出销clk_wiz_1块未连接到任何有效信号。我们将手动仅将复位引脚连接到复位信号。该CLK_OUT2销稍后将手动连接。

此时不要选择“运行连接自动化”。

7.第一次手动连接

7.1)信号管脚手动连接复位到RESETN所述的输入clk_wiz_1块。将光标指针放在重置输入上,您应该看到光标变为笔的图形表示。拖放复位信号线上的任何位置。
7.2)将突出显示手动连接。此时不要选择“运行连接自动化”。
[图片]

8.添加和自定义内存接口生成器IP块

8.1)存储器接口生成器将是我们将在设计中添加的最终IP块。
[图片]

8.2)添加MIG IP块后,单击Run Block Automation。
8.3)板部件接口将显示为DDR2_SDRAM。单击“ 确定”以运行块自动化。
[图片]

8.4)运行MIG块自动化时,您将看到此特定错误消息[BD 41-1273]。你现在可以忽略它。它不会以任何方式影响您的设计。MIG模块将根据为Nexys 4 DDR下载的电路板支持文件进行配置。单击“确定”关闭此消息。您会发现MIG IP模块现在有额外的输入和输出引脚,必须连接到有效信号。
[图片]

9.第二次运行连接自动化

9.1)现在单击Designer Assistance栏上的Run Connection Automation消息提示。[图片]

9.2)仅选择连接自动化列表中的mig_7series_0。请勿在此步骤中选择Microblaze部分。单击确定。
[图片]

9.3)将建立并显示新的信号连接。
[图片]

10.第二次手动连接

10.1)手动连接CLK_OUT2在输出端口信号clk_wiz_1到sys_clk_i输入端口上mig_7series_0块。clk_out2信号是我们在时钟向导块自动化步骤中添加的200 Mhz时钟信号。
[图片]

10.2)选择以蓝色圈出的按钮。这是 Regenerate Layout选项,它将重新排列设计中的IP块。
[图片]

11.使DDR2信号外部

11.1)MIG块应该读取mig_7series_0。
将光标放在此符号||上 在DDR2 +端口名称旁边。您的光标将变为看起来像铅笔。右键单击此处,在下拉列表中选择Make External或左键单击|| 并使用键盘快捷键“Ctrl + t”。
11.2)这将创建一个标记为DDR2的新输出端口连接。
[图片]

11.3)再次重新生成布局。
[图片]

12.验证设计

12.1)选择 验证设计。这将检查设计和连接错误。
[图片]

12.2)在设计验证步骤之后,我们将继续创建HDL系统包装器。
[图片]

13.创建HDL系统包装器

13.1)如本步骤所示,右键单击design_1并选择Create HDL Wrapper。让Vivado管理包装器并选择OK。
[图片]

13.2)将生成一个系统包装文件,并在tcl控制台中显示一条消息,通知我们已生成wrapper.v文件。
[图片]

14.生成位文件

14.2)在左侧的Flow Navigator面板中,在Program and Debug下选择Generate Bitstream选项。如果您尚未保存设计,则会提示您保存块设计。
[图片]

14.3)将开始生成位文件。该工具将运行综合和实施。在成功完成综合和实现后,将创建实际的位文件。您将在项目窗口的右上角找到运行合成和实现的状态栏。
[图片]

14.4)生成比特流后,屏幕上可能会弹出一条消息提示。您无需为此演示打开Implemented Design。只需点击取消即可。
[图片]

15.将硬件设计导出到SDK

15.1)在窗口的左上角,从工具栏中单击“ 文件”,然后选择“ 导出硬件”。
这将使用软件开发工具 - Vivado SDK的系统包装器导出硬件设计。选中复选框,确保包含生成的比特流。
[图片]

15.2)将在Hello_World.SDK下创建一个类似于Vivado硬件设计项目名称的新文件目录。还创建了另外两个文件.sysdef和.hdf。此步骤实际上创建了一个新的SDK工作区。
如果浏览到创建Vivado项目的驱动器上的位置,您将看到已在SDK下创建了新文件夹。请参阅下面的屏幕截图中的TCL控制台消息。现在设计已导出到Software Development Kit(SDK)工具,下一步将是启动SDK工具。
[图片]

16.启动SDK

16.1)转到文件并选择启动SDK,然后单击确定。将启动在Vivado设计项目位置本地创建的SDK文件。从Vivado切换到SDK已经完成。
[图片]

17.适用于Vivado的SDK

17.1)将打开SDK的新窗口。硬件设计规范和包含的IP块显示在system.hdf文件中。SDK工具独立于Vivado,即从这一点开始,您可以在导出的HW设计之上使用C / C ++创建SW项目。如有必要,您还可以直接从主Vivado项目目录中创建的SDK文件夹启动SDK。
现在,如果您需要返回Vivado并更改硬件设计,则建议关闭SDK窗口并在Vivado中进行所需的硬件设计编辑。在此之后,您必须按照创建新HDL包装器的顺序,保存设计和位文件生成。然后必须将此新位文件和系统包装器导出到SDK。
由于此时我们没有任何硬件设计编辑,我们将继续创建一个软件应用程序来显示Hello World。
[图片]

17.2)在主SDK窗口的左下角,您将找到Project Explorer面板。请注意,名称为design_1_wrapper_hw_platform_0的主项目文件夹。
design_1是在Vivado中创建的块设计的名称。该硬件平台具有所有硬件设计定义,已添加的IP接口,外部输出信号信息和本地存储器地址信息。
如果此时,您已关闭SDK,对现有硬件设计进行了编辑,并将您的设计导出到SDK,那么在启动SDK工具后,您将找到一个新的硬件平台,名为:design_1_wrapper_hw_platform_1,除了旧的硬件设计,即design_1_wrapper_hw_platform_0。
[图片]

18.在SDK中创建新的应用程序项目

18.1)转到主工具栏中的File并选择New Application Project。将弹出一个新的项目窗口。为SDK项目指定一个没有空格的名称,如下所示。确保目标硬件是正确的硬件设计。在我们的例子中,它将是design_1_wrapper_hw_platform_0。
例如,如果在Project Explorer窗口中还有另一个硬件设计,那么您还将在Target Hardware下拉选择列表中看到此设计名称。
由于我们只有一个硬件设计 design_1_wrapper_hw_platform_0,这将是我们的目标硬件。选择Board Support Package下的Create New。该工具将自动填充Board Support Package名称以与给定项目名称匹配。
点击下一步。
[图片]

19.从可用模板中选择Hello World Application

19.1)在左侧面板的Available Templates下选择Hello World,然后单击Finish。
[图片]

19.2)完成上一步后,您将在Project Explorer面板中看到两个新文件夹:

  • display_hello_world,其中包含所有二进制文件,.C和.H(Header)文件
  • display_hello_world_bsp这是板支持文件夹

display_hello_world是我们的主要工作源文件夹。这里还包含一个重要的文件,它是lscript.ld。这是Xilinx自动生成的链接描述文件。双击此文件打开。
[图片]

20.验证内存区域映射的链接描述文件

20.1)在链接描述文件中,查看“ 部分到内存区域映射”框。如果您执行了Make DDR2 External步骤,则目标内存区域必须读取mig_7series_0。
向下滚动以检查这是否适用于所有行。如果对于任何区域,它不会说mig_7series_0,则单击Memory Region列下的行并选择mig_7series_0。
[图片]

20.2)返回Project Explorer,双击并打开src文件夹下的helloworld.c。src代表来源。 这是主要的.C文件,它将在执行时在控制台中打印hello world。
[图片]

21.用位文件编程FPGA

21.1)确保使用随附的micro USB线打开Nexys 4 DDR并连接到主机PC。
在快速选择工具栏中,您将找到带有红色箭头和三个绿色方框的符号。此可单击按钮实际位于主工具栏的“ 搜索”选项卡下。
单击此符号可打开Program FPGA窗口。
确保选择硬件平台为design_1_wrapper_hw_platform_0。
在软件配置框中,在Block RAM列中的ELF File to Initialize下,row选项必须读取bootloop。如果没有,请单击该行并选择bootloop。
现在点击Program。
[图片]

22.运行STDIO连接的配置设置

22.1)使用位文件成功编程FPGA后,在Project Explorer面板中,右键单击display_hello_world项目文件夹,该文件夹已在下面的屏幕截图中突出显示。
在下拉列表的底部,选择“运行方式”,然后选择“运行配置”。
“运行配置”窗口分为两个主要部分。在左侧面板中,在Xilinx C / C ++应用程序(GDB)下,选择display_hello_world.elf。

  • 注意:如果您在此步骤中看到display_hello_world Debug而不是display_hello_world.elf,您仍然可以毫无问题地运行它。
    在此窗口的右侧,您将看到五个主要选项卡。选择STDIO Connection选项卡。
    [图片]

23. STDIO连接的COM端口选择

23.1)将端口名称更改为正确的UART端口。您可以在设备管理器 → 端口(COM和LPT)下找到通信端口名称/编号。通信端口将显示为USB串行端口(COM X),其中X是PC的端口号。对我而言,它显示为COM4。选择波特率为9600。
选中Connect STDIO to Console框。如果您取消选中它,如下所示,则不会建立连接。确保选中此框。现在单击Apply and Run。
[图片]

24.在SDK内置控制台窗口中显示Hello World输出

24.1)Hello World将显示在Console选项卡上,如下所示。
[图片]

25.使用Tera Term终端仿真器的可选步骤

请参阅此链接http://en.wikipedia.org/wiki/Tera_Term以了解Tera Term是什么。您可以从此链接http://ttssh2.sourceforge.jp/index.html.en下载并安装Tera Term

25.1)在使用Tera Term建立串行连接之前,请确保在SDK中,未选中“运行配置”中“ STDIO连接”选项卡下的“ 连接STDIO”框。 使用Tera Term中正确的通信端口建立串行连接。 转到SDK运行配置 →应用并运行。 Tera Term将通过显示输出作为控制台。 请注意,在SDK的内置控制台窗口中,显示一条消息,显示端口COM4已在使用中,表明Tera Term正在使用COM4端口。

[图片]