图1
笔者所做的这个工程是基于Zedboard开发板, IP核的功能是读取拨码开关的状态,并写数据控制LED灯。应用程序是在输出台上输出拨码开关的状态,并给LED灯写入0x24。具体方法如下:图2
图3
3、点击Finish。此时等大约一分钟左右XPS中出现了ZYNQ的SAV图,此时,点击图4中黑色矩形部分,创建或者导入外设,后面一直按默认点击NEXT,直至图5,按图5中创建并配置自己的IP核,然后NEXT,如图6所示,选择AXI4-Lite总线,AXI全名为Advanced eXtensive Interface,是AMBA下一个很重要的总线接口,而AXI-Lite是AXI总线协议的精简版,详细信息可以参考XILINX的help文档。点击NEXT,如图7,这个是XILINX为了简化用户工作量封装的IP和AXI总线之间的功能模块IPIF,然后继续NEXT,如图8所示,此时设置用户读写的寄存器的数量为2,因为我们需要读取拨码开关SW的状态,并使用数据控制LED灯,故需要两个寄存器。NEXT,如图9所示,保持默认即可,不用修改,然后一路NEXT直至图10所示,生成ISE工程文件和驱动,第一个选项可以选也可以不选,笔者比较熟悉VHDL,故没选,熟悉Verilog的可以勾上,然后NEXT,点击Finish。此时在XPS的IP Catalog中可以看到我们创建的IP核my_gpio。如图11所示.图4
图5
图6
图7
图8
图9
图10
图11
下一步是要修改我们的IP核让其满足我们的要求,此时,打开PlanAhead的工程目录,找到生成的my_gpio的ISE工程文件,如图12所示,继续打开project3.srcs文件夹中,按路径打开子文件夹,直至出现ISE工程文件,如图13所示, 使用ISE打开该文件,并打开文件USER_LOGIC.VHD文件如图14所示,添加两行代码如红色矩形部分所示。此为我们自己定义的IP端口。查看USER_LOGIC.VHD代码可以知道,两个寄存器分别为slv_reg0和slv_reg1,我们使用slv_reg0作为SW和AXI总线的数据寄存器,则该寄存器只读,为此,注释掉该寄存器写逻辑,具体如图15所示,下一步定义我们自己的信号sw_reg0,sw_reg1,(为了同步SW信号)如图16所示,继续添加同步逻辑,如图17所示,下一步,增加写LED和读取SW状态逻辑,具体方法如图18所示,接着更改顶层文件my_gpio.vhd,在图19所示的代码中添加端口如图20所示,然后如图21所示在USER_LOGIC_I模块中添加代码,如此之后,IP逻辑基本写完了,使用综合工具综合并查看RTL视图,如图22和23所示,从图23可以看出我们定义的端口LED和SW分别都有效定义了,下一步,回到XPS中,如图24所示进行查看MPD文件,MPD(Microprocessor Peripheral Definition),即微处理器外设定义文件,并如图24添加代码并保存,接着,如图25操作, Rescan user repositories,重新扫描用户目录,紧接着,添加设计的IP核,如图26所示 ,下面一路默认即可,最终如图27所示,可以看到我们增加的接口已经显示出来了,下一步是把我们的端口引出去,具体如图28和图29所示,最终如图30所示,下一步是为我们的外设分配映射到内存的地址,GP0和GP1是 通用的I/O端口,GP0范围为0x4000000~0x7FFFFFFF,GP1的范围是0x80000000~0xBFFFFFFF,如图31所示,可以看出系统已经为我们默认设置了地址0x75c00000~0x75c0FFFF,只需锁定即可。此时点击Graphic Design View可以看到我们设计的IP核的端口情况。如图32所示。接着,关闭XPS,回到PlanAhead,右击system为此设计增加top HDL文件,具体如图33所示,图12
图13
图14
图15
图16
图17
图18
图19
图20
图21
图22
图23
图24
图25
图26
图27
图28
图29
图30
图31
图32
图33
图34
图35
图36
图37
图38
图39
图40
图41
图42
图43
图44
图45
图46
图47
我们修改文件memory_test.c如下所示,图49
50
51
52
最后的最后,我想说的是这只是一个开始,没有涉及到中断、高级调用等等,但是我们已经对基本流程有个大致的了解了,剩下的就是功能完善的问题了。 另外由于笔者水平有限,有什么问题请指出(通过留言或者邮箱联系)!谢谢!欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |