Transcript 寄存器组模块
支持指令流水的计算机系统的设计 与实现 1 计05 陈可卿 2010011347 计05 孙艺瀚 2010011356 流水段设计 取指(IF) •得到当前 指令 •得到下一 步PC值 •将PC值传 递下去 译码(ID) •分析指令 执行 (EXE) •算术逻辑 运算 •取出寄存 器编号/ 内存地址 /立即数 •控制信号 继续传递 •控制信号 的产生 访存(MEM) 写回(WB) •访问内存 操作 •写回寄存 器堆 •存在旁路 和冒险检 测 •写后读冲 突:存在 旁路 •与IF阶段 存在结构 冲突 •划分寄存 器 2 数据通路 3 主要模块实现 PC寄存器模块 • 产生当前PC值 • 对下一个周期的PC值进行选择 Branch跳转控制模块 • Next_pc来自: • PC+1 • PC+1+IMM • IMM IF/ID寄存器组模块 • 传递PC值 • 包含中断的时序 立即数扩展模块 • 有无符号 • 任意扩展 4 主要模块实现 寄存器划分模块 •主要的译码工作 •给出控制信号: •ALU运算数选择 •是否需要写回 •是否对T寄存器操作 •T寄存器操作内容 •寄存器编号译码 寄存器组模块 •包括IH和T寄存器 •得到寄存器组中的值,未必是ALU的实际操作数 •主要时序: •T寄存器的锁存 •寄存器写回 ID/EXE寄存器组模块 •传递控制信号 5 主要模块设计 算术逻辑单元模块 • 操作数的选择 • 寄存器堆 • 旁路 EXE/MEM寄存器组模块 • 传递控制信号 6 主要模块设计 内存模块 VGA 键盘模 UART SRAM 和显存 模块 模块 块 模块 7 内存模块 UART模块 •与串口通信 •通过状态机控制时序 SRAM模块 •使用RAM2作为内存 •倍频解决结构冲突 •前半周期用来取指,后半周期访存 VGA和显存模块 •显示模块 •只读存储器模块 •显存模块 键盘模块 •键盘数据接受和分析 •用类似串口的方式通信,为其分配端口:BF02和BF03 8 主要模块设计 MEM/WB寄存器组模块 • 传递控制信号 写回模块 • 寄存器数据可能来自: • 立即数IMM • ALU的第一个操作数A • ALU的运算结果C • 访存结果 • PC寄存器的值 9 扩展设计 冲突解决 中断处理 数据冲突 软件中断 结构冲突 外设 软件 其它贡献 VGA和显 存 双机通信 管脚自动 绑定 键盘 伪码解析 修改实验 指导书 控制冲突 10 冲突解决 数据冲突 • 数据旁路 • 流水线暂停 结构冲突 • 倍频 控制冲突 • 软件 11 数据冲突 写后读冲突 • 指令j的执行需要使用指令i的计算结果,但是它们在流水线中 重叠执行时,指令j可能在指令i将其计算结果写入之前就线性 对保存该计算结果的寄存器进行了操作。 旁路技术 • 把计算得到的结果尽快传送到它需要的位置。 • 旁路存在于: • 上一条指令的EXE阶段对当前指令的ID段 • 上上一条指令的EXE阶段对当前指令的ID段 • 上上一条指令的MEM段对当前指令的ID段 • 上一条指令的MEM段对当前指令的EXE段 • 上上条指令的WB段对当前指令的EXE段 12 数据冲突 流水线暂停检测 • 上一个指令是Load指令 • 上一个指令的写入寄存器和当前指令的某一源寄 存器相同 流水线暂停处理 • 设置暂停信号为1 • 当前指令的控制信号全部为0,即不进行任何写入 操作 • 让PC值保持不变 • 让IF/ID段寄存器保持不变 13 结构冲突 冯诺依曼结构:数据和指令放在同一存储器中,去 直接断和访存阶段会造成存储器争用冲突 将CPU主频设为内存时钟的四分频。 有效的访存地址根据state选择 SRAM模块状态机 RO(Read Only) 设oe为0,state为00 转入IDLE1 IDLE1 设state为10,输出设为ram_data,oe为1 转入WR WR(Write&Read) State设为11,根据输入设定we和oe的值 转入IDLE2 IDLE2 State设为01,输出数据设为ram_data 转入RO 14 控制冲突 对于分支语句,若进行分支预测,即使准确率达到 90%以上,也不可能全部命中 分支预测带来的效率问题一般是再有循环语句时出 现 避开分支预测,将问题交给软件 将循环语句内最后一句在不影响原意的前提下移出 Branch delay slot始终执行有效语句 15 KERNEL运行展示 至此已经可以运行 kernel代码并运行在 kernel里写出的程序。 测试斐波那契数列代 码如右。 在kernel中测试斐波那契数列 16 中断 实现指令集中的INT指令 在IF/ID阶段即可判断是否为指令中断。若是,进入 一个状态机 中断处理状态机 with state_int select instruction_int <= "1110111001000000" when "0001", -- <ee40> MFPC R6 "0100111000000000" when "0010", -- <4e00> ADDIU R6 00 "0110001111111111" when "0011", -- <63ff> ADDSP FF "1101011000000000" when "0100", -- <d600> SW_SP R6 00 "011011100000" & imm_tmp when "0101", -- <6e00> LI R6 00 "0110001111111111" when "0110", -- <63ff> ADDSP FF "1101011000000000" when "0111", -- <d600> SW_SP R6 00 "0110111000000111" when "1000", -- <6e07> LI R6 07 "1110111000000000" when "1001", -- <ee00> JR R6 instruction_in when others; 17 VGA和显存 VGA显示模块 •对输入的50MHz信号二分频,产生25MHz的信号 •产生行同步和场同步计数矢量及行同步和场同步信号 •行同步:656-752为低电平,其余为高 •场同步:490-492为低电平,其余为高 •坐标计算 •根据当前像素点坐标,计算属于屏幕哪一个分块 •去显存中得到相应的字符编号 •去ROM中读取每一个像素上的RGB值 •色彩输出 •在显示区域给每个像素点RGB进行赋值 •在整个消隐区,RGB赋值为0 ROM模块 •存储字符集 显存模块 •使用generic map中的RAM •映射到一段内存地址:0xF800开始的一段内存 18 键盘模块 PS/2键盘中的数据信号 • 按下一个键产生一组串行数据 • 松开产生两组串行数据 • 每组数据有:起始位,8位数据位(扫描码),1位奇偶校验 位 • 扫描码分通码(按下时)和断码(释放时) 键盘接口处理过程 • 键盘产生的数据具有毛刺,需要滤波 • 接收数据 • 接受11个串行数据,串并转换 • 奇偶校验并提取8位扫描码 • 译码及输出 19 VGA和键盘测试 至此可以测试键盘响 应和VGA显示:写一 段汇编代码,其功能 是对于键盘输入的字 符(包括回车),将 会将其输出到屏幕上。 测试记录的照片如左 图所示。 Keyboard to VGA测试 20 VGA和键盘测试 21 键盘和VGA测试代码 双机通信 使用过两台THINPAD教学实验机,同时烧入我们的 计算机系统 两台计算机的串口相连,通过串口,一台实验室就 可以接受另一台实验机发送的数据 加入键盘和VGA模块,成为一个即时通信系统软件 视频展示 22 伪码解析 在软件编写的过程中,经常用到一些常用语句的组 合 设计一些伪指令并写了相应的脚本对其进行编译 伪码 解析后汇编码 PUSH R0 ADDSP 0xFF SW_SP Rx0x0 Rx=Ry ADDIU3 Ry Rx 0x0 Rx=0xABCD LI Rx 0xAB SLL Rx Rx 0x0 ADDIU Rx 0xCD POP R0 LW_SP R0 ADDSP 0x1 23 其它贡献 自动绑定管脚 输入顶层单元文件,输出ucf文件 修正了实验指导书上原有的管脚错误 实验指导书修改 24 25