导读:目前正在解读《跟着我从零开始入门FPGA之(设计一个只有4条指令的CPU)》的相关信息,《跟着我从零开始入门FPGA之(设计一个只有4条指令的CPU)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《跟着我从零开始入门FPGA之(设计一个只有4条指令的CPU)》的详细说明。
简介:简述设计一个只有4条指令的CPU

我们要设计一个简单的CPU

既然做CPU,我们要做流水线的,要简单,做2级流水线就够了。

为了实例的简单,我们选择设计一个8bit的MCU的内核

仍然我们要简单,所以选择RISC的内核,类似PIC的结构还是为了要简化,我们只支持4条指令

继续为了要简化,我们不考虑Status寄存器

有人会问,只有4条指令,你还加减法都有,有一个不就可以了。

这也是我有意的,你想,假设ALU只能做加法,你不觉得ALU这个名称太不名副其实了吗。

movA,#35H 把立即数mov到A寄存器

addA,#42H (A) + 12 -> A

subA,#62H (A) - 12 -> A

JMPimd

跳转到某地址

我们先给他们做机器编码,我们用16bit宽度的指令集编码

0x0035 00是MOV的OP code

0x0142 01是ADD的OP Code

0x0265 02是SUB的OP code

0x8000 80是JMP的OP CODE

我们继续看,指令集,用Verilog的方式来描述

16'b0000_0000_????_???? MOV

16'b0000_0001_????_???? ADD

16'b0000_0010_????_???? SUB

16'b1???_????_????_???? JMP

我们可以看到JMP的跳转地址范围是15个bit地址,也就是32K地址范围

有人说ALU很重要,好,我们就先来看ALU的组成,因为只有加减2种情况,所有ALU的OP代码只用1个bit表示

op为1的时候,做加法,为0的时候做减法。

module alu(input op, input[7:0] in1, input[7:0] in2, output[7:0] out)

assign out = op ? (in1+in2) : (in1-in2);

看到上面的代码,估计不少人大跌眼镜,莫非传说中的alu就这么简陋。

没错,如果你只要做加法和减法,而且不考虑进位和溢出的ALU,就是这么easy的。

好了,cpu的运转过程,包括加载指令,解码指令,执行指令,大家都知道。

我们还要使用流水线技术,虽然这里不用也许更简单,但我们的目标是学习。

一| 加载指令1 | 加载指令2 | 加载指令3 | ..........----------+---------------+----------------+----------------+-----------------

二| | 解码1 执行1| 解码2 执行2| 解码3 执行3

我们可以看到加载和解码和执行,并没有在一个周期中完成,而是分开了在运行第二条指令的时候,CPU正在加载第三条指令,一心二用,事事不耽搁。

clkcnt;

always @(posdge clk)

if(nCS)

clkcnt <= 0;

instr <= 0;

else

instr <= rom_dat_out;

下面是CPU的解码和执行过程

always @(posdge clk)

if(!nCS)

casex(instr)

16'b0000_0000_????_????: //MOV

begin

acc <= instr[7:0];

pc <= pc + 16'h0001;

end

16'b0000_0001_????_????: //ADD

begin

acc <= aluout;

pc <= pc + 16'h0001;

end

16'b0000_0010_????_????: //SUB

begin

acc <= aluout;

pc <= pc + 16'h0001;

end

16'b1???_????_????_????: //JMP

begin

pc <= instr[14:0];

pc <= pc + 16'h0001;

end

下面完成CPU核心和ALU之间的连线

assign aluop= (instr[15:8]==8'h01);

assign aluin1 = acc;

assign aluin2 = instr[7:0];

alu alu1(aluop, aluin1, aluin2, aluout);

有人说,只看到执行指令,没看到解码指令的过程,有木有啊?当然有

16'b0000_0000_????_???? MOV

16'b0000_0001_????_???? ADD

16'b0000_0010_????_???? SUB

16'b1???_????_????_???? JMP

这几个逐个的case不就是在做解码?只是没有独立的解码步骤而已,因为太简单了嘛。

还有个地方,我故意做了遗漏,就是JMP指令的处理。

所谓流水线,就是取指和执行是同时的,但JMP的到来,带来了异常。

正常都是PC加一,所以取指其实一直在取下一条指令,而JMP的目标是不确定的,所以取的指令就不对了我们一般称之为预测失败,然后继续取JMP目标地址的指令,但执行部分,会有一个空的指令周期。

从CPU的用户角度看,就是JMP指令要使用2个指令周期。CPU的设计基本到此结束了。

关于FPGA,我也没有能力做太深入的讲解了,否则误人子弟,岂不是背离了我的目标。

提醒:《跟着我从零开始入门FPGA之(设计一个只有4条指令的CPU)》最后刷新时间 2024-03-14 01:11:12,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《跟着我从零开始入门FPGA之(设计一个只有4条指令的CPU)》该内容的真实性请自行鉴别。