任务描述
本关任务:利用 Logisim 平台构建一个简化的 MIPS/RISC-V 寄存器文件,内部包含8个8位寄存器。
相关知识
寄存器文件(RegFile)又称寄存器堆,是CPU中多个寄存器组成的阵列。MIPS/RISV-V寄存器文件通常具有两个读端口与一个写端口,可以多路并发访问不同的寄存器,从而提高CPU的数据吞吐能力。其原理示意图如下:
写入端口可以采用译码器或者多路分配器(解复用器DMUX),读出端口可以采用多路选择器(数据选择器MUX)。
引脚说明
信号 | I/O | 位宽 | 说明 |
---|---|---|---|
R1# | 输入 | 3 位 | 第1个读寄存器的编号 |
R2# | 输入 | 3 位 | 第2个读寄存器的编号 |
W# | 输入 | 3 位 | 写寄存器的编号 |
CLK | 输入 | 1 位 | 时钟信号,上升沿有效 |
WE | 输入 | 1 位 | 寄存器写使能 |
Din | 输入 | 8 位 | 寄存数据输入,WE=1、 CLK↑将Din写入W#寄存器 |
RD1 | 输出 | 8 位 | R1# 寄存器的值,0号寄存器的值恒零 |
RD2 | 输出 | 8 位 | R2# 寄存器的值,0号寄存器的值恒零 |
实验内容
实验电路框架RegFile.circ下载:鼠标右击右侧代码区,Download File 在Logisim中打开实验电路框架,在工程中绘制电路并进行测试。
封装外观
测试说明
请用记事本或者其他纯文本编辑器打开电路文件(RegFile.circ),全选、复制,然后粘贴到代码窗口中,点击右下方的“评测”按钮,平台会对你的代码进行测试。
部分代码段:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project source="2.15.0.2.exe" version="1.0">
This file is intended to be loaded by Logisim http://logisim.altervista.org
<lib desc="#Wiring" name="0">
<tool name="Splitter">
<a name="facing" val="west"/>
<a name="fanout" val="4"/>
<a name="incoming" val="4"/>
<a name="appear" val="left"/>
<a name="bit0" val="0"/>
<a name="bit1" val="1"/>
<a name="bit2" val="2"/>
<a name="bit3" val="3"/>
</tool>
<tool name="Pin">
<a name="facing" val="south"/>
<a name="output" val="false"/>
<a name="width" val="1"/>
<a name="tristate" val="true"/>
<a name="pull" val="none"/>
<a name="label" val=""/>
<a name="labelloc" val="north"/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="Probe">
<a name="facing" val="west"/>
<a name="radix" val="10signed"/>
<a name="label" val=""/>
<a name="labelloc" val="north"/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="Tunnel">
<a name="facing" val="east"/>
<a name="width" val="32"/>
<a name="label" val="tunnel"/>
<a name="labelfont" val="Dialog plain 12"/>
</tool>
<tool name="Pull Resistor">
<a name="facing" val="north"/>
<a name="pull" val="0"/>
</tool>
<tool name="Clock">
<a name="facing" val="north"/>
<a name="highDuration" val="1"/>
<a name="lowDuration" val="1"/>
<a name="label" val=""/>
<a name="labelloc" val="west"/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="ProgrammableGenerator">
<a name="facing" val="east"/>
<a name="nState" val="4"/>
<a name="label" val=""/>
<a name="labelloc" val="west"/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="Contents" val=""/>
</tool>
<tool name="Constant">
<a name="facing" val="north"/>
<a name="width" val="3"/>
<a name="value" val="0x0"/>
</tool>
<tool name="Power">
<a name="facing" val="north"/>
<a name="width" val="1"/>
</tool>
<tool name="Ground">
<a name="facing" val="south"/>
<a name="width" val="1"/>
</tool>
<tool name="Transistor">
<a name="type" val="p"/>
<a name="facing" val="east"/>
<a name="gate" val="tl"/>
<a name="width" val="1"/>
</tool>
<tool name="Transmission Gate">
<a name="facing" val="east"/>
<a name="gate" val="tl"/>
<a name="width" val="1"/>
</tool>
<tool name="Bit Extender">
<a name="in_width" val="32"/>
<a name="out_width" val="1"/>
<a name="type" val="zero"/>
</tool>
</lib>
<lib desc="#Gates" name="1">
<tool name="NOT Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="20"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="Buffer">
<a name="facing" val="east"/>
<a name="width" val="3"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="AND Gate">
<a name="facing" val="east"/>
<a name="width" val="16"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="OR Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="NAND Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="NOR Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="XOR Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="xor" val="odd"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="XNOR Gate">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="xor" val="odd"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="Odd Parity">
<a name="facing" val="south"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="3"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
<a name="negate2" val="false"/>
</tool>
<tool name="Even Parity">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="30"/>
<a name="inputs" val="2"/>
<a name="out" val="01"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
<a name="negate0" val="false"/>
<a name="negate1" val="false"/>
</tool>
<tool name="Controlled Buffer">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="control" val="right"/>
<a name="negatecontrol" val="false"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="Controlled Inverter">
<a name="facing" val="east"/>
<a name="width" val="1"/>
<a name="size" val="20"/>
<a name="control" val="right"/>
<a name="negatecontrol" val="false"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
</lib>
<lib desc="#Plexers" name="2">
<tool name="Multiplexer">
<a name="facing" val="east"/>
<a name="selloc" val="bl"/>
<a name="select" val="2"/>
<a name="width" val="32"/>
<a name="disabled" val="Z"/>
<a name="enable" val="false"/>
</tool>
<tool name="Demultiplexer">
<a name="facing" val="east"/>
<a name="selloc" val="bl"/>
<a name="select" val="2"/>
<a name="width" val="1"/>
<a name="tristate" val="false"/>
<a name="disabled" val="Z"/>
<a name="enable" val="false"/>
</tool>
<tool name="Decoder">
<a name="facing" val="east"/>
<a name="selloc" val="bl"/>
<a name="select" val="2"/>
<a name="tristate" val="false"/>
<a name="disabled" val="Z"/>
<a name="enable" val="false"/>
</tool>
<tool name="DisplayDecoder">
<a name="facing" val="east"/>
<a name="multibit" val="true"/>
</tool>
<tool name="Priority Encoder">
<a name="facing" val="east"/>
<a name="select" val="3"/>
<a name="disabled" val="Z"/>
</tool>
<tool name="BitSelector">
<a name="facing" val="east"/>
<a name="selloc" val="bl"/>
<a name="width" val="31"/>
<a name="group" val="5"/>
</tool>
</lib>
<lib desc="#Arithmetic" name="3">
<tool name="Adder">
<a name="width" val="6"/>
</tool>
<tool name="Subtractor">
<a name="width" val="5"/>
</tool>
<tool name="Multiplier">
<a name="width" val="1"/>
</tool>
<tool name="Divider">
<a name="width" val="16"/>
</tool>
<tool name="Negator">
<a name="width" val="1"/>
</tool>
<tool name="Comparator">
<a name="width" val="16"/>
<a name="mode" val="twosComplement"/>
</tool>
<tool name="Shifter">
<a name="width" val="8"/>
<a name="shift" val="ll"/>
</tool>
<tool name="BitAdder">
<a name="width" val="8"/>
<a name="inputs" val="1"/>
</tool>
<tool name="BitFinder">
<a name="width" val="8"/>
<a name="type" val="low1"/>
</tool>
</lib>
<lib desc="#Memory" name="4">
<tool name="D Flip-Flop">
<a name="trigger" val="high"/>
<a name="Pre/Clr Positions" val="ABOVE_BELOW"/>
<a name="NegatePresetClear" val="false"/>
<a name="enable" val="false"/>
<a name="NewFFLayout" val="true"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
<tool name="T Flip-Flop">
<a name="trigger" val="rising"/>
<a name="Pre/Clr Positions" val="ABOVE_BELOW"/>
<a name="NegatePresetClear" val="false"/>
<a name="enable" val="false"/>
<a name="NewFFLayout" val="true"/>
<a name="label" val=""/>
<a name="labelfont" val="Dialog plain 12"/>
<a name="labelcolor" val="#000000"/>
</tool>
答案和解析: