全文 移位指令有4条, 同8085A。增量与减量指令有4条, 只针对H、L寄存器。堆栈操作及中断指令有8条: 7 状态的pushh( HL 压入堆栈)、pushp( AF压入堆栈); 6状态的poph、popp; 8状态的rsta(重新启动); 3状态的etim e( T 寄存器使能, 此指令为新增)、eint(中断使能)、d int等。转移指令有5条: 7状态的jmpn(无条件转移至程序nn, 低位在前); 不跳转时5状态, 跳转时7状态的jnn( Z= 1时转移至程序nn)、jcn、jmn、jpen等。子程序调用及返回指令有2条: 11状态的calln (保留当前PC, 转移至程序nn, 低位在前)、7状态的ret(返回)。其它指令有4条: 3状态的nop、c lRF(标志寄存器清零, 此指令为新增)、clrA (A 清零, 此指令为新增)、hlt等。
状态数的计算, 若本次指令的前面一指令为3状态数时, 本指令将会减少1 状态。如: movha,adin; 若第1指令movha前没有其它3 状态指令时,它是3个状态, 而adin会减少1状态, 由原来的4状态变为3状态。再如: mov la, movha; 则后一状态由3状态变成2状态。其余类似(但不包括rsta)。
2. 2. 3 工作原理
由图1可知, 不同的子模块一共有20个, 每个模块用VHDL程序来实现, 最后用元件例化语句构成总模块。下面以设计算术逻辑部件模块c_alu及控制模块c_con为例简要介绍一下思路。
( 1)算术逻辑部件c_alu。
算术逻辑部件c_a lu非常占用FPGA的逻辑单元log ic cells, 需要尽量优化。S3- S0为控制ALU 进行加减、逻辑或移位运算的选择信号, 一共可得到16种运算, 这里用了13种: 6种算术、3种逻辑运算和4种移位指令。如加法、减法、加1、减1、带符号位加法、带符号位减法; A 或B、A 与B、A 异或B; A 左移、A右移、A 带Cy 左移、A 带Cy右移等。另外, ALU 的运算直接影响到符号位的变化, 运算结果存入标志寄存器( FR)。有关alu的运算多为4个状态。
( 2)控制模块c_con。
占用FPGA 的逻辑单元log ic ce lls最多的是控制模块c_con。在参考文献[ 3] 中的思路不再适合于稍大型的CPU 设计, 但它是理解如何控制CPU 信号的一个起点。对于一条指令应该细化到每一个步骤及每一位, 而不再是以一个控制字的方式去实现。以指令movah为例, 首先把PC 值送入MAR 寄存器, 此为状态s0, 这时起作用的是Lmar; 然后在状态s1时, PC值加1, 将存储器单元中的内容读入到IR, 这时Cpc、E ram、Lir起作用, Lmar不再起作用, 需要置0; 接着在状态s2时, 对IR 寄存器中的指令进行译码, 所有的操作指令都是在此状态译码(不包括rsta)。对于3状态指令, 不保存指令, 直接执行, 然后跳转到状态s1。因此对于下一条指令来说, 其状态数减1。
指令中状态数最多的是子程序调用ca lln指令。
C alln指令要保存PC 值到SP- 1及SP- 2中, 然后跳转到子程序。考虑到返回指令ret执行后, PC 要重新在原位置执行, 那么存入SP中的PC 值应该是在得到其指令后加3。对PC 进行单独加3是一种思路, 但需要另外耗费资源, 并且增加状态。这里采用了先把ca lln后的nn存入16位的加1 /减1 地址锁存器, 然后保存PC 到SP, 再将nn 赋值给PC, 跳转到子程序的方法。返回指令ret不仅可以用作子程序调用后的返回, 还可用于中断的返回。
2. 3.. FPGA 实现及编程思路
由于使用内部RAM, 其地址空间为0000 -03FFH。通常在00H 中放入28 (即jmpn, 跳转指令) , 将程序跳转到从40H 开始。把03- 0EH 作为放常用变量的空间, 用inn及outn指令来调用, 以解决寄存器不足的缺陷。这也是一种编程思路, 可参见文献[ 4] 。0FH、1FH、2FH 分别为外部中断0( int0) , 外部中断1( int1), 定时器中断( time) 的起始位置。Int0优先级最高, int1次之, time最低。中断信号高电平有效。中断功能的实现是为了学习其工作原理, 只做了一个定时器中断。计时为减1方式, 当计时为0时, 发出中断信号。T ime中断的使用方法: 首先关中断( dint), 给T赋值(mv itn) , 再开中断( e int), T寄存器使能( et ime)。此后, T 寄存器正常工作。若要再次使用, 首先给T 赋值, 然后T寄存器使能。
初始时的PC 为0000H, SP为03FFH。SP的更改可通过指令sph l来执行。针对实验箱, 将8000-0FFFFH 作为输出口地址, 4000 - 7FFFH 作为输入口地址。而实际实验箱上只定义了1个8位输入, 1个8位输出。IO 口的操作可通过movam 及movma指令去实现。
由于键盘输入时, 要进行去抖动处理, 使用了两种不同的时钟频率。键盘处理采用1KH z的频率,而CPU 的工作时钟可选择实验箱上的不同频率, 从1H z到10MH z皆可, 甚至可以外接其它更高频率。
如果采用1H z的clk in 频率, 可以清楚地看到CPU工作的每一过程。
将本微机下载到实验箱上, 已成功实现了乘法(用减1或右移的方法), 调用子程序, IO 口的使用,中断的使用等多项实验, 验证了CPU 设计的正确性。
3 结束语
QuartusII对微机进行编译, 其逻辑单元LE 用到1151, 占100% 。用FPGA 来实现CPU 的功能, 研究其工作原理, 然后用Synp lify pro软件对其进行门级研究, 对CPU 的面纱将不再感到神秘, 有利于做成专用集成电路ASIC, 控制其规模, 节约芯片成本与面积。同时, 也会增加对FPGA 的学习兴趣和使用技巧, 开发出更多新的产品。