31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器

2023-11-09

  • 说在前面

开发环境:Vivado

语言:Verilog

cpu框架:Mips

控制器:组合逻辑

  •  指令译码器

我们需要根据一条32位的指令的结构确定是哪一条指令

可以根据操作码(op)以及功能码(func),使用case语句确定(下述代码中case语句顺序与上表相同)

`timescale 1ns / 1ns
module instr_dec(
    input [31:0] instr_code,
    output reg [31:0] i
    );
    wire [11:0] t;
    assign t = {instr_code[31:26],instr_code[5:0]};
    always @ (*)
    begin
        casez(t)
            12'b000000100000 :i = 32'b00000000000000000000000000000001;
            12'b000000100001 :i = 32'b00000000000000000000000000000010;
            12'b000000100010 :i = 32'b00000000000000000000000000000100;
            12'b000000100011 :i = 32'b00000000000000000000000000001000;
            12'b000000100100 :i = 32'b00000000000000000000000000010000;
            12'b000000100101 :i = 32'b00000000000000000000000000100000;
            12'b000000100110 :i = 32'b00000000000000000000000001000000;
            12'b000000100111 :i = 32'b00000000000000000000000010000000;
            12'b000000101010 :i = 32'b00000000000000000000000100000000;
            12'b000000101011 :i = 32'b00000000000000000000001000000000;
            12'b000000000000 :i = 32'b00000000000000000000010000000000;
            12'b000000000010 :i = 32'b00000000000000000000100000000000;
            12'b000000000011 :i = 32'b00000000000000000001000000000000;
            12'b000000000100 :i = 32'b00000000000000000010000000000000;
            12'b000000000110 :i = 32'b00000000000000000100000000000000;
            12'b000000000111 :i = 32'b00000000000000001000000000000000;
            12'b000000001000 :i = 32'b00000000000000010000000000000000;
            12'b001000?????? :i = 32'b00000000000000100000000000000000;
            12'b001001?????? :i = 32'b00000000000001000000000000000000;
            12'b001100?????? :i = 32'b00000000000010000000000000000000;
            12'b001101?????? :i = 32'b00000000000100000000000000000000;
            12'b001110?????? :i = 32'b00000000001000000000000000000000;
            12'b100011?????? :i = 32'b00000000010000000000000000000000;
            12'b101011?????? :i = 32'b00000000100000000000000000000000;
            12'b000100?????? :i = 32'b00000001000000000000000000000000;
            12'b000101?????? :i = 32'b00000010000000000000000000000000;
            12'b001010?????? :i = 32'b00000100000000000000000000000000;
            12'b001011?????? :i = 32'b00001000000000000000000000000000;
            12'b001111?????? :i = 32'b00010000000000000000000000000000;
            12'b000010?????? :i = 32'b00100000000000000000000000000000;
            12'b000011?????? :i = 32'b01000000000000000000000000000000;
            default:          i = 32'bx;
        endcase
    end
    
endmodule

 


  • 控制器

输入为指令译码器的输出

输出为控制信号,依据指令操作时间表进行设计;

逻辑表达式为:

PC_CLK = 1

IM_R = 1

Rsc4-0 = IM25-21

Rtc4-0 = IM20-16

M1 = ~(jr + j + jal)

M2 = beq + bne

M3 = jr

M4 = sllv + srlv + srav

M5 = addi + addiu + andi + ori + xori + lw + sw + slti + sltiu + lui

M6 = jal

M7 = lw

M9 = ~(sll + srl + sra + sllv + srlv + srav)

M10 = addi + addiu + andi + ori + xori + lw + sw + slti + sltiu + lui

A0 = sub + subu + or + nor + slt + srl + srlv + ori + beq + bne + slti

A1 = add + sub + xor + nor + slt + sltu + sll + sllv + addi + xori + lw + sw +beq +bne + slti +sltiu

A2 = and + or + xor + nor + sll + srl + sra + sllv + srlv +srav + andi + ori + xori

A3 = slt + sltu + sll + srl + sra +sllv + srlv + srav + slti + sltiu + lui

RF_W = ~(jr + sw + beq + bne + j)

RF_CLK = ~(jr + sw + beq + bne + j) clk

DM_w = sw

DM_r = lw

DM_cs = lw +sw

`timescale 1ns / 1ns
module operation(
    input clk,
    input z,
    input [31:0] i,
    output PC_CLK,    
    output IM_R,     
    output M1,       
    output M2,        
    output M3,        
    output M4,        
    output M5,        
    output M6,       
    output M7,       
    output M9,      
    output M10,      
    output [3:0] ALUC,
    output RF_W,     
    output RF_CLK,   
    output DM_w,   
    output DM_r,     
    output DM_cs,
    output C_EXT16
    );
    assign PC_CLK = clk;
    assign IM_R = 1;
    assign M1 = ~(i[16] | i[29] | i[30]);
    assign M2 = ( i[24] & z) | (i[25] & ~z);
    assign M3 = i[16];
    assign M4 = i[13] | i[14] | i[15];
    assign M5 = i[17] | i[18] | i[19] | i[20] | i[21] | i[22] | i[23] | i[26] | i[27] | i[28];
    assign M6 = i[30];
    assign M7 = i[22];
    assign M9 = ~(i[10] | i[11] | i[12] | i[13] | i[14] | i[15]);
    assign M10 = i[17] | i[18] | i[19] | i[20] | i[21] | i[22] | i[23] | i[26] | i[27] | i[28];
    assign ALUC[0] = i[2] | i[3] | i[5] | i[7] | i[8] | i[11] | i[14] | i[20] | i[24] | i[25] | i[26];
    assign ALUC[1] = i[0] | i[2] | i[6] | i[7] | i[8] | i[9] | i[10] | i[13] | i[17] | i[21] | i[22] | i[23] | i[24] | i[25] | i[26] | i[27];
    assign ALUC[2] = i[4] | i[5] | i[6] | i[7] | i[10] | i[11] | i[12] | i[13] | i[14] | i[15] | i[19] | i[20] | i[21];
    assign ALUC[3] = i[8] | i[9] | i[10] | i[11] | i[12] | i[13] | i[14] | i[15] | i[26] | i[27] | i[28];
    assign RF_W = ~(i[16] | i[23] | i[24] | i[25] | i[29]);
    assign RF_CLK = ~clk;
    assign DM_w = i[23];
    assign DM_r = i[22];
    assign DM_cs = i[22] | i[23];
    assign C_EXT16 = ~(i[19] | i[20] | i[21]);
endmodule

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器 的相关文章

  • 执行长字传输到 CPU 需要多少个周期和大小

    该任务针对架构 ColdFire 处理器 MCF5271 我不明白执行到 CPU 的长字传输或字传输需要多少个周期以及什么大小的周期 我正在阅读图表 但不明白其中有何联系 非常感谢任何评论 我附上了两个例子和答案 数据总线大小 https
  • 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?

    好吧 问题就在这里 我必须编写一个 MIPS 程序 从用户那里获取 2 个输入数字 然后 我必须编写一个代码来输出用户输入的 2 个数字的乘积 商和余数 现在 这非常简单 但是 我没有意识到我们不能在程序中使用乘法和除法操作数 现在我不知道
  • 多处理和并行处理之间的比较

    有人能告诉我多处理和并行处理之间的确切区别吗 我有点困惑 感谢您的帮助 多重处理 多重处理是使用两个或多个中央处理单元 单个计算机系统中的 CPU 该术语还指 系统支持多个处理器和 或的能力 在他们之间分配任务的能力 并行处理 在计算机中
  • 循环遍历阵列 MIPS 组件

    我正在开发一个循环遍历 10 个数字的数组的程序 前 9 个元素的值大于 0 第 10 个元素的值为 0 遇到 0 时循环应中断 i 0 while A i 0 A i A i 1 i 我知道如果寄存器的值等于 0 我可以使用 beq 来中
  • MIPS 寄存器 $0 可以用来存储和检索值吗?

    当我了解 MIPS 处理器时 我的脑海中牢记着读取 0 寄存器总是返回 0 而写入 0 总是被丢弃 来自 MIPS 程序员手册 2 13 4 1 CPU 通用寄存器 r0 被硬连线到一个值 零 并且可以用作任何指令的目标寄存器 结果是被丢弃
  • GPU 的延迟是多少?

    我可以找到 CPU 核心与其缓存 主内存等之间的 CPU 周期延迟 但似乎很难找到有关现代 GPU 的类似信息 有谁知道 GPU 的延迟 特别是现代 nvidia GPU GF110 或更高版本 与其内存之间的延迟 谢谢 GPU 内存确实具
  • 核心和处理器之间的区别

    核心和处理器有什么区别 我已经在谷歌上寻找过它 但我只得到了多核和多处理器的定义 这不是我正在寻找的 核心通常是 CPU 的基本计算单元 它可以运行单个程序上下文 如果支持硬件线程 例如 Intel CPU 上的超线程 则可以运行多个程序上
  • 单核上的多线程有什么意义?

    我最近一直在研究 Linux 内核 并回顾了大学操作系统课程的时代 就像那时一样 我正在玩线程之类的东西 一直以来我一直假设线程是自动在多个核心上同时运行但我最近发现您实际上必须显式编写代码来处理多个核心 那么单核上的多线程有什么意义呢 我
  • 当JVM执行Java应用程序时,操作系统的作用是什么?为什么我们需要操作系统?

    我在网上读过一些资料 有人说Java应用程序是由java虚拟机 JVM 执行的 执行 这个词让我有点困惑 据我所知 非Java应用程序 即 用C C 编写 可以由操作系统执行 在较低级别 这意味着操作系统将二进制程序加载到内存中 然后指示C
  • C# 程序占用太多CPU?

    我有一个程序 它在启动时不断地在 3 个独立的计时器之间切换 我的应用程序的主线程有一个 while 循环 它不断检查全局变量是否已设置为 true 如果设置为 true 它将停止一个计时器并启动另外两个计时器 一个连续 另一个自动停止 如
  • 查看x86架构中的cpu缓存内容

    如何查看或转储基于 x86 的架构的 cpu 缓存内容 每次进行缓存刷新时 我如何才能看到刷新了什么 在哪里 你不能 真的 CPU 缓存被设计为对于 CPU 上运行的代码是透明的 它具有加快代码执行速度的效果 但 CPU 管理有关缓存的所有
  • Linux:如何对系统内存施加负载?

    我正在开发一个小功能 它可以让我的用户了解 CPU 的占用情况 我在用着cat proc loadavg 它返回众所周知的 3 个数字 我的问题是 当我正在开发时 CPU 目前没有做任何事情 有没有一种好方法可以在CPU上产生一些负载 我在
  • 如何根据CPU能力实现渲染器

    我想知道在 JavaScript 中实现渲染器的最佳方法是什么 这里真正重要的并不是渲染的内容部分 我更想知道何时以及如何有效地运行渲染器代码 目前 我有window setInterval renderFunc 1000 20 每 50
  • MIPS 在程序中使用 $s0... 等注册并最终恢复它是否优雅

    我在 MIPS 教程中读到 只有寄存器 s0 s7 在过程调用中被保留 但我认为 也许我错了 创建有副作用的程序并不优雅 我认为程序应该只更改 v0 v1 寄存器和堆栈 如果需要的话 我是对的吗 所以我认为在我的程序中我只能使用 t0 t9
  • 哪种架构称为非均匀内存访问(NUMA)?

    根据wiki http en wikipedia org wiki Non uniform memory access 非均匀内存访问 NUMA 是一种用于多处理的计算机内存设计 其中内存访问时间取决于相对于处理器的内存位置 但尚不清楚它是
  • 大师系统要求

    我们将使用 Virtuoso 来存储 RDF 三重计数一开始将为 1 亿 我需要知道典型的 RAM CPU 磁盘等应该是什么 查询将使用 SPARQL 并且查询会有点复杂 请提供您的意见 Virtuoso 版本 6 x 三元组 四元组 的平
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚

随机推荐

  • 有趣的xss靶场

    最近发现一个在线xss靶场 挺有趣的 靶场只有12关卡 上面还写了服务区原代码 对于想入门xss的小伙伴可以试着玩一玩 结果只要实现弹窗结果为1即可 链接在这里 https xss haozi me 0x00 server code fun
  • C++基础知识 - 异常处理机制

    异常处理的基本思想 C 的异常处理机制使得异常的引发和异常的处理不必在同一个函数中 这样底层的函数可以着重解决具体问题 而不必过多的考虑异常的处理 上层调用者可以再适当的位置设计对不同类型异常的处理 异常是专门针对抽象编程中的一系列错误进行
  • 代码审查最佳实践

    代码审查是一种出色的软件工具 您绝对应该使用它来提高代码质量 但是像其他任何工具一样 有时可能会误用它 这就是为什么我提出了一些最佳做法来指导您查看同行代码的原因 代码审查不是测试 代码审查是开发人员对开发人员的业务 它不涉及任何测试 代码
  • 目标检测算法分类

    目标检测算法分类 1 两步走的目标检测 先找出候选的一些区域 再对区域进行调整分类 代表 R CNN SPP net Fast R CNN Faster R CNN 2 端到端的目标检测 采用一个网络一步到位 输入图片 输出有哪些物体 物体
  • Mysql之流程控制语句case

    CASE函数 情况1 实现等值判断 类似于switch语句 语法 CASE 要判断的字段或表达式 WHEN 常量1 THEN 要显示的值1或语句1 WHEN 常量2 THEN 要显示的值2或语句2 ELSE 要显示的值n或语句n END 案
  • 将项目部署到服务器

    首先确定各个需要被部署的应用所对应的ip 数据库类型 数据库名 中间件 应用名 版本及端口号 重要提示 主要分为六大步骤 1 部署数据库 kingbase8 导出导入数据库dmp文件 2 安装redis 系统后端需要用到redis 3 部署
  • cocos creator主程入门教程(十)—— A*寻路

    这一篇介绍A 寻路算法 在RPG SLG 模拟经营类游戏 有需要给角色寻路的需求 一般寻路我们采用A 寻路算法 A 寻路算法是一种广度优先启发性算法 先说说什么叫广度优先 搜索分为广度优先和深度优先 主要体现在对节点的展开上 深度优先一直往
  • 关于 html 或 jsp 页面调用js文件里的函数报错onclick is not defined处理方法

    错误 zygh is not defined at HTMLAnchorElement onclick 原因 function 方法写在 function 中 function 相当于匿名方法 里面是私有变量 所以页面找不到这个 funct
  • OpenCV13(摄像机显示和图像捕获 + 控制台下获取时间)

    1 摄像机测试程序 图像捕获 VS2012 OpenCV2 4 9 基于OpenCV的单个摄像机显示程序 控制台 按 c 键捕获图像 按照时间格式命名 默认C盘 Alex 2016 9 14 include stdafx h include
  • 【Python报错】在定义class时,出现AttributeError: ‘tuple‘ object has no attribute ‘describe_user‘

    请求各位大神的帮助 我在做class这一章的练习时 遇到报错 不知道如何修改 题目是要输出用户信息以及问候语 出现报错后 我有三个疑惑点 1 tuple指的是程序中的哪一部分 2 为什么会出现识别为tuple的情况 3 如何纠正这个错误 求
  • 关于使用STM32CubeMx配置串口出现的一些问题

    一 使用CubeMX配置好串口中断的工程 打开工程添加相关代码后串口没有数据输出或者看不见数据但串口助手的RX会一直增加的问题 参考 这里 大概意思就是时钟的原因 需要把stm32f4xx hal conf h文件中的时钟改一下 将25MH
  • Write Amplification Analysis in Flash-Based Solid State Drives

    Write Amplification Analysis in Flash Based Solid State Drives 摘要 第一部分 第二部分 第三部分 此文发表于2009年 摘要 写入放大是限制基于NAND闪存的存储设备中的随机写
  • 华为OD机试真题 Java 实现【水仙花数】【2022Q4 100分】

    一 题目描述 所谓水仙花数 是指一个n位的正整数 其各位数字的n次方和等于该数本身 例如153是水仙花数 153是一个3位数 并且153 1 3 5 3 3 3 二 输入描述 第一行输入一个整数n 表示一个n位的正整数 n在3到7之间 包含
  • 深入剖析C语言结构体内存对齐:轻松计算结构体大小的技巧

    本篇博客会讲解C语言结构体的内存对齐 并且给出一种快速计算结构体大小的方式 主要讲解下面几点 结构体的内存对齐是什么 如何快速计算结构体的大小 如何利用内存对齐节省结构体占用的内存空间 为什么结构体要内存对齐 如何修改默认对齐数 结构体内存
  • 国际版腾讯云阿里云免费开户:全站加快 DCDN 重磅发布!打造新一代加快引擎

    腾讯云全站加快 DCDN 重磅发布 打造新一代加快引擎 在数字化转型革新逐渐深化的当下 安全高效成为企业上云 全球化布置的要害需求 跟着运用场景复杂度不断提高 事务需求差异化开展 为了给企业供给更完善的安全加快服务 阿里云对全站加快DCDN
  • ubuntu 16.04安装提示end Kernel panic

    问题描述 ubuntu 最新版本VM虚拟机安装时出现错误end kernel panic not syncing corrupted stack end detected inside scheduler的解决方式 解决办法 选择自定义安装
  • 剑指 Offer 20. 表示数值的字符串

    表示数值的字符串 思路 多边界的问题 求解 package swordPointingToTheOffer public class Twenty public static boolean isNumber String s 空格 小数点
  • js解决0.1+0.2==0.3的问题的几种方法

    js解决0 1 0 2 0 3的问题的几种方法 JavaScript有7种基本类型分别是 Undefined Null Boolean String Number Symbol Object 对于JS中的Number类型 不区分整数和浮点数
  • 外挂编写完全攻略

    外挂编写完全攻略一 先说一下写一个外挂需要什么条件 1 熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的 拥有熟练的C语言知识是写外挂的基本条件 2 具有很强的汇编基础 一般游戏都不可能有原代码的 必须 反汇编或者跟踪的办法来探索
  • 31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器

    说在前面 开发环境 Vivado 语言 Verilog cpu框架 Mips 控制器 组合逻辑 指令译码器 我们需要根据一条32位的指令的结构确定是哪一条指令 可以根据操作码 op 以及功能码 func 使用case语句确定 下述代码中ca