- 1 -
中国科技论文在线
基于 CPLD 的微处理器软硬件设计
杨明君1,Paolo Camurati22**
作者简介:杨明君,(1982-),男,硕士研究生,主要研究方向:计算机微处理器
(1. 武汉理工大学计算机科学与技术学院,武汉 430070;
2. 都灵理工大学信息与自动化学院,都灵 10129) 5
摘要:CoolRunner II CPLD 是 Xilinx 公司最新开发的一个可以任意裁剪的软核。有最新配
套的 Xilinx ISE 集成开发工程软件可以轻松的完成对硬件模块的描述,并实现对硬件模块
的模拟仿真综合功能。本文所讨论的是基于 CoolRunner II CPLD 开发板,用 VHDL 和 C 语言
实现微处理器系统和编译系统联合设计。完成微处理器内部所有功能和所对应的编译系统设
计。由于控制单元是微处理器的关键部件,所以控制单元的设计是微处理器设计核心设计之10
一,控制单元的性能几乎决定着整个微处理器的性能高低。在微处理器结构设计中我们重点
讨论控制单元的分析与实现。编译系统的设计是用形式化语言表示方式实现汇编编译器的分
析与设计,用 C语言来实现编译器的功能,完成了词法分析、语法分析、语法编译转换和机
器指令代码生成。
关键词:微处理器设计;编译系统设计;CPLD 15
中图分类号:TP303
the Hardware/Software Co-design of the Microprocessor
Based on CPLD
YANG Mingjun1, Paolo Camurati2 20
(1. College of Computer Science and Technology, Wuhan University of Technology,
WuHan 430070;
2. Dipartimento di Automatica e Informatica, Politecnico di Torino, Turin 10129)
Abstract: CoolRunner II CPLD is a latest split soft core developed by Xilinx, which can be easily
implemented, simulated and synthesized by the latest integrated development environment Xilinx 25
ISE for the hardware blocks. This paper discussed the hardware and software co-design of the
microprocessor kernel and compiler system based on the CoolRunner II CPLD using VHDL and
C languages. It presents a series of all the components that have been implemented to make up of
the microprocessor kernel and compiler system. The design of the control unit is one of the key
designs of the microprocessor design because of its critical component. The performance of the 30
microprocessor mostly could be decided by the control unit’s. We focus on the analysis and
implement of the control unit at the microprocessor architecture design. The design of the
compiler system, that assembler compiler system is analyzed, designed, and described by the
formal language, has completed the compiler functions, the lexical analysis, the syntax analysis,
the syntax-directed translation, and the generation of the microprocessor instruction vectors 35
utilizing C language.
Keywords: Microprocessor Design; Compiler Design; CPLD
0 引言
微处理器是计算机应用系统的核心部件,微处理器的性能体现计算机应用系统的性能核40
心参数之一。为了提高计算机应用系统性能和上层软件跨平台的应用,微处理器系统结构的
研究和编译系统的研究是大部分计算机应用系统设计人员最为关心的问题之一,也是广大普
通计算机用户关心的问题之一。伴随着可编程逻辑部件和硬件描述语言的发展,特别是复杂
可编程逻辑器件(CPLD)和 VHDL 语言[1],CPLD 开发板是一个用户自定义嵌入式开发板。
为微处理器系统结构的研究提供有利的技术支持。在微处理器系统设计过程中,本文重点是45
- 2 -
中国科技论文在线
强调的对微处理器系统结构的研究和编译系统的研究。
本设计中采用的设计工具有 Xilinx CoolRunner-II CPLD 开发板,Xilinx ISE 最新的硬件
集成开发环境和 C 语言。CoolRunner-II 是一个完全 USB 供电的开发平台,开发板提供了高
效的电源,一个用户自定义的震荡器(1000/100/10kHz),数个用户输入输出设备,一个实
时电流表,一个提供电源和 CPLD 编程的 USB 接口,包括 5 个可扩展接口用来对开发板的50
扩展[2]。Xilinx ISE 集成了大量的应用开发包,提供了多种硬件描述语言,提供了简便的辅
助设计功能,强大的模拟仿真综合工具[3]。有了这些工具我们可以简化设计流程,降低设
计成本,提高设计的可维护性,可以自由的根据设计者的要求对设计进行调整。本文将在第
一部分详细讨论编译系统的设计核心思想;将在第二部分陈述在微处理器设计中的控制单元
的设计思路和实现方法,将在第三部分分享相关工作,设计结论,还有一些设计经验,总结55
本次实验的成果还有对未来工作的一点点想法。
1 编译系统设计
编译系统设计的主要目的是把人可以识别的目标程序代码转化为微处理器指令序列。由
于社会的快速发展,对各种类型微处理器的需求不断的膨胀,导致了微处理器种类繁多,不
同的微处理器都有自己的指令系统,比如 8 位处理器和 32 位处理器的指令系统不同,32 位60
处理器之间的指令系统不同,我们常见的指令系统有 RISC 和 CISC,专用的微处理器都有
自己独特的指令系统。在这些不同指令系统上有很多相应的应用软件,但是不同指令系统中
的应用软件是不能通用的。在计算机网络如此发达的当今社会,网络资源种类繁多,分享信
息和共享网络资源要求计算机网络实现跨平台的应用。实现跨平台的应用基本上只有两种选
择,一是软件实现方式,如 JAVA 平台;二是硬件实现方式,就是本文所讨论的指令系统。65
怎样使不同指令系统应用软件达到复用的目的,是本编译系统设计需要研究的问题,同样也
是简化微处理器设计流程的重要问题之一。本文编译系统设计分三个部分讨论,第一个部分
汇编编译系统设计的实现,第二个部分指令系统硬件实现形式,第三个部分跨平台指令系统
的研究。
汇编编译系统设计 70
本文汇编编译系统设计的思路是把整个系统分为两个大块,第一块是采用形式化语言定
义设计并描述我们要定义汇编语言指令系统文件;第二块是根据汇编语言指令系统文件格
式,开发相对应的编译系统解释程序。编译系统解释程序根据汇编语言指令系统文件,对应
用汇编语言程序进行分析和编码。当我们有需要对汇编语言指令系统的指令,格式,语法,
结构要做调整时,我们只是需要根据格式要求对汇编语言指令系统文件进行修改,编译系统75
解释程序是不需要改变的。这样设计的主要目的是为了克服以往设计中存在的一些问题,比
如说,在增加或者删除指令,调整指令结构,程序布局重构,新的微处理器设计的过程中,
需要修改部分代码,有的甚至可能需要进行重新设计。增加了设计过程中的成本,还有是对
设计开发人员对软硬件知识提出了很高的要求。在实际项目工程中,实现汇编编译系统有很
多种方法,在这里我们不做展开讨论。本文采用 JFlex 和 CUP 编译系统开发工具设计思想80
来完成我们的编译系统设计[4]。
在汇编编译系统实现过程中,我们需要清楚的认识汇编语言的语言格式,然后用形式化
语言知识描述汇编语言程序,定义好终结符集合,非终结符集合和文法集合。按照一定的规
则编码成汇编语言指令系统文件。由此可知,在完成汇编语言指令系统文件之前,我们必须
- 3 -
中国科技论文在线
对我们所要设计的汇编语言进行深入的研究和分析,完成词法分析,语法分析,语法编码转85
换和微处理器指令序列的生成[5]。下面是一个汇编语言的一个文法描述:
G = (N, T, P, S)
N = {<assembler program>, <data segment>, <code segment>, <data item>, <data name>,
<data type>, <data size>, <symbol set>, <number set>, <code item>, <control group>, <shift and
rotate group>, <logical group>, <arithmetic group>, <input and output group>, <interrupt group>, 90
<address symbol>, <control instruction>, <condition symbol>, < shift and rotate instruction>,
<register set>, <logical instruction>, <operand2>, < arithmetic instruction>, < input and output
instruction>, < interrupt instruction>, <interrupt mode>, <nl>}
T = {DW, DB, DD, Z, NZ, C, NC, jump, call, return, load, and, or, xor, add, addcy, sub,
subcy, mul, mulcy, div, divcy, input, output, interrupt, returni, enable, disable, sr0, sr1, srx, sra, sl0, 95
sl1, slx, sla, rl, s0, s1, s2, s3, s4, s5, s6, s7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j, k, l, m,
n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W,
X, Y, Z, ,, :,ε}
P = {
<assembler program> → <data segment><code segment> 100
<data segment> → <data segment><data item><nl>| ε
<data item> → <data name><data type><data size>
<data name> → <symbol set>
<data type> → DW|DB|DD
<data size> → <number set> 105
<code segment> → <code segment><code item><nl>| ε
<code item> → <control group>|<shift and rotate group>|<logical group>|<arithmetic
group>|<input and output group>|<interrupt group>
<control group> → <address symbol><control instruction><condition symbol><symbol set>
<symbol set> → [a-zA-Z][a-zA-Z0-9]* 110
<address symbol> → <symbol set>:|ε
<control instruction> → jump|call|return
<condition symbol> → Z,|NZ,|C,|NC,| ε
<shift and rotate group> → <address symbol>< shift and rotate instruction><register set>
< shift and rotate instruction> → sr0|sr1|srx|sra|sl0|sl1|slx|sla|rl 115
<register set> → s0| s1| s2| s3| s4| s5| s6| s7
<logical group> → <address symbol><logical instruction><register set>,<operand2>
<logical instruction> → load|and|or|xor
<number set> → ([1-9][0-9]*)|0
<operand2> → <register set>|<number set> 120
<arithmetic group> → <address symbol>< arithmetic instruction><register set>,<operand2>
< arithmetic instruction> → add|addcy|sub|subcy
<input and output group> → <address symbol>< input and output instruction><register
set>,<operand2>
< input and output instruction> → input|output 125
<interrupt group> → <address symbol><interrupt instruction><interrupt mode>
< interrupt instruction> → interrupt|returni
<interrupt mode> → enable|disable
<nl> → [\n|\r|\r\n]+
} 130
- 4 -
中国科技论文在线
S = <assembler program>
在前面的描述文法中,G 表示的是一个编译程序的一个文法,N 是非终结符集合,T 是
终结符集合,P 是汇编语言文法描述集合,S 是开始非终结符。它是一个基本的汇编程序框
架,在这个框架的基础上,我们可以丰富和优化这个基础结构去满足我们特殊的需求。例如:
Loop1: Load s7, 01 ; init shifter reg 135
Loop2: Output s7, 04
SL0 s7 ; shift left with 0
Jump NZ, loop2 ; goto loop2 when s7<>0
Jump loop1 ; goto loop1
这是一个简单的汇编语言程序,如果我们需要加一个乘法运算指令 mul 我们只是需要在140
< arithmetic instruction>中添加终结符 mul,还有在 T 中添加 mul 就可以了。如果我们需要把
位操作的单操作数改成双操作数只需要把<shift and rotate group> → <address symbol>< shift
and rotate instruction><register set>替换成<shift and rotate group> → <address symbol>< shift
and rotate instruction><register set>,<operand2>就可以了。如果我们需要调整汇编语言的机构
添加堆栈段,我们只是需要把<assembler program> → <data segment><code segment>替换成145
<assembler program> → <stack segment><data segment><code segment>,然后我们就定义
<stack segment>的文法。
完成了词法分析,语法分析以后,最后就是需要把汇编程序转换成汇编指令系统序列。
本文采用的是映射机制来完成这一过程。我们首先必须建立两张映射表,一张是符号与信号
量映射表,一张是信号量组合编码表。我们以一个 16 位的逻辑指令为例说明这两张表的作150
用。如表格 1,表示的是一个 16 位逻辑指令的格式,第 1 位到第 5 位表示指令的操作码,
第 6 位到第 8 位表示寄存器编号,第 9 位到第 11 位可能表示寄存器编号,第 9 位到第 16
位可能表示一个常数。根据逻辑指令的文法规则检索符号与信号量映射表,查找汇编程序符
号对应的信号量进行替换。如果编译过程中不清楚某些符号的位数可以检索信号量组合编码
表,比如说出现一个常量,可以根据表中的值进行相应的编码。 155
表 1:16 位逻辑指令格式
Tab 1: the Format of 16-bit Logic Instruction
I I I I I X X X Y Y Y K K K K K
表 2:符号与信号量映射表 160
Tab 2: map of symbol and signal
符号表 信号量表
LOAD 00000
AND 00001
OR 00010
XOR 00011
S0 000
S1 001
S2 010
S3 011
S4 100
S5 101
S6 110
S7 111
165
- 5 -
中国科技论文在线
表 3:信号量组合编码表
Tab 3: Combination Table of signals
属性 位数
<register set> 3
<number set> 8
<logical instruction> 5
指令系统硬件实现形式 170
通过汇编编译系统完成目标汇编程序代码的编译以后,我们就得到了汇编程序指令序列
集合。现在,编译系统需要把得到的汇编程序指令序列和微处理器连接起来,才能让微处理
器执行汇编程序指令序列。有两种实现方式:一种是采取时序部件,另一种是采用组合逻辑
部件。时序部件是根据时钟事件和地址寄存器的值,向微处理器发送汇编程序指令序列;组
合逻辑部件是根据地址寄存器值的变化,向微处理器发送汇编指令序列。两种方式都有各自175
的优点和缺点。这两种部件都需要把汇编程序指令序列嵌入到部件中。所以编译系统在完成
编译以后,应该根据用户的需求自动生成所需要的程序存储部件。
跨平台指令系统的研究
跨平台使应用程序在不同的硬件设备上的应用。在硬件水平上设计跨平台操作,有助于
汇编程序指令序列可以在不同的设备上运行,增加指令序列的可移植性。随着网络的发展,180
各种手持设备的应用,增强指令序列的可移植性变的比较强烈。在现在社会的跨平台应用主
要是通过软件实现,比如说 JAVA 平台。相对于软件基础上实现跨平台,在硬件水平上实现
跨平台有速度上的优势,降低了软件系统结构的复杂度,从而降低了对硬件性能需求的,有
助于指令序列在不同的硬件设备的应用,有利于将来的网络资源合理的分配与利用,比如说
让很庞大的程序分割成数小段在网络主机上分别联合计算。实现硬件水平的跨平台操作只是185
需要在微处理器和指令序列的中间加上一个指令映射部件(如图 1)。把标准的指令序列转
化成为微处理器需要的指令序列,让后在微处理器中执行。例如,16 位指令序列在 32 位微
处理器上运行,假定指令标准设定前者的指令集合是后者指令集合的子集。那么就可能一一
对应的信号量编码,那就可以一一进行替换,指令替换,寄存器替换,常量替换等。就可以
实现 16 位指令序列跨平台的应用。 190
2 结构设计
结构设计是微处理器设计的核心设计,是其他各个部件设计的基础。结构设计的好坏直
接影响整个微处理器设计的成败。微处理器结构设计的目标是,维护简单,加减指令容易,
修改内容少,尽量的保持微处理器框架结构的稳定不变,区域化修改。在这个框架体系中很195
容易的整合新指令,而不影响其他指令的执行,增强指令之间设计的独立性。不仅仅是简单
的逻辑指令,还包括控制流指令在内的所有指令[6]。
Instructions flow
M
apping
device Mapping instructions flow
M
icro
processor
图 1:硬件水平上跨平台模型
: Cross-Platform Based on Hardware Level
- 6 -
中国科技论文在线
在大部分微处理器结构设计思想中,控制单元是微处理器结构中的核心部件,它控制着
所有其他的微处理器部件的工作状态。在传统的微处理器结构设计中,控制单元的设计是微
处理器设计中最为复杂困难的部分之一。控制单元的实现机制就目前来说有两种选择:一种200
是有限状态机(FSM),另一种是控制字(CW)。有限状态机方式控制灵活,结构简单清
晰,设计方案相对固定,容易构成性能良好的同步时序逻辑模块,程序层次分明,可读性好,
在高速运算和控制方面有巨大的优势。但是在微处理器部件的维护控制方面差强人意。控制
字方式维护控制灵活,容易构建微处理器框架结构。但是没有清晰的控制状态流,可读性差。
在目前绝大部分的微处理器设计的控制单元都是采用两种方式中的一种,或者是对两种方式205
的改造应用。如:Moore 状态机和 Mealy 状态机。
在本文微处理器设计中,我们决定打破传统的控制单元设计方式综合有限状态机和控制
字的结构,发挥有限状态机和控制字的优势,消除或缩小他们的弱势。在我的设计中采用的
是有限状态机的原理来控制控制字来运作部件控制状态流(如图 2)。实现方式是在有限状
态机的状态中添加一个控制字的状态,根据不同指令的需要,会提供不同数值和数量的控制210
字状态流(如表 4)。这样设计可以有效的控制微处理器的每一个控制状态流情况,也可以
更佳容易对各个微处理器的部件的进行控制,维护简单,增减指令便捷。
表 4:控制字样表,控制字每一位分别表示,读寄存器 1,读寄存器 2,ALU 计算,写寄存器,读存储器,
写存储器,乘法器(4 个时钟周期) 215
Tab 4: Sample Table of Control Word, each bit mean, read reg1, read reg2, ALU execute, write reg, read mem,
write mem, multipler(4 circles)
指令 控制字 1 控制字 2 控制字 3 控制字 4 控制字 5
addkx 1011000 1010000
subyx 1111000 1110000
mulyx 1100001 1100001 1100001 1101001 1100000
outputkx 1000010 1000000
在微处理器设计过程中,控制字的复杂性远远超过了的表 4。由于在设计过程中设计要
求中只是需要用两个周期完成所有指令的设计,所以就固定了控制字状态(如图 3)。在编220
码设计过程中,首先定义控制字表,设计好所有指令的控制字状态,如果有相同控制字状态
的指令,合并控制字状态,节约资源,图中第一行代码就是 interrupt 指令的控制字状态。在
uPC_Proc 中根据指令的操作码 Opcode,用哈希函数的方式找到对应指令的控制字状态,在
时钟的控制下发送不同的控制字状态,让整个有限状态机运作起来,当然可以根据实际情况,
调整有限状态机的结构。这样设计的好处是整个微处理器的结构比较清晰,控制方便,维护225
方便。但是需要耗费一定的资源。
IR PC E CW S
图 2:有限状态机,S开始状态,PC地址寄存器状态,IR指令寄存器状态,
CW控制字状态,E结束状态
: FSM, Start(S), Program Counter (PC), Instruction Register (IR), Control
Word (CW), End (E)
- 7 -
中国科技论文在线
3 结论
本文设计重点是对编译系统和微处理器结构进行分析与研究。
编译系统设计过程中,主要是分析指令系统的设计,汇编编译系统物理实现和在硬件水230
平上实现跨平台的实现。主要是为了对编译系统复用,还有这种指令系统下设计的软件在不
同的设备下的可移植性进行研究。
微处理器设计采用的是原型开发模型,是一个构架、实验、优化、维护的循环过程。主
要目的是为了在这一个过程中寻找一种更为优化的一个微处理器结构。成功的对样本汇编程
序指令序列进行测试(如图 4),通过了模拟综合仿真物理实验,确定了本设计的可行性。 235
通过这次微处理器设计,我们积累了许多实际的设计经验。在对硬件设备进行设计时,
我们必须充分了解我们的实验工具,比如说集成开发环境 Xilinx ISE 的认识,Xilinx
CoolRunner- II CPLD 开发板的了解,清楚的知道有多少资源可以利用。合理的设计硬件结
构,计划的完成各个组成部件。在关于时序部件和组合逻辑部件的时钟分配问题上,尽量少
用时序部件多用组合逻辑部件,因为组合逻辑部件不占用时钟周期。如果在时序部件很多的240
情况下,时序部件在逻辑上有顺序关系,建议采用串行组织结构。图 4 中指令寄存器 testir
图 3:控制单元编码
: Code of Control Unit
- 8 -
中国科技论文在线
和地址寄存器 bus_addr 存在明显的先后顺序关系,所以采用的是串行。指令寄存器 testir 和
寄存器单元写操作 testregin 是不相关的两个部件,应该采用并行,分享时钟周期。
在以后的微处理器设计中,我个人认为应该加深对在硬件水平上的跨平台研究,有利于245
实现各种软件应用在不同硬件设备上的通用性,有利于各种网络设备资源联合应用提供了一
种设计方式,有利于简化软件的体系结构。
[参考文献] (References)
[1] D. Antonio-Torres. A PicoBlaze-Based Embedded System for Monitoring Applications[Z]. Paris:Tecnologico 250
de Monterrey Campus Puebla,2009.
[2] Xilinx, Inc. the Reference Manual of PicoBlaze 8-Bit Microcontroller for CPLD Devices[R]. American: Xilinx,
Inc, XAPP387, 2003.
[3] Xilinx, Inc. Xilinx ISE[OL]. [2002].
[4] . Aho, . Lam, R. Sethi, . Ullman. Compiler: Principles, Techniques, and Tools, 2/E[M]. American:255
Addison-Wesley,2006.
[5] . Hopcroft, R. Motwani, . Ullman. Introduction to Automata Theory, Languages, and Computation[M].
American:Addison-Wesley,2001.
[6] Michael Gschwind, Dietmar Maurer Maurer. An extendible MIPS-I processor kernel in VHDL for
hardware/software co-design[Z]. Wien:EURO-DAC,1996. 260
图 4:样本时序图
: Timing Diagram of Some Sample