2.2.调用CreateandPackageIPWizard,创建一个新的AXI-Lite从机ip
选择Tools->CreateandPackageIP
编辑创建的IP
led_controller_v1_0.v—实例化了所有的AXI-Lite接口,在这种情况下,只有一个接口存在
led_controller_v1_0_S00_AXI.v—包含了处理PL外设与PS端软件的AXI4-Lite接口功能
打开led_controller_v1_0_S00_AXI.v文件,找到Userstoaddportshere,然后在其后添加需要的端口:
然后在文件最后,找到Adduserlogichere,然后在其后添加逻辑功能代码:
保存文件,打开led_controller_v1_0.v文件,找到Userstoaddportshere,添加端口:
在顶层文件中例化刚刚我们添加的端口,保存文件:
更新IP核
打包IP核
然后关闭这个工程即可,ip核创建成功。
2.3.添加ip核到BlockDesign中进行设计
创建BlockDesign:
因为LEDs_out要连接板载LED,所以点击引脚,按下ctrl+t导出引脚:
添加Zynqps核,自动连线:
按下F6验证设计:
创建BlockDesign的HDL文件:
添加LED引脚约束文件:
##LEDs
set_property-dict{PACKAGE_PINR14IOSTANDARDLVCMOS33}[get_ports{LEDs_out_0[0]}];#IO_L6N_T0_VREF_34Sch=LEDs_out_0[0]
set_property-dict{PACKAGE_PINP14IOSTANDARDLVCMOS33}[get_ports{LEDs_out_0[1]}];#IO_L6P_T0_34Sch=LEDs_out_0[1]
set_property-dict{PACKAGE_PINN16IOSTANDARDLVCMOS33}[get_ports{LEDs_out_0[2]}];#IO_L21N_T3_DQS_AD14N_35Sch=LEDs_out_0[2]
set_property-dict{PACKAGE_PINM14IOSTANDARDLVCMOS33}[get_ports{LEDs_out_0[3]}];#IO_L23P_T3_35Sch=LEDs_out_0[3]
2.4.生成Bitstream,打开实现设计,导出硬件文件,运行SDK
2.5.创建一个空的应用工程
File->New->ApplicationProject,选择创建一个空工程:
2.6.添加驱动库
光标选中led_test_bsp之后再进行下面的操作!!!
选择Xilinx->Repositories:
添加ip核所在目录,添加完了之后SDK会自动扫描所添加的目录,然后重新编译工程来添加新的驱动文件:
检查一下库有没有被分派到LED_Controller外设,打开system.mss文件,可以看到外设驱动中存在led_controller_0:
/**
*@fileled_test.c
*@briefled_controleriptest
*@authormculover666
*@date2018/11/10
**/
#include"xparameters.h"
#include"xil_io.h"http://led_controller.h中用到了Xil_Out32
#include"led_controller.h"
#include"xil_printf.h"
#defineLED_BASE_ADDRXPAR_LED_CONTROLLER_0_S00_AXI_BASEADDR
#defineLED_REG00
#defineDELAY50000000
intmain()
{
inttemp=0;
intled_value=0;
inti=0;
xil_printf("led_controlleriptest/r/n");
xil_printf("----------------------/r/n");
while(1)
{
/*writereg0*/
LED_CONTROLLER_mWriteReg(LED_BASE_ADDR,LED_REG0,led_value);
/*readreg0*/
temp=LED_CONTROLLER_mReadReg(LED_BASE_ADDR,LED_REG0);
/*showvalue*/
xil_printf("led=%d",led_value);
xil_printf("/ttemp=%d/r/n",temp);
if(led_valueled_value++;
else
led_value=0;
for(i=0;i
}
}
2.9.配置运行,观察结果
3.实验总结
这个实验做了很长时间,最后看着灯思考了很长时间:
从实验的角度来说说:用HDL创建一个挂载在AXI总线上的ip核去控制LED,然后在存储器映射下这个ip核的四个寄存器会有自己的地址,CPU靠这个地址来访问寄存器,为了操作简单,一般会有一个基地址,其余寄存器是相对这个基地址的偏移,所以控制代码只需要读写寄存器就可以了;
从嵌入式原理的角度来说,其实设计都是基于寄存器的,硬件靠寄存器的数据来工作,寄存器挂载在总线上,所以寄存器会有一个地址(寄存器映射),我们通过指针就可以访问内存空间中这个地址处的数据;
从嵌入式发展的角度来说,通常寄存器地址映射都是由厂商出厂时候映射好的,我们只需要查看芯片参考手册去编程,现在整个硬件可以自己设计,寄存器地址映射只是在一个固定的区间段内(AXI从机地址1G),变的更加灵活了,也说明了整个数字系统的设计正在由板上设计转入片上设计,原来由一块板子才能搞定的任务,现在只需要一个芯片即可~
编辑:hfy
评论