-
指令译码器
2019-12-21 10:47:00 -
并行CISC指令译码器的设计与实现
2009-04-11 15:02:12并行CISC指令译码器的设计与实现;并行CISC指令译码器的设计与实现 -
模型机CPU设计——指令译码器(2)
2019-12-21 20:56:001指令译码器: (1)部件功能: 通过指令系统表设计一个由指令码映射到指令信号的译码器。对IR传送的机器码进行译码,产生相应的控制信号以及为下一个部件提供输入,其中指令码为8位二进制码,译码器的输出端为指令...博客简介
本篇博客是实验设计:《模型机CPU设计》整套实验报告内容之一,包括构架,分部件和性能分析三个大的模块,每个模块又细分为小的部分,历时1.5周完成。最后实验验收的分为满分。现在将其分享出来,希望能给后续的实验同学一个参考,少走不必要的弯路,设计出性能更优的CPU。
资源下载
设计CPU时,一路做了有三个版本,链接如下:
- CPU1.0版本是第一代版本,由于刚开始设计,没有做性能的优化,此版本的优点是布局间隙大,线路较为清晰,如果你刚开始设计,那么这个版本可以更好地让你迅速设计出一个CPU CPU1.0版本压缩包下载
- CPU2.0版本是第二代版本,也是我验收的版本,这个版本对版本一做了布局和时序性能的优化,性能达到了作者当时的巅峰CPU2.0版本压缩包下载
- CPU3.0版本是第三代版本,对第2代版本做了更深层次的优化,解决了RAM不稳定的问题CPU3.0版本压缩包下载
- 这篇博客是整个实验的一部分,全套内容请参考:逻辑与计算机设计基础CPU实验
组合部件:
1指令译码器:
(1)部件功能:
通过指令系统表设计一个由指令码映射到指令信号的译码器。对IR传送的机器码进行译码,产生相应的控制信号以及为下一个部件提供输入,其中指令码为8位二进制码,译码器的输出端为指令操作。
(2)接口设计:
输入:
a,b表示由IR传送来的数据
EN是使能信号
输出:
MOVA用来传送(R2)→ R1操作的使能信号
MOVB用来传送(R2)→(C)操作的使能信号
MOV用来传送((C))→R1操作的使能信号
ALU分别用来传送(R1)+(R2)→R1操作(R1)-(R2)→ R1操作(R1)∨(R2)→ R1操作的使能信号
NOT用来传送R1 /(R1)→ R1操作的使能信号
SHL和SHR用来传送循环左右移位操作的使能信号
JMP,JC,JZ 则用来传送PC跳转到指定address操作的使能信号
IN传送向R1写入操作的指令
OUT传送由寄存器中读出R1的操作的指令
HALT传送停机指令(2)功能实现:
对每一种输入情况进行译码,对应每一种二进制编码,存储在一个临时变量temp里,在对temp讨论输出结果:
指令的汇编符号 指令的功能 指令的二进制编码
(4)功能仿真验证:
仿真结果:
输入1111 R1 R2 执行MOV M操作,此时MOVA=1
输入1111 11 R2 执行MOV R1,M的操作此时MOVB=1
输入1111 R1 11 执行MOVC的操作,此时MOVC=1
输入1001 R1 R2执行(R1)+(R2)→ R1 ALU=1
输入0110 R1 R2执行(R1)-(R2)→ R1 ALU=1
输入1011 R1 R2执行(R1)∨(R2)→ R1 ALU=1
输入0101 R1执行 /(R1)→ R1 ALU=1
输入1010 R1 00执行循环右移一位RSL=1
输入1010 R1 00执行循环右移一位RSR=1
输入0001 00 00,0001 00 01,JMP为1或JZ为1或JC为1
输入0010 R1XX 执行输入操作IN=1
输入0100 R1XX 执行输出操作OUT=1
输入01110000执行NOP操作NOP=1
输入10000000 执行停机操作HALT=1
对于其他输入,这里用了一个小的技巧,都译码为NOP表示跳转到下一条指令表示跳过这条指令,也就是译码结果为NOP=1
结论:仿真结果满足功能要求,设计正确希望大家能够合理借鉴,少走弯路,重在创新,设计出更加优秀的CPU.
-
开放式CPU设计 实验程序 实验CPU:指令译码器
2009-12-02 15:38:16开放式CPU设计 实验程序 实验CPU:指令译码器 所有程序均编译测试通过 请放心下载 -
论文研究-并行CISC指令译码器的设计与实现.pdf
2019-07-22 22:26:44针对x86系列兼容微处理器串行译码速度慢、效率低的缺点,提出了一种并行译码器设计方案。该方案将整个译码过程分为长度译码和地址译码两个阶段进行流水译码,在指令不带前缀的情况下单拍完成长度译码,支持任意两条... -
(萌新的数电学习)用 VHDL语言设计模型机指令译码器
2020-12-10 21:19:17实验背景:通过指令系统表我们可以设计一个由指令码映射到指令信号的译码器。其中指令码为 8 位二进制码,译码器的输出端为指令操作。 VHDL代码 Library IEEE;--库声明 USE IEEE.std_logic_1164.all; ENTITY ...实验背景:通过指令系统表我们可以设计一个由指令码映射到指令信号的译码器。其中指令码为 8 位二进制码,译码器的输出端为指令操作。
VHDL代码library ieee; use ieee.std_logic_1164.all; entity moxingji is port(a: in std_logic_vector(7 downto 0); en:in std_logic; MOVA,MOVB,MOVC,ADD,SUB,OR0,NOT0,RSR,RSL,JMP,JZ,JC,IN0,OUT0,NOP,HALT: out std_logic); end moxingji; architecture aaa of moxingji is signal x: std_logic_vector(0 to 7); signal R1,R2: std_logic; begin x<=not a; R1<=not(a(0)and a(1)and a(2)and a(3)and a(4)and a(5)and en); R2<=not(a(0)and a(1)and a(2)and a(3)and a(6)and a(7)and en); MOVA<=a(0)and a(1)and a(2)and a(3)and R1 and R2 and en; --1111xxxx-111111xx-1111xx11 MOVB<=a(0)and a(1)and a(2)and a(3)and a(4)and a(5)and en; --111111xx MOVC<=a(0)and a(1)and a(2)and a(3)and a(6)and a(7)and en; --1111xx11 ADD<=a(0)and x(1)and x(2)and a(3)and en; --1001 SUB<=x(0)and a(1)and a(2)and x(3)and en; --0110 OR0<=a(0)and x(1)and a(2)and a(3)and en; --1011 NOT0<=x(0)and a(1)and x(2)and a(3)and en; --0101 RSR<=a(0)and x(1)and a(2)and x(3)and x(6)and x(7)and en; --101000 RSL<=a(0)and x(1)and a(2)and x(3)and a(6)and a(7)and en; --101011 JMP<=x(0)and x(1)and a(2)and a(3)and x(4)and x(5)and x(6)and x(7)and en; --00110000 JZ<=x(0)and x(1)and a(2)and a(3)and x(4)and x(5)and x(6)and a(7)and en; --00110001 JC<=x(0)and x(1)and a(2)and a(3)and x(4)and x(5)and a(6)and x(7)and en; --00110010 IN0<=x(0)and x(1)and a(2)and x(3)and en; --0010 OUT0<=x(0)and a(1)and x(2)and x(3)and en; --0100 NOP<=x(0)and a(1)and a(2)and a(3)and x(4)and x(5)and x(6)and x(7)and en; --01110000 HALT<=a(0)and x (1)and x(2)and x(3)and x(4)and x(5)and x(6)and x(7)and en; --10000000 end aaa;
-
31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器
2019-03-21 19:50:07指令译码器 我们需要根据一条32位的指令的结构确定是哪一条指令 可以根据操作码(op)以及功能码(func),使用case语句确定(下述代码中case语句顺序与上表相同) `timescale 1ns / 1ns module instr_dec( ...- 说在前面
开发环境: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
-
Intel Core & Enhanced Core架构/微架构/流水线 (6) - 指令预译码/指令队列/指令译码
2019-01-03 17:12:06指令预译码器从指令Cache或者指令预取缓存区中接收16字节的指令流,执行如下的预译码操作: 确定每条指令的长度(注:x86指令是变长指令) 译码每条指令的指令前缀 为译码器标记每条指令的不同属性(例如,“是... -
3-8译码器设计
2020-12-09 00:30:45本关任务:在Logisim中,利用上一关中设计的2-4译码器级联来构建3-8译码器,使能信号Enable高电平有效。 相关知识 译码器(Decoder)能将二...计算机中通常有地址译码器、指令译码器等。 利用2-4译码器级联扩展构建3-8 -
2-4译码器设计
2020-12-09 00:29:19在Logisim中,设计一个高电平有效2线-4线译码器,使能Enable高电平有效。 相关知识 译码器(Decoder)能将二进制代码的特定含义翻译...计算机中通常有地址译码器、指令译码器等。 2-4译码器的电路原理图如下: ... -
元器件应用中的中规模组合逻辑电路集成译码器
2020-11-13 17:41:52译码器的使用场合非常广泛,例如,数字仪表中的各种显示译码器,计算机中的地址译码器、指令译码 器,通信设备中由译码器构成的分配器,以及各种代码变换译码器等。在实际应用中,有许多译码器集成 芯片可供选择,... -
译码器
2019-09-29 10:53:33概述 译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义“翻译”出来的过程叫做...译码器的主要工作是指令译码 转载于:https://w... -
低电平译码器LS138设计
2020-12-09 00:32:29在Logisim中,设计一个低电平有效的3-8译码器,使能信号有三个:G1、nG2a、nG2b。集成电路编码74LS138。 相关知识 译码器(Decoder)能将二进制代码的特定含义翻译...计算机中通常有地址译码器、指令译码器等。 ... -
论文研究-TD-SCDMA中基于SIMD指令的Turbo译码器实现 .pdf
2019-08-18 09:53:31TD-SCDMA中基于SIMD指令的Turbo译码器实现,刘峰,彭涛,在3G以及4G移动通信系统中,由于Turbo码出色的纠错性能,使得它在物理层比特级信道编码中备受重视。为了降低成本,在通用处理器上实 -
实验一 软件操作、译码器实现
2020-11-11 19:58:56实验一 软件操作、译码器实现 一、实验目的 1.... 2.... 1、熟悉QuartusII软件的基本操作,了解各种设计输入方法(原理图设计、文本设计、波形设计) ...用VHDL语言设计模型机指令译码器,最后仿真验证。 三... -
CPU和GPU都属于冯·诺依曼结构,指令译码执行,共享内存。FPGA之所以比CPU、GPU更快,本质上是因为其无指令...
2019-12-05 20:53:44CPU和GPU都属于冯·诺依曼结构,指令译码执行,共享内存。FPGA之所以比CPU、GPU更快,本质上是因为其无指令,无共享内存的体系结构所决定的。 冯氏结构中,由于执行单元可能执行任意指令,就需要有指令存储器、译码... -
可编程Viterbi译码器设计与实现
2020-10-17 11:30:24卷积编码作为一种优秀的信道编码方式,已被广泛应用在卫星通信和...设计了专用的处理器架构,并对(2,1,7)格式的编码进行了ASIC实现,对两种设计的性能进行了对比,可编程Viterbi译码器的最大工作频率为123 MHz。 -
Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (7) - 流水线前端/译码后指令缓存
2019-01-08 16:37:26译码后微指令缓存存储指令译码器生成的微指令。以后当这些微指令需要被执行时,可以直接从缓存中获取,而不再需要这些微指令的取指和译码阶段,从而节省前端的能耗,消除译码延迟。微指令缓存... -
Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (5) - 流水线前端传统译码器
2019-01-07 13:25:41传统的译码流水线由下列部件/单元构成:指令地址转换旁查缓冲区ITLB,指令缓存,指令预译码器,指令译码单元(一个复杂译码器/三个简单译码器)。 Instruction Cache和ITLB 指令读取是通过ITLB查询然后在指令缓存... -
指令寄存器
2020-12-28 19:49:18指令寄存器(Instructions ... 指令译码器就是做这项工作的。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后,即可向操作控制器发出具体操作的特定信号。 指令寄存器对用户是完全透明的 ... -
Nios在通用编译码器中的应用
2020-10-22 17:52:35长期以来,Altera一直推行嵌入式处理器战略的原因是,随着应用的ASIC开发日益受到成本的困扰,OEM日渐转向FPGA来构建...这3种产品具有32位处理器的基本结构单元--32位指令大小,32位数据和地址路径,32位通用寄存器和32 -
计算机控制器,运算器
2020-01-19 14:56:12控制器是协调和控制计算机运行 程序计数器 程序计数器用来存储下一条指令的地址 循环从程序计数器中拿出指令 当指令被拿出时,指向下一个指令 ... 指令译码器是控制器的主要部件之一 ... -
【计算机系统】CPU指令执行流程与指令流水线原理
2020-06-19 09:49:50指令译码器ID EXE CPU内各个单元:ALU、Cache、Registers .etc MEM WB 状态寄存器FR、Registers. etc 表1 在上述各阶段CPU与内存的交互时,还涉及系统总线如AB、CB、DB等 1、取指阶段(IF, Instruction ... -
logisim单总线CPU设计(定长指令周期3级时序)(HUST).txt
2020-06-05 19:13:03MIPS指令译码器设计 2 定长指令周期---时序发生器FSM设计 3 定长指令周期---时序发生器输出函数设计 4 硬布线控制器组合逻辑单元 5 定长指令周期---硬布线控制器设计 6 定长指令周期---单总线CPU设 -
CPU指令结构你知道吗?
2020-08-28 07:22:14控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等组成,对协调整个电脑有序工作极为重要。它根据用户... -
计算机原理--计算机的控制器
2020-08-24 17:33:22计算机的控制器程序计数器时序发生器指令译码器指令寄存器主存地址寄存器主存数据寄存器通用寄存器 程序计数器 程序计数器用来存储下一条指令的地址 循环从程序计数器中拿出指令 当指令被拿出时,指向下一条指令 ... -
【冬瓜哥手绘】致敬龙芯!冬瓜哥手工设计了一个CPU译码器!
2015-08-25 07:40:54冬瓜哥手绘了一个2指令2周期的CPU译码器!当然,冬瓜哥只是用这个例子尝试向大家分享一些底层电路层面的设计,让大家对其原貌有个感性认识,并希望有更多的人研究和从事底层系统工作。有人说做底层的都是loser,那...