首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
FPGA/CPLD可编程逻辑
» ZedBoard学习手记(二) 开发自定义AXI总线外设IP核——以LED和开关为例
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
ZedBoard学习手记(二) 开发自定义AXI总线外设IP核——以LED和开关为例
发短消息
加为好友
pengpengpang
(pengpengpang)
当前离线
UID
1023229
帖子
6106
精华
0
积分
3055
阅读权限
90
来自
中国
在线时间
156 小时
注册时间
2013-12-20
最后登录
2016-7-3
论坛元老
UID
1023229
来自
中国
1
#
打印
字体大小:
t
T
pengpengpang
发表于 2014-9-19 11:16
|
只看该作者
ZedBoard学习手记(二) 开发自定义AXI总线外设IP核——以LED和开关为例
开发
,
开关
,
手记
,
外设
,
工程
想要发挥ZYNQ芯片的特长,让整个系统协同工作起来,就需要将PS与PL两部分结合在一起,在Cortex-A9核和FPGA逻辑资源之间建立通信的通道,这条通道就是AXI总线。ZedBoard推出的官方例子中已经介绍了如何将Xilinx做好的AXI总线IP(如AXI_Timer、AXI_GPIO等)添加到工程中,而下面就让我们一起来自己编写一个简单的AXI总线设备——读取板上的8个Swtich状态,并控制8个LED的开关。有人会问我不了解AXI总线啊怎么办,无须担心,Xilinx已经为我们设计了建立向导,可以自动生成一个设备模板,即使不了解AXI协议,也可以轻松完成设计工作。首先通过PlanAhead建立一个系统工程,导入ZedBoard的xml文件:zedboard_RevC_v2.xml。这步操作还不清楚的童鞋请在ZedBoard官网上下载ZedBoard_CTT_v14.1资料并跟随该文档进行扫盲。这个资料很详细,也是Step By Step的,可以帮助完成基本的操作学习。工程建好后,进入XPS界面,选择Hardware→Create or Import Peripheral,开始创建外设。
(看不清图的话可以点击小图放大,下同)
在弹出的窗口中选择新建模板,建立一个外设。
Next后选择集成到XPS系统中,这样新建的外设就会保存在edk目录下的pcores文件夹中。
接着Next,为自己的IP起个名字,这里叫my_gpio,全称就是my_gpio_v1_00_a了,注意这里的名字不能用大写字母。
之后选择总线的类型,可以看出这里提供了几个AXI总线设备的变种形势,可以使设备具备猝发操作及大量数据传输的能力,这里我们选AXI4-Lite形式,也就是最简单的类型。
下一步进行几个可选项配置,包括软件复位、主从模式等,勾选中间两项即可,虽然现在用不到软件复位。
设置寄存器数量,这里我们设置两个32位寄存器(实际使用低8位,其它部分Not Care),一个用来控制LED,另一个用来读取SW状态。
选择需要的IP连接信号,这些是与用户逻辑对接的信号,保持默认即可。
这一步可以建立一个总线上的仿真设备,不需要,直接Next。
来到另一个配置画面,第一个选项是使用Verilog来设计用户逻辑;第二个选项建立一个ISE的工程文件,方面写代码;第三个选项让XPS自动生成底层的控制代码。
设置结束以后,在XPS的工程目录下就能找到IP的文件夹了,兔子这里的路径是” .\Hello_Zed.srcs\sources_1\edk\module_1\pcores\my_gpio_v1_00_a”。里面有三个文件夹,hdl文件夹包含了user_logic.v和my_gpio.vhd。前者就是我们要修改的用户逻辑文件,后者则是用来连接AXI与用户逻辑,并封装IP核的VHDL文件。这个文件只能是VHDL的,所以像兔子这样只会Verilog的就很苦闷了,还好里面的内容很简单,看一下就能明白。在devl\projnav文件夹下可以找到刚生成的ISE工程,用Project Navigator打开my_gpio.xise,这样就可以开始编辑user_logic了。
user_logic中除了一些定义和信号连接以外,就是两个always块,第一个实现AXI总线向用户寄存器写入数据,第二个则是总线从寄存器中读取数据。需要注意的是,这里的AXI总线已经通过Xilinx的AXI Lite IP Interface进行了中转,到用户这里就变成了非常简单的读写逻辑。为了控制板上的硬件,我们定义两组信号和相应的寄存器:SW_In信号连接8个Switch,LED_Out连接8个LED。input [7:0] SW_In;output [7:0] LED_Out; 在这里,规定寄存器0为Swtich状态寄存器,寄存器1为LED控制寄存器。添加一个always块,使写入寄存器1的数据在LED_Out上更新。 always @( posedge Bus2IP_Clk ) begin if ( Bus2IP_Resetn == 1'b0 ) begin LED_Out <= 0; end else begin LED_Out[7:0] <= slv_reg1[7:0]; end end // LED_OUTPUT_PROC 同时添加逻辑让Switch的状态通过简单的同步(不是去抖啊)写入寄存器0。 // implement slave model register read mux always @( slv_reg_read_sel or slv_reg0 or slv_reg1 ) begin case ( slv_reg_read_sel ) 2'b10 : slv_ip2bus_data <= slv_reg0; 2'b01 : slv_ip2bus_data <= slv_reg1; default : slv_ip2bus_data <= 0; endcase end // SLAVE_REG_READ_PROC always @( posedge Bus2IP_Clk ) begin if ( Bus2IP_Resetn == 1'b0 ) begin SW_Reg0 <= 0; SW_Reg1 <= 0; slv_reg0 <= 0; end else begin SW_Reg0 <= SW_In; SW_Reg1 <= SW_Reg0; slv_reg0[7:0] <= SW_Reg1[7:0]; end end // SWTICH_INPUT_PROC 之后还要修改读写逻辑,将case ( slv_reg_write_sel )下的2'b10项注释掉,令寄存器0只读(对写入的数据Not Care),寄存器1则可以读写。如此,我们的用户逻辑就完成了,简单吧。别忘了还要在my_gpio.vhd中为用户逻辑添加端口,两组信号在整个IP的对外接口中分别命名为GPIO_LED_Out和GPIO_SW_In。
具体的代码内容在此:
my_gpio_hdl.rar
双击Synthesize,检查一下有没有问题,没问题的话就可以关掉Project Navigatorl 。
回到XPS界面,我们的自定义IP已经在列表中了,但是这个时候将IP添加到工程中,刚才进行的编辑并不生效,GPIO端口并没有显示在IP核的框图中,这点兔子没有搞明白是为什么,可能要手动修改MPD文件吧。于是我选择将这个IP再添加一次(不得已而为之,有什么好办法望不吝赐教),还是刚才的方法,只不过这回选择导入已有的外设,这种方法也可以用于导入其他已有的IP核。
依旧起名为my_gpio,在弹出的提示中选Yes覆盖,之后一路Next到HDL Source Files窗口,选择IP核的\data\_my_gpio_xst.prj文件。
继续Next,直到这里选择总线类型为AXI4-Lite Slave类型。
接着在参数窗口中指定High Address的参数为C_HIGHADDR。
好了,Next到结束,这时刚才进行的修改已经生效并被成功导入了,现在双击my_gpio,保持默认选项不管,将其添加到系统中。
在Graphic视图中,可以看到my_gpio的框图,包括一组已经连接的AXI总线,和两组我们刚才定义的端口。
进入Port界面,将LED和SW端口设置为对外,确保最后看起来是这个样子。
好了,关闭XPS,回到PlanAhead,生成Top HDL(如果之前做了可忽略)。
新建一个约束文件,并设置SW和LED的端口约束。
约束内容如下(建议手动输入,如果Copy了什么非法字符是很麻烦的,害我查了好久):
选择Generate Bitstream,系统会自动完成编译综合工作,最后生成包含PL配置信息的System.bit文件。
至此,my_gpio自定义外设就完成了,这个PL现在可以通过AXI总线与PS通信——让然还需要软件支持了,呵呵。下篇将会介绍如何裸机软件调试外设,其步骤与ZedBoard_CTT文档中大同小异。以上。
收藏
分享
评分
记录学习中的点点滴滴,让每一天过的更加有意义!
回复
引用
订阅
TOP
返回列表
测试测量
嵌入式技术
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议