<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Verilog on TripleZ&#39;s Blog</title>
    <link>https://blog.triplez.cn/tags/verilog/</link>
    <description>Recent content in Verilog on TripleZ&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 04 Jul 2017 12:01:00 +0000</lastBuildDate><atom:link href="https://blog.triplez.cn/tags/verilog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>支持 45 条 MIPS 指令的单周期处理器开发</title>
      <link>https://blog.triplez.cn/posts/support-45-mips-instructions-single-cycle-cpu-dev/</link>
      <pubDate>Tue, 04 Jul 2017 12:01:00 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/support-45-mips-instructions-single-cycle-cpu-dev/</guid>
      <description>实现支持 45 条 MIPS 指令的单周期处理器</description>
      <content:encoded><![CDATA[<h2 id="abstract">Abstract</h2>
<p>支持 45 条 <code>MIPS</code> 指令的单周期处理器，<strong>不支持溢出</strong>。</p>
<blockquote>
<p>ADDU, SUBU, AND, OR, XOR, NOR, SLT, SLTU;
ADDIU, SLTI, ALTIU, ANDI, ORI, XORI, LUI;
SLL, SRL, SRA, SLLV, SRLV, SRAV;
LW, SW, LB, LBU, SB;
BEQ, BNE, BGEZ, BGTZ, BLEZ, BLTZ;
J, JR, JALR, JAL;
MULT;
MFHI, MFLO, MTHI, MTLO;
MFC0, MTC0;
SYSCALL, ERET.</p>
</blockquote>
<h2 id="instruction-set">Instruction Set</h2>
<blockquote>
<p>Total: 36 + 9</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:center">Status</th>
<th style="text-align:center">Ins Type</th>
<th style="text-align:center">op</th>
<th style="text-align:center">func</th>
<th style="text-align:center">ALUctr</th>
<th style="text-align:center">Compare</th>
<th style="text-align:center">Jump</th>
<th style="text-align:center">RegDst</th>
<th style="text-align:center">ALUSrcB</th>
<th style="text-align:center">ALUSrcA</th>
<th style="text-align:center">MemtoReg</th>
<th style="text-align:center">RegWr</th>
<th style="text-align:center">MemWr</th>
<th style="text-align:center">ImmExt</th>
<th style="text-align:center">CopWr</th>
<th style="text-align:center">ByteExt</th>
<th style="text-align:center">iaddrtoNPC</th>
<th style="text-align:center">ManInput_raddr</th>
<th style="text-align:center">ManInput_shf</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">addu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100001</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">subu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100011</td>
<td style="text-align:center">0001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">and</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100100</td>
<td style="text-align:center">0010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">or</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100101</td>
<td style="text-align:center">0011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">xor</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100110</td>
<td style="text-align:center">0101</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">nor</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100111</td>
<td style="text-align:center">0100</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">slt</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">101010</td>
<td style="text-align:center">1011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sltu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">101011</td>
<td style="text-align:center">1010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">addiu</td>
<td style="text-align:center">001001</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">slti</td>
<td style="text-align:center">001010</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sltiu</td>
<td style="text-align:center">001011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">andi</td>
<td style="text-align:center">001100</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">ori</td>
<td style="text-align:center">001101</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">xori</td>
<td style="text-align:center">001110</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0101</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">lui</td>
<td style="text-align:center">001111</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0110</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">10</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0x00000010</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sll</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">0110</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">srl</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000010</td>
<td style="text-align:center">0111</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sra</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000011</td>
<td style="text-align:center">1000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sllv</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000100</td>
<td style="text-align:center">0110</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">srlv</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000110</td>
<td style="text-align:center">0111</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">srav</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">000111</td>
<td style="text-align:center">1000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">lw</td>
<td style="text-align:center">100011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">11</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sw</td>
<td style="text-align:center">101011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">11</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">lb</td>
<td style="text-align:center">100000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">lbu</td>
<td style="text-align:center">100100</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sb</td>
<td style="text-align:center">101000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">10</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">beq</td>
<td style="text-align:center">000100</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">bne</td>
<td style="text-align:center">000101</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">bgez</td>
<td style="text-align:center">000001</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">bgtz</td>
<td style="text-align:center">000111</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">blez</td>
<td style="text-align:center">000110</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">bltz</td>
<td style="text-align:center">000001</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">j</td>
<td style="text-align:center">000010</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">jr</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">001000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">jalr</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">001001</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">01</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">11</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center"></td>
<td></td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">jal</td>
<td style="text-align:center">000011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">10</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">11</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">11111</td>
<td></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th style="text-align:center">Status</th>
<th style="text-align:center">Ins Type</th>
<th style="text-align:center">op</th>
<th style="text-align:center">func</th>
<th style="text-align:center">ALUctr</th>
<th style="text-align:center">Compare</th>
<th style="text-align:center">Jump</th>
<th style="text-align:center">RegDst</th>
<th style="text-align:center">ALUSrcB</th>
<th style="text-align:center">ALUSrcA</th>
<th style="text-align:center">MemtoReg</th>
<th style="text-align:center">RegWr</th>
<th style="text-align:center">MemWr</th>
<th style="text-align:center">ImmExt</th>
<th style="text-align:center">CopWr</th>
<th style="text-align:center">ByteExt</th>
<th style="text-align:center">iaddrtoNPC</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mult</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">011000</td>
<td style="text-align:center">1001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mfhi</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">010000</td>
<td style="text-align:center">1101</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mthi</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">010001</td>
<td style="text-align:center">1110</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mflo</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">010010</td>
<td style="text-align:center">1100</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mtlo</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">010011</td>
<td style="text-align:center">1111</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mfc0</td>
<td style="text-align:center">010000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">10</td>
<td style="text-align:center">01</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">mtc0</td>
<td style="text-align:center">010000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">syscall</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">001100</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">eret</td>
<td style="text-align:center">010000</td>
<td style="text-align:center">011000</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">00</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
<td style="text-align:center">x</td>
<td style="text-align:center">01</td>
</tr>
</tbody>
</table>
<h2 id="modules">Modules</h2>
<p>整个 <code>CPU</code> 分为 <code>Datapath(数据通路)</code> 和 <code>Control(控制单元)</code> 两大模块，其下共有 11 个子组件。</p>
<h3 id="datapath">Datapath</h3>
<h4 id="pc">PC</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/pc.v">PC (Program Counter) &ndash; 指令计数器</a></p>
<p>PC 的主要功能是输出当前指令地址并保存下一条指令的地址，复位后，PC指向 0x0000_3000，这是第一条指令所在地址。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">rst</td>
<td style="text-align:center">I</td>
<td style="text-align:center">复位信号</td>
</tr>
<tr>
<td style="text-align:center">niaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">下一条指令的地址</td>
</tr>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">复位</td>
<td style="text-align:center">当复位信号有效时，PC被设置成<code>0x0000_3000</code>(ModelSim) / <code>0x0000_0000</code>(On board)</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">保存 NPC 并退出</td>
<td style="text-align:center">在每个时钟上升沿保存 NPC，并将其输出</td>
</tr>
</tbody>
</table>
<h3 id="npc">NPC</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/npc.v">NPC (Next PC) &ndash; 下指令部件</a></p>
<p>根据当前指令地址以及判断信号来计算下一指令地址。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">I</td>
<td style="text-align:center">分支信号</td>
</tr>
<tr>
<td style="text-align:center">jump</td>
<td style="text-align:center">I</td>
<td style="text-align:center">跳转信号</td>
</tr>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">I</td>
<td style="text-align:center">指令信号</td>
</tr>
<tr>
<td style="text-align:center">jiaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">跳转地址</td>
</tr>
<tr>
<td style="text-align:center">imm16</td>
<td style="text-align:center">I</td>
<td style="text-align:center">I-指令的16位立即数</td>
</tr>
<tr>
<td style="text-align:center">imm26</td>
<td style="text-align:center">I</td>
<td style="text-align:center">J-指令的26位立即数</td>
</tr>
<tr>
<td style="text-align:center">riaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">返回的当前指令地址</td>
</tr>
<tr>
<td style="text-align:center">niaddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">下一条指令的地址</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">下一指令地址</td>
<td style="text-align:center">将指令地址移至下一条指令</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">分支地址跳转</td>
<td style="text-align:center">当分支信号和判零标志有效时，使用I-指令中的16位立即数做逻辑扩展，使其扩展成30位，再将地址乘4，得到需要跳转的分支地址并将其输出</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">绝对地址跳转</td>
<td style="text-align:center">当跳转信号有效时，使用J-指令中的26位立即数，根据跳转指令类型将其进行不同种的拼接并将其输出</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">返回指令地址</td>
<td style="text-align:center">将当前指令地址进行输出</td>
</tr>
</tbody>
</table>
<h3 id="dm">DM</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/dm.v">DM (Data Memeory)&ndash; 数据内存</a></p>
<p>数据内存，在程序运行中提供数据交换空间。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">addr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">读/写数据地址</td>
</tr>
<tr>
<td style="text-align:center">din</td>
<td style="text-align:center">I</td>
<td style="text-align:center">内存写入总线</td>
</tr>
<tr>
<td style="text-align:center">byteExt</td>
<td style="text-align:center">I</td>
<td style="text-align:center">字节控制信号</td>
</tr>
<tr>
<td style="text-align:center">wEn</td>
<td style="text-align:center">I</td>
<td style="text-align:center">写使能信号</td>
</tr>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">数据输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入数据</td>
<td style="text-align:center">当写使能信号有效时，在每个时钟上升沿将写入总线的数据写进相应内存地址中</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出数据</td>
<td style="text-align:center">将指定地址的数据通过数据输出总线进行输出</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">读/写字节数据</td>
<td style="text-align:center">当字节控制信号有效时，根据输入的数据地址来寻找相应的字节进行读/写操作</td>
</tr>
</tbody>
</table>
<h3 id="im">IM</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/im.v">IM (Instruction Memory) &ndash; 指令内存</a></p>
<p>指令内存，用于存储程序运行指令。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">O</td>
<td style="text-align:center">指令输出</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入指令</td>
<td style="text-align:center">使用 <code>$readmemh</code> 函数将 <code>code.txt</code> 中的指令写入指令内存中</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出指令</td>
<td style="text-align:center">根据得到的指令地址从指令内存中读出相应的指令数据</td>
</tr>
</tbody>
</table>
<h3 id="mux">MUX</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/mux.v">MUX (Multiplexer) &ndash; 选择器</a></p>
<p>选择器，根据选通信号输出选定的输入值。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">a</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选择输入信号 A(<code>00</code>)</td>
</tr>
<tr>
<td style="text-align:center">b</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选择输入信号 B(<code>01</code>)</td>
</tr>
<tr>
<td style="text-align:center">c</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选择输入信号 C(<code>10</code>)</td>
</tr>
<tr>
<td style="text-align:center">d</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选择输入信号 D(<code>11</code>)</td>
</tr>
<tr>
<td style="text-align:center">ctrl_s</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选通控制信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">选择器输出</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">选择输出 A</td>
<td style="text-align:center">当选通控制信号为<code>00</code>时，选择器输出输入信号 A</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">选择输出 B</td>
<td style="text-align:center">当选通控制信号为<code>01</code>时，选择器输出输入信号 B</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">选择输出 C</td>
<td style="text-align:center">当选通控制信号为<code>10</code>时，选择器输出输入信号 C</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">选择输出 D</td>
<td style="text-align:center">当选通控制信号为<code>11</code>时，选择器输出输入信号 D</td>
</tr>
</tbody>
</table>
<h3 id="rf">RF</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/rf.v">RF (Register File) &ndash; 寄存器堆</a></p>
<p>寄存器单元，用于存储程序临时数据。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">busW</td>
<td style="text-align:center">I</td>
<td style="text-align:center">寄存器写入总线</td>
</tr>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">wE</td>
<td style="text-align:center">I</td>
<td style="text-align:center">写使能信号</td>
</tr>
<tr>
<td style="text-align:center">rW</td>
<td style="text-align:center">I</td>
<td style="text-align:center">寄存器写入地址</td>
</tr>
<tr>
<td style="text-align:center">rA</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输出总线A读出的数据地址</td>
</tr>
<tr>
<td style="text-align:center">rB</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输出总线B读出的数据地址</td>
</tr>
<tr>
<td style="text-align:center">busA</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器输出总线A</td>
</tr>
<tr>
<td style="text-align:center">busB</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器输出总线B</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入数据</td>
<td style="text-align:center">当写使能信号有效时，在每个时钟上升沿根据写入地址写入寄存器数据</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出数据</td>
<td style="text-align:center">根据 A / B 数据地址读出相应的寄存器数据并通过输出总线 A / B 输出</td>
</tr>
</tbody>
</table>
<h3 id="alu">ALU</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/alu.v">ALU (Arithmetic Logic Unit) &ndash; 算术逻辑单元</a></p>
<p>算术逻辑单元，可完成加减与或比较等操作。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ALUop</td>
<td style="text-align:center">I</td>
<td style="text-align:center">算术逻辑单元操作控制信号</td>
</tr>
<tr>
<td style="text-align:center">a</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线A</td>
</tr>
<tr>
<td style="text-align:center">b</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线B</td>
</tr>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">result</td>
<td style="text-align:center">O</td>
<td style="text-align:center">输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">做加法</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数之和</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">做减法</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数之差</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">按位与</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位与结果</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">按位或</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位或结果</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">按位或非</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位或非结果</td>
</tr>
<tr>
<td style="text-align:center">6</td>
<td style="text-align:center">按位异或</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位异或结果</td>
</tr>
<tr>
<td style="text-align:center">7</td>
<td style="text-align:center">逻辑左移</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入 B 数逻辑左移 A 位的结果</td>
</tr>
<tr>
<td style="text-align:center">8</td>
<td style="text-align:center">逻辑右移</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入 B 数逻辑右移 A 位的结果</td>
</tr>
<tr>
<td style="text-align:center">9</td>
<td style="text-align:center">算术右移</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入 B 数算术右移 A 位的结果</td>
</tr>
<tr>
<td style="text-align:center">10</td>
<td style="text-align:center">做乘法</td>
<td style="text-align:center">根据操作控制信号，将输入两数的相乘结果保存至 <code>HI</code> 和 <code>LO</code> 寄存器中</td>
</tr>
<tr>
<td style="text-align:center">11</td>
<td style="text-align:center">无符号比较</td>
<td style="text-align:center">根据操作控制信号，若输入总线 A 的数值小于总线 B 的数值，则为真，否则为假</td>
</tr>
<tr>
<td style="text-align:center">12</td>
<td style="text-align:center">带符号比较</td>
<td style="text-align:center">根据操作控制信号，若输入总线 A 的带符号数值小于总线 B 带符号的数值，则为真，否则为假</td>
</tr>
<tr>
<td style="text-align:center">13</td>
<td style="text-align:center">读取 LO 值</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出 <code>LO</code> 寄存器的数值</td>
</tr>
<tr>
<td style="text-align:center">14</td>
<td style="text-align:center">读取 HI 值</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出 <code>HI</code> 寄存器的数值</td>
</tr>
<tr>
<td style="text-align:center">15</td>
<td style="text-align:center">写入 HI 值</td>
<td style="text-align:center">根据操作控制信号，在时钟上升沿来临时将输入总线 A 的数值 写入 <code>HI</code> 寄存器中</td>
</tr>
<tr>
<td style="text-align:center">16</td>
<td style="text-align:center">写入 LO 值</td>
<td style="text-align:center">根据操作控制信号，在时钟上升沿来临时将输入总线 A 的数值 写入 <code>LO</code> 寄存器中</td>
</tr>
</tbody>
</table>
<h3 id="ext">EXT</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/ext.v">EXT (Extender) &ndash; 扩展器</a></p>
<p>扩展器，可将 X 位立即数扩展成为 32 位数。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">din</td>
<td style="text-align:center">I</td>
<td style="text-align:center">X 位立即数</td>
</tr>
<tr>
<td style="text-align:center">extOp</td>
<td style="text-align:center">I</td>
<td style="text-align:center">扩展器控制信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">扩展器输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">逻辑扩展</td>
<td style="text-align:center">当控制信号无效时，对输入的立即数逻辑扩展为 32 位</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">算术扩展</td>
<td style="text-align:center">当控制信号有效时，对输入的立即数算术扩展为 32 位</td>
</tr>
</tbody>
</table>
<h3 id="comp">COMP</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/comp.v">COMP (Compare) &ndash; 比较器</a></p>
<p>比较器，判断是否需要条件转移。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">dinA</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线 A</td>
</tr>
<tr>
<td style="text-align:center">dinB</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线 B</td>
</tr>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">I</td>
<td style="text-align:center">指令信号</td>
</tr>
<tr>
<td style="text-align:center">compare</td>
<td style="text-align:center">I</td>
<td style="text-align:center">比较信号</td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">O</td>
<td style="text-align:center">分支信号</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">条件跳转</td>
<td style="text-align:center">根据当前指令信号，判断是否需要进行条件跳转，并通过分支信号输出</td>
</tr>
</tbody>
</table>
<h3 id="coprocessor0rf">Coprocessor0RF</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/datapath/CoProcessor0RF.v">CoP0 (CoProcessor0) &ndash; 协处理器 0 寄存器堆</a></p>
<p>协处理器 0 寄存器堆， 用于存储 CPU 状态信息。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">din</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线</td>
</tr>
<tr>
<td style="text-align:center">wEn</td>
<td style="text-align:center">I</td>
<td style="text-align:center">写使能信号</td>
</tr>
<tr>
<td style="text-align:center">regNum</td>
<td style="text-align:center">I</td>
<td style="text-align:center">读写地址</td>
</tr>
<tr>
<td style="text-align:center">sel</td>
<td style="text-align:center">I</td>
<td style="text-align:center">地址子号</td>
</tr>
<tr>
<td style="text-align:center">npc_out</td>
<td style="text-align:center">I</td>
<td style="text-align:center">下地址指令地址输入总线</td>
</tr>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">I</td>
<td style="text-align:center">指令信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">输出总线</td>
</tr>
<tr>
<td style="text-align:center">expiaddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">EPC输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入数据</td>
<td style="text-align:center">当写使能信号有效时，在每个时钟上升沿根据写入地址写入寄存器数据</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出数据</td>
<td style="text-align:center">根据读数据地址读出相应的寄存器数据并通过输出总线输出</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">系统调用</td>
<td style="text-align:center">将当前指令地址值写入<code>EPC</code>寄存器中，更改 <code>Status</code> 寄存器并使指令地址跳转到例外入口地址</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">异常返回</td>
<td style="text-align:center">将EPC寄存器的数值输出至下地址逻辑，并更改<code>Status</code>寄存器</td>
</tr>
</tbody>
</table>
<h2 id="control">Control</h2>
<h3 id="ctrl">CTRL</h3>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/tree/master/Project_Assignment/control/ctrl.v">CTRL (Controller) &ndash; 控制单元</a></p>
<p>控制模块，通过解析指令信息来产生相应的控制信号执行指令。</p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令</td>
</tr>
<tr>
<td style="text-align:center">compare</td>
<td style="text-align:center">I</td>
<td style="text-align:center">比较信号</td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">O</td>
<td style="text-align:center">分支信号</td>
</tr>
<tr>
<td style="text-align:center">jump</td>
<td style="text-align:center">O</td>
<td style="text-align:center">跳转信号</td>
</tr>
<tr>
<td style="text-align:center">regDst</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入地址控制信号</td>
</tr>
<tr>
<td style="text-align:center">aluSrcA</td>
<td style="text-align:center">O</td>
<td style="text-align:center">算数逻辑单元输入控制信号 A</td>
</tr>
<tr>
<td style="text-align:center">aluSrcB</td>
<td style="text-align:center">O</td>
<td style="text-align:center">算数逻辑单元输入控制信号 B</td>
</tr>
<tr>
<td style="text-align:center">aluCtr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">算术逻辑单元操作控制信号</td>
</tr>
<tr>
<td style="text-align:center">regWr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入使能信号</td>
</tr>
<tr>
<td style="text-align:center">memWr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">内存写入使能信号</td>
</tr>
<tr>
<td style="text-align:center">immExt</td>
<td style="text-align:center">O</td>
<td style="text-align:center">扩展器控制信号</td>
</tr>
<tr>
<td style="text-align:center">memtoReg</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入总线控制信号</td>
</tr>
<tr>
<td style="text-align:center">copWr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">协处理器 0 写入使能信号</td>
</tr>
<tr>
<td style="text-align:center">byteExt</td>
<td style="text-align:center">O</td>
<td style="text-align:center">字节扩展信号</td>
</tr>
<tr>
<td style="text-align:center">manInput_raddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器地址输入</td>
</tr>
<tr>
<td style="text-align:center">manInput_shf</td>
<td style="text-align:center">O</td>
<td style="text-align:center">偏移量输入</td>
</tr>
<tr>
<td style="text-align:center">iaddrtoNPC</td>
<td style="text-align:center">O</td>
<td style="text-align:center">指令地址选择信号</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">由指令产生控制信号</td>
<td style="text-align:center">通过输入的指令分析出需要执行的操作，输出相应的控制信号</td>
</tr>
</tbody>
</table>
<h2 id="code-repository">Code Repository</h2>
<p>代码仓库。</p>
<p>Github: <a href="https://triple-z.github.io/COExperiment_Repo/">COExperiment_Repo</a></p>
<h2 id="copyright">Copyright</h2>
<p>版权信息。</p>
<p>Copyright (c) 2017 <a href="https://triplez.cn/">TripleZ</a></p>
<p>Open source under the <a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/LICENSE.md">MIT License</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>MIPS 单周期处理器开发</title>
      <link>https://blog.triplez.cn/posts/mips-single-cycle-processor-dev/</link>
      <pubDate>Tue, 30 May 2017 18:19:28 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/mips-single-cycle-processor-dev/</guid>
      <description>&lt;p&gt;使用 &lt;code&gt;Verilog&lt;/code&gt; 语言完成的一个支持13条 &lt;code&gt;MIPS&lt;/code&gt; 指令的单周期处理器。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>使用 <code>Verilog</code> 语言完成的一个支持13条 <code>MIPS</code> 指令的单周期处理器。</p>
<h2 id="abstract">Abstract</h2>
<p>仅支持13条 <code>MIPS</code> 指令的单周期处理器，<strong>不支持溢出</strong>。</p>
<h2 id="instruction-set">Instruction Set</h2>
<p>指令说明。</p>
<blockquote>
<p>Total: 13</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:center">Status</th>
<th style="text-align:center">Ins Type</th>
<th style="text-align:center">op</th>
<th style="text-align:center">func</th>
<th style="text-align:center">ALUctr</th>
<th style="text-align:center">Branch</th>
<th style="text-align:center">Jump</th>
<th style="text-align:center">RegDst</th>
<th style="text-align:center">ALUSrc</th>
<th style="text-align:center">MemtoReg</th>
<th style="text-align:center">RegWr</th>
<th style="text-align:center">MemWr</th>
<th style="text-align:center">ExtOp</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">addu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100001</td>
<td style="text-align:center">0000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">add</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100000</td>
<td style="text-align:center">0001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">subu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100011</td>
<td style="text-align:center">1000</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sub</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100010</td>
<td style="text-align:center">1001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">and</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100100</td>
<td style="text-align:center">0010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">or</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">100101</td>
<td style="text-align:center">0011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sltu</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">101011</td>
<td style="text-align:center">1010</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">slt</td>
<td style="text-align:center">000000</td>
<td style="text-align:center">101010</td>
<td style="text-align:center">1011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">beq</td>
<td style="text-align:center">000100</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1001</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">jump</td>
<td style="text-align:center">000010</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">lw</td>
<td style="text-align:center">100011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">sw</td>
<td style="text-align:center">101011</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0001</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">x</td>
<td style="text-align:center">1</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1</td>
</tr>
<tr>
<td style="text-align:center"><code>supported</code></td>
<td style="text-align:center">ori</td>
<td style="text-align:center">001101</td>
<td style="text-align:center">x</td>
<td style="text-align:center">0011</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">1</td>
<td style="text-align:center">0</td>
<td style="text-align:center">0</td>
</tr>
</tbody>
</table>
<h2 id="modules">Modules</h2>
<p>整个 <code>CPU</code> 分为 <code>Datapath(数据通路)</code> 和 <code>Control(控制单元)</code> 两大模块，其下共有9个子组件。</p>
<h3 id="datapath">Datapath</h3>
<p>数据通路。</p>
<h4 id="pc">PC</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/pc.v">Program Counter &ndash; 指令计数器</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">rst</td>
<td style="text-align:center">I</td>
<td style="text-align:center">复位信号</td>
</tr>
<tr>
<td style="text-align:center">niaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">下一条指令的地址</td>
</tr>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">复位</td>
<td style="text-align:center">当复位信号有效时，PC被设置成 0x0000_3000</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">保存 NPC 并退出</td>
<td style="text-align:center">在每个时钟上升沿保存 NPC，并将其输出</td>
</tr>
</tbody>
</table>
<h4 id="npc">NPC</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/npc.v">Next PC &ndash; 下指令部件</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">I</td>
<td style="text-align:center">分支信号</td>
</tr>
<tr>
<td style="text-align:center">jump</td>
<td style="text-align:center">I</td>
<td style="text-align:center">跳转信号</td>
</tr>
<tr>
<td style="text-align:center">zero</td>
<td style="text-align:center">I</td>
<td style="text-align:center">判零标志</td>
</tr>
<tr>
<td style="text-align:center">imm16</td>
<td style="text-align:center">I</td>
<td style="text-align:center">I-指令的16位立即数</td>
</tr>
<tr>
<td style="text-align:center">imm26</td>
<td style="text-align:center">I</td>
<td style="text-align:center">J-指令的26位立即数</td>
</tr>
<tr>
<td style="text-align:center">niaddr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">下一条指令的地址</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">下一指令地址</td>
<td style="text-align:center">将指令地址移至下一条指令</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">分支地址跳转</td>
<td style="text-align:center">当分支信号和判零标志有效时，使用I-指令中的16位立即数做逻辑扩展，使其扩展成30位，再将地址乘4，得到需要跳转的分支地址并将其输出</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">绝对地址跳转</td>
<td style="text-align:center">当跳转信号有效时，使用J-指令中的26位立即数，与当前指令的高四位进行拼接，再将地址乘4，得到需要跳转的绝对地址并将其输出</td>
</tr>
</tbody>
</table>
<h4 id="dm">DM</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/dm.v">Data Memory &ndash; 数据内存</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">addr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">读/写数据地址</td>
</tr>
<tr>
<td style="text-align:center">din</td>
<td style="text-align:center">I</td>
<td style="text-align:center">内存写入总线</td>
</tr>
<tr>
<td style="text-align:center">wEn</td>
<td style="text-align:center">I</td>
<td style="text-align:center">写使能信号</td>
</tr>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">数据输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入数据</td>
<td style="text-align:center">当写使能信号有效时，在每个时钟上升沿将写入总线的数据写进相应内存地址中</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出数据</td>
<td style="text-align:center">将指定地址的数据通过数据输出总线进行输出</td>
</tr>
</tbody>
</table>
<h4 id="im">IM</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/im.v">Instruction Memory &ndash; 指令内存</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">iaddr</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令地址</td>
</tr>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">O</td>
<td style="text-align:center">指令输出</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入指令</td>
<td style="text-align:center">使用 $readmemh 函数将 code.txt 中的指令写入指令内存中</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出指令</td>
<td style="text-align:center">根据得到的指令地址从指令内存中读出相应的指令数据</td>
</tr>
</tbody>
</table>
<h4 id="mux">MUX</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/mux.v">Multiplexer &ndash; 选择器</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">a</td>
<td style="text-align:center">I</td>
<td style="text-align:center">缺省输入信号</td>
</tr>
<tr>
<td style="text-align:center">b</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选择输入信号</td>
</tr>
<tr>
<td style="text-align:center">ctrl_s</td>
<td style="text-align:center">I</td>
<td style="text-align:center">选通控制信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">选择器输出</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">缺省输出</td>
<td style="text-align:center">当选通控制信号无效时，选择器输出缺省输入信号</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">选择输出</td>
<td style="text-align:center">当选通控制信号有效时，选择器输出选择输入信号</td>
</tr>
</tbody>
</table>
<h4 id="rf">RF</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/rf.v">Register File &ndash; 寄存器堆</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">busW</td>
<td style="text-align:center">I</td>
<td style="text-align:center">寄存器写入总线</td>
</tr>
<tr>
<td style="text-align:center">clk</td>
<td style="text-align:center">I</td>
<td style="text-align:center">时钟信号</td>
</tr>
<tr>
<td style="text-align:center">wE</td>
<td style="text-align:center">I</td>
<td style="text-align:center">写使能信号</td>
</tr>
<tr>
<td style="text-align:center">rW</td>
<td style="text-align:center">I</td>
<td style="text-align:center">寄存器写入地址</td>
</tr>
<tr>
<td style="text-align:center">rA</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输出总线A读出的数据地址</td>
</tr>
<tr>
<td style="text-align:center">rB</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输出总线B读出的数据地址</td>
</tr>
<tr>
<td style="text-align:center">busA</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器输出总线A</td>
</tr>
<tr>
<td style="text-align:center">busB</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器输出总线B</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">写入数据</td>
<td style="text-align:center">当写使能信号有效时，在每个时钟上升沿根据写入地址写入寄存器数据</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">读出数据</td>
<td style="text-align:center">根据A/B数据地址读出相应的寄存器数据并通过输出总线A/B输出</td>
</tr>
</tbody>
</table>
<h4 id="alu">ALU</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/alu.v">Arithmetic Logic Unit &ndash; 算术逻辑单元</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ALUop</td>
<td style="text-align:center">I</td>
<td style="text-align:center">算术逻辑单元操作控制信号</td>
</tr>
<tr>
<td style="text-align:center">a</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线A</td>
</tr>
<tr>
<td style="text-align:center">b</td>
<td style="text-align:center">I</td>
<td style="text-align:center">输入总线B</td>
</tr>
<tr>
<td style="text-align:center">result</td>
<td style="text-align:center">O</td>
<td style="text-align:center">输出总线</td>
</tr>
<tr>
<td style="text-align:center">zero</td>
<td style="text-align:center">O</td>
<td style="text-align:center">判零标志</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">做加法</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数之和</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">做减法</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数之差</td>
</tr>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">按位与</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位与结果</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">按位或</td>
<td style="text-align:center">根据操作控制信号，通过输出总线输出输入两数的按位或结果</td>
</tr>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">做比较</td>
<td style="text-align:center">根据操作控制信号，若输入总线A的数值小于总线B的数值，则为真，否则为假</td>
</tr>
</tbody>
</table>
<h4 id="ext">EXT</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/datapath/ext.v">Extender &ndash; 扩展器</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">imm16</td>
<td style="text-align:center">I</td>
<td style="text-align:center">I-指令的16位立即数</td>
</tr>
<tr>
<td style="text-align:center">extOp</td>
<td style="text-align:center">I</td>
<td style="text-align:center">扩展器控制信号</td>
</tr>
<tr>
<td style="text-align:center">dout</td>
<td style="text-align:center">O</td>
<td style="text-align:center">扩展器输出总线</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">逻辑扩展</td>
<td style="text-align:center">当控制信号无效时，对输入的16位立即数逻辑扩展为32位</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">算术扩展</td>
<td style="text-align:center">当控制信号有效时，对输入的16位立即数算术扩展为32位</td>
</tr>
</tbody>
</table>
<h3 id="control">Control</h3>
<p>控制单元。</p>
<h4 id="ctrl">CTRL</h4>
<p><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/Project_1/control/ctrl.v">Controller &ndash; 控制器</a></p>
<table>
<thead>
<tr>
<th style="text-align:center">信号名</th>
<th style="text-align:center">方向</th>
<th style="text-align:center">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ins</td>
<td style="text-align:center">I</td>
<td style="text-align:center">当前需要执行的指令</td>
</tr>
<tr>
<td style="text-align:center">branch</td>
<td style="text-align:center">O</td>
<td style="text-align:center">分支信号</td>
</tr>
<tr>
<td style="text-align:center">jump</td>
<td style="text-align:center">O</td>
<td style="text-align:center">跳转信号</td>
</tr>
<tr>
<td style="text-align:center">regDst</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入地址控制信号</td>
</tr>
<tr>
<td style="text-align:center">aluSrc</td>
<td style="text-align:center">O</td>
<td style="text-align:center">算数逻辑单元输入控制信号</td>
</tr>
<tr>
<td style="text-align:center">aluCtr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">算术逻辑单元操作控制信号</td>
</tr>
<tr>
<td style="text-align:center">regWr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入使能信号</td>
</tr>
<tr>
<td style="text-align:center">memWr</td>
<td style="text-align:center">O</td>
<td style="text-align:center">内存写入使能信号</td>
</tr>
<tr>
<td style="text-align:center">extOp</td>
<td style="text-align:center">O</td>
<td style="text-align:center">扩展器控制信号</td>
</tr>
<tr>
<td style="text-align:center">memtoReg</td>
<td style="text-align:center">O</td>
<td style="text-align:center">寄存器写入总线控制信号</td>
</tr>
</tbody>
</table>
<hr>
<table>
<thead>
<tr>
<th style="text-align:center">序号</th>
<th style="text-align:center">功能名称</th>
<th style="text-align:center">功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">由指令产生控制信号</td>
<td style="text-align:center">通过输入的指令分析出需要执行的操作，输出相应的控制信号</td>
</tr>
</tbody>
</table>
<h2 id="code-repository">Code Repository</h2>
<p>代码仓库。</p>
<p>GitHub: <a href="https://github.com/Triple-Z/COExperiment_Repo">COExperiment_Repo</a></p>
<h3 id="copyright">Copyright</h3>
<p>版权信息。</p>
<p>Copyright (c) 2017 <a href="https://triplez.cn">TripleZ</a></p>
<p>Open source under the <strong><a href="https://github.com/Triple-Z/COExperiment_Repo/blob/master/LICENSE.md">MIT License</a></strong>.</p>]]></content:encoded>
    </item>
    
    <item>
      <title>提升编写 Verilog 的体验</title>
      <link>https://blog.triplez.cn/posts/write-verilog-in-a-better-way/</link>
      <pubDate>Sun, 14 May 2017 16:46:55 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/write-verilog-in-a-better-way/</guid>
      <description>推荐几个 Atom 上的 Verilog 插件</description>
      <content:encoded><![CDATA[<p>鉴于使用 <code>ModelSim</code> 的开发效率实在太低，连自动补全这种基本 <code>IDE</code> 功能都没有 <del>基本搞 EE 做出来的 IDE 都差不多这样</del>，我开始寻找新的开发方式，以提高自己的 <code>Verilog</code> 编码体验。</p>
<p>由于个人原因，平常较为喜欢使用<code>GitHub</code>的<code>Atom</code>编辑器 <del>用Vim/Emacs的别喷我了</del> ，所以开始了在 <code>Atom</code>里寻找<code>Verilog</code>插件。</p>
<p>然后发现了两个炒鸡炒鸡炒鸡好用的 <code>Package</code> ：</p>
<ul>
<li><code>language-verilog</code></li>
<li><code>linter-verilog</code></li>
</ul>
<p><code>language-verilog</code> 这个插件如其名，就是增加了 <code>Atom</code> 对 <code>Verilog</code> 语言的支持，如果你启用了 <code>autocomplete</code> 相关的插件，还能够实现自动补全的功能。</p>
<p><code>linter-verilog</code> 这个插件的作用是在每次保存时，对 <code>Verilog</code> 程序进行检错工作。但是在安装上就有点坑了，没这么容易装上。因为它是 <code>linter</code> 的一个小支持包，依赖 <code>linter</code> 进行工作，所以，你得先装上 <code>linter</code>。</p>
<p>然而这还没完。 <code>linter</code> 只是提供了一个检错的核心，但是对不同语言的支持都是接的外部 <code>API</code> ，如 <code>linter</code> 实现对 <code>C/C++</code> 的支持是用的 <code>GCC</code> 环境。所以，我们需要配置好 <code>icarus verilog</code> 环境，才能够顺利运行 <code>linter-verilog</code>。</p>
<p>有了这两个插件，大可以抛弃 <code>ModelSim</code> 那辣鸡的 <code>IDE</code> 了。</p>
<p>如果有更好用的插件/环境，欢迎讨论~</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
