基于 MiniLA 的移植与实现 (1)

来源:互联网 发布:微信选课系统源码 编辑:程序博客网 时间:2024/06/10 01:16

通过上篇《MiniLA初步分析》的描述,我们对MiniLA有了一定的了解,现在看如何在已有的硬件环境上让他工作起来。

 

找到手上最适合的一块板卡是MPC8280 + XC2S400E2者之间扩展总线进行连接,这时候内存控制器工作在GPCM(General-purpose chip-select machine)模式。

主要信号

External Bus:

8位数据线,12根地址线,读有效,写有效,片选

这部分可以参考FPGAppcbus模块的信号定义

FPGA JTAG:

通过将FPGAJTAG信号连接到ppcspi控制器接口上,实现FPGA的在线编程

Communication

FPGA IO -> ppc irq0

FPGA IO -> ppc irq6

FPGA IO -> ppc GPIO (若干)

 

 

因为FPGA旁没有本地的Memory,所以该设计的难点就是如何将采样的数据暂存起来并保证实时可靠的传送到PowerPCSDRAM里。基于XC2S400E内的Block RAMs资源数,最终在FPGA内部通过逻辑搭建了一个16Kbytes的双端口RAM

 

PowerPC上的开发环境:

ELDK3.1.1 (Linux-2.4.25gcc-3.1.1)

 

FPGA开发环境:

ISE 7.1.04i

ModelSim 5.8c

 

FPGA内部有5个模块,如下图:

ppcBus 由于和PowerPC的扩展总线进行对接,内置了328bits的寄存器。PowerPC可以通过对起的访问实现对FPGA的控制。当读寄存器0地址的时候,触发rd信号。

 

FIFO 这是一个包裹模块,对应的概念在软件里可以称为wrapper。其内部通过Block RAM构建的一个双端口RAM16Kbytes的尺寸,PORTA为读通道,端口尺寸8bitsPORTB为写通道,端口尺寸为32Bits

 

DataGen 实现对16个通道上的信号进行编码,并写入FIFO。其中信号:

channel[0:15]表示输入的16个测试通道

mask[0:15]用来实现对clkIn的分频,来产生采样时钟

en表示是否使能采样

采样的触发条件按上文说的有两个:

1.      16个通道上的信号有一个或多个发生了变化。这时候把和上次采样点的时钟计数器的值以及变化前的电平状态记录下来。(例如这是一个下跳,那就记录1而不是0

2.      16bits的计数器发生了溢出前,当到0xffff的时候强制产生一次触发。

 

DataRead PowerPCFPGA寄存器0进行访问的时候,将FIFO中的一个有效数据放在扩展总线的数据线上,并对读地址进行自增。

 

LA_top 将上面的4个模块进行信号的链接。同时通过读地址和写地址进行判断,当FIFO中的有效数据超过1Kbytes的时候就触发中断,当达到15Kbytes就认为已经接近上限,认为可能发生溢出。

 

ControlLA_top中的一个小模块,通过判断读地址和写地址的值,来计算FIFO内有效数据的个数

 

下面是对FPGA寄存器功能的定义:

 

Address

Type

Reset Value

Registers Description

0x00

R

0x00

Data read MDA port

0x01

R/W

0x00

System Control register

0x02

R/W

0x01

Sample Rate Control Low register

0x03

R

0x00

FIFO Remain Data Counter Low register

0x04

R

0x00

FIFO Remain Data Counter high register

0x06

R/W

0x00

Sample Rate Control High register

 

Data read MDA port Registers (0x00)

Bit

Description

0-7

用于读取内部FIFO内容的端口,内部地址会根据读信号自增

System Control Register (0x01)

Bit

Description

0

0: 停止测试数据的产生

1: 开始测试数据的产生

1

(Read Only)

0: 正常

1: FIFO已经溢出

2

(Read Only)

0: FIFO内没有多余1024Bytes的数据可读

1: FIFO内有多余1024Bytes的数据可读

3

reserved

4

reserved

5

reserved

6

reserved

7

0:系统正常工作

1:复位FPGA内部逻辑

 

Sample Rate Control Low register (0x02)

Bit

Description

0-7

采样参考时钟的计数器控制,低8

 

FIFO Remain Data Counter Low register (0x03)

Bit

Description

0-7

FIFO中目前所剩数据的低8

 

FIFO Remain Data Counter High register (0x04)

Bit

Description

0-7

FIFO中目前所剩数据的高8

 

Sample Rate Control High register (0x06)

Bit

Description

0-7

采样参考时钟的计数器控制,高8

 

 

1.      FPGA工作后,PowerPC可以检测到其已经进入工作模式,这个通过GPIO来实现,同时常亮Alive LED

2.      通过System Control Register Bit01来激活数据的产生,同时点亮Active LED

3.      通过System Control Register Bit00来禁止数据的产生,同时熄灭Active LED

4.      当检测到FIFO快要溢出(有效数据超过15Kbytes), 点亮Critical LED,同时将状态显示在System Control Register Bit1

5.      FIFO中的数据超过了1024Bytes的时候,产生中断IRQ5,该中断为低有效电平中断

6.      通过System Control Register Bit71来复位FPGA的内部逻辑

7.      实时的读取Register 0x3 0x4可以获得当前FIFO中残留数据的长度

8.   通过修改Register 0x2 0x6的值,可以实现对采样时钟的频率进行调整,计算公式为:

SAMPLE_CLK = MAIN_CLK / (reg6<<8 +reg2)

 

FPGA设计的要点是在DataGen模块中要确保写入FIFO的采样数据高16bits和低16bits一致。

16个通道上的信号有一个或多个发生了变化。这时候把和上次采样点的时钟计数器的值以及变化前的电平状态记录下来。(例如这是一个下跳,那就记录1而不是0)。这个要求是上位机软件设计决定的,两者需要保持一致。

 

原创粉丝点击