AXI-Lite:Simper,non-brust control register style interface 添加寄存器类型接口IP核详细使用步骤说明

AXI-Lite:Simper,non-brust control register style interface 添加寄存器类型IP核使用

写在前面:先感谢csdn 肖志远师兄的指点,将如何添加自定义IP好好梳理了一下,不过以下图中的其他3种类型的IP核怎么定义,需要好好研究下。

                  这篇博文的驱动程序来源并参考懒兔子的博客,感谢懒兔子的分享。

                  第一次发博文,有这么多张图片,添加真是累,纯粹的体力活。

 


寄存器控制类型的的接口,这些寄存器提供给软件编程控制和监视用户逻辑的状态。如果不需要外部接口,仅仅是利用内部寄存器来使ARM和FPGA数据交换,不需要另外添加外接IO的话,按照教程的方法添加寄存器一路默认直接打开ISE编辑HDL即可。

ARM和FPGA之间的控制寄存器:

一、读寄存器:ARM通过读寄存器,获取FPGA寄存器的值或者是开关、按键IO的值,所以会有FPGA给它赋值。

在上图中选择4个寄存器后,FPGA会自动生成的4个32bits寄存器:


比如现在给slv_reg0 赋值,这个值供ARM读取


添加上述always块后,ISE编译综合出现以下错误:

 Signal slv_reg0[31] in unit user_logic is connected to following multiple drivers:


错误原因是显然的:slv_reg0在两个always块中同时赋值,所以找到以下always块,修改如下:


注释中的内容是在时钟驱动下,arm给slv_reg0写数据,注释完成后,这时候arm不能通过写数据给slv_reg0到FPGA,slv_reg0变成了只读寄存器。

 

二、读写寄存器:ARM向FPGA写数据,ARM也可以从驱动操作将slv_reg2的值获取。


只需要把寄存器的值赋值给你要添加到FPGA的寄存器就可,不需要在其他地方添加什么东西。

 

三、验证实验:从软件界面将写入数据到FPGA的slv_reg2中,然后又通过软件将赋值到FPGA的数读取打印出,以此证明上述添加寄存器没有问题。

 

图中数据流程:

我通过控制写入300,软件提示我输入了300

打开驱动,将300(x012c)写入到0xe083c008;

读取数据的时候,打印出了每个字节的地址0xe083c008-0xe083c00b

将读到的数据在软件中拼接,打印出300

验证成功。

 

Note 1如果利用兔子的驱动,则需要将数据改成以下内容,因为他的读函数只是读第0个寄存器,之前麻木了一直在读其他寄存器无效果。

Note 2寄存器个数宏定义对应修改 #define MY_GPIO_REG_NUM 4

Note 3有时候打印出要写的寄存器的标识很有必要的,可能是我个人的问题,或者是编译器的问题,我现在用传入参数3表示传入参数2。


Note 4:在进行大规模的数据交换时,兔子的软件代码频繁地打开关闭设备文件,这点需要修改,在准备获取数据时打开一次驱动,数据交换结束后关闭驱动文件。

Note 5:在利用兔子的C代码时,读寄存器想当然地以为Read_Regs(0)读的是第1个寄存器,Read_Regs(1)就是读第2个寄存器的值,其实是不对的,应该是在驱动各种修改寄存器的偏置地址。由下图看出,rd8_buf[4],数组的索引号不可能超出4,数组传入的参数只能是0,reg_num参数并没有实际的作用。

 

所以这时候需要修改驱动中的代码:


以下是ARM控制寄存器和FPGA控制寄存器的关系:


ioread8每次读一个字节,从数据的低8位开始读,一直读到高8位结束

所以第2个寄存器slv_reg2在ARM中的地址是

GPIO_Regs +8,GPIO_Regs +9,GPIO_Regs+10,GPIO_Regs +11

我在测试的时候暂时这么做的,+8,在兔子的驱动中这个可重用性不好,不过这个函数还留了一个参数:*offset,没实际测过,不知道能不能用起来

 

 

四、IP核加入端口

下图是增加IP核端口的整体框图:


在自定义IP核时候,VHD文件是顶层,vhd的entity相当于Verilog的module,用户的逻辑文件都是以部件实例化的方式生成,加入用户自定义的端口主要分为以下3个步骤:

第一步:在用户逻辑中,添加端口

第二步:在最外层IP核添加端口

第三步:将user_logic 实例化和顶层连接,上图红色节点位置

 

第一步:打开user_logic文件,

1.根据绿色文字提示在对应部分加入端口


2.声明端口输入还是输出的类型和端口位宽


到此为止,在用户的任意一个always块中就可以自由添加寄存器和使用以上端口了,第一步完成

 

第二步:打开my_ip.vhd

3.根据绿色文字提示,将端口,端口类型,位宽添加完整,std_logci_vector就是数组。

 

第三步:仍然在my_ip.vhd

4.顶层文件要用你自定义的IP核,在VHD中会声明部件component,在这个结构中加入user_logic的端口,直接从user_logic中拷贝过来即可。


5.实例化用户逻辑文件,现在相当于进行图中的红色节点,代码中的”=>”相当于连接线

到此为止添加文件全部完成,ISE中综合后,在xps导入IP核,在XPS中添加IP核的时候显示出vhd文件的外部端口,也就是上图图中流程图的端口


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值