简易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设计入门算术逻辑单元六
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452592.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!