数字电路设计之五级流水线设计(CPU)

更新时间:2023-06-04 06:54:43 阅读: 评论:0

数字电路设计之五级流⽔线设计(CPU)
这个流⽔线应该是我⼤⼆上的时候的最⾼⽔平了,现在看起来确实很简单,代码风格也不是很好,没有模块化,⽽且这些指令也不是严格的mips的所有指令,是⾃⼰定义的⼀些。但是放在博客⾥也算是对⾃⼰过去的⼀个总结吧!
现在再看这个代码,我觉得写得太恶⼼了,没有注释,没有说清楚关键的地⽅。我⾃⼰都忘了为什么这么写~~
后来发现有⾮常坑爹的Bug祝好!!!我没有改过来了~~~
• 实验步骤
1.先写好CPU的指令集。
2.根据指令集先把⼀些基本的指令实现,⽐如LOAD,STORE等,把⼤概的流⽔线先画出框图。画出框图后,把基本指令实现。调试,仿真。
3.在2的基础上加⼊别的指令,考虑好hazard的问题
4.优化代码代码,调试,simulation。
· 实验原理
流⽔线是数字系统中⼀种提⾼系统稳定性和⼯作速度的⽅法,⼴泛应⽤于⾼档CPU的架构中。根据MIPS处理器的特点,将整体的处理过程分为取指令(IF)、指令译码(ID)、执⾏(EX)、存储器访问(MEM)和寄存器会写(WB)五级,对应多周期的五个处理阶段。⼀个指令的执⾏需要5个时钟周期,每个时钟周期的上升沿来临时,此指令所代表的⼀系列数据和控制信息将转移到下⼀级处理。
流⽔线寄存器负责将流⽔线的各部分分开,共有IF/ID、ID/EX、EX/MEM、MEM/WB四组。根据前⾯
的介绍可知,四组流⽔线寄存器要求不完全相同,因此设计也有不同考虑。
(1)EX/MEM、MEM/WB两组流⽔线寄存器只是普通寄存器。
(2)当流⽔线发⽣数据跳转时,需清空ID/EX流⽔线寄存器⽽插⼊⼀个⽓泡,因此ID/EX流⽔线寄存器是⼀个带同步清零功能的寄存器。
需要注意的是,由于仿真对初始值的要求,上述寄存器都应考虑有ret信号的接⼊,以提供仿真时各寄存器的初值。
流⽔线:
取址:处理器从指令存储器中读取指令
译码:处理器从寄存器⽂件中读取源操作数并对指令译码产⽣控制信号
执⾏:处理器使⽤ALU执⾏计算
存储器访问:处理器从数据存储器中读取或者写⼊数据
写回:若是LOAD指令,将结果写回寄存器⽂件。
>>加、减电路的设计考虑
减法、⽐较及部分分⽀指令(B N、BNE等)均可⽤加法器和必要的辅助电路来实现。对ALU来说,它的两个操作数输⼊时都已经是补码形式,当要完成两个操作数的减法时,即A补-B补,可将减法转换为加法,利⽤加法器来实现:
›A补-B补= A补+(-B补)= A补+(B补)补= A补+(B补)反+1
草字头占读什么加法器完成的功能为:
sum=A+~B+1。即可完成加减运算。
由于32位加法器的运算速度影响着CPU频率的⾼低,因此设计⼀个⾼速加法器尤为重要,本实验采⽤的是超前进位加法器,不过弄出来的速度⽐不过描述级语⾔写出的加法,所以后来加法就改成直接加了。
⽐较电路的设计考虑
对于⽐较运算,如果最⾼为不同,即A[31]≠B[31],则根据A[31]、B[31]决定⽐较结果,但应注意有符号数和⽆符号数⽐较运算的区别。
①在有符号数⽐较SLT运算中,判断A<B的⽅法为:
若A为负数、B为0或正数:A[15]&&(~B[15])
若A、B符号相同,A-B为负:(A[15]~^B[15]) && sum[15]
则SLTResult=(A[15]&&(~B[15])) ||( (A[15]~^B[15]) && sum[15])
②在⽆符号数⽐较SLT运算中,判断A<B的⽅法为:
若A最⾼位为0、B最⾼位为1:(~A[15] )&&B[15]
若A、B最⾼位相同,A-B为负:(A[15]~^B[15]) && sum[15]
则SLTResult=((~A[15] )&&B[15]) ||( (A[15]~^B[15]) && sum[15])
算术右移运算电路的设计考虑:海怪怎么吃
Verilog HDL的算术右移的运算符为“<<<”。要实现算术右移应注意,被移位的对象必须定义为reg类型,但是在SRA指令,被移位的对象操作数B为输⼊信号,不能定义为reg类型,因此必须引⼊reg类型中间变量B_reg,相应的Verilog HDL语句为:
reg signed [31:0] B_reg;
always @(B) begin
B_reg = B;  end
引⼊reg类型的中间变量B_reg后,就可对B_reg进⾏算术右移操作。
逻辑运算:
与、或、或⾮、异或、逻辑移位等运算较为简单,只是要注意⼀点,AND、XOR、OR三条指令的⽴即数为16位⽆符号数,应“0扩
展”为32位⽆符号数,在运算的同时完成“0扩展”。
CPU的verilog代码:
`timescale 1ns / 1ps
小狗的资料
// state macro define日xxx
`define idle 1'b0
北京市昌平区
`define exec 1'b1
// instruction macro define
`define NOP 5'b00000
`define HALT 5'b00001
`define LOAD 5'b00010
`define STORE 5'b00011
`define SLL 5'b00100
`define SLA 5'b00101
`define SRL 5'b00110
`define SRA 5'b00111
`define ADD 5'b01000
元宝馄饨
`define ADDI 5'b01001
`define SUB 5'b01010
`define SUBI 5'b01011
`define CMP 5'b01100宋襄
`define AND 5'b01101
`define OR 5'b01110
`define XOR 5'b01111
`define LDIH 5'b10000
`define ADDC 5'b10001
`define SUBC 5'b10010
`define JUMP 5'b11000
`define JMPR 5'b11001
`define BZ 5'b11010
`define BNZ 5'b11011
`define BN 5'b11100
`define BNN 5'b11101
`define BC 5'b11110
`define BNC 5'b11111
// general register
`define gr0 3'b000
`define gr1 3'b001
`define gr2 3'b010
`define gr3 3'b011
`define gr4 3'b100
`define gr5 3'b101
`define gr6 3'b110
`define gr7 3'b111
module CPU(input wire  ret,
input wire  enable,          //make the
input wire  start,          //start CPU
input wire  clock,          //clock
input wire  [15:0]i_datain,  //instruction
input wire  [15:0]d_datain,  //data from memory
output reg  d_we,            //write enable
output wire [7:0]i_addr,    //pc
output reg  [7:0]d_addr,    //output adder for data memory
长单词output reg  [15:0]d_dataout  //output data to data memory
);
reg [15:0]gr[7:0];            //register file
reg state,next_state;          //to control the CPU
assign i_addr      =    pc;
//************* CPU control *************//
always @(podge clock)
begin
if (!ret)
state <= `idle;
el
state <= next_state;
end
always@(*)
begin
ca (state)
`idle :
if ((enable == 1'b1) && (start == 1'b1))
next_state <= `exec;
el
next_state <= `idle;
`exec :
if ((enable == 1'b0) || (wb_ir[15:11] == `HALT))
next_state <= `idle;
el
next_state <= `exec;
endca
end
//_______________________________________________
reg [15:0]id_ir;
reg [7:0]pc;
//************* IF *************//
always@(podge clock or negedge ret)
begin
if (!ret)
begin
id_ir <= 16'b0000_0000_0000_0000;
pc <= 8'b0000_0000;
end
el if (state ==`exec)
begin
if(((ex_ir[15:11] == `BZ) && (zf == 1'b1)) || ((ex_ir[15:11] == `BN) && (nf == 1'b1))||

本文发布于:2023-06-04 06:54:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/857136.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   运算   寄存器   没有   考虑   完成   加法   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图