实例五-Robei和Vivado的联合设计——流水灯设计

实例五 Robei和Vivado的联合设计——流水灯设计

3.1.1. 本章导读

该设计将指导你在Robei中完成一个简单的Verilog设计并且通过波形仿真来验证你的设计的功能正确性,随后使用Vivado IDE综合和实现并生成比特流文件,最后,将生成的比特流下载到Zybo开发板,用实际电路验证设计是否正确。
设计目的
完成这个设计后,你将能够:
• 使用Robei、Vivado联合设计项目,使用Zybo开发板对项目进行验证,建立软硬件协同的设计平台;
• 使用Robei仿真模拟设计;
• 使用提供的Xilinx设计约束(XDC)文件来约束引脚位置;
• 合成并实现设计;
• 生成比特流;
• 使用生成的比特流配置FPGA和验证功能。
该设计通过四个开关对四个LED灯进行控制。具体的开关与LED灯的电路逻辑关系如图3-1-1所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第1张图片

3.1.2. Robei设计内容

1. light模型设计

(1)新建一个模型命名为 light,类型为 module,同时具备1输入1输出。每个引脚的属性和名称参照下图3-1-2进行对应的修改。
实例五-Robei和Vivado的联合设计——流水灯设计_第2张图片
(2)添加代码。点击模型下方的 Code添加代码。
代码如下:
assign led[0] = ~swt[0];
assign led[1] = swt[1] & ~swt[2];
assign led[3] = swt[2] & swt[3];
assign led[2] = (swt[1] & ~swt[2]) | (swt[2] & swt[3]);

(3)保存并执行后,如果没有错误,单击view->code view可查看完整的代码。如图3-1-4:
实例五-Robei和Vivado的联合设计——流水灯设计_第3张图片
在Verilog代码第2行定义了该模块的开始(标有关键字module),第22行定义了该模块(标有关键字endmodule)的结束。7-8行定义了输入和输出端口,10-11行定义了数据类型,而行13-17定义了模块的实际功能。在这些代码中,只有13-17行模块的实际功能需要手动输入,其余代码Robei软件都可以直接自动生成。
(4)保存模型到一个指定的文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误输出。

2. light_tb测试文件的设计

(1)新建一个1输入1 输出的light_tb测试文件,记得将Module Type设置为 “testbench”,各个引脚配置如图3-1-5所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第4张图片
(2)另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。
(3)加入模型。在Toolbox工具箱的Current栏里,会出现当前目录下的所有模型,单击该模型并在 light_tb上添加,并连接对应的引脚,如图3-1-6所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第5张图片
(4)输入激励。点击测试模块下方的“Code”,输入激励算法。激励代码在结束的时候要用$finish 结束。
激励代码:
initial
begin
#5 switches=4’b1111;
#5 switches=4’b1110;
#5 switches=4’b1101;
#5 switches=4’b1010;
#5 switches=4’b1011;
#5 switches=4’b0110;
#5 switches=4’b0101;
#5 switches=4’b0110;
#10 $finish;
end

(5)执行仿真并查看波形。查看输出信息。检查没有错误之后查看波形。点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图3-1-7:
实例五-Robei和Vivado的联合设计——流水灯设计_第6张图片

3. light_constrain约束文件的设计

需要进行综合并下载到开发板验证的设计都要用约束文件来分配FPGA位于开发板上的开关和指示灯的物理IO地址。换句话说,约束文件的作用就是将设计中的各个输入输出端口和开发板上的实际物理IO对应起来。在一个完整的FPGA设计验证流程中,约束文件是必不可少的。
Robei软件可以帮助我们完成约束文件的设计。
(1)新建一个模块,模块类型选择constrain。如图3-1-8所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第7张图片
虽然我们设计的流水灯模块只有一个输入swt和一个输出led,但是这个输入和输出都是4位的。在约束文件中,一个输入或者输出只能对应1位,所以我们的约束文件需要4个输入和4个输出。
(2)把这个新建的模块和之前设计的模块保存在同一个目录下,接下来在左侧Toolbox中通过单击将light模块添加进约束模块。添加完成后,可以先将约束模块的4个输入和light模块的输入连接起来,将约束模块的4个输出和light模块的输出连接起来,如图3-1-9所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第8张图片
(3)修改端口和连线的名称。
约束文件端口的名称对应开发板上硬件IO的引脚名称。很多硬件引脚名称可以直接在开发板的PCB上读到,比如4个LED灯分别对应的是M14,M15, G14,D18,4个拨动开关分别对应的是G15,P15,W13,T16等。开发板的所有引脚ID可以在开发板相关文档资料里查到。
首先把连接输入swt的4个端口名称修改为G15,P15,W13,T16,然后把连接输出led的4个端口名称修改为M14,M15,G14,D18。
接下来,我们需要修改连线的名称。比如对于开关G15,我们想让它对应我们设计中swt的最低位也就是swt[0],那么就要把端口G15和端口swt的连线名称修改为0。类似地,连接swt的四条连线名称分别为0,1,2,3,连接led的也是一样。修改后的模块如图3-1-10。
实例五-Robei和Vivado的联合设计——流水灯设计_第9张图片
(4)保存并运行。如果没有错误,Robei软件就会在模块存储目录下创建一个名为constrain的文件夹,并在其中创建后缀名为xdc的约束文件。与查看设计时的代码一样,可以通过菜单栏的View->CodeView查看完整的约束代码,如图3-1-11所示。
实例五-Robei和Vivado的联合设计——流水灯设计_第10张图片

3.1.3. Vivado设计内容#pic_center

1. 工程创建

启动Vivado并选择XC7Z010CLG400-1,并使用Verilog HDL语言。使用我们通过Robei设计的项目light.v和已经生成好的light.xdc文件。
(1)打开Vivado选择开始>所有程序>Xilinx设计工具> Vivado2013.4> Vivado2013.4;
(2)单击创建新项目Create New Project启动向导。你将看到创建一个新的Vivado项目对话框,单击Next;
(3)单击New Project里的浏览按钮,选择希望新项目保存的位置,比如可以选择路径c:\xup\fpga_flow\labs,然后单击Select;
(4)在工程名中输入lab1。确保创建项目子目录复选框被选中。单击Next;
实例五-Robei和Vivado的联合设计——流水灯设计_第11张图片
(5)选择项目类型表单的RTL Project选项,不要在下面“Do not specify sources at this time”选项上打勾,以便我们可以接着添加源文件,然后单击Next;
(6)使用下拉按钮,在添加源形式中选中Verilog作为目标语言和仿真语言;
实例五-Robei和Vivado的联合设计——流水灯设计_第12张图片
(7)点击添加Add Files…按钮,浏览到刚刚我们Robei项目的目录下打开Verilog文件夹,选择light.v,单击Open,然后单击Next去添加现有的IP形式;
(8)因为我们没有任何的IP添加,跳过这一步,直接单击Next去添加约束文件;
(9)点击添加Add Files…按钮,浏览到之前设计存放的路径下的constrain文件夹,选择light.xdc并单击OK,然后单击Next;
Xilinx的设计约束文件用于分配FPGA位于主板上的开关和指示灯的物理IO地址。这些信息可以通过主板的原理图或电路板的用户手册来获得。
(10)在默认窗口中,选择Parts选项,在Filter部分的各种下拉菜单中,选择XC7Z010CLG400-1。过滤条件在图3-1-14中列出,分别是:在Family中选择Zynq-7000,在Sub-Family中选择Zynq-7000,在Package中选择CLG400,如果需要的话,继续在Speed grade中选择-1。选择完毕后单击Next;
实例五-Robei和Vivado的联合设计——流水灯设计_第13张图片
(11)单击Finish创建Vivado项目。
使用Windows资源管理器,并查找到c:\xup\fpga_flow\labs\lab1目录。你会发现lab1.data、lab1.srcs目录和lab1.xpr(Vivado)项目文件已创建。该lab1.data目录是为Vivado程序数据库所创建的。目录constrs_1和sources_1的lab1.srcs目录下被创建;其中lab1.xdc(constraint)和lab1.v(source)被分别放置。
实例五-Robei和Vivado的联合设计——流水灯设计_第14张图片
(12)打开light.v源代码并分析内容。在资源窗口中,双击打开light.v进入文本编辑模式。
实例五-Robei和Vivado的联合设计——流水灯设计_第15张图片
(13)打开light.xdc源代码并分析内容。在资源窗口中,展开约束文件夹,然后双击打开light.xdc进入文本编辑模式。约束代码如下:
set_property PACKAGE_PIN G15 [get_ports swt[0]]
set_property IOSTANDARD LVCMOS33 [get_ports swt[0]]
set_property PACKAGE_PIN P15 [get_ports swt[1]]
set_property IOSTANDARD LVCMOS33 [get_ports swt[1]]
set_property PACKAGE_PIN W13 [get_ports swt[2]]
set_property IOSTANDARD LVCMOS33 [get_ports swt[2]]
set_property PACKAGE_PIN T16 [get_ports swt[3]]
set_property IOSTANDARD LVCMOS33 [get_ports swt[3]]

set_property PACKAGE_PIN M14 [get_ports led[0]]
set_property IOSTANDARD LVCMOS33 [get_ports led[0]]
set_property PACKAGE_PIN M15 [get_ports led[1]]
set_property IOSTANDARD LVCMOS33 [get_ports led[1]]
set_property PACKAGE_PIN G14 [get_ports led[2]]
set_property IOSTANDARD LVCMOS33 [get_ports led[2]]
set_property PACKAGE_PIN D18 [get_ports led[3]]
set_property IOSTANDARD LVCMOS33 [get_ports led[3]]
实例五-Robei和Vivado的联合设计——流水灯设计_第16张图片
(14)对RTL源文件进行分析。展开the Open Elaborated Design的下拉菜单中的RTL分析任务并且单击Schematic查看原理图。
该模型(设计)将制定并显示设计的原理图。
实例五-Robei和Vivado的联合设计——流水灯设计_第17张图片

2. 使用Vivado综合工具来综合设计并且分析项目主要输出

(1)单击综合任务下拉菜单中的Run Synthesis。综合过程将分析light.v文件并尝试生成门级网表文件。当这个过程完成了综合,将会弹出带有三个选项的完成对话框;
(2)选择Open Synthesized Design选项,然后单击OK,因为我们想看看在功能实现之前综合的输出。如果有对话框弹出,单击是,关闭阐述设计;
(3)选择项目摘要选项卡Project Summary,并了解各个窗口。如果你没有看到项目摘要选项卡,那么选择Layout > Default Layout,或点击项目概要图标在这里插入图片描述
实例五-Robei和Vivado的联合设计——流水灯设计_第18张图片
图3-1-19 项目摘要视图
点击不同的链接,看看提供了什么允许你更改综合的设置信息。
(4)单击项目摘要选项卡中的Table,如图3-1-20所示。请注意,估计有3个LUT和8个IO(4输入和4输出)被使用。
实例五-Robei和Vivado的联合设计——流水灯设计_第19张图片
(5)在综合下拉菜单下,单击Schematic,查看综合设计的示意图。
实例五-Robei和Vivado的联合设计——流水灯设计_第20张图片
注意到IBUFs和各OBUF被自动实例化(添加)到设计中对输入和输出进行缓存。逻辑门在LUT(1输入LUT1,2输入LUT2,3个输入LUT3)中实现。四个门的RTL分析输出映射到四个LUT中的综合输出。
使用Windows资源管理器,验证lab1.runs文件夹是在lab1目录下。在runs目录下,synth_1目录用来放置一些综合文件。
实例五-Robei和Vivado的联合设计——流水灯设计_第21张图片

3. 使用Vivado实现设计的分析以及项目摘要输出

(1)单击在流程导航菜单中的实现任务Run Implementation。实现过程将在综合设计上运行。当这个过程完成了将会弹出带有三个选项的实现完成对话框;
(2)选择Open implemented design,单击确定,此时可查看在器件上实现设计的视图;
(3)出现提示,关闭综合设计,单击是。已实现的设计将被打开。单击确定查看器件视图;
(4)在网表窗口中,选择连线中的一个(例如swt_IBUF[2]),并注意到在设备视图选项中即可显示连线在实际电路中的位置和走向;
(5)如果没有显示,单击连线资源图标在这里插入图片描述,显示连线资源;
实例五-Robei和Vivado的联合设计——流水灯设计_第22张图片
(6)关闭实现设计的视图,然后选择Project Summary项目摘要选项卡(你可能需要更改为默认布局视图),并观察结果。选择Post-Implementation。请注意,实际的资源利用率是3个LUT和16个的IO。此外,它也表示在这个设计中没有定义时序约束(由于这个设计是组合逻辑电路);
实例五-Robei和Vivado的联合设计——流水灯设计_第23张图片
图3-1-24 实现结果
使用Windows资源管理器,确认synth_1和impl_1被创建在lab1_runs的同一级目录下。impl_1目录包含多个文件,包括实现情况的报告文件。
(7)在Vivado中,选择在底部面板中的Reports选项卡(如果不可见,单击窗口中的菜单栏,选择Reports),然后双击Place Design section下的 Utilization Report条目。如图3-1-25所示。该报告将在辅助视图窗口中显示资源利用率。注意,由于该设计是组合逻辑电路所以没有使用寄存器。
实例五-Robei和Vivado的联合设计——流水灯设计_第24张图片
实例五-Robei和Vivado的联合设计——流水灯设计_第25张图片

4. 将设计在开发板上实现

将开发板上的电源开关拨到ON。生成比特流,打开硬件会话,对FPGA进行编程。
(1)确保微型USB电缆连接到PROG UART接口(在电源开关的旁边);
(2)确保JP7设置为USB提供电源;
(3)接通电源板上的开关;
(4)点击程序和流程导航窗口中的调试任务下的Generate Bitstream。比特流生成过程将在实现设计上运行。当这个过程完成比特流生成后,会弹出有三个选项的完成对话框,如图3-1-27所示:
实例五-Robei和Vivado的联合设计——流水灯设计_第26张图片
这一过程将已经生成的lab1.bit文件放在lab1.runs目录下的impl_1目录下。
(5)选择打开硬件管理器选项,然后单击确定。硬件管理器窗口将打开并显示“未连接”状态;
(6)点击Open a new hardware target。如果之前已经配置过开发板你也可以点击最近打开目标链接Open recent target,如图3-1-28所示;
实例五-Robei和Vivado的联合设计——流水灯设计_第27张图片
(7)单击Next看Vivado自定义搜索引擎服务器名称的形式;
(8)单击Next以选择本地主机端口。应检测并确定为一个硬件目标的JTAG电缆,它使用Xilinx_tcf。它也将显示检测到的硬件设备。
实例五-Robei和Vivado的联合设计——流水灯设计_第28张图片
(9)单击两次Next,然后单击Finish。未连接硬件会话状态更改为服务器名称并且器件被高亮显示,如图3-1-30所示。还要注意,该状态表明它还没有被编程;
实例五-Robei和Vivado的联合设计——流水灯设计_第29张图片
(10)选择器件,并验证lab1.bit被选为常规选项卡中的程序文件;
实例五-Robei和Vivado的联合设计——流水灯设计_第30张图片
图3-1-31 编程文件

(11)在器件上单击鼠标右键,选择程序器件,或单击Program device > XC7z010_1链接到目标FPGA器件进行编程;
实例五-Robei和Vivado的联合设计——流水灯设计_第31张图片
(12)单击确定对FPGA进行编程。Done(完成)灯亮起时,说明对器件编程成功。
(13)通过开关的开闭来观察LED(请参考前面的逻辑图)验证输出;
实例五-Robei和Vivado的联合设计——流水灯设计_第32张图片
(14)如果验证正确,关闭开发板电源;
(15)选择 File > Close Hardware Manager关闭器件的会话。

3.1.4. 总结

该项目介绍了使用Robei来简化设计的一种完整的设计流程,该项目通过Robei来进行对Verilog的设计之后使用Vivado以及Zybo开发板对设计进行综合,实现以及板级验证的详细过程。

你可能感兴趣的:(教育,FPGA,Robei,Robei案例,高校)