实现ARM9与FPGA的并口通信的两种方式

时间:2025-04-28  作者:Diven  阅读:0

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

实现ARM9与FPGA的并口通信的两种方式

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

图1

图2

图3

表1

原SPI功能GPIOFPGA引脚功能
SPI0_MOSIPA1W21写使能
SPI0_SCKPA2W22读使能
SPI0_CSPA3W20片选

硬件连接对应情况如图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所示。

图4

2      对PIOA的寄存器组重新初始化

在最初的驱动程序中包括了对GPIO的初始化,经过试验观察PIO可读寄存器的内容发现寄存器的配置不能满足本任务的完成,使用已有的初始化会干扰到使能信号的操作,于是要对GPIO进行重新初始化,对寄存器进行配置。

2.1       PIO_PER寄存器

图5

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

2.2       PIO_OER寄存器

图6

该寄存器有默认的设置,观察发现最低4位默认为1100。本项目需要用到GPIO的输出模式,所以需要对该寄存器进行重新配置,给P1,P2,P3置1,开启引脚的输出功能。

2.3       PIO_PUDR寄存器

图7

通过观察PIO_PUSR寄存器可以发现默认的上拉寄存器是全部开启的,上拉寄存器的启用会影响GPIO的正常输出,所以通过PIO_PUDR寄存器将上拉寄存器关闭,为之后正常操控GPIO提供基础。

数据的写入:

1       概况

PIO_SODR和PIO_CODR这两个寄存器可以将指定位的GPIO电平置1置0。由于这里设计的读写使能为低电平有效,在程序中首先将涉及的信号均拉高,相当于对信号进行一个复位。之后就可以进行数据的发送工作。

图8

图9

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

在一个发送周期中,经历以下过程:

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

1:片选信号拉低;

2:写使能信号拉低;

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

4:写使能拉高,同时在上升沿时刻对数据取样;

5:片选信号拉高。

在DATASHEET的SMC一章中有对并口的发送时序进行描述,当前实验结果也符合数据手册中通过SMC实现并口通信的说明,如图10、图11所示。可见,其实两种方式大同小异,实现的结果相同。

图10

图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所示:

图12

通过对FPGA编程将数据0x3456放到数据总线上,在ARM的程序中对数据总线所在的地址进行读取,就可以将数据读出。这里将读出的数据存储到了PIOC寄存器中,你也可以把放到变量中来观察,验证对错。在IAR里查看PIOC的只读寄存器PIOC_ODSR就可以看到数据已经被存放到了寄存器当中。

关于涉及到的寄存器、寄存器的控制方式、使能信号的时序以及相关软件的使用和编程思路,读取与写入是大致一样的,这里不再重复描述。

猜您喜欢

2512贴片电阻是一种常用的电子元件,因其尺寸为2.5mm x 1.2mm而得名。它在电路中起着至关重要的作用,主要用于限制电流和分压。 相比于传统的插件电阻,...
2024-11-26 11:29:33

双工器是重要的通信设备,应用于无线电、电视及其通信系统中。主要功能是实现信号的双向传输,允许设备在同一频带上同时发送和接收信号,极大地提高了通信的效率。双工器的...
2010-01-20 00:00:00

温度校正器是重要的仪器,应用于工业、实验室及科研领域。主要作用是确保温度测量的准确性和可靠性。在许多生产过程中,温度控制直接影响产品的质量和安全,使用温度校正器...
2010-01-29 00:00:00

Java作为解释型的语言,其高度抽象的特性意味其很容易被反编译,容易被反编译,自然有防止反编译措施存在。今天就拜读了一篇相关的文章,受益匪浅,知彼知己嘛!!之所...
2022-07-29 16:00:00

仪表放大器是重要的电子设备,应用于信号处理和数据采集系统中。根据不同的工作原理和应用需求,仪表放大器主要可以分为以下几类。按照增益特性,仪表放大器可以分为固定增...
2013-11-17 00:00:00

光敏电阻是对光线敏感的电子元件,主要作用是根据光照强度的变化调整电阻值,从而实现对光的感应。光敏电阻应用于自动照明、光线监测和环境检测等领域。在自动照明系统中,...
2012-03-31 00:00:00

音频变压器是专门用于音频信号处理的电子元件,在音频设备中是非常重要的配件。其主要功能是将音频信号的电压和电流进行转换,从而实现信号的隔离和匹配。通过音频变压器,...
2010-01-04 00:00:00

电子元器件中,电阻器是常见的基础元件,而色环电阻则是电阻器的一种重要表示方式。色环电阻通过颜色编码来显示其电阻值和误差范围。对于初学者来说,理解色环电阻的读取方...
2025-03-17 13:00:02

数字电位器是应用于电子设备中的可编程元件,其主要作用是调节电流和电压。根据不同的工作原理和应用场景,数字电位器可以分为以下几类。按照控制方式分类,数字电位器可分...
2011-03-04 00:00:00

白板擦是我们日常办公和学习中不可少的工具。主要作用是帮助我们轻松清除白板上的字迹,使得白板可以随时保持干净整洁。无论是在课堂上还是会议室中,白板擦的使用都能提升...
2013-05-21 00:00:00