计算机系统综合课程设计.docx
《计算机系统综合课程设计.docx》由会员分享,可在线阅读,更多相关《计算机系统综合课程设计.docx(36页珍藏版)》请在冰豆网上搜索。
计算机系统综合课程设计
计算机系统综合设计
设计报告
组长:
唐兴盛
成员:
吴哲凯
荆宁
丁富来
汤思彦
东南大学计算机科学与工程学院
二00九年一月
设计名称
东大之芯嵌入式系统
完成时间
2009-1-5
验收时间
成绩
本组成员情况
姓名
学号
承担的任务
个人成绩
唐兴盛
09005309
流水线CPU、MiniC编译器
吴哲凯
09005328
流水线CPU、汇编器
荆宁
09005323
集成开发环境MiniSysIDE
丁富来
09005324
汇编器
汤思彦
09005336
外设
注:
本设计报告中各个部分如果页数不够,请大家自行扩页,原则是一定要把报告写详细,能说明本组设计的成果和特色,能够反应小组中每个人的工作。
报告中应该叙述设计中的每个模块。
设计报告将是评定每个人成绩的重要组成部分之一,因此要在报告中明确标明每个模块的设计者。
设计报告最后一页是验收表和教师综合评价,请大家打印报告的时候将此页一并打印装订。
本组设计的功能描述(含所有实现的模块的功能)
我们小组在本课程设计中一共完成了32位流水CPU及定时计数器,看门狗、PWM、UART、中断控制器这些外设,带全屏编辑功能的汇编器、Mini-C编译器的IDE环境开发。
并实现了系统的整体联合调试,以及下载调试。
功能完全正常。
本组设计的主要特色
1.实现了32位5级流水结构的CPU
2.实现了具有强大错误检测功能的汇编器
3.实现了Mini-C编译器
4.重写了ALU中的移位器
5.使用结构描述重新设计了寄存器组
6.完善地处理了流水中断及其嵌套的处理
7.整合了汇编器与编译器,设计出了一个集成开发环境MiniSysIDE
8.MiniSysIDE支持关键字高亮,并实现了与Quartus的无缝连接
本组设计的体系结构
I.32位5级流水CPU
系统的CPU采用了MIPS的经典5级流水结构。
流水段分为IF取指、ID译码、EXE执行、MEM内存读写、WB寄存器回写。
流水线设计关键是解决相关性。
系统采用的是哈佛结构,所以不存在结构相关。
主要解决的是数据相关和控制相关。
解决数据相关采用了转发策略,将以后要写到寄存中的数据提前送到需要的地方;解决控制相关采取了阻塞策略。
II.汇编器
汇编器主要由四个部分组成:
词法分析、语法分析、机器码翻译、错误检测。
其中语法分析是核心。
具体结构图1所示。
图1汇编器结构
词法分析器负责按照MiniSys汇编语言词法,组字符成词;语法分析器依据MiniSys汇编语言语法,组词成句;机器码生成器负责依据翻译规则(包括指令翻译和数据翻译),将一个完整的指令句子或变量定义语句转换为相应的机器指令。
词法分析器没有用自动机,而是采用了以下策略。
我们用的是LL
(1)文法,所以每次读入一个单词前,基本已经知道了单词的类型。
词法分析时,直接读入一个字符串,然后进行字符串匹配。
比如通过语法分析,知道接下来是“ORG_CODE”。
词法分析时只要把读入的字符串同“ORG_CODE”进行匹配,如果一样证明词法分析正确,否则就是出错。
出错后,调用相应的错误处理程序,处理完后继续进行语法分析。
机器码的生成伴随着词法分析和语法分析。
如果前一个单词识别正确,则进行翻译。
否则跳过不进行翻译。
汇编器的关键是语法规则的定义,语法分析和词法分析都是严格按照语法规则进行的。
III.Mini-C编译器
MiniC编译器主要由以下几个部分组成,词法分析器,语法制导分析筐架(含中间代码生成),寄存器分配模块,函数块翻译模块,代码综合输出模块。
结构示意如图2所示。
图2编译器结构
词法分析器在词法分析表的驱动下,从输入流中识别符号,为语法分析提供单词流。
语法分析器采用了LALR
(1)分析法,并采用语法指导的方式进行中间代码的生成,符号表管理模块为语法分析过程提供单词登记,查询的功能,并参与变量的空间分配计算,为后续的代码生成,提供地址信息。
寄存器分配部分负责对翻译过程中产生的临时变量进行寄存器关联,采用的策略是简单统计各个临时变量的使用频率,为使用最频繁的前10个临时变量分配寄存器,对超出部分的寄存器,为其分配内存空间。
函数块的翻译负责将中间代码生成部分产生的各个函数的中间代码翻译为汇编代码,并加上相应的现场保护,现场恢复的代码,完成子程序的翻译。
最后的代码综合输出主要作用是,将各个子程序进行总装,加上中断入口,程序初始化代码,产生完整的一个汇编代码,完成翻译。
产生的汇编代码只要通过Minisys的汇编器翻译,就可以生成最终的机器代码,进入CPU运行。
本组设计中各个部件的设计与特色概述
I.流水处理器部分
Ø总体设计
系统的CPU采用了MIPS的经典5级流水结构。
流水段分为IF取指、ID译码、EXE执行、MEM内存读写、WB寄存器回写。
流水线设计关键是解决相关性。
系统采用的是哈佛结构,所以不存在结构相关。
主要解决的是数据相关和控制相关。
解决数据相关采用了转发策略,将以后要写到寄存中的数据提前送到需要的地方;解决控制相关采取了阻塞策略。
Ø功能介绍
●与MIPS指令集兼容的32位流水CPU
●两级外部中断控制器
Ø主要模块实现技术
●中断控制器
流水线的中断具有一定的复杂性,本设计针对不同情况采取了相应的策略实现了精确中断。
中断的检测在时钟下降沿完成。
(1)非转移指令的中断处理。
此类情形的中断时最简单那的,只需要在中断返回地址寄存器中写入下一条指令的地址,同时输出新PC为中断入口地址,在下一时钟清除IF/ID流水寄存器。
但此类情况有个复杂点的问题,下一周期时,IF/ID被清除,此时高优先级的中断将当前的低优先级中断中断了,当保存的中断返回地址为低优先级的中断的入口地址。
所以,设计时,要向ID/EXE流水寄存器传递当前是否有低优先级的中断发生。
(2)转移指令的中断处理。
对于转移发生前,只需要保存转移的目的地址,同时设置新的PC值,清除IF/ID寄存器。
对于下一个时钟周期,由于IF/ID被清除,此时发生中断嵌套,则类似于a中的处理方法,利用ID/EXE保存的上个时钟的信息,保存低优先级中断的入口地址。
(3)被阻塞的指令。
中断发生时,中断控制器会检测是否有阻塞信号,并自动延迟1个时钟周期执行中断过程。
●寄存器模块
寄存器组位宽为32位,采用D触发器组建。
由地址译码器、32位寄存器组、输出多路开关、转发器多路开关组成。
寄存器文件提供寄存器的读写以及前向数据的转发功能,是处理器的核心部件之一。
为了解决结构相关性,规定寄存器组的写入发生在时钟下降沿。
寄存器组RTL图如图3所示。
图3寄存器组的RTL图
●译码单元
采用了组合电路译码方式,产生相关控制信号、扩展16位立即数到32位、分析数据相关性、指导数据流的转发。
为了消除对ALU造成的结构相关性,PC和MEM/IO地址的计算,都在译码单元中完成。
这样可以提高转移指令的效率。
译码单元是整个CPU的核心部分,CPU的正常运行完全靠译码单元的控制和协调。
●执行单元
执行单元的设计至关重要,其性能的高低直接决定CPU的延迟和主频。
为了尽可能避免触发器造成的延迟,采用了纯组合逻辑设计。
运算部件采用高效结构,比如32位组内并行组间也并行的加法器、桶形移位器(见图4)等。
以此尽可能的减少延迟。
图4桶形移位器
●MEM/IO单元
内存使用了Altera公司提供的宏模块实现,使用的是lpm_ram宏模块。
在时钟的下降沿完成MEM的写入和读出。
I/O与MEM采用统一编址,由MEMIO模块负责MEM/IO地址译码,产生MEM和IO的选通信号。
同时,该模块产生写入数据,送往MEM和IO部件。
为了整合MEM和IO的读出数据,IOREAD模块根据内存和IO的读写信号以及地址信号,对MEM和IO的读出数据进行选择,从而实现读出数据的过滤。
IOREAD的RTL结构如图5所示。
图5IOREAD的RTL结构
接口部件
Ø总体设计
在计算机系统中,外设不会直接挂在系统总线或CPU上,这是因为外设在信号种类、时序等方面往往会有差别,所以需要提供相应的接口电路来完成与系统总线之间的各种转换。
各种接口电路中,需要设计供CPU直接存取访问的寄存器或特定电路,称之为I/O端口。
I/O地址空间的设计有两种方案,一种是独立编址、另一种是统一编址。
考虑到指令系统中没有专门的I/O指令,只能使用LW和SW两条指令进行RAM访问和I/O访问,所以采用了I/O统一编址方式。
系统中RAM与I/O地址空间分配如图6所示。
图6RAM与I/O地址空间分配
Ø各模块用途简介
●7段LED是系统中最常用的输出设备
●4×4键盘是系统中最常用的输入设备
●16位定时器可以用来输出时钟中断
●PWM控制器用来控制模拟电路
●32位并口用来模拟彩灯效果
●看门狗控制器用来使失控的程序恢复正常
●32位内部定时器提供内部定时
Ø各模块具体功能
●4位7段LED控制器
数码管有两种,共阳极数码管和共阴极数码管。
系统针对共阴极数码管进行设计。
即数据位为“1”时,数码管亮,为“0”时灭。
系统中有4个7段数码管,可用来表示4位10进制或4位16进制数。
每半个字节为1组,从16位数据线的高位到低位共分成4组,分别表示LED3、LED2、LED1和LED0。
模块中含有一个16位寄存器,保存显示到数码管上的数值。
端口地址为0FF00H。
●4×4键盘控制器
为了减少连线个数,节省布线面积,系统采用了矩阵键盘形式。
键盘控制器的功能为自动扫描4×4键盘,当有键按下时扫描键值,将键值记录到键值寄存器中。
键盘的扫描算法是:
让所有行线全为了0,读出所有列线状态,如果有列线为0,则说明有键按下;然后从第0行开始扫描每一行,令该行所对应的行线为0,其余行线为1;然后读列线,如果有一列为0,则该行该列交叉处的键被按下;如果读出所有列都为1,则行号加1,并将下一行线清0,其他行线置1,顺序扫描下一行。
扫描到按键后,将行线和列线进行编码,输出键值。
MiniSys成功的用电路实现了这一键盘扫描算法。
模块中含有一个4位寄存器,用来保存当前键值。
端口地址为0FF10H。
●16位定时/计数器
系统带两个定时/计数器,采用了加1计数器。
支持重复定时/计数。
定时方式中,计数到设定值输出一个高电平。
默认情况下,SCT2的定时输出接0号中断(时钟中断)。
计数方式中,计数到设定值时设置状态寄存器的相应位。
模块中含有四个16位的寄存器,用来保存当前状态值或当前计数值。
端口地址为0FF20H、0FF22H、0FF24H、0FF26H。
●16位PWM控制器
控制器内部有一个16位计数器和一个16位对比值,计数器周而复始的加1计数,计数到最大值时跳变为0再计算。
当计数器的值低于对比值时输出低电平,否则输出高电平。
不难发现,对比值的不同决定了输出脉冲的占空比。
当然计数器的最大值可以由程序设置。
模块中含有三个16位的寄存器,分别用来保存计数器的最大值、计数器的对比值、计数器的使能信息。
端口地址分别为0FF30H、0FF32H、0FF34H。
●看门狗控制器
模块中含有一个16位定时器,系统复位后计数值为0FFFFH,之后计数值减1,当减到0的时候,向CPU发送4个时期的RESET信号,同时计数器复位到0FFFFH并继续计数。
可以通过程序向看门狗端口发写信号(俗称“喂狗”)来复位看门狗,使计数器重新开始计数。
模块的端口地址为0FF50H。
●32位并口控制器
本模块很简单,就是含一个32位的寄存器。
可以读写这个寄存器,端口地址为0FF70H。
Ø设计难点及解决方案
●流水线CPU设计的问题和解决策略
(1)数据相关性
MiniSys的设计采用了数据定向转发技术来解决数据的相关性。
ID段含两个四选一的数据选择通路,以此实现数据的定向转发。
数据选择通路的四个输入是EXE段的ALU运算结果、MEM段保存的ALU运算结果、MEM段读出的数据、寄存器的回写数据。
根据ID段产生的控制信号,选择其中的一条通路作为EXE的运算数据输入。
除了一种特殊的情况,其他的数据相关都可以通过定向转发解决。
对于EXE段指令为lw,而ID段的指令需要lw读出的内存值。
此时,内存的数据只能在下一个时钟周期才能被读出来,因此ID段和IF段需要阻塞一个时钟周期,同时在下一个周期开始时清除ID段流向EXE的数据和控制信号,以等待内存数据的读出。
(2)控制相关性
对于jr、j指令,一定会发生转移,因此在ID段就可以计算出新PC值。
对于jal,在ID段就写入$ra寄存器。
同时,应当在下一时钟周期清除IF/ID段的流水寄存器。
对于bne,beq指令,通过在ID段判断寄存器的内容,确定转移是否发生,控制新PC的产生。
由于可能发生和EXE段的lw相关,加上转移发生要清除一段流水寄存器,其最大可能造成两段的空隙,这是bne,beq和j,jal的不同。
(3)结构相关
由于计算PC值有单独的加法单元,同时采用哈佛结构(分离的指令和数据存储器),因此MiniSys的设计不存在结构相关性。
●关于数据转发策略的细节
MiniSys的设计中有四种数据需要向前转发:
EXE段的ALU运算结果、MEM段保存的ALU运算结果、MEM段读出的数据、寄存器回写数据。
按照转发最新数据的原则,四种数据的优先级为EXE段的ALU结果>MEM段保存的ALU结果或MEM段读出的数据>寄存器回写数据。
当前指令需要读取数据时,根据控制信号判断是否需要转发。
如果需要则从下面四个输入中选一个作为转发数据:
EXE段的ALU运算结果、MEM段保存的ALU运算结果、MEM段读出的数据、寄存器回写数据。
如果不需要则直接读寄存器文件。
转发策略完全由组合逻辑实现,并采用了优先级结构以保证较短的电路延迟。
●PC流水的设计细节
图7PC的流水结构
图7就是PC(指令计数器)流水的结构,从结构图我们看出,PC流水实际上就是对新PC的选择过程,如果没有转移发生时,PC顺序地产生,只有当转移发生时,PC才会终止顺序产生,而装入新的PC值。
多路开关的控制信号由译码单元和中断控制器联合产生。
上述的PC流水通路在PCGEN模块中实现。
图8是PCGEN的内部RTL结构。
图8PCGEN的内部RTL结构
II.汇编器
Ø总体设计
汇编器主要由四个部分组成:
词法分析、语法分析、机器码翻译、错误检测。
其中语法分析是核心。
具体结构如图9所示。
图9汇编器结构
词法分析器负责按照MiniSys汇编语言词法,组字符成词;语法分析器依据MiniSys汇编语言语法,组词成句;机器码生成器负责依据翻译规则(包括指令翻译和数据翻译),将一个完整的指令句子或变量定义语句转换为相应的机器指令。
词法分析器没有用自动机,而是采用了以下策略。
我们用的是LL
(1)文法,所以每次读入一个单词前,基本已经知道了单词的类型。
词法分析时,直接读入一个字符串,然后进行字符串匹配。
比如通过语法分析,知道接下来是“ORG_CODE”。
词法分析时只要把读入的字符串同“ORG_CODE”进行匹配,如果一样证明词法分析正确,否则就是出错。
出错后,调用相应的错误处理程序,处理完后继续进行语法分析。
机器码的生成伴随着词法分析和语法分析。
如果前一个单词识别正确,则进行翻译。
否则跳过不进行翻译。
汇编器的关键是语法规则的定义,语法分析和词法分析都是严格按照语法规则进行的。
Ø功能介绍
●支持MIPS指令集的一个子集,含31条指令
●采用软件模拟,扩展了6条指令:
push、pop、jle、jl、jg、jge
●数据类型支持2、10、16进制,以后缀区分
●具有全局查错功能,即一次汇编尽可能多的找出错误
●数据段定义支持多变量、多行定义、地址重定位
●允许多行注释
Ø模块实现
●词法分析模块
该模块含一个扫描器的总控程序,总控程序根据需要调用不同的扫描子程序。
比如语法分析过程中,需要词法分析程序识别一个标识符。
它将标识符的内码传递给扫描器的总控程序Scanner(T_IDNAME),然后再调用ScanIdname()识别一个标识符。
如果成功返回0,失败则返回-1。
一些简单的识别,比如识“DATA”或”CODE”等,直接在总控程序中实现,并没有单独定义函数。
下面是词法分析程序关键函数声明:
intScanner(intTypeOfToken);//扫描器总控程序
intScanCom();//扫描指令助记符
intScanIdname();//扫描标识符
intScan16Radix(intmaxlen);//扫描16进制数
intScan10Radix(intmaxlen);//扫描10进制数
intScan2Radix(intmaxlen);//扫描2进制数
intScanReg(intToeknID);//扫描寄存器
intScanEndl();//扫描注释
●语法分析模块
语法分析采用了LL
(1)文法。
下面是语法分析程序关键函数声明:
intParser();//语法分析器
intDeduction();//语法推导器
voidSucceed();//汇编成功
voidFail();//汇编失败
语法分析的具体算法如图10所示。
图10语法分析算法
●机器码生成模块
该模块主要是将汇编程序中的数据和指令翻译程机器码,其中数据放在Ram.mif文件,指令放在Rom.mif文件。
翻译采取的策略是每识别一个正确的单词,调用翻译程序进行翻译。
比如翻译这条指令:
add$1,$2,$3。
词法程序正确识别指令助记符号“add”,接着调用翻译器,在指令链表中添加一条新指令,填充功能号和操作码。
词法程序识别“$1”、“$2”、“$3”后,翻译器往先前添加的指令中填充Rd、Rs、Rt字段。
这样就完成了一条指令的翻译。
下面是机器码生成模块的关键函数:
intTranslater();//翻译器核心程序
intTranslateImmi();//翻译立即数
intTranslateAddr();//翻译地址
intTranslateID();//翻译变量
//下面都是具体指令翻译函数
intTranslateRcom();
intTranslateSrcom();
intTranslateSllRcom();
intTranslateIcom();
intTranslateSicom();
intTranslateLwicom();
intTranslateJcom();
intTranslateBcom();
intTranslatePcom();
intTranslateJbcom();
intTranslateNop();
●错误处理模块
可处理常见的词法、语法、语义错误。
词法和语法错误是在词法分析中发现的,而语义错误是在翻译过程中发现的。
遇到错误后,调用错误总控程序Error(intTypeOfError),错误总控程序根据错误类型调用不同的处理函数。
处理函数打印错误信息,同时调整下推栈和输入流,这样语法分析程序就可以继续进行下去。
下面是错误处理模块的关键函数:
intError(intTypeOfError);//错误处理总控程序
intErrorLexical();//词法语法错误处理
intErrorSemantic();//语义错误处理
intReadErrorToken();//读取错误单词
intReadErrorSentence();//读取错误句子
Ø语法规则
1.
2.
3.
4.{T_DATA}{T_SEG}{T_ENDL}
5.
6.
7.
8.{T_ORG_DATA}{T_ADDR}{T_ENDL}
9.
10.
11.{T_IDNAME}{T_DW}{T_NUM}{T_ENDL}
12.{T_COMMA}{T_NUM}
13.
14.{T_DW}{T_NUM}{T_ENDL}
15.
16.{T_DATA}{T_ENDS}{T_ENDL}
17.
18.{T_CODE}{T_SEG}{T_ENDL}
19.
20.
21.{T_ORG_CODE}{T_ADDR}{T_ENDL}
22.
23.{T_IDNAME}{T_COLON}
24.{T_ENDL}
25.
26.{T_RCOM}{T_RD}{T_COMMA}{T_RS}{T_COMMA}{T_RT}
27.{T_SRCOM}{T_RS}
28.{T_SLLRCOM}{T_RD}{T_COMMA}{T_RT}{T_COMMA}{T_SHAMT}
29.{T_ICOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}{T_IMMEDIATE}
30.{T_SICOM}{T_RT}{T_COMMA}{T_IMMEDIATE}
31.{T_LWICOM}{T_RT}{T_COMMA}{T_BRS}
32.{T_JCOM}
33.{T_BCOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}{T_PCOM}{T_RS}
35.{T_JBCOM}{T_RT}{T_COMMA}{T_RS}{T_COMMA}
36.{T_NOP}
37.{T_IDNAME}
38.{T_IMMEDIATE}
39.{T_IDNAME}
40.{T_ADDR}
41.
42.<