当前位置: 首页 > news >正文

跟着我从零开始入门FPGA(一周入门系列)第七天

7、设计一个只有4条指令的CPU


我们要设计一个简单的CPU

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

为了实例的简单,我们选择设计一个8bit的MCU的内核
仍然我们要简单,所以选择RISC的内核,类似PIC的结构
还是为了要简化,我们只支持4条指令
继续为了要简化,我们不考虑Status寄存器

有人会问,只有4条指令,你还加减法都有,有一个不就可以了。
这也是我有意的,你想,假设ALU只能做加法,你不觉得ALU这个名称太不名副其实了吗。

mov  A,#35H 把立即数mov到A寄存器
add  A,#42H (A) + 12 -> A
sub  A,#62H (A) - 12 -> A
JMP  imd    跳转到某地址


我们先给他们做机器编码,我们用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(一周入门系列)第七天

7、设计一个只有4条指令的CPU我们要设计一个简单的CPU既然做CPU&#xff0c;我们要做流水线的&#xff0c;要简单&#xff0c;做2级流水线就够了。为了实例的简单&#xff0c;我们选择设计一个8bit的MCU的内核仍然我们要简单&#xff0c;所以选择RISC的内核&#xff0c;类似PIC…...

Synopsys Sentaurus TCAD系列教程之--Sde概述

Sde 方便处理rule check相关的问题。同时也能让使用者进一步了解器件结构、掺杂和引线等基本操作。Sde用于搭建结构&#xff0c;重新优化网格&#xff0c;提供.mesh文件供后面Sdevice仿真&#xff0c;主要包含以下几部分&#xff1a; 第一部分&#xff1a; Scheme BasicsDefi…...

计算结构体大小

计算结构体大小 目录计算结构体大小一. 结构体内存对齐1. 简介2. 嵌套结构体二. offsetof三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节&#xff08;bety&#xff09;为单位 1. 简介 对于结构体成员在内存里的存储&#xff0c;存在结构体的对齐规则&#…...

第二十一篇 数据增强

文章目录 摘要1、数据增强的作用2、常用的图像增强方法2.1、一些辅助函数ToTensorToPILImageNormalizeResize2.2、中心裁剪2.3、亮度、对比度和颜色的变化2.4、随机裁剪2.5、随机灰度与灰度2.6、水平/竖直翻转2.6.1、水平翻转2.6.2、垂直旋转2.7、随机角度旋转2.8、随机仿射变换…...

记一次线上es慢查询导致的服务不可用

现象 某日线上业务同学反馈订单列表查询页面一直loding&#xff0c;然后提示请求超时&#xff0c;几分钟之后恢复正常 接到报障之后&#xff0c;马上根据接口URL&#xff0c;定位到了请求链路&#xff0c;发现是es查询超时&#xff0c;这里我们的业务订单表数据是由几百万的&a…...

分布式之ZAB协议

写在前面 假定我们现在使用zk执行了如下的指令&#xff1a; [zk: 192.168.0.10:2181(CONNECTED) 0] create /dongshidaddy 123 Created /dongshidaddy [zk: 192.168.0.10:2181(CONNECTED) 1] create /dongshidaddy/mongo 456 Created /dongshidaddy/mongo假定因为节点故障最终…...

MySQL binlog常用命令及设置清理时间

MySQL binlog常用命令及设置清理时间1 binlog 基本概念2 binlog常用命令3 清理MySQL的binlog日志3.1 自动清理3.2 手动清理文章参考&#xff1a; http://www.360doc.com/content/22/0418/08/65840191_1027038859.shtml https://www.cnblogs.com/kiko2014551511/p/11532426.html…...

Windows下载安装Prometheus

目录 资料 下载 解压 点击prometheus.exe运行 资料 Prometheus是一个开源的系统监控和报警系统&#xff0c;同时也支持多种exporter采集数据&#xff0c;还支持pushgateway进行数据上报&#xff0c;Prometheus性能足够支撑上万台规模的集群。 官网&#xff1a;https://pr…...

0-1背包、完全背包及其变形【零神基础精讲】

来源0x3f&#xff1a;https://space.bilibili.com/206214 三叶姐的对背包问题的总结&#xff1a;【宫水三叶】详解完全背包一维空间优化推导&#xff08;附背包问题攻略&#xff09;https://leetcode.cn/circle/discuss/GWpXCM/ 文章目录0-1背包、完全背包及其拓展&#xff08;…...

OpenStack

OpenStack优势&#xff1a; 1、模块松耦合。 2、组件配置较为灵活。 3、二次开发容易 OpenStack共享服务组件&#xff1a; 1、数据库服务&#xff1a;MongoDB 2、消息列队&#xff1a;RabbitMQ 3、缓存&#xff1a;Redis 4、存储&#xff1a;Ceph 5、负载均衡&#xff…...

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha&#xff0c;创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口&#xff0c;在接口中使用 kaptcha 工具类来生成验证码图片&#xff08;验证码信息&#xff09;并返回3 登录时从sess…...

【2023】某python语言程序设计跟学第一周内容

本文说明&#xff1a; 案例内容为北理工python语言程序设计课程&#xff0c;如有不妥请联系&#xff01; 目录温度转换案例&#xff1a;执行结果&#xff1a;代码解析&#xff1a;白话说明&#xff1a;举一反三&#xff1a;根据输入半径求圆周长或面积执行结果&#xff1a;温度…...

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难&#xff0c;努力地进行深度钻研&#xff0c;生产内容&#xff1b;而大多数信息受众始终在享受轻度学习&#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地&#xff0c;那就应该尽早抛弃轻松学习的幻想&#xff0c;锤炼深度学习…...

“ChatGPT之父”Sam Altman:我是如何成功的?

背靠微软&#xff0c;OpenAI能拳打谷歌&#xff0c;脚踢Meta&#xff0c;它背后的男人&#xff0c;必然不简单。 让我们来看一看&#xff0c;Sam Altman是如何一步步成长为今天这个搅动全世界的男人。 山姆奥特曼&#xff08;Sam Altman&#xff09; 成长和创业经历 在YC创始…...

jQuery发送Ajax请求的几种方式

概述JQuery发送ajax请求的方法有很多&#xff0c;其中最基本的方法是$.ajax&#xff0c;在其中封装的方法有 $.get, $post等。我们分别举了不同的示例。数据格式首先&#xff0c;浏览器与服务器之间传输数据所采用的格式&#xff0c;比较常见的有json&#xff0c;jsonp&#xf…...

Android实现连线题效果

效果图全部正确&#xff1a;有对有错&#xff1a;结果展示&#xff0c;纯黑色&#xff1a;支持图片&#xff1a;实现思路仔细分析可以发现&#xff0c;连线题的布局可以分为两部分&#xff0c;一个是左右两列矩形&#xff0c;另一个是他们之间的连线。每个矩形的宽高都一样&…...

以数据 见未来!首届未来数商大会成功举办

2月25日&#xff0c;2023未来数商大会在杭州未来科技城学术交流中心举办。大会发布了数商产业趋势研究报告&#xff0c;首次提出并探讨了完整的数商产业概念&#xff0c;并成立了未来数商联盟&#xff0c;开通了浙江大数据交易服务平台余杭专区。会上&#xff0c;杭州未来科技城…...

Java数据结构与算法——手撕LRULFU算法

LRU算法 力扣146&#xff1a;https://leetcode-cn.com/problems/lru-cache/ 讲解视频&#xff1a;https://www.bilibili.com/video/BV1Hy4y1B78T?p65&vd_source6f347f8ae76e7f507cf6d661537966e8 LRU是Least Recently Used的缩写&#xff0c;是一种常用的页面置换算法&…...

20230227英语学习

Can Clay Capture Carbon Dioxide? 低碳新思路&#xff1a;粘土也能吸收二氧化碳&#xff01; The atmospheric level of carbon dioxide — a gas that is great at trapping heat, contributing to climate change — is almost double what it was prior to the Industria…...

校招前端高频react面试题合集

了解redux吗&#xff1f; redux 是一个应用数据流框架&#xff0c;主要解决了组件之间状态共享问题&#xff0c;原理是集中式管理&#xff0c;主要有三个核心方法&#xff1a;action store reduce 工作流程 view 调用store的dispatch 接受action传入的store&#xff0c;reduce…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...