zynq 尝试自制带总线IP : AXI-lite 流水灯

前言:

        zynq是Xilinx近来重点推出的一款FPGA + arm(CortexA9)的SOC。其强大之处不言而喻。官方有zedboard开发板,可能会买不起。

从而在国内找了一款替代产品MiZ702,基本和zedboard兼容。本系列博客的例程适用于与zedboard以及MiZ702。

        每节都会有例程回复即可下载,欢迎大家和我一起玩~~

   从前写FPGA程序的时候,顶层模块往往用亍模块的例化,已经模块间的连线。而vivado似乎更提倡新建一个Block作为顶层,已图形的形式连线。我们自己用HDL写的模块,可以通过vivado提供的IP打包工具,制作一个带AXI总线的IP。我们的zynq的PS部分可以直接通过总线和我们制作的带有一定功能的IP迚行数据交互。 
  比如,我乀前用HDL写过写过一个VGA的驱劢模块,我叧需要向VGA模块赋值,VGA就能对应迚行显示。那举这个赋值的事情如果交给PS做就非常合适(将数据放在数组里,播放一段规频都没问题),这样zynq的优势就很好的体现出来。 
  这次,我们就尝试自制带总线IP,先丌拿VGA做实验,还是从简单的流水灯开始。流水灯模块内部虽然没有什举逻辑部分,但先说明这个制作的过程。 
 

SIMsun">首先新建一个工程之后,出现如下界面~~

zynq 尝试自制带总线IP : AXI-lite 流水灯_第1张图片

next

zynq 尝试自制带总线IP : AXI-lite 流水灯_第2张图片

next,创建一个AXI4总线的IP:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第3张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第4张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第5张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第6张图片

至此,一个AXI4总线的模型的框架就建好了,不过既然是自制,当然是需要加入自己东西咯~~

不急,继续,新建一个Block,用来放置IP核们,GO!GO!GO!

zynq 尝试自制带总线IP : AXI-lite 流水灯_第7张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第8张图片

首先添加一个zynq核:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第9张图片

 

通过同样的方法添加自己的IP:

添加了之后,是时候我我们自己的IP“添油加醋”了:

编辑我的IP

zynq 尝试自制带总线IP : AXI-lite 流水灯_第10张图片

点击OK:(之后会弹出一个新的工程,专门针对IP的)

zynq 尝试自制带总线IP : AXI-lite 流水灯_第11张图片

接下来,我们要修改的就是这两个文件:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第12张图片

一个个来,先修改第一个:(空都给你留好了了只等,自己去填啊)

zynq 尝试自制带总线IP : AXI-lite 流水灯_第13张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第14张图片

在来修改第二个:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第15张图片

再添加,自己的用户逻辑:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第16张图片

修改结束保存下,接着干:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第17张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第18张图片

好了,我们的IP编辑完毕了~~

最后 把引脚弄出来,如下~~

zynq 尝试自制带总线IP : AXI-lite 流水灯_第19张图片

那么接下,为自己IP添加引脚约束,(不用管其他的?只用负责自己的?。。。对,是的哦!)

zynq 尝试自制带总线IP : AXI-lite 流水灯_第20张图片

如果不为自己的IP添加引脚约束会如何呢?好吧,我就告诉吧,我悲剧的没有添加的结果(编译好久的好不好==!)

这个是没有分配LED引脚的结果~~

具体,代码我也贴出来吧~~

  1. set_property PACKAGE_PIN T22 [get_ports {LED[0]}]
  2. set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]
  3. #NET LD0           LOC = T22  | IOSTANDARD=LVCMOS33;  # "LD0"
  4. set_property PACKAGE_PIN T21 [get_ports {LED[1]}]
  5. set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]
  6. #NET LD1           LOC = T21  | IOSTANDARD=LVCMOS33;  # "LD1"
  7. set_property PACKAGE_PIN U22 [get_ports {LED[2]}]
  8. set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]
  9. #NET LD2           LOC = U22  | IOSTANDARD=LVCMOS33;  # "LD2"
  10. set_property PACKAGE_PIN U21 [get_ports {LED[3]}]
  11. set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]
  12. #NET LD3           LOC = U21  | IOSTANDARD=LVCMOS33;  # "LD3"
  13. set_property PACKAGE_PIN V22 [get_ports {LED[4]}]
  14. set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}]
  15. #NET LD4           LOC = V22  | IOSTANDARD=LVCMOS33;  # "LD4"
  16. set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}]
  17. set_property PACKAGE_PIN W22 [get_ports {LED[5]}]
  18. #NET LD5           LOC = W22  | IOSTANDARD=LVCMOS33;  # "LD5"
  19. set_property PACKAGE_PIN U19 [get_ports {LED[6]}]
  20. set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}]
  21. #NET LD6           LOC = U19  | IOSTANDARD=LVCMOS33;  # "LD6"
  22. set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}]
  23. set_property PACKAGE_PIN U14 [get_ports {LED[7]}]
  24. #NET LD7           LOC = U14  | IOSTANDARD=LVCMOS33;  # "LD7"

复制代码

 

好了IP都添加完了,开始连线吧~~~

zynq 尝试自制带总线IP : AXI-lite 流水灯_第21张图片

好了,点两个确定之后就连接好了:如下

zynq 尝试自制带总线IP : AXI-lite 流水灯_第22张图片

 

OK还有很重要的一步,接下来Generate Output Products: 这一操作会生成 Block的对应的HDL文件。

zynq 尝试自制带总线IP : AXI-lite 流水灯_第23张图片

zynq 尝试自制带总线IP : AXI-lite 流水灯_第24张图片

最后,为我们的Block创建一个顶层文件:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第25张图片

这么麻烦的事情当然是交给Vivado,让她帮我们,一键搞定:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第26张图片

生成的顶层文件如下:(这时Block之上就出现了顶层文件,话说真是方便啊~~)

zynq 尝试自制带总线IP : AXI-lite 流水灯_第27张图片

好了,可以产生bit文件了:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第28张图片

顺利的话,应该是编译成功啦!

接下了,开始SDK的了,好戏开始了~~(累了就休息会)

//--------------------------------华丽分割线-------------------------------------

我们继续~~将我们刚刚弄好了硬件信息,导入到SDK,他会为我们产生一些头文件

zynq 尝试自制带总线IP : AXI-lite 流水灯_第29张图片

进入SDK!!

zynq 尝试自制带总线IP : AXI-lite 流水灯_第30张图片

SDK已经打开(打不开?那去看我前一篇博客~~),新建一个工程:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第31张图片

新建一个空的工程,点击Finish

zynq 尝试自制带总线IP : AXI-lite 流水灯_第32张图片

再创建一个C文件:

zynq 尝试自制带总线IP : AXI-lite 流水灯_第33张图片

添加代码如下:

  1. #include  
  2. #include "xparameters.h" 
  3. #include "xil_io.h"
  4. int main(void) 
  5. {
  6.     Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR, 0x55); 
  7.     return 0; 
  8. }

复制代码

 

你要问,“XPAR_MYIP_0_S00_AXI_BASEADDR”这个长长的是个啥啊?

我们去"xparameters.h"头文件里看看:(正是我们自己IP的基地址啊)

好了,Ctlr + B,编译一下,(我去,还有一个警告!!)

zynq 尝试自制带总线IP : AXI-lite 流水灯_第34张图片

莫慌~~~右击工程,Clean一下,该警告可除也~~

zynq 尝试自制带总线IP : AXI-lite 流水灯_第35张图片

接下来,就是下载,调试了,就不再重复了~~

 

总结:

       这次虽说是自定义IP,但是基本和vivado自带的IO IP没什么分别。

当然,这个过程是描述清楚了。自己想添加什么复杂的逻辑,就自己发挥了~~

你可能感兴趣的:(嵌入式,——,Zynq&Petalinux)