好的网站特点,wordpress转换为中文,网站seo在线诊断,seo做得好的企业网站项目代码下载
还是请大家首先准备好本项目所用的源代码。如果已经下载了#xff0c;那就不用重复下载了。如果还没有下载#xff0c;那么#xff0c;请大家点击下方链接#xff0c;来了解下载本项目的CPU源代码的方法。
下载本项目代码
准备好了项目源代码以后#xff…项目代码下载
还是请大家首先准备好本项目所用的源代码。如果已经下载了那就不用重复下载了。如果还没有下载那么请大家点击下方链接来了解下载本项目的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 1b0)begindecode_done 1b0;op_code 5h0;reserve_bit 3h0;op_rand 8h0;endelse if (decode_en 1b1)begindecode_done 1b1;op_code instruct_word[15:11];reserve_bit 3h0;op_rand instruct_word[7:0];endelsebegindecode_done 1b0;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我们忽略这三位的信号值并固定地将【3h0】赋给输出信号保留位【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】设置为固定的【3h0】,将【instruct_word】的位选 [7:0] 赋给了【op_rand】。当仅仅维持一个有效的高电平信号译码使能信号变为低电平时操作码【op_code】保留位【reserve_bit】和操作数【op_rand】维持不变。 四. 本模块总体逻辑
本模块的总体逻辑其实很简单。就是将输入信号【instruct_word】的位选 [15:11] 与位选 [7:0] 提取出来并分别赋给操作码信号【op_code】和操作数信号【op_rand】。而对于保留位则固定地将其设置为【3h0】。
本模块的逻辑还是很简单的。 结束语
到了这里本节也就该结束了。然后呢按照以往的经验我们又该去编写验证代码了。这一块我觉得其实写不写验证都是那么回事。因为本模块的逻辑真的很简单。
对于本模块我就不去写test bench代码了。
验证代码虽然不写了我们还是会有其他的任务。
到了这里由于取指令和译码模块我都讲完了我也讲过了本项目的机器码格式那么接下来我打算来讲一讲我在本系统里面往指令ram中写入了哪些指令。
下一节开始我们要来看一看本系统所要执行的几条机器指令。当然了在后面我也会讲到如何来将你想要去执行的指令写入指令ram中。
本节结束。