收到Spartan 6 lx9这块板子,很是意外。因为在我的眼中,FPGA开发板是一个很大的东西,哪知道真有这种U盘式的开发板。说它是U盘式的开发板,是因为它能够像U盘一样,直接插入USB接口,就可进行FPGA设计了。
Lx9开发板,体积小,便于携带。一端是普通的USB接口,可以插入笔记本或台式机,用ISE编程,下载到FPGA上。另外,为了便于调试,在另外一端也配备了USB的Type B接口,通过连接线,连到电脑后,可以实现USB转串口的功能。所以,我现在开发,就是通过在两个连接线把这块开发板同电脑的两个USB串口连接起来,一端是用来FPGA编程的,一端是串口调试的。
由于在前面设计了兼容ARM9处理器的CPU内核,这次收到开发板以后,就下载进去,进行调试测试。在前面,我对兼容ARM9处理器的CPU内核做的最重要的工作是让它在Modelsim下面启动了uClinux操作系统,在本论坛的链接:http://bbs.eetop.cn/thread-175617-1-1.html。当然,现在已经可以在Modelsim下面启动真正的Linux操作系统了,链接是:http://code.google.com/p/arm-cpu-core/。下面,同各位分享,如何使用这款兼容ARM9处理器的CPU内核进行Dhrystone Benchmark的测试。
当然,第一步是安装Spartan6的开发软件ISE。在这个设计包里面,有一张ISE webpack的光盘,一步步的安装步骤,就不多说了。
安装完毕,打开ISE后,就是普通的启动界面。现在,我们必须新建一个FPGA设计工程,而且这个FPGA设计工程必须针对Spartan 6 lx9这块开发板。因此,在新建FPGA project时,必须在Family中选择Spartan 6,在Device中选择XC6SLX9,在Package中选择CSG324,在Speed中选择-2。以上的几个选项都是针对这块开发板中的FPGA而设的。只要这么设定了,那么我们综合出来的bit文件可以直接下载入FPGA开发板中,进行运行。
各位可以参照下图进行设定,整个新建项目的向导,在这里就不在多说了。
新建工程后,我们就可以增加顶层文件,以及各种设计文件。下面是我做Dhrystone Benchmark的工程结构图。如下图所示,这个工程采用的是XC6SLX9-2csg324,完全符合开发板中的FPGA设定。它有一个顶层文件: dhry_top(dhry_top.v),这个顶层文件涵盖了几个基本模块。这些基本模块有:u_pll模块(负责生成时钟);u_arm9模块:这就是兼容ARM9处理器内核;u_rom模块:存储处理器运行指令的ROM;u_ram模块:处理器运行需要的RAM;u_uart模块:一个简单的串口生成模块;dhry_top.ucf:整个工程的管脚约束文件。
首先介绍u_arm9-arm9(arm9.v),这是我设计的兼容ARM9处理器的CPU内核。它设计简单,易于集成到自己的设计当中,下表是它的接口列表。
类别 |
名字 |
方向 |
位宽 |
描述 |
系统接口 |
clk |
IN |
1 |
时钟输入端口 |
rst |
IN |
1 |
异步复位端口,高电平有效 |
|
cpu_en |
IN |
1 |
同步使能端口,高电平有效 |
|
中断源 |
cpu_restart |
IN |
1 |
ARM架构reset中断源,高有效 |
fiq |
IN |
1 |
ARM架构FIQ(fast interrupt)中断源,高有效 |
|
irq |
IN |
1 |
ARM架构IRQ(interrupt)中断源,高有效 |
|
rom_abort |
IN |
1 |
ARM架构Prefetch Abort(instruction fetch memory abort)中断源,高有效 |
|
ram_abort |
IN |
1 |
ARM架构Data Abort(data access memory abort)中断源,高有效 |
|
指令池接口 |
rom_en |
OUT |
1 |
ROM读使能,高有效 |
rom_addr |
OUT |
32 |
ROM地址总线 |
|
rom_data |
IN |
32 |
ROM读数据 |
|
数据池接口 |
ram_cen |
OUT |
1 |
RAM使能信号,高有效 |
ram_wen |
OUT |
1 |
RAM写使能信号,高电平代表写,低电平代表读 |
|
ram_addr |
OUT |
32 |
RAM地址总线 |
|
ram_rdata |
IN |
32 |
RAM读数据总线 |
|
ram_wdata |
OUT |
32 |
RAM写数据总线 |
|
ram_flag |
OUT |
4 |
RAM各字节使能信号 |
为了让它工作起来,我们必须为它配备ROM提供执行的指令,配备RAM提供运行的空间。因此,只要我们在FPGA设计上,为它配上了对应的ROM和RAM,它就能够工作起来。下面是它的简单的ROM和RAM模型。
这两个模型非常简单,容易采用FPGA内部的Block RAM来实现。ISE为我们准备了非常好的生成IP的工具——CORE Generator,只要我们选择Project->New Source即可调出下面的界面。选择IP(CORE Generator & Architecture Wizard),可以生成本次Dhrystone Benchmark测试需要的三个IP: PLL、ROM、RAM。
具体的生成过程,大家可以自己摸索。下面通过顶层dhry_top.v来看看,这三个IP和uart模块是如何合并一起实现Dhrystone Benchmark测试的。
这个项目的目的是对兼容ARM9处理器内核进行Dhrystone benchmark测试。测试的程序放在ROM模块里面。为了能够进行在线可编程,我们把程序的执行分为两种状态,一是工作态,在这个状态下,ROM模块内存放的指令一一取出执行,此时串口作为处理器的外设而工作;另外一个是编程态,在这个状态下,我们可以通过串口把编译完毕的程序下载入ROM模块内,当然,在这个状态下,处理器内核是不工作的。因此,我们使用EN_KEY作为这两个状态切换的输入管脚。正好开发板上有DIP switch的设备,使用它可以对开发板送入0或1的状态。此时EN_KEY正好连接入其中的一个DIP switch管脚。
module dhry_top (
CLOCK_100,
RST_KEY,
EN_KEY,
UART_RX,
UART_TX
);
input CLOCK_100;
input RST_KEY;
input EN_KEY;
input UART_RX;
output UART_TX;
上面是dhry_top.v的头文件。其中它含有四个输入端口和一个输出端口。其中CLOCK_100接板上的100 MHz时钟输入端,通过PLL模块可以生成兼容ARM9内核需要的工作时钟。RST_KEY是一个复位按键,它连接入开发板的唯一的用户可以使用的按钮。通过按动这个按钮,可以对开发板进行复位操作。另外一个输入端口是EN_KEY,它用来切换ARM内核的工作态以及编程态。剩下的输入和输出关键是串口的输入引脚和输出引脚。
wire clk;
wire rst;
wire irq;
wire [31:0] rom_data;
wire [31:0] ram_addr;
wire ram_cen;
wire [3:0] ram_flag;
wire [31:0] ram_wdata;
wire ram_wen;
wire [31:0] rom_addr;
wire rom_en;
wire [31:0] ram_rdata_rom;
wire [31:0] ram_rdata_ram;
wire rx_vld;
wire [7:0] rx_data;
wire txrdy;
reg [31:0] ram_rdata;
reg [3:0] rd_sel;
reg tx_vld;
reg [7:0] tx_data;
reg irq_delay;
pll u_pll
(// Clock in ports
.CLK_IN1 ( CLOCK_100 ), // IN
// Clock out ports
.CLK_OUT1 ( clk )
<本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网