手把手教你编写一个超等简便的CPU
FPGA的处理才能固然强壮,但在举行步骤化的职责时,用形态机来完成偶尔就显得不如CPU写步骤那么简便。在FPGA内里也可以用逻辑来搭出简便的CPU,并固化一小段代码去完成特定的功效。思索下最简便的CPU是什么样子呢?
最少,必要有读取步骤(指令),并实行指令的历程。指令存放在一块内存中间,CPU每步取一条指令来实行,依据读出的指令内容,内里的形态产生变化——好比存放器按指令要求举行运算,好比拜候外部的端口(或总线)。指令是一个编码,形貌这一步必要做的事变;实行指令的历程就是形态转移的历程。我实行的这个超简便CPU是如此:
上图中,PC是Program Counter,就是步骤计数器,选择ROM中步骤实行的地点。opr用来存放如今的指令,它的内容从ROM中读到。存放器另有A存放器和R0~R7存放器,用来盘算和存放后果,别的另有一个1-bit的“零"标志位zflag,是给条件转移指令用的。固然,若只是内里的存放器变来变去,这个CPU就没有实用代价了,以是另有一个输入端口,以及一个输入端口,用来和存放器A互换数据。
计划指令字长为8-bit,存放器宽度也为8-bit。每条指令都是从ROM中读8-bit,可以最多有256种不同的指令,固然指令中能编码立刻数,以是指令不会有那么多种。我给这个CPU计划了14条指令:
跳转指令有2条,无条件转移和Z条件转移,转移范围为5-bit相对地点,即-16~ 15。
带立刻数指令有4条,由于指令才8-bit,立刻数只好分派4-bit了。装入A存放器的高4位或低4位,以及与A做加减法。
R0~R7存放器只能与A存放器举行copy和比力利用。
影响zflag标志的指令有位测试指令TESTB, 比力指令COMP和加减法指令。
指令空间并没有效完,可以依据必要再增补指令。
用Verilog言语来写这个CPU的形态转移局部:
module cpu0(clk, Iaddr, Ibus, PortI, PortO);
input clk;
output [9:0] Iaddr;
input [7:0] Ibus;
input [7:0] PortI;
output reg [7:0] PortO;
reg [9:0] pc;
reg [7:0] RA;
reg [7:0] Rn[0:7];
reg zflag;
assign Iaddr=pc;
reg [7:0] opr;
always @(posedge clk)
opr