简易CPU设计入门:取指令(一),端口列表与变量声明

取指令这一块呢,个人觉得,不太好讲。但是呢,不好讲,我也得讲啊。那就尽量地讲吧。如果讲得不好的话,那么,欢迎大家提出好的意见,帮助我改进讲课的质量。

首先呢,还是请大家去下载本专栏所需要用到的项目源代码。

点击下方链接,以学习下载项目源代码的方法。

下载本项目代码

然后呢,我们来看本节的内容。

我们本节和接下来的一些课节,应该都是去讲取指令的。取指令的部分,位于【\cpu_me01\code】路径里面的【get_instruct.v】代码文件中。

本节呢,我先把这一代码文件中的所有的代码,都给贴在下面的代码块中。大家先整体浏览一下就行。里面的内容呢,我会一点一点地去讲解的。

module get_instruct
(input wire sys_clk,input wire sys_rst_n,input wire get_inst_en,input wire [15:0] ip,output reg decode_en,output reg [15:0] instruct_code
);reg [15:0] ip_buf;
wire [15:0] instruct_code_wire;reg rd_en;
reg rd_en_d1;
reg rd_en_d2;always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)ip_buf <= 16'h0;else if (get_inst_en == 1'b1)ip_buf <= ip;elseip_buf <= ip_buf;always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)rd_en <= 1'b0;else if (get_inst_en == 1'b1)rd_en <= 1'b1;elserd_en <= 1'b0;always @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)beginrd_en_d1 <= 1'b0;rd_en_d2 <= 1'b0;endelsebeginrd_en_d1 <= rd_en;rd_en_d2 <= rd_en_d1;endalways @(posedge sys_clk or negedge sys_rst_n)if (sys_rst_n == 1'b0)begindecode_en <= 1'b0;instruct_code <= 16'h0;endelse if (rd_en_d1 == 1'b1)begindecode_en <= 1'b1;instruct_code <= instruct_code_wire;endelsebegindecode_en <= 1'b0;instruct_code <= instruct_code;endram_disk_256x16	ram_disk_inst (.aclr ( ~sys_rst_n ),.address ( ip_buf ),.clock ( sys_clk ),.data ( 16'hz ),.rden ( rd_en ),.wren ( 1'b0 ),.q ( instruct_code_wire ));endmodule

代码文件中的代码内容,我已经贴出来了。接下来呢,我就一点一点地来讲解了。

首先呢,我们来看看这个端口列表,以及变量的声明部分。

图1

代码的第1行写了模块的名字,其实就是和文件名一样的东西。只不过,文件名有那个扩展名【.v】,而这个模块名呢,没有扩展名的部分。在我们的这个项目中,所有的代码文件,都是只含有一个模块,且代码文件名与模块名相同。

我自己这么写,是学习的别人的做法。我也建议大家这么做。因为,这算是一种通用的写法,大家都这么做,约定俗成 。你要是也按照这个约定俗成的规范来写的话,会方便团队合作吧。

代码的3到6行,是输入端口,都是wire型的。当然了,输入端口,肯定不能是reg型。输出端口可以是reg类型的,输入端口的话,wire型比较常见。

在声明端口类型的时候,如果端口是wire类型的,那么,wire这个关键字,其实是可以省略的。也就是说,端口声明部分,你可以像下面的示例这样子来书写。

图2,端口声明示例,省略wire关键字的写法

请大家着重去看图2中的红色框线所示的部分,没有写wire这个关键字。这样子来写,它和加上wire关键字的写法,意思是一样的。

(一)对wire类型的复习

这个怎么说呢?在Verilog HDL里面,端口的类型,最常见的是两种,一种是reg型的,一种是wire型的。这两种类型最常见。在这两种最常见的类型里面呢,Verilog将端口的默认的类型,指定为wire型。所以呢,无论是输入端口,还是输出端口,还是输入输出端口,如果你既不写reg关键字,也不写wire关键字,默认地,它就相当于写上了wire关键字。

然后呢,对于输入端口和输入输出端口来讲,不可以用reg类型,而可以使用wire型。

在这里呢,我是领着大家复习了一下Verilog的基础语法。为啥领着大家复习呢?这是因为,Verilog这个硬件编程语言,其实是一个比较杂乱的东西。C语言的语法,比较简洁,也容易记住。但是Verilog不是。Verilog的语法,庞杂,乱的很。建议大家呢,还是多注意复习和整理Verilog的语法细节,时常温习。

(二)系统时钟与系统复位信号

我们来看第3行和第4行。这个呢,它就是系统时钟与系统复位信号。其中呢,系统复位信号,有一个【n】的部分,就是【sys_rst_n】中的末尾的【n】。这个n,就代表着说,它是低电平有效。也就是说,这个系统复位信号,它是在低电平的时候,才会进行复位。

关于系统时钟与系统复位信号,基本上呢,它都会是从顶层模块,就开始传下来。然后呢,在FPGA里面,大家 知道,FPGA开发板上,会有时钟引脚与复位引脚。所以呢,顶层模块的系统时钟与系统复位信号,来自于FPGA开发板上的时钟引脚和复位引脚,而其余的代码文件中的时钟与复位信号,则多是直接或者间接地,来自于顶层模块中的系统时钟与系统复位信号。

本代码文件中的时钟与复位信号,都是来自于顶层模块。

我们看一看顶层模块中的时钟与复位信号,是如何连接到本代码文件的。如下图所示。

图3,顶层模块的端口声明
图4,顶层模块与本文件模块的连接

图3与图4,都是位于顶层模块。顶层模块,位于【\cpu_me01\code】路径下的【cpu_top.v】文件中。图3的3行与4行,声明了时钟与 复位信号。然后呢,图4里面,第45行与第46行,通过命名端口连接的方式,将顶层模块的时钟与复位信号,连接到了本模块的时钟与复位信号。且信号名都是一样的。

(三)取指令使能与指令指针信号

我们还是回到图1。我这里说回到图1,对你来讲,可能有些不方便。建议你呢,可以把这个图1的图片给下载下来,随时对照着来看。这样子呢,能方便一些。回到图1,图1的第5行和第6行,则分别是取指令使能信号【get_inst_en】与指令指针信号【ip】。

这俩信号,也是通过顶层模块,来连接过来的。但是呢,它们其实并非来自顶层模块,它们的源头,其实是来自控制中心【ctrl_center】模块。

图4的47行与48行,显示了顶层模块有名为【get_inst_en】与【instruct_pointer】的变量,连接到了本模块的取指令使能信号【get_inst_en】与指令指针信号【ip】。我们再来看看顶层模块的如下的代码截图。

图5,位于顶层模块

图5里面的11行和12行,分别是声明了wire型变量【get_inst_en】与【instruct_pointer】。这俩变量,其中的一个用途,是连接本模块的两个输入信号。我们再来看看这俩信号在顶层模块中,连接控制中心【ctrl_center】模块的情况。如下图所示。

图6,位于顶层模块

从图6中的红色框线的部分,可以看到顶层模块的wire型变量【get_inst_en】和【instruct_pointer】与控制中心模块【ctrl_center】的连接情况。

控制中心中的取指令使能信号,是如何产生的,以及如何连接到顶层模块的,这个呢,我们之前有讲过。忘记了的,请前往下面的链接去复习回顾。

初始化完成后,准备取指令

在上面的链接里面,我讲了第一个取指令使能信号的产生情况。然而,我并未讲第一个指令指针是如何产生的。

想要取指令,需要取指令使能信号,以告诉取指令模块,要去取指令了。同时呢,也需要一个指令指针,也就是,得告诉取指令模块,要取的指令,位于哪个内存地址中。

我们还是前往控制中心模块,看一看指令指针的产生情况。

控制中心模块【ctrl_center】,位于【\cpu_me01\code\Ctrl_Center】路径下的【ctrl_center.v】里面。我们来看看下图的代码。

图7,位于控制中心模块
图8,位于控制中心模块

从图7与图8来看,控制中心中的27行与28行,声明了指令指针【ip】与取指令使能信号。在390行到409行之间,是更新【ip】的逻辑代码。

在这里呢,对于更新【ip】的逻辑,我们暂时只需要看390行到392行,和408行,409行。390行到392行,是说,在系统复位信号的作用下,【ip】清零。408行和409行是说,在【else】的条件里面,ip保持原值不变。

在这里呢,我们暂时并不涉及图8中的两个【else if】的情况。那俩情况呢,它都是CPU运行起来以后,执行某些指令的时候,所产生的情形。现在呢,CPU 还没有运行指令呢,所以不涉及这两个【else if】的情况。

在这种情况下,ip呢,在系统复位信号的作用下,已经归零。然后呢,就是归于【else】的条件,【ip】保持0值不变。

这样一来呢,【ip】这个信号,它本来是控制中心的第27行声明的一个输出端口。然后呢,经由390到392行,与408,409行代码的作用,保持0值。并且呢,它在第一个取指令使能产生后,它是把这个0值,传递到了顶层模块里面。

图6中的39行,显示了,控制中心的【ip】信号,传递给了顶层模块的【instruct_pointer】变量。然后呢,顶层模块的【instruct_pointer】变量,又在图4中的48行,传递给了本模块的【ip】变量。

这样一来呢,本模块的4个输入变量,我们就清楚了它们的来源,含义。我们也知道,取指令模块第一次运行,也就是第一次取指令的时候,指令指针【ip】的值,为0。

(四)剩余的端口与变量

我们还是去看一看图1。下面,我给出图1的副本。

图1——副本

接下来呢,我们来看一看第8行和第9行,它们是译码使能与取出来的指令码。

我们取出了指令以后,就把它放在第9行的变量中,从本模块传出去,传给译码模块。同时呢,也要将译码使能信号【decode_en】给传递出去。译码使能信号与第9行变量,应该是同时有效的。这个时序,必须要予以保证。

我们再来看一看第12行到第17行。

第12行,ip_buf变量,它是对输入信号【ip】的缓存。

第13行,【instruct_code_wire】,它用来连接取出的指令码,并将取出的指令码传递给第9行的输出信号。这个信号的设置,我觉得是很重要的。

第15行,是读使能信号。第16行,是将读使能信号延后一个时钟周期所产生的信号。第17行,是将读使能信号延后两个时钟周期所产生的信号。

结束语

关于取指令这一块,我估计,我需要花费好几节的时间,来讲解这一块。个人觉得,这一块,可能会不好讲。当前,我对于如何讲解这一部分的知识,思路还比较乱。

希望能够学好吧。我们都努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37755 消费人群趋于年轻化&#xff0c;消费需求迈向健康化&#xff0c;消费场景与渠道走向多元化&#xff0c;这些因素共同驱动企业凭借数据能力来适应市场的变化。从消费市场来看&#xff0c;消费群体、需求、场景及渠道皆展现出与…

GIS中的投影坐标系

投影说明 GIS操作过程中&#xff0c;不可避免的涉及到处理数据的问题 而数据中有一个极为重要的东西就是其空间参考&#xff08;见下图&#xff09; 地理坐标系与投影坐标系 这里给出一些重要概念的简单定义 地理坐标&#xff1a;就是用经纬度表示地面点位的球面坐标。 地理…

Java项目实战II基于Java+Spring Boot+MySQL的新闻稿件管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 前在信息爆…

基于Springboot+Vue的视频点播系统设计与实现登录 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

基于Spring Boot的校园管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自…

GPT与大模型行业落地实践探索

简介 本课程探讨GPT和大模型技术在行业中的实际应用和发展。课程将涵盖GPT的基础知识、原理、及其在行业中的应用案例&#xff0c;如财报分析和客服机器人。重点在于结合实际案例中的使用效果&#xff0c;讲解如何利用GPT的API开发企业级应用以及利用更高级的功能构造AI Agent。…

react-native-Windows配置

一&#xff1a;官网&#xff1a; React Native for Windows macOS Build native Windows & macOS apps with Javascript and React 二&#xff1a;安装依赖 需要以管理员身份运行powershell,然后粘贴下面代码&#xff0c;注意&#xff1a;要安装淘宝镜像&#xff0c;要…

图解C#高级教程(一):委托

什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同&#xff0c;因为委托可以被执行。当执行委托时&#xff0c;委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…

Skywalking告警配置

背景 skywalking 9.7.0&#xff0c;地址&#xff1a;Backend setup | Apache SkyWalking helm&#xff1a;skywalking-helm:4.5.0&#xff0c;地址&#xff1a;skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警&#xff1f; …

创客匠人第二期“老蒋面对面”交流会圆满收官!

磅礴的大雨浇不灭奋斗的激情。9月24日&#xff0c;创客匠人第二期老蒋面对面—“创客匠人让知识变现不走弯路”内部大会在集美隆重举行。 本次内部大会旨在传递公司战略精神&#xff0c;深度探讨公司品牌传播的价值、方向和策略。这不仅是一次内部的交流与分享&#xff0c;更是…

linux 内核代码学习(十)--Linux内核启动和文件系统

前面第九章介绍了linux内核文件系统从软盘启动的几种方式&#xff1a;1、从软盘直接启动的linux&#xff0c;软盘上包括内核及简单文件系统&#xff1b;2、从软盘直接启动的linux&#xff0c;将内核与文件系统分别放置在一张软盘上&#xff1b;3、Grub做为引导程序&#xff0c;…

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着自然语言处理&#xff08;NLP&#xff09;技术的飞速进步&#xff0c;基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构&#xff0c;如 GPT 系列模型&…

【UI】Vue3 + Naive-ui 使用表格Data Table 以及分页页码显示不全问题解决

参考文章&#xff1a; Vue3 Naive-ui Data Table 分页页码显示不全 Naive UI之数据表格分页pagination 数据列表分页全部代码: <n-data-tableref"tableRef"striped:columns"columns":pagination"pagination":bordered"false":d…

Java必修课——Spring框架

目录 一、Spring框架概述二、IOC概念和原理2.1、什么是IOC2.2、IOC接口 三、深入理解Java基础中的集合框架3.1、Collection3.2、Map3.3、集合工具类 四、练习写一个SpringMVC框架1、介绍2、程序实践3、总结 五、Java开发者必备10大数据工具和框架 一、Spring框架概述 Spring是…

Javase学习day1-前置知识

1、什么是计算机 2、 硬件及冯诺依曼结构 3、软件及软件开发 4、常用的快捷键 5、常用的Dos命令 常用的Dos命令&#xff1a;(基本都是在cmd里面写的) #盘符切换&#xff1a;直接输入那个盘符的名字加一个冒号就行。 #切换目录&#xff1a; cd change directory&#xff08;这是…

STM32编码器接口笔记

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

ISA-95制造业中企业和控制系统的集成的国际标准-(2)

ISA-95 文章目录 ISA-95ISA-95企业层和制造运营管理层信息模型一、企业层和制造运营管理层信息模型内容二、企业层和制造运营管理层信息模型分类 ISA-95企业层和制造运营管理层信息模型 ISA-95信息模型是指ISA-95制造业中企业和控制系统集成的国际标准定义了企业层和制造运营层…

心觉:运用吸引力法则和开发潜意识的核心中的核心是什么?

吸引力法则的核心在于 思想的力量 和 频率的匹配。你所思考和感受的会吸引与你频率相匹配的事物和经历到你的生活中。具体来说&#xff1a; 明确意图和目标&#xff1a;清晰地知道你想要什么&#xff0c;并且用详细的方式描述它。这可以是通过写下目标、制作愿景板&#xff08;…

MySQL_视图

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

鸿蒙harmonyos next flutter通信之MethodChannel获取设备信息

本文将通过MethodChannel获取设备信息&#xff0c;以此来演练MethodChannel用法。 建立channel flutter代码&#xff1a; MethodChannel methodChannel MethodChannel("com.xmg.test"); ohos代码&#xff1a; private channel: MethodChannel | null nullthis.c…