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

简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值

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

下载本项目代码

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

在之前的章节里,我是讲解了,使用Quartus II 13.1的IP核生成的功能,来生成RAM IP核。讲完了这个以后,我们在这一节,接着来讲解取指令模块。

我还是将取指令模块的代码给整体地贴在下面。

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

上述代码块,位于【\cpu_me01\code\get_instruct.v】里面。

一.   ip_buf的非阻塞赋值

我们来看看关于ip_buf的非阻塞赋值代码块。

图1

由图1可以看到,ip_buf在复位时,它为0值。检测到输入信号中的【get_inst_en】为高电平以后,ip_buf非阻塞赋值为输入信号【ip】的值。此后,ip_buf保持此值不变。

在这里,取指令使能信号【get_inst_en】,它是来自于控制中心模块【ctrl_center】的。每次准备取指令时,【get_inst_en】才会变为1,且仅仅维持一个时钟周期的高电平。其余的时间里,它为0值。

这样一来,图1中的【ip_buf】,它是说,每检测到一次【get_inst_en】为高电平,就缓存一次【ip】的值,然后在【get_inst_en】为低电平期间,【ip_buf】保持不变。下一次检测到一次【get_inst_en】为高电平的时候,就缓存新的【ip】的值。逻辑不难。

二.   rd_en的非阻塞赋值

图2

从图2来看,读使能变量【rd_en】,它在系统复位时,为0值。当检测到控制中心传来的取指令使能信号【get_inst_en】变为高电平的时候,读使能信号【rd_en】变为1。其余时间,【rd_en】为0。

取指令使能我们讲了,它是由控制中心模块传来的,且仅仅维持一个时钟周期的高电平,其余时间为0值。而【rd_en】其实也是一样的。【rd_en】的逻辑,仅仅在检测到【get_inst_en】为1时,【rd_en】才为1,其余时候,【rd_en】为0。而【get_inst_en】仅仅维持一个时钟周期,所以,【rd_en】的高电平也是仅仅维持一个时钟周期。

注意,【ip_buf】与【rd_en】都是本地变量,如下图所示。

图3

图3中的第12行和第15行,可以表明,【ip_buf】与【rd_en】均为本地变量。

三.   延时信号【rd_en_d1】与【rd_en_d2】

在图3中,我们可以看到两个延时信号【rd_en_d1】与【rd_en_d2】。所谓的延时,是对【rd_en】信号进行延时。在这里,虽说我声明了两个延时信号,但是,实际用到的,只有【rd_en_d1】而已。之所以要多申请一个,是因为,我担心一个延时信号不够用。

生活中,好多事情我也是这样的。因为总担心东西会不够用,所以我倾向于多准备一些。对于擅长精打细算的人来讲,我这种做法,可能会显得有些不好理解。

我们还是来看一看代码。

图4

我先来说一说代码的执行效果。效果就是,【rd_en_d1】相比【rd_en】延后了1个时钟周期,【rd_en_d2】又比【rd_en_d1】延后了1个时钟周期。

接下来,我又会用文字说明的方法,来演示这种代码执行过程了。请大家先将图4给保存好,以随时对照着我的文字讲解。

我们知道,【rd_en】变为1,是由于非阻塞赋值。那么,它肯定是在某一个时钟上升沿到来后,在非阻塞赋值的第2阶段变为1的。

那么,我们先将初始条件设置为,时钟周期处于【rd_en】变为1的之前的一个时钟周期。

【初始条件】假定某一个时钟上升沿到来时,rd_en == 0,且本周期里面 rd_en 不会变为1。我们将这个时钟上升沿,定义为0号上升沿。此时,rd_en_d1与rd_en_d2的值均为0。

在0号时钟上升沿到来后的非阻塞赋值第1阶段,计算非阻塞赋值的右侧表达式的值。这个时候,表达式【rd_en_d1 <=  rd_en】与表达式【rd_en_d2 <= rd_en_d1】的右侧表达式分别为【rd_en】与【rd_en_d1】,它们都为0。

在0号时钟上升沿到来后的非阻塞赋值第2阶段,将右侧表达式的值赋予左侧的变量。这样一来,在这个阶段里,rd_en_d1与rd_en_d2的值均被赋值为0,与0号时钟上升沿到来时的值是一样的。

【1号时钟上升沿到来】此时rd_en为0,且假定本上升沿到来后的非阻塞赋值第2阶段里,rd_en被非阻塞赋值为1。此时,rd_en_d1与rd_en_d2的值依然为0。

在1号上升沿到来后的非阻塞赋值第1阶段,计算非阻塞赋值的右侧表达式的值。此时,右侧表达式【rd_en】与【rd_en_d1】的值均为0。

在1号时钟上升沿到来后的非阻塞赋值第2阶段,将右侧表达式的值赋予左侧的变量。这样一来,在这个阶段里,rd_en_d1与rd_en_d2的值均被赋值为0,与1号时钟上升沿到来时的值是一样的。

【2号时钟上升沿到来】此时rd_en为1,且本上升沿到来后的非阻塞赋值第2阶段里,rd_en被非阻塞赋值为0。此时,rd_en_d1 == 0,rd_en_d2 == 0。

在2号上升沿到来后的非阻塞赋值第1阶段,计算非阻塞赋值的右侧表达式的值。此时,右侧表达式【rd_en】的值为1,右测表达式【rd_en_d1】的值为0。

在2号上升沿到来后的非阻塞赋值第2阶段,将右侧表达式的值赋予左侧的变量。这样一来,rd_en_d1被赋值为1,rd_en_d2被赋值为0。也就是,rd_en_d1变为1,而rd_en_d2不变。

【3号时钟上升沿到来】此时,rd_en == 0,rd_en_d1 == 1, rd_en_d2 == 0。

在3号上升沿到来后的非阻塞赋值第1阶段,计算非阻塞赋值的右侧表达式的值。此时,右侧表达式【rd_en】的值为0,【rd_en_d1】的值为1。

在3号上升沿到来后的非阻塞赋值第2阶段,将右侧表达式的值赋予左侧的变量。这样一来,rd_en_d1被赋值为0,rd_en_d2被赋值为1。

【4号时钟上升沿到来】此时,rd_en == 0,rd_en_d1 == 0, rd_en_d2 == 1。

在4号上升沿到来后的非阻塞赋值第1阶段,计算非阻塞赋值的右侧表达式的值。此时,右侧表达式

【rd_en】的值为0,【rd_en_d1】的值为0。

在4号上升沿到来后的非阻塞赋值第2阶段,将右侧表达式的值赋予左侧的变量。这样一来,rd_en_d1被赋值为0,rd_en_d2被赋值为0。

我们将上面的几个文字说明的信息摘录一下,我们将【rd_en】,【rd_en_d1】与【rd_en_d2】变为1的时机给摘录下来。

在1号时钟上升沿到来后,在非阻塞赋值的第2阶段,rd_en被非阻塞赋值为1。

在2号时钟上升沿到来后,在非阻塞赋值的第2阶段,rd_en_d1被非阻塞赋值为1。

在3号时钟上升沿到来后,在非阻塞赋值的第2阶段,rd_en_d2被非阻塞赋值为1。

所以呢,rd_en,rd_en_d1,rd_en_d2,它们分别是右边的信号比左边的信号延后一个时钟周期变为1。

四.   延时例题

本文第三节主要是为了向大家讲述延时逻辑。那个具体的文字表述不是重点,重点时,再次出现延时逻辑,你得是能够明白。

下面,我给大家来一个例题。

图5

如果第3节的知识,大家看懂了,那么,图5中的代码,其实是不难的。

图5中的代码,依然是一个延时逻辑。

signal,signal_d1,signal_d2,signal_d3,signal_d4,signal_d5,signal_d6,这几个信号,分别是右边的信号比左边的信号延后一个时钟周期。

延时逻辑,大家明白了没?

结束语

在本节,我又水了一节。

延时逻辑,也算是一个有趣的硬件代码逻辑。希望大家能学会。

本节里面,我没有采用表格的方法来解读代码逻辑,而是采用了文字说明的方法。其实两种方法只是不同的方法而已。你可以选择一种方法,来研究你所关注的问题。

表格的话,其实我还是比较推荐大家去使用它。图表,应该算是现代社会里,我们经常需要去观察和分析的材料吧。

会计里面有资产负债表,炒股的人也需要去看股票价格的走势图。信息时代,图表思维,大概也是我们需要去训练的一种思维了。

本节结束。

相关文章:

简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值

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

【算法】---归并排序(递归非递归实现)

参考 左程云算法 算法导论 前言 本篇介绍 归并排序分治法 前置知识 了解递归&#xff0c; 了解数组。 引入 归并排序 归并排序最早是由公认的现代计算机之父John von Neumann发明的&#xff0c; 这是一种典型的分治思想应用。 我们先介绍分治思想 分治思想 分治思想的…...

UniVue大版本更新:UniVue2.0.0-preview

大版本发布说明 距离上次更新好像已经过去很久了&#xff0c;最近太忙了没时间维护新版本&#xff0c;也是自己在使用的过程中发现了很多问题也有了更多的灵感&#xff0c;由于和之前的版本区别太大&#xff0c;决定重新开一个大版本。这个UniVue2之后的版本追求是性能&#xf…...

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…...

C++基础补充(02)C++其他控制语句break continue goto等

文章目录 1. break2. continue 语句3. goto 语句goto的存在 4. 跳出多重循环4.1 goto 直接跳转4.2 C11及其后版本的 return 语句4.3 使用标志变量 在C中&#xff0c;控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…...

决策树中联合概率分布公式解释说明

学习决策树时书本中有一公式 7-3 是&#xff1a; P ( X x i , Y y j ) p i j ( i 1 , 2 , … , m , j 1 , 2 , … , n ) P(X x_i, Y y_j) p_{ij} \quad (i 1, 2, \dots, m, \ j 1, 2, \dots, n) P(Xxi​,Yyj​)pij​(i1,2,…,m, j1,2,…,n) 这个公式表示的是随机变…...

计算机毕业设计 农场投入品运营管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程&#xff1f;如何使用php email服务&#xff1f; 无论是用户注册、密码重置&#xff0c;还是订单确认&#xff0c;电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能&#xff0c;并提供一些配置技巧&#xff0c;帮助你更好…...

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路&#xff08;Logo&#xff09;第一步第二步 隐藏Logo示例查看源码及思路&#xff08;Info&#xff09;第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo&#xff0c;今天看了下V9源码&#xff0c;发现M…...

2024年房市

24年8月15日&#xff0c;国家统计局公布&#xff0c;“7月末&#xff0c;商品房待售面积73926万平方米”。(原文链接&#xff1a;https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html)   7.39亿平方存量商品房&#xff0c;估价均价1万每平&#xff0c;总价约&am…...

index索引

index索引&#xff1a; create index 【1】on 【2】(【3】) 1为索引名&#xff0c;通常为id_表名_列名。2为表名。3为列名。 CREATE INDEX id_account_id ON account(id); -- 根据id创建索引 CREATE INDEX id_account_idname on account(id,name); -- 创建组合索引 索…...

理解互联网链路:从本地ISP到Tier 1 ISP运营商

1. 互联网服务提供商&#xff08;ISP&#xff09; 互联网服务提供商&#xff08;ISP&#xff09;是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网&#xff0c;并提供相关的服务&#xff0c;如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...

基于元神操作系统实现NTFS文件操作(三)

1. 背景 本文主要介绍DBR的读取和解析&#xff0c;并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作&#xff0c;所以只解析了少量的部分&#xff0c;其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...

深度学习与数学归纳法

最近发现&#xff0c;深度学习可以分为两个主要的阶段&#xff0c;分别是前向推理以及反向传播&#xff0c;分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候&#xff0c;本质上是在利用历史数据求网络参数的先验分布&#xff1b; …...

《Linux从小白到高手》理论篇(六):Linux软件安装一篇通

List item 本篇介绍Linux软件安装相关的操作命令&#xff0c;看完本文&#xff0c;有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用&#xff1b;查询功能任何用户都可以操作&#xff1b;如果普通用…...

【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...

②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 &#xff08;接上一章&#xff09; 自由协议通信步骤 &#xff08;以MS-A2-1041为例&#xff09; 接收与…...

matlab-对比两张图片的HSV分量的差值并形成直方图

%对比两张图片的HSV分量的差值并形成直方图&#xff0c;改个路径就能用&#xff0c;图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…...

微服务SpringGateway解析部署使用全流程

官网地址&#xff1a; Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用&#xff1a; 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...

Solidity 存储和内存管理:深入理解与高效优化

在 Solidity 中&#xff0c;存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取&#xff0c;而这些操作对 gas 的消耗有很大影响。因此&#xff0c;理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…...

为初创团队搭建统一的大模型api网关以控制开发成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为初创团队搭建统一的大模型API网关以控制开发成本 对于初创技术团队而言&#xff0c;快速验证产品想法、迭代功能是生存的关键。在…...

RTK内置电台:如何能撬动消费电子万亿市场|深圳海导科技navynav

在测绘、农业、智能交通等领域&#xff0c;厘米级甚至毫米级的高精度定位需求正推动着定位技术的持续革新。作为实时动态载波相位差分技术的核心组件&#xff0c;RTK内置电台凭借其无需外接设备、抗干扰能力强、部署灵活等优势&#xff0c;已成为高精度定位系统的“神经中枢”。…...

Meshroom终极指南:免费开源3D重建软件,从照片到三维模型的完整解决方案 [特殊字符]

Meshroom终极指南&#xff1a;免费开源3D重建软件&#xff0c;从照片到三维模型的完整解决方案 &#x1f680; 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom Meshroom是一款革命性的开源3D重…...

深度解析:PC端即时通讯防撤回功能的技术实现

深度解析&#xff1a;PC端即时通讯防撤回功能的技术实现 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitHub_…...

从IR压降到远程采样:大电流PCB供电设计的实战经验与陷阱规避

1. 项目背景与问题浮现几年前&#xff0c;我参与了一个项目&#xff0c;主电源是一个标准的开放式机架电源&#xff0c;需要为一个位于机箱内相对较远的模块提供5V、约20A的直流电。最初的供电路径设计是依靠PCB走线&#xff0c;我们使用了1盎司铜厚的板材。问题很快就出现了&a…...

告别“对方已撤回“!PC版微信QQ防撤回补丁终极指南

告别"对方已撤回"&#xff01;PC版微信QQ防撤回补丁终极指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitco…...

AI模型评估资源精选:从标准基准到定制化实践指南

1. 项目概述&#xff1a;为什么我们需要一个AI评估资源精选集&#xff1f;如果你最近也在折腾大语言模型&#xff0c;无论是想自己微调一个&#xff0c;还是想评估市面上哪个模型更适合你的业务场景&#xff0c;大概率会遇到一个头疼的问题&#xff1a;评估标准太多了&#xff…...

终极图片去重神器:AntiDupl.NET帮你一键清理重复图片释放磁盘空间

终极图片去重神器&#xff1a;AntiDupl.NET帮你一键清理重复图片释放磁盘空间 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因电脑里堆积如山的重复照片而烦…...

AI编程助手与代码质量守护:Trunk Cursor插件实战指南

1. 项目概述&#xff1a;当AI编程助手遇上代码质量守护者如果你和我一样&#xff0c;日常重度依赖Cursor这类AI编程助手来加速开发&#xff0c;那么你一定也遇到过类似的困扰&#xff1a;AI生成的代码片段虽然功能上“能用”&#xff0c;但在代码风格、格式一致性、甚至是潜在的…...

保姆级避坑指南:在Ubuntu 18.04上用ROS Melodic和easy_handeye搞定UR5+Realsense D435i手眼标定

保姆级避坑指南&#xff1a;Ubuntu 18.04下ROS Melodic与UR5机械臂手眼标定实战 在工业机器人应用开发中&#xff0c;手眼标定是连接视觉系统与机械臂的关键环节。本文将针对UR5机械臂与Realsense D435i相机的组合&#xff0c;深入剖析ROS Melodic环境下使用easy_handeye进行标…...