这一段的内容和上一章紧密结合,主要是根据指令和数据通路设计
    1)PC的输入生成逻辑GenNextPC一共有四选一部件
    1>in0对应的顺序取指的PC(即PC+4)
    2>in1对应PC加上保存下来的分支指令的offset
    3>in2对应PC高位拼接上保存下来的直接跳转指令instrindex
    4>in3对应通用寄存器读端口1的数据读入。
    将该四选一的选自信号sel
    nextpc设计为“零-独热码”信号宽4比特,每个比特对应一个数据输入 任何一个合法的选择信号只有一个比特设置为1.
    2)对于指令RAM得我片选信号inst_inst_en高电平有效。对于现在的单周期CPU ,只要CPU的复位撤销,该信号就恒为1。
    3)对于指令RAM的写使能信号inst_ram_en高电平有效。目前不考虑自修改代码之类的操作。所以RAM不会有来自RAM的写的请求。同时,指令RAM的内容初始化是由FPGA内部的电路自行加载完成的,不是通过外部设备写入的。所以inst_ram_wen信号恒为0。
    4)ALU的源操作数输入的slu_src1的生成逻辑GenALUSrc1中包含一个三选一部件,三个输入依次是,
    1)in0对应通用寄存器端读端口1的数据读出。
    2)in1对应PC
    3)in2对应指令码的sa域零扩展至32位。
    该三选一的选择信号设计为“零-独热码”共3bit。
    5)ALU的源操作数输入alu_src2的生成逻辑GenALUSrc2中包含一个“三选一”部件,器三个输入依次是:
    1>in0对应的通用寄存器堆的读端口2的数据读出
    2>in1对应指令码的imm域符号扩展至32位
    该三选一部件的选择信号sel_alu_src1设计为“零-独热码”共3比特
    6)ALU内部的多路选择器的选择经由alu_op再次译码产生,alu_op设计为“零-独热码”每一位ALU支持一种操作,共12位,每一位与操作之间的对应关系如表所示
    A31A1F92-A2A3-47AD-8EE1-A62FDAEAB78C.jpeg

    ALU一种操作可能对应多种指令。通过将不同指令间的相同操作数提取出来,可以生成相同的ALU操作码。这样做使得设计ALU内部数据通路的控制信号时只关注ALU所实现的操作而不是指令。(?)可以降低设计的复杂度。
    7)对于数据RAM的片选信号data_ran_en,高电平有效。与指令RAM类似,也将此信号恒置为1
    8)对于RAM的写使能信号data_ram_wen,高电平有效
    9)通用寄存器的写使能信号为rf_we
    10)通用寄存器堆写地址生成逻辑GenRFRes中包含一个三选一部件,其三个输入依次为
    1>in0对应的指令rd域,
    2>in1对应指令的rt域,
    3>in2对应的常值32’d31
    该三选一的选择信号为sel_rf_dst设计为“零-独热码”共3bit
    11)通用寄存器堆的写入生成逻辑GenRFRes包含一个“二选一”部件
    1>in0对应ALU计算结果alu_res
    2>in1对应从RAM中读出load操作的返回值ld_res该二选一部件的1bit选择信号sel_rf_res为0表示alu_res,为1表示ld_res.
    056A34A8-32E8-4ABA-B27F-C6E487BC308C.jpeg