您的位置 首页 编程

完成ARM9与FPGA的并口通讯的两种方法

实现ARM9与FPGA的并口通信的两种方式-并口通信是最常用基础功能,实现ARM9与FPGA的并口通信有两种方式,一种颇为巧妙,利用SMC(Static Memory Controllor),其中的使能点都通过寄存器可以轻松控制;另一种方式就是通过GPIO来完成。

并口通讯是最常用根底功用,完结ARM9与FPGA的并口通讯有两种方法,一种较为奇妙,运用SMC(StaTIc Memory Controllor),其间的使能点都经过寄存器能够轻松操控;另一种方法便是经过GPIO来完结。

因为我拿到板子硬件的DRAM_CSN0、DRAM_WEN和DRAM_RDN在前期PCB规划时没有充分考虑过SMC或许被运用,故运用接插件上其他引脚进行替代,运用了图1中画圈的三根引脚SPI0_MOSI、SPI0_SCK、SPI0_CS。因为这三根引脚能够复用为GPIO,所以在并口调试中将这三根引脚当作GPIO来运用。

完结ARM9与FPGA的并口通讯的两种方法

图1

完结ARM9与FPGA的并口通讯的两种方法

图2

完结ARM9与FPGA的并口通讯的两种方法

图3

表1

原SPI功用 GPIO FPGA引脚 功用
SPI0_MOSI PA1 W21 写使能
SPI0_SCK PA2 W22 读使能
SPI0_CS PA3 W20 片选

硬件衔接对应状况如图2、图3和表1所示。到此,你应该现已了解了完结通讯需求重视的引脚了吧。

工程进程:

1      重设Pin Planner

依据当时硬件的实践衔接状况,对Quartus中的Pin Planner进行更新,将信号i_rd_cpu、i_wr_cpu、i_select对应的locaTIon改为PIN_W22、PIN_W21、PIN_W20。如图4所示。

完结ARM9与FPGA的并口通讯的两种方法

图4

2      对PIOA的寄存器组从头初始化

在开始的驱动程序中包含了对GPIO的初始化,经过试验调查PIO可读寄存器的内容发现寄存器的装备不能满意本使命的完结,运用已有的初始化会搅扰到使能信号的操作,所以要对GPIO进行从头初始化,对寄存器进行装备。

2.1       PIO_PER寄存器

完结ARM9与FPGA的并口通讯的两种方法

图5

该寄存器是用来启用PIOA各个引脚的GPIO形式,如图5所示,每一位都对应操控着一根GPIO管脚,经过给P1、P2、P3置1激活了PA1、PA2、PA3的GPIO形式,一起也等于封闭了复用外围A、B的形式。

2.2       PIO_OER寄存器

完结ARM9与FPGA的并口通讯的两种方法

图6

该寄存器有默许的设置,调查发现最低4位默许为1100。本项目需求用到GPIO的输出形式,所以需求对该寄存器进行从头装备,给P1,P2,P3置1,敞开引脚的输出功用。

2.3       PIO_PUDR寄存器

完结ARM9与FPGA的并口通讯的两种方法

图7

经过调查PIO_PUSR寄存器能够发现默许的上拉寄存器是悉数敞开的,上拉寄存器的启用会影响GPIO的正常输出,所以经过PIO_PUDR寄存器将上拉寄存器封闭,为之后正常操控GPIO供给根底。

数据的写入:

1       概略

PIO_SODR和PIO_CODR这两个寄存器能够将指定位的GPIO电平置1置0。因为这儿规划的读写使能为低电平有用,在程序中首先将触及的信号均拉高,相当于对信号进行一个复位。之后就能够进行数据的发送作业。

完结ARM9与FPGA的并口通讯的两种方法

图8

完结ARM9与FPGA的并口通讯的两种方法

图9

图8为接连发送0x1122,0x3344,0x5566等多个数据时的状况,在写使能的上升沿对数据总线和地址总线上的信息进行取样;图9中显现当写使能信号上升沿的时间,数据总线上的信息为0x5566,地址总线上的信息为0x0005,行将0x5566存储到RAM的0x0005地址中。(上图SignalTap采样时钟为125MHz)

在一个发送周期中,阅历以下进程:

0:地址总线上呈现地址信息;

1:片选信号拉低;

2:写使能信号拉低;

3:数据放到数据总线上;

4:写使能拉高,一起在上升沿时间对数据取样;

5:片选信号拉高。

在DATASHEET的SMC一章中有对并口的发送时序进行描绘,当时试验成果也契合数据手册中经过SMC完结并口通讯的阐明,如图10、图11所示。可见,其实两种方法迥然不同,完结的成果相同。

完结ARM9与FPGA的并口通讯的两种方法

图10

完结ARM9与FPGA的并口通讯的两种方法

图11

2       ARM中数据的发送

经过FPGA_WriteData函数完结数据的发送作业,其间运用了PIO寄存器中的PIO_CODR,PIO_SODR,PIO_ODSR三个寄存器,别离完结使能拉低,使能拉高,和标志位判别的功用。

#define WREG(x) (*((volaTIle unsigned short *)(x))) 语句中,(volaTIleunsigned short *)(x)将x界说为了一个地址指针,再经过*取内容,这样就能够将数据写到这个地址上,在之后的程序中只需直接调用WREG()就能够便利的向地址写数据。

3       FPGA中数据的存储

reg uprise_wr_dly;

always @(posedgei_clk,negedge i_rst_n)

begin

if(!i_rst_n)

uprise_wr_dly <= 1'b0;

else

uprise_wr_dly <= i_wr_cpu_pre;

end

reg wr;

always @(posedgei_clk,negedge i_rst_n)

begin

if(!i_rst_n)

wr <= 1'b0;

else if((i_wr_cpu_pre == 1'b1) && (uprise_wr_dly ==1'b0))

wr <= 1'b1;

else

wr <= wr;

end

以上程序制作了一个比写使能信号拖延一个clock的信号,再经过两个信号的组合判别完结了写使能上升沿信号的处理。这在FPGA的程序中是很常见的处理方法。

最终经过RAM程序中的接口程序,将现已处理好的数据总线信号、地址总线信号和使能信号、时钟信号添加进接口傍边,功用便完结了。

数据的读取:

数据读取时的使能信号相同运用了PIO_CODR和PIO_SODR这两个要害的寄存器,依照时序操控这两个寄存器的值即可。

数据读取的状况如图12所示:

完结ARM9与FPGA的并口通讯的两种方法

图12

经过对FPGA编程将数据0x3456放到数据总线上,在ARM的程序中对数据总线地点的地址进行读取,就能够将数据读出。这儿将读出的数据存储到了PIOC寄存器中,你也能够把它放到变量中来调查,验证对错。在IAR里检查PIOC的只读寄存器PIOC_ODSR就能够看到数据现已被寄存到了寄存器傍边。

关于触及到的寄存器、寄存器的操控方法、使能信号的时序以及相关软件的运用和编程思路,读取与写入是大致相同的,这儿不再重复描绘。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/339349.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部