

An logic gate computer made of 74 gates
- Size
- 100 × 100 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 75
- Nets
- 138
- Pads
- 430
- Tracks, vias
- 1,650, 205
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 5 (file 20171130)
- Created
- 11 Nov 2018
- Updated
- 8 Jul 2020
Overview
ALU1 is an open-source printed circuit board by Left-Hand, from the Left-Hand/74-gate-computer repository on GitHub. It is a 2-layer board of 100 × 100 mm with 75 parts on 138 nets, routed with 1,650 tracks and 205 vias.
It is built around the 74LS240DC, 74LS04PC and 74LS10PC, with the 74LS273PC and 74LS74PC among its other parts. Its parts include 19 resistors, 18 diodes, 14 capacitors, 13 ICs and 9 connectors.
Main components
574LS240DC
--55℃~+125℃ 1 15mA 18ns@5V,45pF 24mA 29mA 4.75V~5.25V 74LS Output enable Schmitt trigger Tri-State - Buffers, Drivers, Receivers, TransceiversTexas InstrumentsBuffers, Drivers, Receivers, Transceivers74LS04PC
PDIP-140℃~+70℃ 4.75V~5.25V 6 6.6mA 74LS PDIP-14 InvertersonsemiInverters74LS10PC
PDIP-140℃~+70℃ 3 3.3mA 4.75V~5.25V 74LS Series NAND Gate PDIP-14 Logic GatesonsemiLogic Gates74LS273PC
PDIP-201 15ns 27mA 27ns@5V,15pF 30MHz 5ns 74LS Series 8 D-Type Reset Rising Edge PDIP-20 Flip Flops ROHSonsemiFlip Flops74LS74PC
DIP-140ns 0℃~+70℃ 1 2 20MHz 3.5pF 35ns@5V,50pF 4.5ns 4.75V~5.25V 400uA 74LS Series 8mA 8mA Asynchronous Complementary D-Type Rising Edge Set and Reset DIP-14 Flip FlopsTexas InstrumentsFlip Flops
README
readme.md本文档用于帮助您快速理解本微型计算机的构成
特征及功能
-
核心频率期待值为16Mhz,保守预估为8Mhz(暂未测试,待实体机研制出来后测试)
-
绝大多数指令为1T,不使用微指令 *部分另外说明
-
使用冯·诺伊曼架构(最初是使用哈佛架构)
-
使用74门作为本计算机的核心组件,并且不使用其他可编程组件(单片机,FPGA,CPLD等)
-
支持VGA显卡,分辨率为256*240。为4片is62c256分为两组乒乓工作,能够硬件上下回滚,自动修改地址为下一个字符
-
包含2个16位定时器,可屏蔽计时器信号,产生7位权中断
-
PC(program counter)程序计数器为24位,能够寻址宽度为2M,前一半分配给AT28系列或是W27C系列芯片作为引导程序,后半部分为单片8Mbit的 sram,用于储存数据和运行程序
-
支持硬件ALU加速乘除操作,需要配置ALU相关寄存器,核心运算部分在16个时钟内完成(不包括配置寄存器及载入读出)
动机及声明
本人在16年左右看了commdore64的测评,认为非常新奇,于是整天幻想做一个自己的计算机,于17年开始构思(但是当时想的都是一些怪点子,比如用FR储存器作为Vram,使用摇摇棒作为显示屏等),直到下半年到18年出才正式开始用74构造切实可行的电路,并且陆续发布相关文章(黑历史bushi),最后在digital软件下逐步仿真出我想要的电路
主页:https://space.bilibili.com/28690875
专栏:https://www.kechuang.org/t/83193
本项目为开源项目,可能会出相关套件,请勿盗用。 由于我是一名在校高一年级高中生,因学业原因可能进度推展缓慢
文件
主目录下有一个POB.dig文件,为项目的主文件。使用hneemann的digtial作为仿真的ide(需要安装java),可以在 https://github.com/hneemann/Digital 中找到
作者的提供的库并不适合本项目,我将example/lib下的文件做了替换,解压主目录下的lib.zip文件并替换,方可使用本项目
ES目录下为旧的模块测试用文件,曾有模块化的打算,但是因无法看到底层电路的状态而放弃这一方案
原理
本计算机与其他微机不同,没有微指,例如C语言中的
A = B;在大部分微机中,这条指令包括数个微指令:
1. 使B寄存器输出总线使能
2. 控制A载入总线中的数据
3. B寄存器输出结束
4. 检查其他操作...但是,在本机中,绝大多数指令(不涉及修改返回PC值)为1T指令,即一条指令只花费一个周期
此机中,花费两个指令:
1. 切换为B寄存器输出到总线
2. 向A寄存器发出载入脉冲再比如一个稍微复杂的(A,B分别为ALU内部的两个寄存器):
C = A + B;执行操作如下(对应一个周期):
1. 切换为立即数寄存器输出到总线
2. 输出加法的ALU控制码(使用74181作为ALU,有多位控制译码线,无法简单操作)
3. ALU载入控制码
4. 切换为ALU输出到总线
5. C寄存器载入总线中的内容故而,在本机中大部分操作使用译码器实现。有两种选通通道,P以及O,均为6位,各自可选通64个不同的脉冲,其区别在于
- P中只会在CLK主时钟发出脉冲时发出脉冲
- O会一直保存为上次载入之后的内容,且持续输出
这样,我们需要操作诸如A = B的操作,先修改O的指针以使B输出,再是P指向A载入的脉冲并放出脉冲,即可完成这样的操作
指令结构
单个指令为8bit,如果后缀了操作数,那么则为16bit单个操作的字节这样分配
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| 下一位数据有无 | 是否为O指令 | P5/O5 | P4/O4 | P3/O3 | P2/O2 | P1/O1 | P0/O0 |
需要说明的是,数据必须在指令之前给出,这使我们的汇编码写起来似乎有点反人类,但是这样做也是合情合理的
例如,A寄存器载入的指令为001(前包含一位0表示8进制) 下面是一段实现"A = 0x19"的汇编代码(此处为方便没有配置A寄存器,实际需要):
BUSO 0x19
ACP这里我们的BUSO指使总线上的立即数寄存器输出(为000(八进制中的0,八进制不使用如0x,0b的前缀,而是0)),它的出现同时为了引入0x19这样一个操作数,我们把它编译出来
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | //BUSO指令,下接操作数
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | //操作数0x19
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | //A寄存器载入控制符这样,我们的A寄存器就可以载入0x19这样的数字了其背后的逻辑控制稍显复杂,我们不做讨论
操作符
下面列出所有操作符(空为未定)
P操作符:
| 序列号 | 汇编助记符 | 说明 |
|---|---|---|
| 000000 | NON | 不做任何操作 |
| 000001 | ACP | 向A寄存器输出脉冲,视当前操作状态而定 |
| 000010 | AMR | A寄存器清零 |
| 000011 | STL | 使A寄存器操作状态为左移 |
| 000100 | STR | 使A寄存器操作状态为右移 |
| 000101 | LDM | 使A寄存器操作状态为载入 |
| 000110 | BLLD | 使BL寄存器载入 |
| 000111 | BHLD | 使BH寄存器载入 |
| 001000 | AILD | 使A寄存器右侧移位寄存器载入 |
| 001001 | MLD | 使M寄存器载入(硬件乘法加速相关) |
| 001010 | STC | 使ALU进位输入清零 |
| 001011 | CLC | 使ALU进位输入制位 |
| 001100 | REC | 使ALU进位输入为进位输出 |
| 001101 | NF | 第一次移位操作禁止(硬件除法加速相关) |
| 001110 | CAI | 清除A寄存器右移移入数据(硬件乘法加速相关) |
| 001111 | ACLD | ALU控制符载入 |
| 010000 | PCLLD | 程序计数器最低字节预载入 |
| 010001 | PCMLD | 程序计数器中字节预载入 |
| 010010 | PCHLD | 程序计数器高字节预载入 |
| 010011 | FBK | 强制备份当前程序计数器至备份0 |
| 010100 | RD | 读写储存器操作为读 |
| 010101 | WT | 读写储存器操作为写 |
| 010110 | RET | 返回备份0的程序地址 |
| 010111 | GED | 程序计数器备份至备份1,读写预载入的地址数据并返回 |
| 011000 | JMP | 无条件跳转预载入的地址 |
| 011001 | HLT | 宕机 |
| 011010 | JC | 在ALU状态寄存器输出情况下,有进位输出跳转 |
| 011011 | JNC | 在ALU状态寄存器输出情况下,无进位输出跳转 |
| 011100 | JZ | 在ALU状态寄存器输出情况下,ALU得数为0时跳转 |
| 011101 | JNZ | 在ALU状态寄存器输出情况下,ALU得数不为0时跳转 |
| 011110 | JV | 在ALU状态寄存器输出情况下,ALU得数溢出跳转 |
| 011111 | JNV | 在ALU状态寄存器输出情况下,ALU得数未溢出跳转 |
| 100000 | T0LLD | 定时器T0低位载入 |
| 100001 | T0HLD | 定时器T0高位载入 |
| 100010 | T1LLD | 定时器T1低位载入 |
| 100011 | T1HLD | 定时器T1高位载入 |
| 100100 | CTC | 设置定时器中断许可 |
| 100101 | CTI | 设置中断许可 |
| 100110 | INT3 | 强制中断3 |
| 100111 | INT1 | 强制中断1 |
| 101000 | IO0 | IO0载入 |
| 101001 | IO1 | IO1载入 |
| 101010 | CLD | C寄存器载入 |
| 101011 | DLD | D寄存器载入 |
| 101100 | IOLD | IO口控制数据流寄存器载入 |
| 101101 | ||
| 101110 | ||
| 101111 | ||
| 110000 | ||
| 110001 | ||
| 110010 | ||
| 110011 | ||
| 110100 | ||
| 110101 | ||
| 110110 | ||
| 110111 | ||
| 111000 | SAM | 设置A组屏幕输出 |
| 111001 | IVS | 切换为另一组屏幕输出 |
| 111010 | WVGA | 写VGA数据 |
| 111011 | YP | 设置Y偏转 |
| 111100 | LXB | 准备载入X地址 |
| 111101 | LX | X地址载入 |
| 111110 | LYB | 准备载入Y地址 |
| 111111 | LY | Y地址载入 |
O操作符:
| 序列号 | 汇编助记符 | 说明 |
|---|---|---|
| 000000 | BUSO | 总线立即数寄存器输出 |
| 000001 | UO | ALU输出 |
| 000010 | DO | 除法寄存器输出 |
| 000011 | AOO | A寄存器右侧输出寄存器输出 |
| 000100 | ACO | ALU状态输出 |
| 000101 | PCLO | 程序计数器低位预输入输出 |
| 000110 | PCMO | 程序计数器中位预输入输出 |
| 000111 | PCHO | 程序计数器高位预输入输出 |
| 001000 | RDTO | 读取的储存器数据输出 |
| 001001 | INTO | 中断信号编码输出 |
| 001010 | CRO | C寄存器输出 |
| 001011 | DRO | D寄存器输出 |
| 001100 | IO0O | IO0输出 |
| 001101 | IO1O | IO1输出 |
汇编器及烧录
主目录下的asm.py文件,使用python写了一个简易的汇编器,用于将类似汇编代码更为底层的代码转换为机器码,省去人力编写的痛苦,写完之后将文档(txt格式)的地址修改进python代码中,在命令行的输出中可以找到编译出的机器码,将这段文本修改进入POB.dig文件下(实质上是xml文件),在ROM的data属性中替换为该段文本
各个寄存器逻辑详解
待补充
其他
koishi赛高
Parts
75| Qty | Value | Footprint | References |
|---|---|---|---|
| 19 | R | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R2, R3, R4, R5, R6, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19 +3 |
| 18 | LED | LED_THT:LED_Rectangular_W5.0mm_H2.0mm | D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16 +2 |
| 13 | C | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13 |
| 6 | Conn_01x08 | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | J2, J3, J5, J6, J7, J8 |
| 3 | 74LS138 | Package_DIP:DIP-16_W7.62mm | U2, U6, U11 |
| 3 | 74LS240 | Package_DIP:DIP-20_W7.62mm | U10, U12, U13 |
| 2 | 74LS181 | Package_DIP:DIP-24_W15.24mm | U3, U7 |
| 1 | 74LS04 | Package_DIP:DIP-14_W7.62mm | U1 |
| 1 | 74LS10 | Package_DIP:DIP-14_W7.62mm | U4 |
| 1 | 74LS244 | Package_DIP:DIP-20_W7.62mm | U9 |
| 1 | 74LS273 | Package_DIP:DIP-20_W7.62mm | U5 |
| 1 | 74LS74 | Package_DIP:DIP-14_W7.62mm | U8 |
| 1 | C | Capacitor_THT:CP_Radial_D5.0mm_P2.00mm | C15 |
| 1 | Conn_01x03 | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J9 |
| 1 | Conn_01x28 | Connector_PinHeader_2.54mm:PinHeader_1x28_P2.54mm_Vertical | J1 |
| 1 | LOGO | Valve:cute | G*** |
| 1 | LOGO | Valve:me | G*** |
| 1 | USB_B_Micro | Connector_USB:USB_Mini-B_Lumberg_2486_01_Horizontal | J4 |
More from Left-Hand/74-gate-computer
2- 2 layers99.7 × 99.7 mm

- 2 layers100 × 100 mm

Similar boards
- 2 layers249.9 × 140.7 mm

GIMIX DMA SASI
roberto314/GIMIX_reproduction
Reproducing SS-50 and SS-30 cards and GIMIX Ghost Case and Mainboard
89 parts1BSD-2-Clause - 2 layers364 × 203 mm

- 2 layers279.4 × 203.2 mm

Z180GDC
lynchaj/rhyophyre
Single Board Computer featuring Zilog Z180 processor and NEC µPD7220 Graphics Display Controller
249 parts12 - 6 layers244 × 244 mm

Retroslop
CPTforever/8088-MicroATX-Computer
A 8088 based, IBM 5150 like computer compatible with the MicroATX motherboard form factor.
193 parts - 2 layers213.5 × 79.1 mm

- 2 layers125.7 × 97.8 mm

QL CST FLoppyController V3
alvaroalea/QL_CST_FLoppyController
A clone of the CST's Floppy Disk Interface for Sinclair QL (PCB version 3 & 4)
25 parts8 - 2 layers232.8 × 204.2 mm

- 2 layers244 × 244 mm

Questions
How big is the ALU1 PCB?
It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.
What parts does the ALU1 use?
75 parts, built around the 74LS240DC, 74LS04PC, 74LS10PC and 74LS273PC. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the ALU1 KiCad files?
From the Left-Hand/74-gate-computer repository on GitHub, at the commit this page was made from: the board is kicad/ALU1/ALU1.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Can I use the ALU1 design in my own project?
Its repository states no licence, so its author keeps all rights: ask Left-Hand before reusing the design.