Kanade Electronicskanaelecom
🔧

ロジックICで組む

演算器

A
A
MSB
MSB
MSB
MSB
B
B
LSB
LSB
MSB
MSB
C
C
A=B
A=B
Carry
Carry
ALU

181*4+182
ALU...
0
0
1
1
541
541
541
541
541
541
86
86
86
86
86
86
5
5
3
3
08
08
>>
>>
0
0
1
1
MSB
MSB
BOOL_SEL
BOOL_SEL
OUT_SEL
OUT_SEL
EQ_NEQ
EQ_NEQ
SR_US
SR_US
COMP_US
COMP_US
SR_SEL
SR_SEL
S0 - S3, M
S0 - S3, M
C_SEL
C_SEL
C_USE
C_USE
Text is not SVG - cannot display

演算の種類
演算演算
74181比較回路
加算A+B (mod 0x10000)add一致A==Beq
減算A-B (mod 0x10000)sub不一致A!=Bneq
論理積A&Band比較(signed)A<Blts
論理和A|Bor比較(unsigned)A<Blsu
排他的論理和A^Bxorシフト回路
論理否定~Anot右シフト(signed)A>>1srs
左シフトA<<1sl右シフト(unsigned)A>>1sru
左循環A<<1 + MSBrotl右循環A>>1rotr
比較演算の原理

 比較演算の結果は真偽値型です。結果は1bitなので16bitに広げます。(true0xfffffalse0x0000

一致/不一致

 74181には A=B 出力があります。これと制御信号を XOR すると eq A B / neq A B になります。

大小比較

 比較には74181の減算を使います。まず、4bitの符号なし整数の減算 𝐴𝐵 を考えます。ビット反転して1を足すと負の数になる (10000𝑋=𝑋+1) ことを利用して計算します。

𝐴𝐵=𝐴+(10000𝐵)10000=𝐴+𝐵+110000

 減算器は実際には加算 𝐴+𝐵+1 を計算します。キャリー出力は結果が10000以上であることを表しています。つまり、減算器のキャリーフラグが立っているとき、

𝐴+𝐵+1=𝐴𝐵+1000010000𝐴𝐵
74181A<BA=BA>B
Carry011
A=B010

 符号つき整数の場合、符号ビットを反転してから同じことをやれば比較ができます。「符号ビットを反転し符号なし整数として解釈する」という操作は、大小関係を保存するからです。

演算のデコード
演算C3C2C1C074181S3S2S1S0MCC_SELC_USECOMP_USSR_USSR_SELEQ_NEQBOOL_SELOUT_SEL
加算add0000A + B100100-00----100
論理反転not1~A00001---0----100
左シフトsl10A + A110000-00----100
左巡回lrot1A + A + MSB11000MSB010----100
論理積and100A & B10111---0----100
排他的論理和xor1A ^ B01101---0----100
論理和or10A | B11101---0----100
減算sub1A - B011001110----100
一致eq1000A - B - 1011000-00--00001
不一致neq1A - B - 1011000-00--10001
比較(符号なし)ltu10A - B - 1011000-00---1001
比較(符号付き)lts1A - B - 1011000-01---1001
右シフト(符号なし)sru100----------00--010
右シフト(符号付き)srs1----------10--010
右巡回rrot10-----------1--010
-1-----------1--010
OUTDeode
S3𝐶3̇𝐶0+𝐶2𝐶1
S2𝐶3+𝐶1𝐶0
S1𝐶3+𝐶2
S0𝐶3+𝐶1+𝐶0
M𝐶3̇𝐶1𝐶0+𝐶2·𝐶0
C_SEL𝐶2
C_USE𝐶3𝐶1𝐶0
COMP_US𝐶3𝐶1𝐶0
SR_US𝐶3
SR_SEL𝐶2
EQ_NEQ𝐶3
BOOL_SEL𝐶2
OUT_SEL_ALU𝐶3
OUT_SEL_BOOL𝐶3·𝐶2
OUT_SEL_SHIFT𝐶3𝐶2
部品表
BOM#
ALU74HC1814
Carry74HC1821
XOR74HC861
3 to 8 Decoder74HC1381
3 State Buffer74HC5412
3 State Buffer Inv74HC5404
OR74HC121
NAND (1bit MUX)74HC001

1bitのマルチプレクサは4個のNANDで構成できます。

MUX=𝐴𝑆+𝐵𝑆=𝐴𝑆·𝐴·𝑆
テスト

ALUは36入力16出力の組み合わせ回路。2^36パターンを全検査する。

入力レジスタ
入力レジスタ
出力レジスタ
出力レジスタ
マイ

コン
マイ コン
ALU
ALU
遅延

回路
遅延 回路
オシロ
オシロ
Text is not SVG - cannot display

  1. 入力レジスタにセット
  2. パルスを送信
  3. ALUの計算を待つ
  4. 規定の遅延時間後の出力がラッチされる
  5. 出力を読み取る
  6. 一致するか確認

メモリ空間

Addr
Addr
15:12
15:12
0
0
1
1
15
15
154
154
11:8
11:8
7:4
7:4
0
0
3:0
3:0
SRAM
SRAM
154
154
0
0
SP
SP
Data
Data
ROM
ROM
VRAM
VRAM
PC
PC
IRA
IRA
ZERO
ZERO
4
4
[1:0]
[1:0]
139
139
X
X
Y
Y
0x0XY0 : 0x0XYF
0x0XY0 : 0x0XYF
154
154
IO Module
IO Module
OUT
OUT
IN
IN
IO
IO
154
154
14
14
2
2
3
3
!CS
!CS
!CS
!CS
!CS
!CS
Text is not SVG - cannot display

タイミングチャート

SRAM

レジスタ

カウンタ

部品表
BOM#
4 to 16 Decoder74HC1543
2 to 4 Decoder74HC1391
テスト

メモリ空間は16入力16出力で状態空間が 2^16^(2^16) 。状態が独立で相互作用がないと考えれば、各bitごとに読み書きをチェックすればいい。また、各チップごとにランダムにエントリを選択して読み書きする。

プログラム制御ユニット

リセット時、74157のSTを使ってPCを0にする。

IRA

574*2
IRA...
INTR
INTR
INTR_PC

DIPSW*2
INTR_PC...
PC

574*2
PC...
+1

283*4
+1...
ALU
ALU
COND
COND
=0?
=0?
0
0
0
0
1
1
1
1
=0?
=0?
PC_CLK
PC_CLK
RST
RST
PFC_CTRL
PFC_CTRL
Text is not SVG - cannot display

部品表
BOM#
Multiplexer74HC1578
Adder74HC2834
DFF74HC5744
8in OR74HC40782
AND74HC081
19

データパス

ALU
ALU
SR2
SR2
SR1
SR1
SR2
SR2
IMM
IMM
SR2
SR2
ALU
ALU
RA
RA
S1
S1
S2
S2
INTR_IN
INTR_IN
RAM
RAM
PFC
PFC
D
D
ALU
ALU
Testing Device
Testing Device
Text is not SVG - cannot display

クロック

水晶

発振器
水晶 発振器
分周器
分周器
リング

カウンタ
リング カウンタ
Text is not SVG - cannot display

Stage0
Stage0
RS1_CLK
RS1_CLK
RS2_CLK
RS2_CLK
RD_CLK
RD_CLK
PC_CLK
PC_CLK
Stage1
Stage1
Stage2
Stage2
Stage3
Stage3
Viewer does not support full SVG 1.1

デコーダ

RS1
RS1
RS2
RS2
RD
RD
IMM
IMM
DIN_ALU
DIN_ALU
ADR_RS1
ADR_RS1
S2_SEL
S2_SEL
ALU_CTRL
ALU_CTRL
[7,4]
[7,4]
[11,8]
[11,8]
[15,12]
[15,12]
ADR_RS2
ADR_RS2
ADR_RD
ADR_RD
ADR_ALU
ADR_ALU
ADR_0
ADR_0
[3,0]
[3,0]
[19,16]
[19,16]
[11,8]
[11,8]
ADD
ADD
STG0
STG0
[0]
[0]
[31,16]
[31,16]
STG1
STG1
STG2
STG2
OPC
OPC
Func
Func
[1]
[1]
[1]
[1]
[1]
[1]
[3]
[3]
PCF_CTRL
PCF_CTRL
[3]
[3]
[1]
[1]
DIN_RS2
DIN_RS2
DIN_RA
DIN_RA
[3]
[3]
Text is not SVG - cannot display

デコード
ALUS2DIN1.ADR2.ADR3.ADR
addFuncRS2ALURS1RS2RD
addiFuncIMMALURS1-RD
loadADDIMMRS2RS1ALURD
storeADDIMMRS2RS1RS2ALU
callifADDIMMRARS1RS2RD
Verilog
`define CALC  4'b0000
`define CALCI 4'b0001
`define LOAD  4'b0011
`define STORE 4'b0111
`define CALIF 4'b1111

module ID(
    input  wire [31: 0] OP,
    output wire [ 3: 0] RS1,
    output wire [ 3: 0] RS2,
    output wire [ 3: 0] RD,
    output wire [31:16] IMM,
    output wire [ 1: 0] DIN_SEL,
    output wire [ 1: 0] ADDR_SEL,
    output wire [ 3: 0] ALU_CTRL,
    output wire         PFC_CTRL,
);

wire [3:0] OPC;

assign RS1 = OP[ 3: 0];
assign RS2 = OP[ 7: 4];
assign RD  = OP[11: 8];
assign OPC = OP[15:12];
assign IMM = OP[31:16];

assign ALU_CTRL = OPC==`CALC  ? OP[19:16]
                : OPC==`CALCI ? OP[ 7: 4]
                : `ALU_ADD;

assign ADDR_SEL = STAGE==0 ? `ADDR_RS1
                : STAGE==1 ? `ADDR_RS2
                : STAGE==2 ? `ADDR_RD;

assign DIN_SEL = OPC==`CALC|`CALCI ? `DIN_ALU
               : OPC==`LOAD|`STORE ? `DIN_RS2
               : OPC==`CALLIF     ? `DIN_RA;

assign S2_SEL = OPC==`CALC ? `S2_RS2
                           : `S2_IMM;

endmodule

ハードウェア構成