>
首页 » 业界动态 » 多处理器系统中Nios II软核处理器启动方案的设计

多处理器系统中Nios II软核处理器启动方案的设计

作者:  时间:2007-12-03 06:25  来源:

摘要:首先分析研究nios ii软核处理器系统的启动过程,然后在多处理器系统中设计一nios ii 的启动方案,此方案通过外部cpu控制nios ii处理器系统的启动。

关键词:nios ii;系统启动;多处理器系统;sopc

引言

nios ii 处理器是altera公司设计的一款基于fpga的32位risc嵌入式软核处理器,具有32位指令集、数据通路及地址空间,是其可编程系统芯片(sopc)的核心。nios ii系统采用altera公司设计的一套avalon总线交换结构,avalon总线上的所有信号都与系统时钟同步且地址、数据和控制信号使用独立的端口;支持各种传输方式;采用从端口仲裁机制,对于有多个主设备的系统可以提高系统的吞吐量。

采用基于fpga 的nios ii软核处理器很容易在嵌入式系统设计中实现多处理器系统。在这样的多处理器系统中,一般外部处理器做主处理器,nios ii处理器为从处理器,两个处理器有共用的存储器可以进行数据交互。本文将通过对nios ii系统启动的研究设计一方案,用外部处理器配置fpga,加载程序代码到nios ii系统中的程序存储器中,最终完成nios ii系统的启动。

在多处理器系统的启动方案

在多处理器系统中,为了降低成本,可以省去nios ii的一个非易失性存储器外设,如flash、eprom等,nios ii处理器通过avalon交换结构连接易失性存储器,一个外部主处理器及一些必要的接口外设。因此延迟nios ii的启动是必要的,解决办法是在nios ii系统中设计一启动延迟模块,把此模块的基址设为nios ii的复位地址。通过此模块,nios ii处理器上电复位后启动被延迟,直到数据被传输完毕,外部处理器通过启动延迟模块向nios ii发送一个可以开始进入程序存储器的指令,然后跳转到程序存储器开始执行,完成后续的设备初始化及应用程序的执行。

外部处理器通过时序转接桥连接在avalon交换结构上和nios ii处理器共同构成的一个双处理器系统如图1所示。黑色箭头表示nios ii启动延迟模块是通过avalon交换结构连接的。

图1 多处理器系统的启动方案结构

启动方案的硬件设计

启动延迟模块如图2所示,它有两个从端口s1、s2:s1一端连接在启动延迟模块中的rom单元上,另一端通过avalon总线连接在nios ii处理器的指令主端口;s2一端连接在启动延迟模块的控制寄存器上,另一端通过avalon总线连接在外部处理器和nios ii处理器的数据主端口。图2中箭头的方向表示数据的流向。

图2 nios ii启动模块的硬件结构

在此需做两点说明:

* 在启动延迟模块中有两个寄存器,这两个寄存器定义如下:

表1 寄存器定义

寄存器名

字节偏移量

读写状态

长度

说明

控制寄存器1

0

可读可写

32位

用于存放nios ii程序存储器中_start程序的入口地址

控制寄存器2

4

可读可写

32位

跳转标志位(31_1位保留)

这两个寄存器值由外部处理器来写入,其中偏移量为0的寄存器存放nios ii程序存储器中_start程序的入口地址,此值由外部处理器写入;偏移量为1的寄存器只用了第0位,其它位保留,当外部处理器配置好nios ii处理器系统后,会向此寄存器的第0位写入1,否则保持为0。

* rom中的数据是外部处理器在配置fpga的时候写入的,因此只要fpga配置完成后,启动代码就存放进rom中了。rom的大小要根据启动程序代码的大小来决定,设计中应尽可能降低这段程序的代码存储量。

下边是用verilog 硬件描述语言编写的启动延迟模块的硬件代码的主体框架结构:

//rom读端口(s1):

boot_rom the_boot_rom

(

.clock (s1_clk),   //s1_clk为来自avalon总线模块上的s1端口的时钟信号

.aclr (s1_reset),  //s1_reset为来自avalon总线模块上的s1端口的复位信号

.q (s1_readdata), //s1_readdata为流向avalon总线模块的s1端口的32位数据

.address (s1_address)  //s1_address为来自于avalon总线模块的s1端口的地址

);

//控制寄存器读写端口(s2):

control_register the control_register

(

.clk (s2_clk),  //s2_clk为来自avalon总线模块上的s2端口的时钟信号

.reset (s2_reset),  //s2_reset为来自avalon总线模块上的s2端口的复位信号

.read (s2_read),  //s2_read为来自avalon总线模块上的s2端口的读使能信号

.write (s2_write),  //s2_write为来自avalon总线模块上的s2端口的写使能信号

.schipselect (s2_chipselect), //s2_chipselect为来自avalon总线模块上的s2端口的片选信号

.address (s2_address), //s2_address为来自avalon总线模块上的s2端口的地址

.readdata (s_readdata),  //s2_chipselect为流向avalon总线模块上的s2端口的32位读数据

.writedata (s2_writedata) //s2_writedata为来自avalon总线模块上的s2端口的32位写数据

);

启动方案的软件设计

启动方案的软件设计目标是当系统复位后,在外部处理器向nios ii程序存储器和数据存储器传输数据的过程中,nios ii处理器运行要受到外部处理器的控制。当一切就绪后,外部处理器发出一条释放nios ii处理器的命令,接下来nios ii处理器就可以正常运行了。

软件部分主要就是存放在启动延迟模块中rom的代码,此代码主要是检测启动延迟模块中控制寄存器2的第0位是否为1。若为1,则跳转到控制寄存器1中所存储的地址处执行。若设控制寄存器的基址为control_reg_base,为了减少代码量,这段代码容易用nios ii的汇编指令来实现,代码部分在此从略。

最后本方案在我们自己设计的一块开发板上经过测试,能够正确完成nios ii 处理器的启动。

结语

采用多处理器的系统虽然可以提高系统的性能,但传统的多处理器系统一般只出现在工作站及高端pc上,在嵌入式系统中由于其设计代价太高很少采用。本文设计了一种在多处理器系统中的nios ii软核处理器的启动方案,这个方案在外部处理器向nios ii的程序存储器和数据存储器加载数据时,可以控制nios ii处理器的启动。

参考文献:

1. creating multiprocessor nios ii systems tutorial.2005

相关推荐

三星10月24日或在美推出Galaxy Note II

三星  Galaxy Note II   2012-09-28

博通推出全新StrataXGS Trident II交换芯片

StrataXGS Trident II  2012-09-09

微星HD6790 Twin Frozr II拆解

2011-07-18

基于SOPC的分布式干扰系统嵌入式网关设计

干扰系统  网关  SOPC  2011-06-01

基于嵌入式的电缆故障检测仪设计

嵌入式  Nios  FPGA  2011-05-09

基于NiosII的SOPC多处理器系统设计方法

NiosII  SOPC  QuartusII  2010-12-29
在线研讨会
焦点