EDK内嵌CPU,如果需要CPU访问自定义外设,有两种方式,一是通过IO,二是通过总线。IO访问比较简单,它可以通过软件模似出各种时序的总线,但模似毕竟是模拟,它的速度和易用性都不是很好,因此需要通过自定义IP,将自定义外设与总线连接起来。
话又说回来,IO它也是IP,它与CPU通讯也是通过总线来连接的,所以后无论是自定义外设还是软件自带的外设,它都是挂在总线上,由CPU来访问的。
通常情况下,外设都是挂在PLB总线上,下面用EDK12.2通过一个实验来介绍如何自定义基于PLB总线的IP。
关键字:EDK PLB 自定义IP
新建一个EDK工程,添加串口外设,自定义一个PLB总线的IP,定义四个寄存器。
1、 分别对四个寄存器进行读写测试,
2、 将其中一个寄存器的值输出到外部的LED,查看LED的状态。
选择Hardware ? Create or Import Peripheral to start the wizard ,点击下一步;
选择Create templates for a new peripheral 点击Next
选择To an XPS project,将生成的IP保存在当前工程目录下(在当前工程的pcores文件夹中)
点击下一步,输入IP名和版本号,再点下一步
选择Processor Local Bus (PLB v4.6)并click Next
这里根据需要选择生成的模板文件类型,每个选项生成的文件提供给user_logic的总线接口是不一样的,这里我们选择user logic software Register。
输入registers数量;
这里列出了提供给user_logic的总线接口,可根据需要进行增减. Click Next
In the (OPTIONAL) Peripheral Simulation Support panel, leave Generate BFM simulation platform unchecked, and click Next
在最下面一行打勾,生成模板文件。
点击下一步,将可看到摘要信息
点Finish 完成
这时在IP Catalog 就可以看到它了。
打开D:\my_custom_ip\pcores\my_ip_v1_00_a,生成的文件目录如下:
Step1:My_ip.vhd是顶层文件,这里是PLB总线接口和IP的输入输出端口,创建模板时,系统自动帮我们添加了PLB总线接口,而外部端口则需要我们自已添加。
在--USER ports added here处添加输出端口
在--USER ports mapped here添加 led_out => led_out, 表示顶层文件的led_out和user_logic中的 led_out是相连接的。
保存并关闭My_ip.vhd文件。
Setp2:在user_logic中添加端口和用户代码
打开user_logic.vhd在--USER ports added here处添加端口
在--USER signal declarations added here, as needed for user logic 下添加用户代码
保存并关闭user_logic.vhd文件
在Ports下添加led_out端口描述,PORT led_out = "", DIR = O, VEC = [0:31];
修改完成,点击保存并关闭MPD文件。
选择Project ? Rescan User Repositories 将自动将修改后的IP更新到EDK中。
打开UCF文件,输入IP的引脚 NET my_ip_0_led_out_pin<31> LOC=B10…….。
点击update bitstream生成bit文件。
打开xparameters.h,就可以后到my_ip在PLB总线上分配的地址了,我们在程序里就是通过这个地址访问它
编写C代码如下:
点击下载,在串口调试助手则可看到如下信息
自定义IP生成的VHDL代码中,有文件my_ip.vhd和user_logic.vhd,my_ip.vhd是顶层文件,它完成了PLB总线接口,及PLB总线协议转换,最后提供给user_logic接口,用于与PLB总线通讯,my_ip.vhd相当于是PLB与用户逻辑的一个桥梁,如下图:
下面我们来看看本例程提供给user_logic的有哪些信号(注意:采用不同方式生成的模板是不一样的)。
--对use_logic开放的总线接口 ///////////////////////////////////////
Bus2IP_Clk => ipif_Bus2IP_Clk, --bus -> ip clk信号
Bus2IP_Reset => ipif_Bus2IP_Reset, --bus -> ip 复位信号
Bus2IP_Data => ipif_Bus2IP_Data, --bus -> ip 数据总线
Bus2IP_BE => ipif_Bus2IP_BE, --bus -> ip byte enable
Bus2IP_RdCE => user_Bus2IP_RdCE, --bus -> ip 读寄存器地址
Bus2IP_WrCE => user_Bus2IP_WrCE, --bus -> ip 写寄存器地址
IP2Bus_Data => user_IP2Bus_Data, --bus <- ip 数据
IP2Bus_RdAck => user_IP2Bus_RdAck, --bus <- ip RdAck
IP2Bus_WrAck => user_IP2Bus_WrAck, --bus <- ip WrAck
IP2Bus_Error => user_IP2Bus_Error --bus <- ip Error
--//////////////////////////////////////////////////////////////////
Data文件夹下有MPD文件和PAO文件,
当IP设计完成并已添加到了用户的嵌入式系统中,如果在调试的过程中需要调整IP的硬件结构时,可以按如下步骤进行。
Step1:修改IP 的HDL文件并保存;
Step2:然后执行project->Launch Xilinx Bash Shell,并在命令行输入命令:
Cd synthesis,再输入xst –ifn IP名称对应的scr文件,可在工程的synthesis文件夹下找,(本例程为my_ip_0_wrapper_xst.scr),此时EDK会自动重新编译被修改的文件,并在过程相关的文件中更新信息。
Setp3:如果修改了MPD文件,则需要“Project ? Rescan User Repositories”一次,最后update bitstream。
PLB接口总线协议非常复杂,为了方便用户开发,xilinx采用向导的方式自动生成模板,用户不需要去管它的协议标准,只要了解它生成的文件结构,能在user_logic添加自已的逻辑进去,就可以了。
熟悉了流程和工具的使用,应用起来就不那么别扭了 :) 。
《Lab 3: Adding Custom IP to an Embedded System Lab》 www.xilinx.com
《基于XILINX FPGA片上嵌入式系统的用户IP开发》http://www.eefocus.com/html/08-10/415520080549KvWJ.shtml
附件是本文PDF及IP 文件
用户1621116 2012-5-29 17:33