目录导航
严禁未经本人允许的转载和引用到任何实验报告/大作业/论文/文章中。
当然小段的合理的借鉴是可以的。
前言:
写作目的:
这玩意很冷门?是的,就是很冷门。冷门到中文互联网上基本找不到有关资料,但是呢,西电人还是要用啊。
在西安电子科技大学计算机科学与技术学院(我还是喜欢叫软件学院)的嵌入式方向必修课FPGA技术中,沈老师用了这种架构来作为教学工具,讲解了如何用HDL描述一个较为复杂的硬件结构。在最后完成大作业的时候,很多同学可能会遇到“找不到资料”,“PPT看不懂”等困难,我写这篇长文也算是造福后来的学弟学妹们吧。
文章修改自我的大作业报告,删去了一些代码以及实验仿真部分。
文章内容:
这篇文章并不包括任何的代码,只是从较为顶层的角度简述了整个Parwan处理器是怎么运作的,并举了一些例子。
当然,第九部分的图片会使用VHDL综合后的NGC网表图,因为我觉得这样能好理解一点。
由于对MarkDown使用不熟练,很多表格都是在Word中绘制然后截图贴上的,请谅解。
错别字可能很多。
开始之前:
开始之前,我假定您是一位合格的大三学生,这意味着您学过数字电路和基本的计算机组成原理。我希望您理解以下名词的大概含义:
- D触发器
- 总线
- 内存
- 内存页
- 寻址方式
- 指令集
- ALU(算术逻辑单元)
- 寄存器
- PC(程序计数器)
- 状态机
大概理解就好,这些名词我也会在后文稍作简述。
我们先简要回顾一下我们之前学习的内容,我们可能觉得“操作系统”已经够底层了,“写汇编”已经底层到不能再底层了。但是,我们某些时候可能需要关注更底层的东西,比如CPU内部的架构,指令流水线,分支推测,内存设计或者某个Port的状态或者PCB板的布局。去考虑什么推挽开漏,上拉下拉,某个电容怎样怎样等玩意。
计算机组成课上讲的什么微命令等东西,教学时几乎是作为黑箱讲的,只了解到什么微指令译码等东西。确实,要深入讲是较为麻烦的,哪怕8086也是个挺复杂的CISC的CPU。很多同学就会很好奇“PC OUT ;AR IN”到底底层怎么处理啊?希望能通过读一读文章,理解一下RISC的硬件解码是如何构建和运行的。
本文尽量不谈微操作,微指令之类的东西,这些概念通常是CISC特有的,CISC本质上到了最后也是要进行硬件解码的,不过再说就超出本文范围了。
这次的Parwan处理器架构就是介于计算机科学和电子工程之间的东西,简单(相比于真正的现代处理器来说,这玩意只是60年前水平的玩具),但体现了很多思想。不过我们不能一一去了解了,这篇文章从较为顶层的层面去讨论整个Parwan架构,读完后有兴趣的甚至可以自己用点元件组一个。
正文:
1.Parwan处理器架构是什么?
Parwan处理器是一种简易冯诺依曼式RISC处理器架构,最初是国外某校大四学生的课程设计。
Parwan本意为“帕尔旺省”,又作Panvan,是阿富汗中部的一个省份。
2.Parwan处理器架构的基本概况
Parwan处理器中,用户可完全控制的寄存器只有一个,就是AC(累加寄存器),除此之外,用户需要存储的数据均必须放置于内存中。
Parwan处理器字长为8位,也就意味着AC的容量仅有8BIT,数据总线的宽度也只有8BIT,但是,由于其特殊的设计,地址总线可以达到12BIT,也就是说,Parwan处理器最多能支持4KByte的内存容量。
Parwan处理器的指令寻址方式支持直接寻址(Directled Addressing)和间接寻址(Indirected Addressing),具体细节将在后文详述。
Parwan处理器的指令分为单字节指令和双字节指令,可以大致分为17条,不过由于寻址方式的不同,部分指令还可以细分,对于处理器的控制部分和指令译码来说,共有23种指令。
由于地址为12位但是字长只有8位,Parwan处理器在设计时针对部分指令的寻址范围进行了约束,branch等分支指令,或者jsr等子程序进入指令,其寻址范围限制在256Byte内。关于Parwan的内存管理机制将在后文详述。
3.Parwan处理器架构的内存管理
如上文所述,Parwan处理器地址总线宽度为12BIT,这也就意味着在进行寻址时,只靠一个字节是无法进行准确定位的。为此,Parwan处理器采用了分页式的内存管理机制。
Parwan处理器最多支持4Kbyte的内存,这4Kbyte内存被分为16个256Byte的页(Page)。
对于一个内存单元的准确描述,需要4位的页号和8位的偏移地址(Offset)。
对于寻址范围有限制的指令,如各类branch分支指令,jsr子程序进入指令等,其寻址方式为直接将第二个字节的8位解释为偏移地址,而页号则使用该条指令第二个字节在内存中位于的页号,即直接从PC中取来页号。这样就能拼凑为12位地址,从而定位内存单元。
以上只能进行页内寻址的寻址方式被称作Page Address。
而对于必须进行精确定位的指令,如jmp直接跳转指令和STA,LDA等指令,这些指令的第一个字节的低4位也被用来编码内存地址,此时,指令第一个字节的低4位作为页号,第二个字节8位作为偏移地址,共同进行寻址。
这些需要精确定位的指令,通常也支持间接寻址,对于间接寻址,指令第一个字节的低4位作为页号,第二个字节8位作为偏移地址,组成12位全地址,用这12位地址找到某内存单元,再用这内存单元内的8位数据作为偏移地址,和之前的页号一起,找到真正要寻找的内存单元。可见,间接寻址的地址存放单元和数据存放单元必须在同一页面内。
以上需要第一字节和第二字节共同拼凑作为作为地址的寻址方式称作Full Address。
4.Parwan处理器架构的指令集
Parwan处理器架构采用自创的指令集,如上文所述,共有23条指令,不过对于顶层用户,只需要理解为17种指令。
指令如下:
其中[loc]表示以直接/间接寻址的方式得到loc地址存储内容
对于以上指令,其二进制编码如下:
注:BIT4位在支持间接寻址的指令内,’1’代表间接寻址,’0’代表直接寻址,其余指令无此意义。
如上文内存管理部分所述,这些指令的寻址方式存在区别:部分指令的寻址方式仅局限于页内,部分指令的第一个字节的低4位也被用来编码地址。这些都是在汇编器设计中需要注意的。
对于以上指令的执行过程,顶层开发者可以不详细了解,但是jsr指令的设计是和Parwan处理器架构支持的子程序结构密切相关得,再次说明如下:
由于Parwan处理器架构不支持cpu层面的堆栈处理,所以在进入子程序时必须保存返回地址。
Parwan处理器架构支持的子程序格式必须如下:
jsr指令的第二字节为需要进入的子程序的第一字节。
在执行jsr指令时,会首先将当前PC的值写入子程序的第一字节(此时PC的值就是jsr后下一条指令的地址)
然后将<