-
真值表
Jump M2reg Wmem ALUop[2:0] ALUimm Wreg Regrt sext add 0 0 0 000 0 1 0 0 sub 0 0 0 001 0 1 0 0 and 0 0 0 010 0 1 0 0 or 0 0 0 011 0 1 0 0 slt 0 0 0 100 0 1 0 0 addi 0 0 0 000 1 1 1 1 andi 0 0 0 010 1 1 1 0 ori 0 0 0 011 1 1 1 0 slti 0 0 0 100 1 1 1 1 sw 0 0 1 000 1 0 1 1 lw 0 1 0 000 1 1 1 1 j 1 0 0 xxx 0 0 x 0 nop 0 0 0 xxx 0 0 x 0 输入:运算符号func,操作符号op;输出Jump,M2reg,Wmem,ALUop,ALUimm,Wreg,REgrt,sext。这些输出所对应的含义我将在第二部分的说明文档里面解释清楚。
- 【仿真截图】
- ![ALU](D:\digital design\project_1\ALU.jpg)
- 输入op,A,B;输出zero,result
- 当
op
为0,1,2,3,4时,分别表示add,sub,and,or,slt运算,result
输出结果,zero
表示结果是否为0,主要用于地址跳转时的作用 - 仿真与功能说明:在0
10ns的时候,result的结果等于A+B;在1020ns是result的结果等于A-B;在2030ns的时候,result的结果等于A&B;当3040ns的时候,result的结果等于A|B。这样的一个模块,主要负责单周期cpu中将指定地址中的数据取出后进行操作的这样的一个功能
- 【仿真截图】
- ![regfile](D:\digital design\project_1\regfile.jpg)
- 输入:clk,WE,Regwriteaddress,Regwritedata,rsadd,rtadd;输出:rsdata,rtdata
WE
为使能信号,1的时候允许写入数据,0的时候只允许读出数据;clk
为时钟信号,在上升沿的时候如果WE
为1,则将Regwritedata
写入Regwriteaddress
的位置;rsadd
,rtadd
为要求的rs
,rt
的地址,使用组合电路的逻辑输出对应地址的数据到输出rsdata
,rtdata
中去- 仿真与功能说明:从仿真波形图中,我们可以看到在40ns的时刻Regwritedata发生了变化,从4变为6,在下一个时钟下降沿,则成功的将数据写入Regwriteaddress对应的位置,可以从rsdata和rtdata的输出数据看出设计模块的准确性。这样的一个模块主要用于完成从cpu的寄存器中取出数据和重新写入的功能,扮演了RAM的角色。
- 【仿真截图】
- ![Datamemory](D:\digital design\project_1\Datamemory.jpg)
- 输入:WE,address,datainput;输出:dataoutput
WE
为使能信号,当WE
为1时候将datainput
输入到address
对应的存储单元中去;当WE
为0的时候将address
对应的存储单元中的数据输出到dataoutput
- 仿真与功能说明:从仿真波形图中可以看出,在40ns之前,WE=1,即存储器进行写的操作,就是将数据6写入地址为4与6的位置;40ns之后WE=0,进行读取操作,将之前写入地址6位置的数据6输出,可以证明模块功能仿真的正确性。这样的一个模块主要扮演了一个存储器的作用,负责将寄存器的数据写入并储蓄,也负责在必要的时候将先前存储的数据写回寄存器进行下一步的计算。
- 【仿真截图】
- ![instruction_mem](D:\digital design\project_1\instruction_mem.jpg)
- 输入:address;输出:op,rs,rt,rd,immediate,func,label
- 该module的主要功能,就是根据输入的address,到mem之中取出对应的指令,并按照位数分割到输出
op
,rs
,rt
,rd
,immediate
,func
,label
中去 - 仿真与功能说明:主要是接受pc计数器所指的指令位置,在指定地址处取出指令并将其分隔为各个参数。由于每次指令都是4的倍数,所以将32位的指令存储在4个8位的寄存器中,方便每次读取下一条指令的地址
- 【仿真截图】
- ![PC计数器](D:\digital design\project_1\PC计数器.jpg)
- 输入:clk,reset,enable,newaddress;输出:currentaddress
clk
为时钟信号,enable
为使能信号,输入下一条指令的地址newaddress
,在时钟上升沿时输出当前指令地址currentaddress
- 仿真和功能说明:从仿真截图中可以看到,pc模块在时钟的上升沿进行输出下一条指令的地址,reset复位信号默认从0也就是第一条指令开始执行,在使能信号enable=1的情况下,不断按照时钟进行更新指令地址;enable=0的时候,不再进行更新,保持上一次输出的数据保持不变。在单周期cpu设计中,主要负责指令地址的更新,输入数据是下一条指令的地址或者是指定跳转的指令地址
- 【仿真截图】
- 其中输入
sext
表示选择进行符号位扩展还是零扩展,1表示符号位扩展,0表示零扩展,输入a
表示待扩展的16位立即数,输出b
表示扩展完成后的结果 - 这个模块的功能比较简单,主要就是负责符号位扩展和零扩展。从仿真波形图中也可以看到,当零扩展时,直接在左侧补0,将16位数据扩展为32位数据;当符号位扩展时,将16位数据中的最高位,也就是符号位,将32位数据的前16位进行填充。在单周期cpu设计中,主要用于I类型的指令的立即数在之后的alu计算过程中的数据扩展作用。
- 【仿真截图】
- 其中输入
control
为控制信号,1表示out
输出in_1
,0表示out
输出in_2
- 在单周期cpu设计过程中,主要使用的地方是寄存器地址选择的地方,用于区分R类型指令和I类型的指令,用于选择取出数据并计算之后写入的地址是rt还是rd
- 【仿真截图】
- ![choose_32](D:\digital design\project_1\choose_32.jpg)
- 主要功能和choose_5大体相同,唯一的区别是把输入
in_1
和in_2
改为32位的数据选择 - 在单周期cpu设计过程中,32位的数据选择器主要用于三个地方:第一个是寄存器读入的数据的选择上究竟是选择输入从存储器的指定位置取出的数据还是先前寄存器取出数据进行计算的结果;第二个是alu运算单元进行数据计算的时候第二个操作数是R类型下的rt地址下的寄存器数据,还是说是I类型指令下的立即数数据;第三个是pc计数器进行新地址数据的接受的时候,需要对于新的指令地址是下一条指令还是说是j指令指定的指令进行相应的选择。