原创 EDK下如何自定义IP

2010-11-15 21:01 6773 11 12 分类: FPGA/CPLD

摘要


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的状态。


二、实验步骤


1、新建一个EDK工程,添加串口外设


2、根据向导创建IP模块


选择Hardware ? Create or Import Peripheral to start the wizard ,点击下一步;


c291a95f-a35a-4d15-ae8e-070dadb2774b.JPG


选择Create templates for a new peripheral 点击Next


选择To an XPS project,将生成的IP保存在当前工程目录下(在当前工程的pcores文件夹中)


935337d6-3fde-4b8d-9180-88e7a08041ec.JPG


点击下一步,输入IP名和版本号,再点下一步


d2738956-3b9e-4830-816a-42bc33523c86.JPG


选择Processor Local Bus (PLB v4.6)并click Next


ddbf06a3-4667-4ee0-98e1-4e8a1fd80220.JPG


这里根据需要选择生成的模板文件类型,每个选项生成的文件提供给user_logic的总线接口是不一样的,这里我们选择user logic software Register。


3fa2f711-37bd-4374-ae71-938bef298460.JPG


输入registers数量;


6b18f554-4de0-4080-932a-1357808dcf32.JPG


这里列出了提供给user_logic的总线接口,可根据需要进行增减.  Click Next


c5ba84b5-1d92-42c5-b321-8810cc9f2f03.JPG


In the (OPTIONAL) Peripheral Simulation Support panel, leave Generate BFM simulation platform unchecked, and click Next


e3ae2de9-a25e-46cc-8950-0d32e31ec426.JPG


在最下面一行打勾,生成模板文件。


6e706c9b-ef8b-4763-9416-aec6ad3497cf.JPG


点击下一步,将可看到摘要信息


9d684c6b-330f-4590-b7be-7f5687103ec9.JPG


点Finish 完成


这时在IP Catalog 就可以看到它了。


454c40ec-4497-4b43-bfd6-1fafa9c3c795.JPG


打开D:\my_custom_ip\pcores\my_ip_v1_00_a,生成的文件目录如下:


d2de76bf-30b9-46d6-9e04-40859bdc8c70.JPG


3、修改模板,添加自定义代码


(1)在模板中添加用户代码


 Step1:My_ip.vhd是顶层文件,这里是PLB总线接口和IP的输入输出端口,创建模板时,系统自动帮我们添加了PLB总线接口,而外部端口则需要我们自已添加。


 在--USER ports added here处添加输出端口


b22efcb5-e974-4907-85d8-4890be028629.JPG


在--USER ports mapped here添加 led_out   => led_out, 表示顶层文件的led_out和user_logic中的 led_out是相连接的。


97df8f3d-3003-41de-a2ea-fe6934281d0d.JPG


保存并关闭My_ip.vhd文件。


Setp2:在user_logic中添加端口和用户代码


打开user_logic.vhd在--USER ports added here处添加端口


e58b7727-fe4b-498c-ac8d-738623324ff9.JPG


在--USER signal declarations added here, as needed for user logic 下添加用户代码


8ec8c4c8-bac2-4806-a112-ee1e1281a470.JPG


保存并关闭user_logic.vhd文件


(2)修改MPD文件


    在Ports下添加led_out端口描述,PORT led_out = "", DIR = O, VEC = [0:31];


4dcb0ce8-cc2a-4f54-861c-129e807a415e.JPG


修改完成,点击保存并关闭MPD文件。


选择Project ? Rescan User Repositories 将自动将修改后的IP更新到EDK中。


 


4、添加自定义的IP


49ed2556-eefc-402b-abaf-fa1637b473f1.JPG


3afd396d-ee24-4e74-b135-1c0b295e4e1c.JPG


(1)分配引脚


打开UCF文件,输入IP的引脚 NET my_ip_0_led_out_pin<31> LOC=B10…….。


3ddd17dc-8c53-4227-b806-98e06265a301.JPG


(2)生成BIT文件


点击update bitstream生成bit文件。


5、下载与验证


打开xparameters.h,就可以后到my_ip在PLB总线上分配的地址了,我们在程序里就是通过这个地址访问它


b635a568-0e9e-433a-98af-45c722dee22b.JPG


编写C代码如下:


3d479453-a765-441c-a882-30a0d19ce329.JPG


点击下载,在串口调试助手则可看到如下信息


e8f2da21-9b09-4154-aa0f-cb6f0c9c23ee.JPG


三、IP文件分析


1、HDL文件


自定义IP生成的VHDL代码中,有文件my_ip.vhd和user_logic.vhd,my_ip.vhd是顶层文件,它完成了PLB总线接口,及PLB总线协议转换,最后提供给user_logic接口,用于与PLB总线通讯,my_ip.vhd相当于是PLB与用户逻辑的一个桥梁,如下图:


a86c51a0-0cd6-4e74-b052-1255ac31862f.JPG


下面我们来看看本例程提供给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


      --//////////////////////////////////////////////////////////////////


2、MPD和PAO文件


Data文件夹下有MPD文件和PAO文件,


de97f11f-90ae-4d73-b96c-09a502cfe3b9.JPG253df085-ed97-4247-bae4-12b892a2b5a2.JPG


四、IP的功能调整与修改


当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会自动重新编译被修改的文件,并在过程相关的文件中更新信息。


e034dacb-b92e-4d8a-ad81-7c7ec9a21070.JPG


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 文件


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1621116 2012-5-29 17:33

很值得学习
相关推荐阅读
用户1278632 2011-09-15 12:49
解决FPGA配置成功,但不能初始化运行的BUG
摘要:    遇到两次FPGA配置完成,却不能正常运行的问题,一次是ALTERA的A1C3,另一次是XILINX的XC3S700A。两次都是DONE信号的问题。问题虽不大,但却很折腾人,今天在这里作下...
用户1278632 2011-09-15 12:41
Code Edit的神器UltraEdit
摘要:      我不是一个专职的程序员,但经常会要写一些单片机底层的code和hdl code,起初用UE,是因为查找和批量修改很方便,而且不会额外的生成一些“垃圾”文件;现在用UE三年多了,一直都...
用户1278632 2010-12-29 09:29
ISE与EDK联合设计报错 ERROR:NgdBuild:604 logical block
做一个很简单的测试在ISE的SCH里调用EDK的symbol,EDK的功能也很简单,就是CPU通过串品打印一串字符首先,我建一个ISE工程再建一source  sch类型,并设置为顶层,取名为top....
用户1278632 2010-12-22 14:49
EDK12.2中 mch_emc IP的时序问题
mch_emc IP可以将PLB总线时序转为inter 8080时序 下面是我用chipscope抓到的波形Mem_DQ_O_In :  数据输入 Mem_OEN:      读信号  Mem_A: ...
用户1278632 2010-12-22 14:29
xilinx FPGA的配制与应用程序引导-范例
两个Xilinx FPGA应用程序引导的范例1、run_in_flash是直接在NOR FLASH里运行程序2、spi_flash_boot是将BIT和bootloader和APP全部固化到SPI F...
用户1278632 2010-12-19 13:48
EDK下sram IP的使用
EDK软件的memory and memory controller中有一个xps multi-channel external memory controller(sram/flash)的IP,用来...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条