基于 MiniLA 的移植与实现 (1)
来源:互联网 发布:微信选课系统源码 编辑:程序博客网 时间:2024/06/10 01:16
通过上篇《MiniLA初步分析》的描述,我们对MiniLA有了一定的了解,现在看如何在已有的硬件环境上让他工作起来。
找到手上最适合的一块板卡是MPC8280 + XC2S400E,2者之间扩展总线进行连接,这时候内存控制器工作在GPCM(General-purpose chip-select machine)模式。
主要信号
External Bus:
8位数据线,12根地址线,读有效,写有效,片选
这部分可以参考FPGA内ppcbus模块的信号定义
FPGA JTAG:
通过将FPGA的JTAG信号连接到ppc的spi控制器接口上,实现FPGA的在线编程
Communication:
FPGA IO -> ppc irq0
FPGA IO -> ppc irq6
FPGA IO -> ppc GPIO (若干)
因为FPGA旁没有本地的Memory,所以该设计的难点就是如何将采样的数据暂存起来并保证实时可靠的传送到PowerPC的SDRAM里。基于XC2S400E内的Block RAMs资源数,最终在FPGA内部通过逻辑搭建了一个16Kbytes的双端口RAM。
PowerPC上的开发环境:
ELDK3.1.1 (Linux-2.4.25、gcc-3.1.1)
FPGA开发环境:
ISE 7.1.04i
ModelSim 5.8c
FPGA内部有5个模块,如下图:
ppcBus 由于和PowerPC的扩展总线进行对接,内置了32个8bits的寄存器。PowerPC可以通过对起的访问实现对FPGA的控制。当读寄存器0地址的时候,触发rd信号。 FIFO 这是一个包裹模块,对应的概念在软件里可以称为wrapper。其内部通过Block RAM构建的一个双端口RAM,16Kbytes的尺寸,PORTA为读通道,端口尺寸8bits,PORTB为写通道,端口尺寸为32Bits DataGen 实现对16个通道上的信号进行编码,并写入FIFO。其中信号: channel[0:15]表示输入的16个测试通道 mask[0:15]用来实现对clkIn的分频,来产生采样时钟 en表示是否使能采样 采样的触发条件按上文说的有两个: 1. 当16个通道上的信号有一个或多个发生了变化。这时候把和上次采样点的时钟计数器的值以及变化前的电平状态记录下来。(例如这是一个下跳,那就记录1而不是0) 2. 当16bits的计数器发生了溢出前,当到0xffff的时候强制产生一次触发。 DataRead 当PowerPC对FPGA寄存器0进行访问的时候,将FIFO中的一个有效数据放在扩展总线的数据线上,并对读地址进行自增。 LA_top 将上面的4个模块进行信号的链接。同时通过读地址和写地址进行判断,当FIFO中的有效数据超过1Kbytes的时候就触发中断,当达到15Kbytes就认为已经接近上限,认为可能发生溢出。 Control为LA_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 Bit0置1来激活数据的产生,同时点亮Active LED
3. 通过System Control Register Bit0置0来禁止数据的产生,同时熄灭Active LED
4. 当检测到FIFO快要溢出(有效数据超过15Kbytes), 点亮Critical LED,同时将状态显示在System Control Register Bit1上
5. 当FIFO中的数据超过了1024Bytes的时候,产生中断IRQ5,该中断为低有效电平中断
6. 通过System Control Register Bit7置1来复位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)。这个要求是上位机软件设计决定的,两者需要保持一致。
- 基于 MiniLA 的移植与实现 (1)
- 基于 MiniLA 的移植与实现 (2)
- 基于 MiniLA 的移植与实现 (3)
- 基于ARM的Linux系统移植研究与实现
- 转自EDN基于ARM的Linux系统移植研究与实现
- 基于ARM11的嵌入式linux系统移植与实现--(笔记一)
- 基于ARM11的嵌入式linux系统移植与实现--笔记二
- 基于ARM11的嵌入式linux系统移植与实现--笔记三
- 基于ARM11的嵌入式linux系统移植与实现--笔记四
- 基于ARM的嵌入式linux 内核的裁剪与移植
- 基于嵌入式Linux 系统的MiniGUI 的移植与应用
- 基于s3c2410的tslib1.4的编译与移植~
- 将JConsole移植到Eclipse平台(1)--实现基于SWT的MDI风格界面
- 【1】基于TQ2440的MP3设计——【4、U-Boot 移植与改写】
- 基于Qtopia_Core的嵌入式Linux_GUI平台移植与开发 (转)
- 基于Tiny6410的LCD与一线触屏移植
- [转载]基于ARM的linux内核裁剪与移植
- 基于Android平台的x264的移植与应用(一):移植篇
- 家乡的桥
- flex中双击事件的实现
- 95句互联网上暴强语录~~你以前没看过的!
- [转]为22-29岁的人解释一下什么叫工作
- SQL Server 2005&2008备份恢复总结
- 基于 MiniLA 的移植与实现 (1)
- c++宏展开的问题
- 基于 MiniLA 的移植与实现 (2)
- 基于 MiniLA 的移植与实现 (3)
- C#写XML的简单例子
- 【转载】 -- 15条使人醒悟的生活中的定律
- taskSpawn
- 迎世博中兴3G志愿者
- 发现程序员来不及做啊。