[Zed测评] 创建基于AXI Lite总线的vga测试IP核(二)(巨长,慎入)
0赞接着上篇来,这篇处理完所有硬件相关的东西,本来想把软件部分一起发,结果实在太长,自己都受不了了~再开个(三)吧!
1.3、创建PL系统(vga 测试IP核)
1.3.1、利用向导新建IP核
Step 1)在XPS(Xilinx Platform Studio)中选择Hardware菜单下的 Create or Import Peripheral... 选项
弹出下图所示的IP核新建/导入向导:
Step 2)点击下一步:选择新建外设模板还是导入已有外设,这里选择新建。
Step 3)点击Next:选择IP核存放位置,这里我选择直接放在PlanAhead所建的工程文件夹里。
Step 4)单击Next:仔细看一下提示信息,这里需要为IP核命名,注意不能使用大写字母。这里的名字会作为IP核的顶层实体名。版本号和Description根据需要和喜好进行设置。
Step 5)设置完毕后Next:选择IP核的总线接口类型,这里选择最简单的AXI4-Lite。
Step 6)下面几步,大家在第一建立IP核的时候,最好仔细阅读界面上的提示信息,还是很有用的。
这里我翻译一下,但总感觉没有看原文流畅。你的外设将通过 AXI IP 接口(IPIF)模块连接到AXI4总线上,这是一个快速实现AXI4总线与用户逻辑互连接口的方法。除了标准功能(如:IPIF模块提供的地址译码功能)之外,向导工具还提供了其他常用服务和配置,从而简化设计的实现。
Master service and configuration一栏,选择IP核是否具有主设备功能。我做的是个简单的IP核,不作Master。
Slave service and configuration一栏,是和从设备相关的选项:1、Software reset:是否支持从软件进行重启或复位;2、是否使用软件可访问的寄存器;3、在数据期是否使用计时器(应该是用于重试机制或者是放弃交易)。这里选上2和3,其实就是默认选中的两项。
点击Next:
Step 6)配置用户寄存器:选择所使用的寄存器的个数。这里我只是通过PS向VGA发送数据,1个寄存器就满足了。
点击Next,进入下一步:
Step 7)选择用户逻辑和IPIF之间的接口信号。
上图勾选的信号,都是向导默认选中的信号,而且不能删减,剩下3个信号可以选中。我选择使用默认设置,Next:
Step 8)这里是问你是否需要生成编译、仿真的工程。如果选中的话,向导会生成testbench、仿真激励等,协助你完成对逻辑的仿真。根据实际应用需要选择该选项。
由于我前期在ISE中验证了自己设计的逻辑,所以此处就没有勾选,Next:
Step 9)选择用户逻辑代码所使用的HDL类型、是否生成ISE和XST工程来帮助你对逻辑代码进行综合、是否生成驱动文件帮助你完成软件设计。
这里我都没有选中,直接Next:恭喜!来到了IP核摘要页面,核对一下,有没有什么地方不小心选错,还可以back,更改。
点击Finish,IP核向导的工作就完成了,下面还要编辑逻辑代码,更改XPS调用时需要用的MPD文件,最后再调用IP核。
1.3.2、设计逻辑代码
Step1)分别打开需要更改的两个源文件。
如上图所示,在XPS中,点击File->Open,弹出打开文件对话框:
选择文件夹pcores,打开后一个文件夹,名字为vga_v1_00_a,对应了我们刚才新建的IP核:
进入vga_v1_00_a文件夹,发现有三个子文件夹,具体每个文件夹的作用,可以参考我前面的文章。
IP核的HDL文件,存放在hdl文件夹中,打开hdl文件夹,再进入vhdl子文件夹,最后分别打开两个vhd文件。
如上图所示,打开两个vhd文件后,XPS出现对应的选项卡。
Step 2)更改代码
代码的更改我就不细说了,感兴趣的可以下载文章最后给出的整个工程文件,对照着做一下,就知道改了哪些地方了。主要是要熟悉VHDL的语法,如果user_logic使用verilog的话,还得熟悉verilog。
需要更改的文件有两个,一个是vga.vhd,一个是user_logic.vhd。vga.vhd是IP核的顶层模块,在该模块中例化了user_logic。改的时候看看注释,注释也指定了代码添加的位置,哪些代码不能更改……
vga.vhd只需要更改端口部分和user_logic的例化部分,user_logic需要添加自己的端口和逻辑代码。
vga.vhd更改的两处分别为:
添加端口:
例化user_logic:
user_logic.vhd更改的部分:
添加端口:
添加信号:
添加逻辑:这部分太长,不贴了,参考工程文件吧。
至此,逻辑代码修改完毕。
1.3.3、将IP核和PS通过AXI总线连接起来
Step 1)修改IP核的MPD文件。该文件用来告诉XPS我们建的IP核有哪些端口和参数。该文件,存储在vga_v1_00_a文件夹下的data子文件夹下,打开vga_v2_00_a.mpd,加入我们新增的五个端口:
Step 2)编辑完毕后记得保存。
如上图所示,保存后,点击Project菜单,选择Rescan User Repositories选项,XPS会扫描到我们新建的IP核端口发生了变化。注意:每次更改参数和端口之后,都要重新扫描一下,XPS不会自动更新。
Step 3)添加IP核。
在XPS的左侧,如上图所示位置,点击IP Catalog选项卡,展开上图绿色方框内的Project Local PCores目录,再展开USER目录,就可以看到我们新建的vga IP核了,双击,或者右键选择Add IP,弹出向导:
选择Yes,弹出IP核配置页面:
使用默认配置,点击OK。
弹出上面的对话框,问你将IP核连接到那个模块,第一项是连接到PS,第二项是手动设置,这里选连接到PS,点击OK。
切换到BusInterfaces选项卡,发现vga_0已经连接到总线上。
我们再切换到图形视图,看一下效果:
我们的IP核是下面那个几乎看不到的小方块,放大一下:
发现IP核的五个输出端口并没有连接到顶层的输出端口,这里还需要设置一下。
从Graphical Design View切换到System Assembly View(这两个选项卡在图形的下面),回到System Assembly View 后,再上面的选项卡中选择Ports,然后将vga_0展开,效果如下图所示:
在axi_hs行,Connected Port列交叉位置,单击鼠标右键,选择Make External。
单击鼠标左键,XPS就将vga_0的axi_hs端口连接到了外部(External)输出端口,设置完毕后的效果如下:
为了简单起见,这里我使用的是默认的名字,等熟悉了操作流程和工具,大家就可以尝试更改能够更改的东西了。
重复上述操作,将其他四个端口引出来,最终效果图如下:
完了,我们再切换到图形视图,看一下设置完毕后的效果:
发现,我们添加的五个端口都已经引出来了。
除此之外,发现IP核的时钟是100MHz,而我们的逻辑需要50MHz的输入时钟,所以我们要进入System Assembly View视图、Zynq选项下,配置一下IP核所用的时钟。
进入System Assembly View,Zynq:
选择图中红色方块内的可编程模块:“Clock Generation”,进入时钟设置页面:
找到PL Fabric Clocks项,展开:
发现,我们IP核用的FCLK_CLK0是100MHz,改成50后点击下面的OK:
点击OK后自动返回XPS,至此PL模块的时钟也设置完毕 ,图形视图中可以直观的看到时钟从100MHz变成50MHz。
至此PL的设置就已经完毕了,产生一下网表,没有错误就可以退出XPS,返回PlanAhead了。产生网表的快捷按钮见下图:
Step 4)退出XPS,返回PlanAhead。
1.4、硬件平台的综合、实现、生成比特流
1.4.1、为整个硬件平台创建顶层文件
如上图所示,在Sources窗口中,选中cpu,右键,选择Create Top HDL,选中后,弹出创建的进度条,跑完后效果如下:
双击cpu_stup.v,打开顶层文件,查看一下,发现vga接口引脚如下图所示:
1.4.2、添加约束文件
如上图所示,在sources窗口的空白处,右键,选择Add Sources,弹出对话框:
选择“Add or Create Constraints”,Next:
选择Add Files,找到从官网上下载的zedboard ucf文件,添加进来:
Finish后,完成添加。效果如下:
1.4.2、修改约束文件
双击zedboard_master_UCF_RevC_v3.ucf,找到和VGA接口相关的引脚配置语句。
修改上图红色方框内的配置语句,修改效果如下图所示:
1.4.3、这里偷个懒,直接产生比特流,工具会自动提示综合、实现,选择OK,就可以了。
实现过程中会弹出警告:这是因为官方的约束文件分配了所有的引脚,我们的设计中没有驱动这些引脚,大致看一下,没有和vga相关的警告就OK。
1.5、将硬件信息导入到SDK
File->Export->Export Hardware for SDK…
注意,要选中“运行SDK选项”,因为我这里还没有打开SDK。选好后OK,就会自动打开SDK了。
工程文件在下一篇,做完软件部分一起上传吧!