上周末写了系列的1-4篇, 看起来似乎目标已实现. 但我也是根据想象力 想到哪里写哪里, 上板能不能工作正常呢, 会不会崩了呢? 这周末就找了一个板子, 上板跑跑看.
我的板子是高云小蜜蜂系列, 大概是最便宜的FPGA开发板了. 编写和仿真继续用vivado吧, 前几篇也用的vivado, 用顺手了. 最后一步生成/下载bit文件转到高云的Gowin软件.
程序直接用机器码编程(有点酷?), 反正代码也很短. 还需要一个固化程序的ROM块. ROM一般要使用开发工具提供的IP例化功能, 但为了跟板子无关, 这里就用verilog描述一下.
ROM里面的代码就是计算从1加到10的, 计算结果应该是55 ('h37).
module rom(
input [7:0]addr,
output reg[15:0]op
);
always@(*)begin
case (addr)
0: op = 'h0800; //ldr r0,#0
1: op = 'h0901; //ldr r1,#1
2: op = 'h1001; //add r0,r1
3: op = 'h1901; //add r1,#1
4: op = 'h590b; //cmp r1,#11
5: op = 'h7f02; //bne #2
6: op = 'h0707; //mov r7,r7 // while(1);
default: op = 'h0707;
endcase
end
endmodule
CPU和3-8译码器的代码无需修改, 再做一个cpu_top顶层设计, 将ROM和CPU连接起来.
module cpu_top(
input clk,rst,
output [15:0]op,
output [7:0]R[8]
);
wire eq;
rom rom_inst1(
.addr(R[7]),
.op(op));
cpu cpu_inst1(
.clk(clk),
.rst(rst),
.op(op),
.eq(eq),
.R(R));
endmodule
看一下vivado生成的RTL图, 看到图就可以直观一点. 我也是每一步, 看到图才踏实.
这几条程序, 一眨眼就跑完了, 怎么看过程中对不对呢? 我想了一个办法, clk不接晶振上, 而是接到按键上, 按一下, 跑一条指令. 这样就有时间观察了. 想观察谁, 把它引到LED上, 直接看灯就观察到了.
下面转入高云IDE. 高云家的软件非常地袖珍. vivado2024最小安装就已经40G了. 高云的只有300M左右.
绑IO
高云下载界面
高云的软件最大的好处就是速度快, 综合/布线/下载, 都是秒完成. 而vivado每一步都非常慢.
下载完后, 测试一下, 按一下, 跑一条指令.
上面软件代码中可以看出, R0存的是累加和.
上面硬件代码中可以看出, 把R0引出来到LED上了. 便于观察.
测试时每一步累加, 拍了照片, 如下:
亮灯分别是: 01, 03, 06, 0a, 0f, 15, 1c, 24, 2d, 37
亮灯分别是:
0x01=1,
0x03=3,
0x06=6,
0x0a=10,
0x0f=15,
0x15=21,
0x1c=28,
0x24=36,
0x2d=45,
0x37=55,
验证完成, 是时候把clk交还给晶振了. 板上有27M晶振, 直接将clk连接到晶振上.
原理图上看, 有源晶振27M连接到FPGA的52脚
clk信号绑定到FPGA的52脚
连27M晶振, 一下子就跑完了, 结果是正确的.
收工了?
如果需要加入新指令, 只需要修改switch...case...块.
而其他部分无需更改: 因为寄存器数量没变, 所以从寄存器组取数的处理, 存入寄存器的处理, 3-8译码器都不用变. op格式没有改的话, 译码, 取立即数等也没变.
可以加入一些其他必要指令, 比如: 乘法, 左右移位, 非/异或 ... ...
case(op)
1: out1 = in1 + in2;
2: out1 = in1 - in2;
3: out1 = in1 & in2;
4: out1 = in1 | in2;
5: out1 = (in1 == in2);
//.... 这里添加新的指令.
default: out1 = 0;
endcase
--- --- ---
这个CPU我应该不会更了, 再加内容, 它就慢慢失去小巧的特性了, 主要也因为我毕竟不是这一行业的, 实在编不下去了:)
这个系列是抛砖引玉篇, 如果你刚学完数电, 或者正在学verilog, 或者做C编程 但对CPU是如何执行代码二进制 感到神秘, 希望该篇能为你揭开CPU的神秘面纱. 如果该文能对你有一丢丢的帮助, 或者让你对CPU设计有了兴趣也去设计了自己的CPU, 就算没有白写, 很满足了.
剧终。
--- -- ---
CPU不改了,但汇编器可以有:自己动手写CPU - 6-CSDN博客
标签:out1,clk,自己,---,动手,高云,CPU,op From: https://blog.csdn.net/weixin_46766770/article/details/145078234