首页 > 其他分享 >自己动手写CPU - 5

自己动手写CPU - 5

时间:2025-01-14 20:30:12浏览次数:3  
标签:out1 clk 自己 --- 动手 高云 CPU op

自己动手写CPU_qq85058522的博客-CSDN博客

上周末写了系列的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

相关文章

  • ESP-IDF esp32添加自己的组件
    esp32添加自己的组件:1.按键盘的F1,或者点击菜单view-CommandPalette都可以,选择EDP-IDF:CreaterNewESP-IDFComponent,输入组件名称(比如说esp_pwmout),确定2.看到已经新建了该组件,修改对应.h文件#ifndef__ESP_PWMOUT_H__#define__ESP_PWMOUT_H__voidsetup_pwm(void);......
  • 发布和更新自己的nuget包
    生成本地包文件.nupkg1.1.在vs2022中【工具】-【命令行】-【开发人员命令工具】打开命令行1.2.输入cd项目名,进入到要发布的项目中1.3.使用nugetpack命令即可生成一个扩展名为nupkg的包文件。比如:HZC.WinFormLib.1.0.0.nupkg发布到nuget(可以使用nuget.ory网站直接......
  • List.Insert 导致的 CPU 爆高
    我们经常会使用List<T>作为数据存储容器。但在某些特殊场景下,List.Insert方法可能会引发严重的性能问题,例如CPU占用率飙升。示例程序以下是一个简单的控制台程序,模拟在List的开头不断插入数据:internalclassProgram{staticvoidMain(string[]args){List......
  • 海康摄像头忘记密码,自己如何快速重置密码
    海康摄像头,自助重置密码。一、摄像头忘记密码情况在项目工程中,有各种各样的原因,导致摄像头密码忘记,有的时安装时安装工程商没有把密码留下来,有的是客户自己设置了密码后忘记了密码,还有的是客户买的新摄像头,有客户退货,然后你又拿到这样的货,导致密码错误。摄像头密码错误后,是无法......
  • 大语言模型入门指南:一篇掌握学习计划和路线,给自己三个月然后惊艳所有人
    课题介绍一、方向介绍在不到四年时间里,Transformer模型以其强大的性能迅速在NLP社区崭露头角,进而,基于Transformer这一标准架构的BERT、T5,乃至当下热门的GPT模型已经逐渐成为各个领域中的不可或缺的模型架构。深入理解Transformer模型背后的底层原理,以及Transformer相关的......
  • 【Azure App Service】对App Service中CPU指标数据中系统占用部分(System CPU)的解释
    问题描述在使用AzureAppService服务时,对于它的CPU占比,从AppServicePlan级别可以查看整个实例(vm)资源的CPU占比,而如果在具体的一个AppService服务中,则只能查看到当前应用所消耗的CPU时间,如果需要计算它的占比:需要使用公式【CPUTime/(CPU核数*60)】估算。CPUperc......
  • Prometheus 是一个开源的监控和报警工具,主要用于收集、存储和查询来自不同服务和应用
    Prometheus是什么?Prometheus是一个开源的监控和报警工具,主要用于收集、存储和查询来自不同服务和应用程序的时间序列数据(如CPU使用率、内存消耗、网络流量等)。它特别适合用于微服务架构下的监控,因为它支持多种集成方式,并能够处理大规模的、高频的数据。Prometheus具有以下主......
  • 自己动手写CPU - 6
    自己动手写CPU_qq85058522的博客-CSDN博客CPU不加功能了,但汇编器可以有。下面写一个把汇编(助记符)翻译成机器码的小工具。Python熟些,就用它了。很简单,就是字符串替换。直接上代码。importsysiflen(sys.argv)!=2:print("usage:pythonassemblerxxx.asm")exi......
  • WiFi+4G摄像头拍照图传模块(夜视2K高清1080P)-关于参考资料,程序移植,新建调用自己的
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 关于参考资料......
  • 终于决定:把自己家的能源管理系统开源了!
    决定了很久把自己公司的能管平台开源了,部分功能和bug正在修复中。欢迎star欢迎轻拍地址:https://gitee.com/ustcyc/zhitan-ems介绍通过物联网技术,采集企业水、电、气、热等能耗数据,帮企业建立能源管理体系,找到跑冒滴漏,从而为企业节能提供依据。进一步为企业实现碳跟踪、碳盘......