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

简易CPU设计入门:算术逻辑单元(五)

专栏导航上一篇简易CPU设计入门算术逻辑单元四专栏目录下一篇简易CPU设计入门算术逻辑单元六项目代码下载请大家首先准备好本项目所用的源代码。如果已经下载了那就不用重复下载了。如果还没有下载那么请大家点击下方链接来了解下载本项目的CPU源代码的方法。CSDN文章下载本项目代码上述链接为本项目所依据的版本。在讲解过程中我还时不时地发现自己在讲解与注释上的一些个错误。有时我还会添加一点新的资料。在这里我将动态更新的代码版本发在下面的链接中。Gitee项目简易CPU设计入门项目代码:讲课的时候我主要依据的是CSDN文章链接。然后呢如果你为了获得我的最近更新的版本那就请在Gitee项目链接里下载代码。准备好了项目源代码以后我们接着去讲解。本节前言在上一节我讲解了算术逻辑运算中的乘法操作本节呢我们来讲解除法操作。本节的代码位于【......cpu_me01\code\ALU\】路径里面。主要讲解的代码是【div_cell.v】代码文件。一. 端口声明我们来看一下端口声明部分的代码。图1【div_cell.v】里面的端口声明和相同路径里面的【ALU.v】里面的端口声明是一样的。第3行和第4行是系统时钟与系统复位信号。系统时钟信号其频率为50MHz。系统复位信号为低电平有效。第6行到第8行它们对应着控制中心里面的3个内部寄存器。其中呢【oprand0】对应着控制中心里面的0号内部寄存器【oprand1】对应着控制中心里面的1号内部寄存器【oprand2】对应着控制中心里面的2号内部寄存器。我们可以看一下控制中心里面的代码。图2控制中心里面的代码图2里面的代码是控制中心模块里面的代码。它显示了三个操作数变量与三个内部寄存器的绑定代码。在这里三个操作数变量【oprand0-2】是如何声明的以及它们是如何与本节的图1中的三个操作数变量【oprand0-2】相联系的我就不去展示了。有兴趣的话你可以自己去查看。第10行到第12行是本系统中的三大内部总线。第14行是用于发送【成功完成】信号的总线。二. 变量声明与总线绑定图3第17行和第18行是用来计时的两个变量。其中呢【cal_time_d1】延后【cal_time】一个时钟周期。第20行它是用来保存计算结果的。本节的模块名称为【div_cell】所以呢这里的 res保存的是除法运算的运算结果。第21行和第22行分别是端口声明中的【work_ok_inner】和【data_sig_inner】总线变量的代理变量。我们来看一下两个总线代理与对应的总线变量的绑定代码。图4图4显示了这种总线变量与它的代理变量的绑定代码。三. 计算图5always (posedge sys_clk or negedge sys_rst_n) if (sys_rst_n 1b0) res 1b0; else if ((ctrl_sig_inner[4] 1b1) (addr_sig_inner 6d3)) res oprand1 / oprand0; else res res;图5中的代码就是执行计算的代码它也是关于 res 的逻辑的代码。res的逻辑是在系统复位时它是被赋值为0值。在【else】分支里面也就是闲来无事时它是保持现有值不变。而每当满足【(ctrl_sig_inner[4] 1b1) (addr_sig_inner 6d3)】条件之时它就执行计算将【oprand1 / oprand0】的运算结果赋给 res 变量。在这里【ctrl_sig_inner[4] 1b1】是什么意思我们还是来复习一下内部控制总线的知识。图6/********************************************* ctrl_sig_inner[0]:register write enable寄存器写使能 ctrl_sig_inner[1]:register read enable寄存器读使能 ctrl_sig_inner[2]:random memory write ebable内存写使能 ctrl_sig_inner[3]:random memory read enable内存读使能 ctrl_sig_inner[4]:Arithmetic and Logic calculate算术逻辑运算 ctrl_sig_inner[5]:reserve保留 ctrl_sig_inner[6]:reserve保留 ctrl_sig_inner[7]:reserve保留 ctrl_sig_inner[8]:reserve保留 ctrl_sig_inner[9]:reserve保留 ctrl_sig_inner[10]:reserve保留 ctrl_sig_inner[11]:reserve保留 ctrl_sig_inner[12]:reserve保留 ctrl_sig_inner[13]:reserve保留 ctrl_sig_inner[14]:reserve保留 ctrl_sig_inner[15]:reserve保留 还有一种运算叫做读取立即数将立即数放入内部寄存器。 此运算不需要通过内部信号的参与。 ************************************************/根据图6当内部控制总线的位4为1而其余位都是0值时表示控制中心向算术逻辑单元发布了算术逻辑运算使能信号。算术逻辑运算可以包含着多种运算类型。加法算一个减法也算是一个。那么如何来区分不同的运算类型呢这个时候我们就通过内部地址总线【addr_sig_inner】来表示不同的运算种类。当本模块收到的【addr_sig_inner】总线信号的值是3时就表示执行除法运算。所以呢图5所示代码的意思是当【div_cell】模块收到了算术逻辑运算使能信号并且根据内部地址信号值确定本次的运算类型为除法运算时则在非阻塞赋值阶段将端口中的操作数1除以操作数0结果放在 res 变量里面。四. 计时变量图7always (posedge sys_clk or negedge sys_rst_n) if (sys_rst_n 1b0) cal_time 1b0; else if ((ctrl_sig_inner[4] 1b1) (addr_sig_inner 6d3)) cal_time 1b1; else cal_time 1b0;在图7里面显示了【cal_time】的逻辑。在系统复位与【else】分支里面它都是被赋予0值。而在满足了【(ctrl_sig_inner[4] 1b1) (addr_sig_inner 6d3)】条件之时它就被赋予 1 值。这个条件它其实和第三分节中的 res 被重新计算的条件一样的。它是说在收到了算术逻辑运算使能信号且根据内部地址总线的值判断出本次执行的运算类型为除法运算时则将【cal_time】变量赋值为 1 值。然后呢我们再来看【cal_time_d1】的逻辑。图8图8显示了【cal_time_d1】的逻辑。它是将【cal_time】延后一个时钟周期所形成的信号。五. 总线逻辑图9图9显示了本模块的两个总线变量【data_sig_inner】和【work_ok_inner】的对应代理变量【data_sig_represent】和【work_ok_represent】的逻辑。当检测到【cal_tijme 1】条件满足之时在此后的非阻塞赋值阶段【data_sig_represent】和【work_ok_represent】被赋予 0 值。当检测到【cal_tijme_d1 1】条件满足之时在此后的非阻塞赋值阶段【data_sig_represent】和【work_ok_represent】分别被赋予各自的有效值。其中【data_sig_represent】被赋予 res 的值也就是将本模块的算术逻辑运算结果保存下来。而【work_ok_represent】被赋予 1 值。在这里两大代理变量分别与本模块的两大总线变量相绑定。而本模块的两大总线变量又与各自的同名的内部总线相连接。所以呢向代理写入了什么值就相当于向对应的内部总线传递了什么值。六. 总体逻辑本模块的总体逻辑是当检测到了算术逻辑使能信号且运算类型为乘法运算时则执行操作数1除以操作数0的除法运算并将运算结果暂时保存在 res 变量里面。同时将【cal_time】设置为 1 值。然后呢在检测到【cal_time 1】条件满足之时对两大内部总线【data_sig_inner】和【work_ok_inner】分别写入 0 值。同时将【cal_time_d1】设置为 1 值。在检测到【cal_time_d1 1】条件满足之时对两大内部总线【data_sig_inner】和【work_ok_inner】分别传递有效值。其中呢【data_sig_inner】被传入运算结果 res 的值【work_ok_inner】被传递 1 值。【work_ok_inner】被写入 1 值表示本次操作成功完成。在【work_ok_inner】被写入 1 值的同时运算结果也同时被传到【data_sig_inner】总线里面了。所以呢成功完成信号【work_ok_inner】与运算结果【data_sig_inner】同时有效。控制中心会从这两个内部总线接收到消息并且会进行相应的处理的。结束语算术逻辑单元涉及的运算种类不少。所以呢本部分的讲解还会有几节。慢慢学吧。专栏导航上一篇简易CPU设计入门算术逻辑单元四专栏目录下一篇简易CPU设计入门算术逻辑单元六

相关文章:

简易CPU设计入门:算术逻辑单元(五)

专栏导航 上一篇:简易CPU设计入门:算术逻辑单元(四) 专栏目录 下一篇:简易CPU设计入门:算术逻辑单元(六) 项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&am…...

Kali Linux 2026.1 发布 (2026 主题 BackTrack 模式) - 领先的渗透测试发行版

Kali Linux 2026.1 发布 (2026 主题 & BackTrack 模式) - 领先的渗透测试发行版 The most advanced Penetration Testing Distribution 请访问原文链接:https://sysin.org/blog/kali-linux/ 查看最新版。原创作品,转载请保留出处。 作者主页&…...

网页实现文字转语音朗读功能

SpeechSynthesisUtterance是HTML5中新增的API&#xff0c;用于将指定文字合成为对应的语音。 <button onclick"play()">朗读</button> <script>var utterThis new SpeechSynthesisUtterance();utterThis.text "hello word";utterThis…...

PlayCover终极指南:三步在Mac上畅玩iOS游戏与应用

PlayCover终极指南&#xff1a;三步在Mac上畅玩iOS游戏与应用 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为心爱的iOS游戏无法在Mac上体验而烦恼吗&#xff1f;PlayCover为你打开了一扇全新的…...

保姆级教程:在RK3568开发板上配置RK809-5 PMIC的Android设备树(附完整代码)

RK3568开发板实战&#xff1a;RK809-5 PMIC设备树配置全流程解析 当你在RK3568开发板上第一次按下电源键&#xff0c;却只看到一片黑屏时&#xff0c;作为嵌入式工程师的直觉会告诉你&#xff1a;PMIC配置出了问题。RK809-5这颗电源管理芯片就像系统的"心脏"&#xf…...

Uvicorn性能调优:异步I/O模型选择与配置指南

Uvicorn性能调优&#xff1a;异步I/O模型选择与配置指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为Python生态中最受欢迎的ASGI服务器&#xff0c;其性能表现直接…...

MediaPipe Holistic实战效果:一张照片生成全身骨骼图,效果超乎想象

MediaPipe Holistic实战效果&#xff1a;一张照片生成全身骨骼图&#xff0c;效果超乎想象 1. 引言&#xff1a;当AI遇见全身感知 想象一下&#xff0c;你只需要上传一张普通的全身照片&#xff0c;AI就能自动识别出你的面部表情、手势动作和身体姿态&#xff0c;并生成一张精…...

【Python内存管理终极指南】:20年专家亲授智能体内存优化的5大核心配置步骤

第一章&#xff1a;Python智能体内存管理的底层原理与认知重构Python 的内存管理并非由开发者显式控制&#xff0c;而是通过一套高度协同的自动化机制实现——它融合了引用计数、循环垃圾回收&#xff08;GC&#xff09;与内存池&#xff08;pymalloc&#xff09;三层结构。这种…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的公司门户网站设计与实现

基于aspaccess的公司门户网站设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的公司门户网站设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的公司门户网站设计与实现&a…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的仓储物流管理系统设计与实现

基于aspaccess的仓储物流管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的仓储物流管理系统设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的仓储物流管理系统…...

asp毕业设计下载(全套源码+配套论文)——基于asp+access的办公系统设计与实现

基于aspaccess的办公系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于aspaccess的办公系统设计与实现&#xff0c;更多精选毕业设计项目实例见文末哦。 文章目录&#xff1a; 基于aspaccess的办公系统设计与实现&#xff08;毕…...

消防给水系统控制:西门子 S7 - 200 与昆仑通态触摸屏的奇妙组合

消防给水系统控制&#xff0c;西门子S7-200&#xff0c;昆仑通态触摸屏YH25 1.采用西门子S7-200PLC&#xff0c;CPU226EM223数字量模块EM231模拟量模块。 2.昆仑通态MCGS触摸屏及软件&#xff0c;可自行转换新版MCGSPRO程序。 3.两水泵一用二备和二用一备可切换&#xff0c;故障…...

别再傻傻分不清了!用Simulink手把手带你搞懂导纳控制与阻抗控制的本质区别

导纳控制 vs 阻抗控制&#xff1a;从理论到Simulink实战的深度解析 在机器人控制领域&#xff0c;柔性交互是一个永恒的话题。想象一下&#xff0c;当机械臂需要完成精密装配任务时&#xff0c;既要有足够的刚性保证定位精度&#xff0c;又要在意外碰撞时表现出适当的柔顺性——…...

快充、便携、安全兼备,Anker能量盒到底香不香?

随着无线互联网时代的到来&#xff0c;移动设备的续航问题成为人们的新烦恼。无论是频繁出差、旅行&#xff0c;还是移动办公&#xff0c;充电宝几乎已经成为随身必备的装备。 然而&#xff0c;传统充电宝往往存在充电速度慢、体积笨重、功能单一&#xff0c;甚至安全认证不完善…...

2024版idea引入lombok总是报错解决方法

在创建SpringBoot文件时不勾选lombok&#xff0c;然后自己手动导入lombok并指定版本玛德这idea的SpringBoot中导入lombok后我使用Data总是说我的get和set方法有毛病&#xff0c;一怒之下我直接就是疯狂搜如何解决lombok引用问题&#xff0c;结果不是让我去勾选一个东西就是让我…...

OpenClaw对比测试:Qwen3.5-9B与其他模型在自动化任务中的表现

OpenClaw对比测试&#xff1a;Qwen3.5-9B与其他模型在自动化任务中的表现 1. 测试背景与实验设计 最近在搭建个人自动化工作流时&#xff0c;我遇到了一个关键问题&#xff1a;OpenClaw框架下究竟该选择哪个大模型作为决策核心&#xff1f;为了找到答案&#xff0c;我花了三天…...

HertzBeat自定义监控模板开发终极指南:打造专属监控能力 [特殊字符]

HertzBeat自定义监控模板开发终极指南&#xff1a;打造专属监控能力 &#x1f680; HertzBeat是一款开源、高性能的实时监控系统&#xff0c;支持自定义监控、无代理部署和类Prometheus架构。本指南将带你从零开始掌握HertzBeat自定义监控模板开发的核心技能&#xff0c;快速构…...

TVM构建系统详解:CMake与Makefile配置最佳实践

TVM构建系统详解&#xff1a;CMake与Makefile配置最佳实践 引言&#xff1a;TVM构建系统的核心挑战 深度学习编译器TVM&#xff08;Tensor Virtual Machine&#xff09;作为一个跨平台、多后端的开源项目&#xff0c;其构建系统面临着独特的复杂性。开发者需要在不同架构&#…...

对抗攻击新思路:为什么Diffusion模型比GAN更适合生成隐蔽攻击样本?

扩散模型在对抗攻击领域的突破性优势&#xff1a;从理论到实践 当我们在讨论机器学习安全时&#xff0c;对抗攻击一直是个令人着迷又充满挑战的话题。想象一下&#xff0c;只需对输入图像做几乎不可察觉的微小改动&#xff0c;就能让最先进的分类模型完全"失明"——这…...

HelloWorld.h:嵌入式LED硬件抽象库设计与实战

1. 项目概述led是一个极简但高度工程化的嵌入式LED控制抽象库&#xff0c;其核心载体为单头文件HelloWorld.h。尽管项目名称朴素、文档极度精简&#xff08;Readme为空&#xff09;&#xff0c;但该命名本身即构成一种嵌入式开发领域的隐喻性宣言——它并非教学示例的代名词&am…...

Docker+iredmail搭建企业级邮件服务器全流程(附常见问题排查)

Dockeriredmail搭建企业级邮件服务器全流程指南 邮件系统作为企业日常沟通的核心基础设施&#xff0c;其稳定性和安全性直接影响业务运转效率。传统邮件服务器部署往往需要复杂的配置和漫长的调试周期&#xff0c;而Docker容器化技术结合iredmail开源邮件解决方案&#xff0c;为…...

TVM终极模型剪枝指南:如何快速实现结构化与非结构化剪枝

TVM终极模型剪枝指南&#xff1a;如何快速实现结构化与非结构化剪枝 想要让深度学习模型跑得更快、占用更少内存&#xff1f;TVM的模型剪枝功能就是你的最佳选择&#xff01;&#x1f680; 本文为你带来TVM剪枝的完整指南&#xff0c;从基础概念到实际应用&#xff0c;让你快速…...

终极指南:Autoenv如何彻底解决团队开发环境配置难题

终极指南&#xff1a;Autoenv如何彻底解决团队开发环境配置难题 【免费下载链接】autoenv 项目地址: https://gitcode.com/gh_mirrors/aut/autoenv Autoenv是一款强大的目录环境管理工具&#xff0c;能够在您进入包含.env文件的目录时自动执行其中的环境配置&#xff0…...

从零搭建企业级开源大模型平台:Ollama+Llama3+open-webui实战指南

1. 为什么选择OllamaLlama3open-webui组合&#xff1f; 最近两年大语言模型的发展速度简直让人瞠目结舌&#xff0c;从最初的GPT-3到现在的Llama3&#xff0c;模型能力突飞猛进的同时&#xff0c;部署门槛也在不断降低。作为一个在AI领域摸爬滚打多年的老手&#xff0c;我实测过…...

终极指南:从NumPy到Pydantic的Claude-Code-Usage-Monitor依赖管理完整解析

终极指南&#xff1a;从NumPy到Pydantic的Claude-Code-Usage-Monitor依赖管理完整解析 【免费下载链接】Claude-Code-Usage-Monitor Real-time Claude Code usage monitor with predictions and warnings 项目地址: https://gitcode.com/gh_mirrors/cl/Claude-Code-Usage-Mon…...

说说你对spring的IOC的理解

面试 IOC指的就是控制反转&#xff0c;指的就是创建对象的控制权的转移&#xff0c;简单来说&#xff0c;由之前的手动new对象&#xff0c;转换成了由spring自动生产&#xff0c;spring利用java的反射机制&#xff0c;根据配置文件或注解在运行时动态创建并管理对象。...

别再只会调库了!用NumPy和Random手搓一个SMOTE算法,我踩过的坑都在这了

从零实现SMOTE算法&#xff1a;NumPy实战与关键问题解析 理解类别不平衡问题的本质 在数据科学和机器学习领域&#xff0c;我们经常会遇到类别分布严重不均衡的数据集。想象一下&#xff0c;你正在处理一个信用卡欺诈检测项目&#xff0c;正常交易记录可能有数百万条&#xff0…...

终极指南:如何用LanceDB向量数据库构建智能学习资源检索系统

终极指南&#xff1a;如何用LanceDB向量数据库构建智能学习资源检索系统 【免费下载链接】lancedb Developer-friendly, serverless vector database for AI applications. Easily add long-term memory to your LLM apps! 项目地址: https://gitcode.com/gh_mirrors/la/lanc…...

如何将TaskWeaver与LangChain无缝集成:扩展AI代理能力边界的终极指南

如何将TaskWeaver与LangChain无缝集成&#xff1a;扩展AI代理能力边界的终极指南 【免费下载链接】TaskWeaver A code-first agent framework for seamlessly planning and executing data analytics tasks. 项目地址: https://gitcode.com/gh_mirrors/ta/TaskWeaver T…...

taocms v3.0.2漏洞防御指南:如何避免.htaccess文件被恶意利用

Taocms v3.0.2安全加固实战&#xff1a;从漏洞原理到防御体系构建 当网站管理后台的.htaccess文件成为攻击者的跳板时&#xff0c;系统安全便形同虚设。近期曝光的Taocms v3.0.2远程代码执行漏洞&#xff08;CVE-2022-25578&#xff09;正是利用了这一薄弱环节&#xff0c;攻击…...