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)-(八)上代码→指令译码以及控制器 的相关文章

  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • MIPS——这重要吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题 了解 MIPS 编程语言有用吗 我是一名计算机科学学生 正在上一门以 MIPS 为重点的汇编课程 我很擅长使用高级语言进行编写 但 M
  • 如何使用 MPLAB X 中的 mips 汇编为每个宏调用创建唯一的标签

    我有一个执行比较的宏 如果比较不正确 则跳转到宏的末尾 这是一个简化的示例 macro do work if value not zero value li s0 value bne s0 zero exit label nop Do wo
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失
  • 将 CPU 频率指定为 Linux 启动时的内核 CMD_LINE 参数?

    我将笔记本电脑的i5 CPU更换为i7 CPU 这样它可以运行得更快 但由于i7的功率更大 温度也比以前更高 所以我的笔记本经常死机 所以 我使用cpupower来指定CPU的最大频率 它起作用了 现在 我的问题是 有没有办法在启动时将CP
  • 查看x86架构中的cpu缓存内容

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

    我正在开发一个小功能 它可以让我的用户了解 CPU 的占用情况 我在用着cat proc loadavg 它返回众所周知的 3 个数字 我的问题是 当我正在开发时 CPU 目前没有做任何事情 有没有一种好方法可以在CPU上产生一些负载 我在
  • 如何将三地址代码转换为MIPS汇编语言?

    我正在做一个项目 其中我必须创建一个翻译器来为 C 代码生成 MIPS 汇编代码 正在使用的编程语言是 C 我已经完成了三个地址代码的生成 但我对如何进一步进行感到非常困惑 如前所述 这是直接翻译 确实没有什么需要澄清的 以下面的三地址代码
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

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

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • 分支预测器和分支目标缓冲区如何共存?

    我的问题是它们如何在现代 CPU 架构中共存并协同工作 你把它稍微颠倒了 每次获取时 您都会索引到分支预测器 它会告诉您刚刚收到的指令是否will be解码为已采取的分支 如果没有 则获取下一个连续地址 但是 如果您的分支预测器说它将是一个
  • 裸机交叉编译器输入

    裸机交叉编译器的输入限制是什么 比如它不编译带有指针或 malloc 的程序 或者任何需要比底层硬件更多的东西 以及如何才能找到这些限制 我还想问 我为目标 mips 构建了一个交叉编译器 我需要使用这个交叉编译器创建一个 mips 可执行
  • 内核模块未加载(但 insmod 返回 0)

    我必须向现有设备 mips arch 添加一些功能 我已经尝试了几个 SDK 目前我取得了一些进展 但是 insmod 返回 0 成功 并且 lsmod 显示它们 但是 printk 和 create proc entry 都不起作用 但我
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的
  • 使用Python获取CPU温度?

    如何使用 Python 检索 CPU 的温度 假设我在Linux上 有一个较新的 sysfs 热区 API http shallowsky com blog linux kernel sysfs thermal zone html 也可以看
  • Linux 内核中是否使用了扩展指令集(SSE、MMX)?

    好吧 它们带来 至少应该带来 性能的巨大提升 不是吗 所以 我还没有看到任何 Linux 内核源代码 但很想问 它们是否以某种方式被使用 在这种情况下 对于没有此类指令的系统 必须有一些特殊的 代码上限 SSE 和 MMX 指令集在音频 视
  • prometheus中每个节点的CPU使用率

    理想情况下 我必须找出每个节点上 Pod 的 CPU 使用率百分比 但我试图找出每个节点的CPU使用率 我已经编写了查询 但它给了我超过 100 可以是 150 200 即使包含多个 cpu 的情况 我取了平均值 您能帮我理解下面的查询有什
  • Nodejs 异步函数是否使用所有 CPU 核心?

    如果我使用异步函数或带有回调的函数 例如本机 fs 模块 http 等 它们会默认在所有 cpu 核心上运行吗 或者整个系统只使用 1 个核心 Node js 中的一些异步操作 例如文件 I O fsmodule 将通过 libuv 中的线

随机推荐

  • 有趣的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