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

简易CPU设计入门:译码模块(一)

项目代码下载

还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。

下载本项目代码

准备好了项目源代码以后,我们接着去讲解。

本节前言

有一段时间没写本专栏的教程了。在之前的章节里,我是讲解了系统初始化模块和取指令模块。取完了指令以后,我们来讲解译码模块。

一.   代码展示

首先呢,让我们来看一看译码模块的全部代码。

module decode_unit
(input wire sys_clk,input wire sys_rst_n,input wire decode_en,input wire [15:0] instruct_word,output reg decode_done,output reg [4:0] op_code,output reg [2:0] reserve_bit,output reg [7:0] op_rand
);always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)begindecode_done <= 1'b0;op_code <= 5'h0;reserve_bit <= 3'h0;op_rand <= 8'h0;endelse if (decode_en == 1'b1)begindecode_done <= 1'b1;op_code <= instruct_word[15:11];reserve_bit <= 3'h0;op_rand <= instruct_word[7:0];endelsebegindecode_done <= 1'b0;op_code <= op_code;reserve_bit <= reserve_bit;op_rand <= op_rand;endendmodule

不知道,是否因为,我学习电子学的Verilog HDL与数字电路的时间太短。我写完了译码模块以后,我自己都没想到,没想到译码单元竟然是这么少。译码模块,就是传说中的译码器。

在我这里,译码器模块,只有37行。

上面的代码块中的代码,位于【\cpu_me01\code】路径里面,代码文件的名字为【decode_unit.v】。

二.   输入信号

我们来看一看代码中的输入信号。

图1

图1中的3到6行,便是输入信号了。第3行与第4行,这俩是系统时钟与系统复位信号。其中,系统复位信号为低电平有效。值得关注的是第5行和第6行的译码使能信号【decode_en】与指令字信号【instruct_word】。

首先,我来说一说【字】的概念。在英特尔汇编里面,字可以指一种数据类型,它是16比特长度的整数,也就是相当于C语言中的【unsigned short】。而在学习一些个计算机技术领域的英文文档时,字往往是指连续多个比特组成的数据结构,它可能是一个字节的长度,也有可能是多个字节的长度。

在计算机技术里面,谈到字,首先它是有着一定的长度的,由连续的比特构成。第二,比特组合里面,它有着一定的格式。不同的位,或者不同的位的组合,会代表着不同的含义。

本节所述的指令字【instruct_word】,它是16位的长度,和汇编语言中的字型数据的长度相同。在这个16位的长度的比特组合里面,它包含有3个组成部分,分别是操作码,操作数和保留位。至于说,是怎么包含的,我们以后再讲。

译码使能信号【decode_en】和指令字信号【instruct_word】均来自于取指令模块的输出信号。我们来看一看它们的生成于连接情况。

图2,取指令模块

本模块中的译码信号【decode_en】和指令字信号【instruct_word】分别对应着取指令模块中的译码使能信号【decode_en】和指令码【instruct_code】信号。

从图2可以看出,当取指令模块检测到【rd_en_d1】为1的时候,取指令模块中的【decode_en】变为高电平,同时【instruct_code】信号被赋值为有效的值。还可以看到,取指令模块中的【decode_en】信号和【instruct_code】信号同时变为有效,并且译码使能信号【decode_en】仅仅维持一个时钟周期。

图2显示了取指令模块的【decode_en】和【instruct_code】信号的生成情况。接下来,我们去本项目的顶层模块【cpu_top】中查看一下连接情况。

图3,本项目顶层设计模块【cpu_top】

在图3里面,我们可以看到,我在顶层模块里面申请的几个用于连接不同模块的变量。其中呢,红色框线所示的第13行和第14行,显示了我所声明的译码使能【decode_en】信号和指令字信号【instruct_word】。

我们接着看。

图4,本项目顶层设计模块【cpu_top】

图4中,我们可以看到,取指令模块的【decode_en】和【instruct_code】信号,分别连接到顶层模块的【decode_en】和【instruct_word】变量。

我们接着看。

图5,本项目顶层设计模块【cpu_top】

如图5的红色框线所示,顶层模块中的【decode_en】与【instruct_word】分别连接到本模块的同名信号。

这样一来,我们就清楚了本模块的输入信号【decode_en】与【instruct_word】的来源了。

三.    输出信号

讲完了输入信号以后,我们再来讲解输出信号。

图1,副本

在图1副本中,我们去看8到11行的代码。这里呢,包括两部分,第一部分呢,是译码完成信号【decode_done】,第二部分,是对输入的指令字的分解出来的各部分信号,分别是操作码【op_code】,操作数【op_rand】,还有保留位。

我们还是来看一下代码。

图6,本模块的输出信号的逻辑代码

在图6中,主要是输出信号的逻辑。我们首先来看译码完成信号【decode_done】。它的逻辑,根据图6的代码,我们可以看到,当系统复位信号为低电平有效时,它是0值。当系统监测到输入信号译码使能【decode_en】为1时,译码使能信号【decode_done】被非阻塞赋值为1。然后呢,在else分支里面,【decode_done】又变为了0值。输入信号中的译码使能信号【decode_en】仅仅是维持一个时钟周期的高电平,所以呢,本模块中的【decode_done】信号也是仅仅维持着一个时钟的高电平。

也就是说,本模块的输出信号,译码完成信号【decode_done】,也是仅仅维持一个时钟周期的高电平。仅当检测到输入信号,译码使能信号【decode_en】为1时,译码完成信号【decode_done】才变为1,且仅仅维持一个时钟周期的高电平,随即又变为0值。

说完了这个译码完成信号以后,我们再来说其余的三个输出信号。

在输入信号里面,指令字信号【instruct_word】是一个16比特的信号。对于这个信号,本模块,也就是译码模块,需要将其分为三个部分。第一部分,是它的位15到位11,这一部分,我们要将其提取出来,并赋给输出信号,操作码【op_code】。第二部分,是位10到位8,我们忽略这三位的信号值,并固定地,将【3'h0】赋给输出信号,保留位【reserve_bit】。第三部分,是位7到位0,我们要将其提取出来,并赋给输出信号,操作数【op_rand】。

我们来看一看图6中,关于【op_code】,【reserve_bit】与【op_rand】的情形,基本上与我的讲述是一致的。。

操作码【op_code】,保留位【reserve_bit】和操作数【op_rand】,在系统复位信号为有效的低电平时,均为0值。而在检测到高电平有效的译码使能信号【decode_en】以后,将输入的指令字信号【instruct_word】的位选 [15:11] 赋给了【op_code】,将保留位 【reserve_bit】设置为固定的【3'h0】,将【instruct_word】的位选 [7:0] 赋给了【op_rand】。当仅仅维持一个有效的高电平信号,译码使能信号变为低电平时,操作码【op_code】,保留位【reserve_bit】和操作数【op_rand】维持不变。

 四.    本模块总体逻辑

本模块的总体逻辑其实很简单。就是将输入信号【instruct_word】的位选 [15:11] 与位选 [7:0] 提取出来,并分别赋给操作码信号【op_code】和操作数信号【op_rand】。而对于保留位,则固定地将其设置为【3'h0】。

本模块的逻辑还是很简单的。

结束语

到了这里,本节也就该结束了。然后呢,按照以往的经验,我们又该去编写验证代码了。这一块,我觉得,其实写不写验证都是那么回事。因为本模块的逻辑真的很简单。

对于本模块,我就不去写test bench代码了。

验证代码虽然不写了,我们还是会有其他的任务。

到了这里,由于取指令和译码模块,我都讲完了,我也讲过了本项目的机器码格式,那么,接下来,我打算来讲一讲,我在本系统里面,往指令ram中写入了哪些指令。

下一节开始,我们要来看一看,本系统所要执行的几条机器指令。当然了,在后面,我也会讲到,如何来将你想要去执行的指令,写入指令ram中。

本节结束。

相关文章:

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…...

力扣题目解析--三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示…...

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…...

linux shell脚本学习(1):shell脚本基本概念与操作

1.什么是shell脚本 linux系统中&#xff0c;shell脚本或称之为bash shell程序&#xff0c;通常是由vim编辑&#xff0c;由linux命令、bash shell指令、逻辑控制语句、注释信息组成的可执行文件 *linux中常以.sh后缀作为shell脚本的后缀。linux系统中文件乃至脚本的后缀并没有…...

Savitzky-Golay(SG)滤波器

Savitzky-Golay&#xff08;SG&#xff09;滤波器是一种在时域内基于局域多项式最小二乘法拟合的滤波方法&#xff0c;它最初由Savitzky A和Golay M于1964年提出&#xff0c;并广泛应用于数据流平滑除噪。 基本介绍 一、基本原理 SG滤波器通过在滑动窗口内拟合多项式来平滑数…...

Webserver(2.7)共享内存

目录 共享内存共享内存实现进程通信 共享内存 共享内存比内存映射效率更高&#xff0c;因为内存映射关联了一个文件 共享内存实现进程通信 write.c #include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h>int main(){…...

【网安案例学习】凭证填充Credential Stuffing

### 凭证填充的深入讨论 凭证填充&#xff08;Credential Stuffing&#xff09;是一种网络攻击技术&#xff0c;攻击者利用从数据泄露中获取的大量用户名和密码组合&#xff0c;尝试在其他网站和服务上进行自动化登录。这种攻击依赖于用户在多个网站上重复使用相同密码的习惯。…...

网站建设公司怎么选?网站制作公司怎么选才不会出错?

寻找适合靠谱的网站设计公司&#xff0c;不要盲目选广告推最多的几家&#xff0c;毕竟要实现自身品牌营销&#xff0c;还是需要多方面考量。以下几个方面可以作为选择的参考&#xff1a; 1. 专业能力如何&#xff1f; 一个公司的专业能力&#xff0c;决定了最后网站设计的成果…...

19. 架构重要需求

文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求&#xff08;ASRs&#xff09;不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…...

iOS 再谈KVC、 KVO

故事背景&#xff1a;大厂面试&#xff0c;又问道了基本的kvc kvo的原理和使用&#xff0c;由于转了前端&#xff0c;除了个setter和getter&#xff0c;我全忘记了&#xff0c;其实还是没有理解记忆&#xff0c;下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…...

java、excel表格合并、指定单元格查找、合并文件夹

#创作灵感# 公司需求 记录工作内容 后端&#xff1a;JAVA、Solon、easyExcel、FastJson2 前端&#xff1a;vue2.js、js、HTML 模式1&#xff1a;合并文件夹 * 现有很多文件夹 想合并全部全部的文件夹的文件到一个文件夹内 * 每个部门发布的表格 合并全部的表格为方便操作 模…...

最基础版编译运行Java(纯小白)

流程图&#xff1a; ⚠ 需要先安装JDK (Java Development Kit) 1. 写文件 首先写好自己的“文件”&#xff0c;可以用Sublime Text等文本编辑器写&#xff0c;还可以直接新建文本文档写一个.txt文件。 以编写一个HelloWorld程序为例&#xff1a; public class HelloWorld{p…...

六西格玛项目助力,手术机器人零部件国产化稳中求胜——张驰咨询

项目背景 XR-1000型腔镜手术机器人是某头部手术机器人企业推出的高端手术设备&#xff0c;专注于微创手术领域&#xff0c;具有高度的精确性和稳定性。而XR-1000型机器人使用的部分核心零部件长期依赖进口&#xff0c;特别是高精度电机、关节执行机构和视觉系统等&#xff0c;…...

Python爬虫系列(一)

目录 一、urllib 1.1 初体验 1.2 使用urllib下载网页、图片、视频等 1.3 反爬介绍 1.4 请求对象定制 1.5 get请求的quote方法 1.6 多个参数转成ascii编码 1.7 post请求 1.8 综合案例演示 一、urllib 1.1 初体验 # urllib是python默认带的&#xff0c;无需额外下载 i…...

# vim那些事...... vim删除文件全部内容

vim那些事… vim删除文件全部内容 1、在 Vim 中删除整个文件的内容&#xff0c;可以使用以下命令&#xff1a; 1&#xff09;打开 Vim&#xff0c;并编辑你想要清空的文件。 2&#xff09;按 Esc 确保你不在插入模式&#xff0c;而在命令模式。 3&#xff09;输入 gg 跳转到…...

Selinux及防火墙

一&#xff0c;selinux简介&#xff1a; SELinux&#xff08;Security-Enhanced Linux&#xff09;是一个Linux内核安全模块&#xff0c;旨在提供强制访问控制&#xff08;MAC&#xff09;机制&#xff0c;以增强系统的安全性。由美国国家安全局&#xff08;NSA&#xff09;开…...

业绩代码查询实战——php

一、一级代码显示职员 foreach($data_职员信息 as $key > $value){//$where_查询分类$where_查询通用;//$dat分类one $业绩提成->where($where_查询分类)->order("CreateDate desc")->select();if($value[haschildname]0 && $value[key] !"…...

内网穿透技术选型PPTP(点对点隧道协议)和 FRP(Fast Reverse Proxy)

PPTP&#xff08;点对点隧道协议&#xff09;和 FRP&#xff08;Fast Reverse Proxy&#xff09;是两种实现内网穿透的技术&#xff0c;但它们的工作原理、使用场景和特点有很大区别。以下是它们的详细比较&#xff1a; PPTP&#xff08;Point-to-Point Tunneling Protocol&am…...

信号与噪声分析——第三节:随机过程的统计特征

随机过程的定义&#xff1a; 随机过程是一种数学模型&#xff0c;用来描述系统或现象在时间或者空间上随之变化的不确定性。 一个随机过程的数字特征 1.数学期望&#xff08;统计平均值&#xff09;&#xff1a; 表示为 数学期望是随机过程在时间 t 上的平均值&#xff0c;通常…...

nginx(四):如何在 Nginx 中配置以保留真实 IP 地址

如何在 Nginx 中配置以保留真实 IP 地址 1、概述2、nginx配置示例2.1、配置说明2.2、客户端获取真实IP2.2.1、代码说明 3、插曲4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、概述 当使用nginx作为…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...