资料介绍
描述
背景
如果您像我一样喜欢复古电脑,那么您很有可能会在很多场合看到 KENBAK-1,它被许多人视为第一台商用个人电脑。十年前,Mark Wilson 推出了KENBAK-uino ,这是一个在 ATmega328 上模拟运行的复制品。2016 年,Brian Benchoff发表了一篇关于John Blankenbaker KENBAK-1 创造者的精彩文章。对于 KENBAK-1 故事的第一手资料,您真的应该看看 John Blakenbaker 自己的KENBAK-1 计算机网站。
有一段时间你可以购买一个全尺寸的 KENBAK-1 复制套件,带有 PCB、电源、正宗金属外壳、132 个标准系列 TTL 逻辑 IC 作为 CPU/过程控制逻辑(没错,没有微处理器)和两个 1024 位移内存寄存器。不幸的是,此选项不再可用,但根据 Mark Wilson 的代码,Adwater & Stir提供了尺子大小的nanoKENBAK-1 、半尺寸µKENBAK-1 套件,并且很快还将提供全尺寸套件。此外,您还可以在网上找到像这样的 KENBAK-1 仿真器。
动机
因此,有了所有这些当之无愧的 KENBAK-1 爱,我为什么还要创造另一个 KENBAK-1 复制品?翻转的答案可能是我想要并且我可以,但这还不是全部。虽然所有精彩的复制品都模仿了原版的发球台并提供真正的 KENBAK-1 体验,甚至还有一些附加功能,如内置程序,但在一天结束时,您仍然在许多情况下手动翻译机器指令并通过前面板按钮一次一步地键入它们。当出现问题时,虽然您可以一次单步执行一条指令,但您在前面板显示屏上一次只能看到一件事,即指令或内存/寄存器地址。它变老得很快。
我认为我可以增加一些价值的地方是将机器代码模拟器与汇编器和调试器集成在一起。您仍然可以启动我的 KENBAK-2/5 控制台,通过前面板在本机模式下键入和运行您的程序。此外,您将能够打开一个集成开发环境,通过汇编语言输入一个 KENBAK-1 程序并使用实际控制台运行该程序。同样,您将能够单步调试您的汇编代码,设置断点,并像您一样观察内存和寄存器内容。
我对这个项目的另一个动机是我真的很想深入研究这台机器。当我查看编程参考手册时,我对机器架构和指令集印象深刻。我的意思是用逻辑芯片构建的机器上的间接索引寻址模式。非常酷。
设计注意事项
控制台本身将以 2:5 的比例渲染(因此命名为 KENBAK-2/5)。这主要是为了让所有部件都能安装到我的 Prusa MK3S 的打印床上。内置的 Raspberry Pi 4 将通过 32 通道端口扩展器连接到前面板。除了运行 KENBAK-1 仿真器外,还需要额外的 Pi 马力来运行“集成开发环境”(IDE)。可以通过将显示器、键盘和鼠标连接到控制台的 Pi 4 本身或通过 VNC(首选)来访问 IDE。模拟器、汇编器和调试器将用 Python 编写。
补给品:
除了 3D 打印部件之外,您还需要以下物品:
- 1树莓派 4
- 1 MCP23017 32 通道 I/O 扩展帽(https://www.buyapi.ca/product/mcp23017-hat-32-channel-io-expansion-hat/ )
- 12 个3mm LED(8 个白色和 4 个黄色)
- 2 个拨动开关(KINYOOO SPDT 迷你拨动开关,开/开 3 针 2 位 - 亚马逊)
- 15 个按钮开关(迷你 7 毫米瞬时(关-开)按钮 - 亚马逊 - 8 个黑色和 7 个白色)
- 接上电线。我用的是 22 AWG。
- 间距为 2.54 毫米的母头。
打印零件
我打印了没有支撑的零件和以下设置(除非另有说明):
打印分辨率:0.2 毫米
填充:20%
灯丝:AMZ3D PLA 颜色:我使用了灰色和湖蓝色来与原版保持一致。你的来电。
注意:以默认方向打印零件。
要制作 KENBAK-2/5,您需要打印以下部件:
- 1 - 身体底部
- 1 - 身体顶部
- 1 - 前面板
- 2 - 侧夹
组装控制台
KENBAL-2/5 控制台具有 3D 打印框架并使用面板安装组件。在原始大小的 40% 时,必须做出一些妥协。一方面,John Blankenbaker 机器前面板上出色的键盘式按钮被证明是无法复制的。事实上,按钮位置必须在我的复制品上水平拉伸一点,以适应我确实找到的小面板安装按钮。同样,面板灯也没有漂亮的插座,只有后部安装的 3 毫米 LED。
小尺寸的优点是这些部件可以安装在相当多的 3D 打印机上。据我所知,表壳的形状与原版非常接近。它分五个部分打印。底部有用于该项目的 Raspberry Pi“引擎”的安装钉和用于布线的切口。
顶部没有什么特别的。请注意用于将前面板固定到位的顶部和底部部件中的凹槽。
前面板上有用于固定按钮、开关和灯的孔。由于复制品的尺寸很小,我无法像过去在其他项目中那样直接在面板上 3D 打印标签。相反,我保存了一个 DXF 文件,其中包含来自我的 Fusion 360 模型的面板轮廓和孔位置,并将其带到我添加标签的 Inkscape 中。我将生成的 SVG 文件打印到透明的醋酸纤维板上,我将其层压以保护印刷并增加覆盖层的硬度。我沿着轮廓切出覆盖层,并用标准的手持 1/4" 纸打孔器在按钮和开关孔上打孔。面板灯凹入覆盖层后面,因此不需要孔。
我不能使用面板安装按钮和开关附带的螺母,因为它们不适合这个比例。相反,我调整了前面板上的孔的大小,以便组件可以像它们一样从背面自螺纹拧入。LED 只是摩擦配合。
带有标签的覆盖层将恰好适合按钮和开关,需要一点技巧。
前面板适合切入顶部和底部的凹槽。
将顶部和底部部件与开槽的侧部件连接起来。
这就是控制台。
连接控制台
前面板灯、按钮和开关通过上图所示的端口扩展器连接到 Raspberry Pi。端口扩展器带有支架,因此我使用 Raspberry Pi 上的两个对角角孔将其安装到底部框架上,并使用支架对面的两个角孔来支撑帽子。看起来相当扎实。
接线如下,引脚编号映射到前面板组件:
IC1
1 - 停车灯
2 - 储存灯
3 - 设置灯
4 - 清除灯
5 - 关闭
6 - 开启
7 - 切换解锁
8 - 切换锁定
9 - 数据灯 0
10 - 数据灯 1
11 - 数据灯 2
12 - 数据灯 3
13 - 数据灯 4
14 - 数据灯 5
15 - 数据灯 6
16 - 数据灯 7
IC2
1 - 停止按钮
2 - 启动按钮
3 - 存储按钮
4 - 读取按钮
5 - 设置按钮
6 - 显示按钮
7 - 清除按钮
8 - 不适用
9 - 数据按钮 0
10 - 数据按钮 1
11 - 数据按钮 2
12 -数据按钮 3
13 - 数据按钮 4
14 - 数据按钮 5
15 - 数据按钮 6
16 - 数据按钮 7
在下面的照片中,我大约完成了一半。接地线已连接到所有前面板组件,十五个按钮已连接到帽子,十二个 LED 有一根短线,连接了一个限流电阻。电阻为 10k 以降低亮度。
我使用母头将前面板灯和按钮连接到扩展器。因为顶部框架上没有太多的头部空间,而且板上公头之间的空间有限,我不得不像下面的照片那样调整电线的角度。
它有点紧,当我将电线焊接到接头上时,我一直在问自己为什么没有为前面板设计 PCB。在一天结束时,虽然它工作正常。
红色热缩管保护 LED 的“串联”限流电阻。前面板组件接地线连接到 Raspberry Pi 接地引脚(黑线)。几根电缆扎带和我的 KENBAK-2/5 硬件准备就绪。
关于 KENBAK-2/5 IDE
IDE 用 Python 编写,在 KENBAK-2/5 硬件核心的 Raspberry Pi 上运行。它由四个主要部分组成:
- 控制台- 允许 Raspberry Pi 通过端口扩展器与前面板开关、按钮和灯进行交互。
- 仿真器- 在软件中模拟组成原始KENBAK -1 硬件的 134 个集成电路的操作。它接受一个 256 字节数组作为输入,该数组表示 KENBAK-1 中的整个内存块,并执行编码到这些字节中的指令,直到遇到 HALT 指令或用户按下停止按钮。
- Assembler - 采用 KENBAK-1 指令的符号表示,如Programming Reference Manual的 Symbolic Representation of Instructions 部分中所定义,并将它们转换为可由模拟器执行的机器代码(或原始 KENBAK-1,如果您是有幸接触到一个)。
- 调试器- 允许用户在他们的代码中设置断点,该断点将在该点停止执行,以便可以查看机器内存和寄存器。
查看上图,您可以看到我刚刚加载了一个用 KENBAK-1 汇编语言编写的斐波那契数列计算器程序。右上象限当然是汇编代码,左边是等效的二进制指令。通过单击二进制指令,您可以设置或清除断点(例如,skp 指令设置了断点)。
左下方是预定义“寄存器”的状态,包括用于加载和读取内存位置的地址寄存器。在 KENBAK-1 架构中,寄存器只是预定义的内存位置。以下是 KENBAK-1 中九个特殊内存位置的值(地址为十进制):
Name Address Usage
~~~~ ~~~~~~~ ~~~~~
A 000 A register.
B 001 B register.
X 002 X register.
PC 003 Program counter.
OUTPUT 128 Maps to front panel data display lamps.
OCA 129 Overflow/Carry bits for A register.
OCB 130 Overflow/Carry bits for B register.
OCX 131 Overflow/Carry bits for C register.
INPUT 255 Maps to the front panel data input button
中间底部是所有 256 个内存位置的十六进制转储,右下角更详细地显示了相同的内存位置,每个位置用十六进制、十进制、八进制和二进制表示。所有对内存位置的引用都是十进制的(指令、十六进制转储和详细信息面板中的最左边的列以及指令面板中的最右边的列)。
以绿色呈现的条目表示程序计数器 (PC) 当前指向的内存位置。
前面板控制台与 IDE 完全集成。因此,例如,您可以通过按下控制台上的物理 START 按钮或单击 IDE 中的 Run 按钮来启动上面显示的 Fibonacci 程序。类似地,按住 STOP 按钮,然后按 START 将执行一个步骤,IDE 的 Step 按钮也是如此。
任何写入 OUTPUT 寄存器的内容都会显示在控制台的数据灯上。通过地址寄存器从控制台存储到内存位置的数据将反映在 IDE 中。
IDE 确实提供了一些附加功能。您的程序可以保存并加载到磁盘(汇编代码和二进制内存映像)。重新启动按钮会将所有内容重置为上次加载的图像。Clear 会将内存和汇编程序空间清零,然后将 PC 设置为内存位置 4。 Auto 将以大约每秒一条指令的速度运行程序。
您可以通过单步调试或设置断点并观察内存和寄存器来调试程序。
如果您只想使用 KENBAK-1 代码,您可以在任何支持 Python 的平台上“独立”运行 IDE,但当然您只能将 KENBAK-2/5 控制台集成到 Raspberry Pi 上,因为它绑定到wiringpi库。
安装软件
KENBAK-IDE.py 文件可从我的GitHub 存储库中获得。如果在 KENBAK-2/5 硬件环境之外使用,它应该可以在任何支持 Python3 且不依赖任何库的机器上运行。在这种模式下,您仍然可以编写、调试和运行 KENBAK-1 汇编语言程序。这本身就是一个很棒的学习环境。
如果您在带有端口扩展帽的 KENBAK-2/5 的 Raspberry Pi 上运行,您必须首先确保安装了 Wiringpi 库。
pip3 install wiringpi
我在 Pi 上创建了一个文件夹
mkdir /home/pi/KENBAK-1
并在那里复制了 KENBAK-IDE.py、Assembler Syntax.txt、Fibonacci.asm 和 Fibonacci.bin 文件。然后是运行 Python 脚本的简单问题。
cd /home/pi/KENBAK-1
python3 KENBAK-IDE.py
自动启动 KENBAK-2/5 IDE
如果您像我一样在内置 Raspberry Pi 上将 KENBAK-1 IDE 作为专用控制台运行,那么在机器启动时让程序自动启动会很方便。这是我为实现这一目标所做的。
我在我的 Pi 上创建了一个自动启动文件夹并切换到该文件夹。
mkdir /home/pi/.config/autostart
cd /home/pi/.config/autostart
在刚刚创建的自动启动文件夹中,我添加了以下两个文件。
运行KENBAK-1
cd /home/pi/KENBAK-1
/usr/bin/python3 KENBAK-IDE.py
KENBAK-1.desktop
[Desktop Entry]
Type=Application Name=KENBAK-1
Exec=/home/pi/.config/autostart/runKENBAK-1
此外,必须使用以下命令使 runKENBAK-1 文件可执行:
chmod 777 runKENBAK-1
现在,如果您重新启动系统,您应该会短暂看到桌面出现,并且在 KENBAK-IDE 应用程序加载后不久。
设置 VNC
当前的 Raspberry Pi OS 版本已嵌入 RealVNC。如果您像我一样在 KENBAK-2/5 控制台中运行 Raspberry Pi,那么您必须设置一个虚拟桌面以供 VNC 客户端连接。我发现执行此操作的最简单方法是将以下行添加到/etc/rc.local文件的末尾,在 Pi 上的exit 0之前。
# Setup a virtual screen for the VNC server.
sudo -u pi vncserver -randr=1920x1080
将屏幕尺寸设置为与您将访问 KENBAK-IDE 的机器相同。然后,您应该能够在控制台机器的 IP 地址上使用 RealVNC 客户端连接到 KENBAK-2/5,并附加:1 ,例如在我的情况下192.168.123.122:1 。
整理起来
如上图所示,我添加了一个帮助按钮来弹出一些关于汇编语言语法的信息。与原版一样,您只需使用控制台前面板上的开关、按钮和指示灯即可输入和运行程序,并查看内部机器内存。当您键入时,汇编程序指令会不断被解析,当相应的二进制代码不再有任何问号时,您就知道该行的语法是正确的。它似乎工作得很好。
有了断点、单步模式和内存可视化,调试突然变得容易多了。
当我第一次查看 KENBAK-1 编程参考手册时,我对没有微处理器、只有离散逻辑芯片的机器的指令集印象深刻。实现一个汇编器和仿真器只会加深我对 John Blankenbaker 所创造的东西的欣赏。这在当时是一项相当大的成就,约翰·布兰肯贝克(John Blankenbaker)作为早期个人计算机先驱者,在历史上应该占有一席之地。
还有一件事
1971 年,当 John Blankenbaker 展示他的 KENBAK-1 个人计算机时,他总是展示的程序之一是星期计算器。给定任何日期,它可以告诉您该日期是一周中的哪一天。这是一件很酷的事情,每个人都可以产生共鸣。
嗯,我不觉得我的 KENBAK-2/5 复制品会很完整,直到它可以做到这一点。这是一个有趣的编程挑战,它锻炼了我机器的更多功能,实际上发现了我的模拟器软件的一些小问题:
- JMK 操作数未正确保存返回地址
- 推进程序计数器 (PC) 所需的 HALT 操作数
- 我调整了一些控制台交互。
- 我添加了一个 DB 指令来保留一个字节的内存。
我现在更有信心,因为我的复制品与原作非常接近。这是代码:
; Program to calculate the day of the week for any date. To start this program you will
; have to input the date in four parts: Century, Year, Month, and Day. Each of the parts
; is entered as a two digit Binary Coded Decimal number (ie. the first digit will occupy
; bits 7-4 as a binary number, and the second digit bits 3-0) using the front panel data
; buttons. The steps to run this program are:
;
; 1) Set the PC register (at address 3) to 4.
; 2) Clear the input data then enter the date Century.
; 3) Press Start.
; 4) Clear the input data then enter the date Year.
; 5) Press Start.
; 6) Clear the input data then enter the date Month.
; 7) Press Start.
; 8) Clear the input data then enter the date Day.
; 9) Press Start.
;
; The day of the week will be returned via the data lamps using the following encoding:
;
; 7-Sunday 6-Monday 5-Tuesday 4-Wednesday 3-Thursday 2-Friday 1-Saturday
;
; All lamps turned on means the last item entered was invalid and you have to restart.
;
;
; Get the date we want the day for.
;
load A,INPUT ; Get the century.
jmk bcd2bin
store A,century
halt
load A,INPUT ; Get the year.
jmk bcd2bin
store A,year
halt
load A,INPUT ; Get the month.
jmk bcd2bin
sub A,1 ; Convert from 1 based to 0 based.
store A,month
halt
load A,INPUT ; Get the day.
jmk bcd2bin
store A,day
load A,0b10000000 ; Setup the rotation pattern.
store A,rotate
;
; All the inputs should be in place. Start the conversion.
;
load A,year ; Get the year.
sft A,R,2 ; Divide by 4.
store A,B ; Save to B the working result.
add B,day ; Add the day of the month.
load X,month ; Use X as index into the month keys.
add B,monkeys+X ; Add the month key.
jmk leapyr ; Returns a leap year offset in A if applicable.
jmk working ; Working...
sub B,A ; Subtract the leap year offset.
jmk cencode ; Returns a century code in A if applicable.
jmk working ; Working...
add B,A ; Add the century code.
add B,Year ; Add the year input to the working result.
chkrem load A,B ; Find the remainder when B is divided by 7.
and A,0b11111000 ; Is B > 7?
jmp A,EQ,isseven ; No then B is 7 or less.
sub B,7 ; Yes then reduce B by 7.
jmk working ; Working...
jmp chkrem ; Check again for remainder.
isseven load A,B ; Is B = 7?
sub A,7 ; Subtract 7 from B value.
jmp A,LT,gotday ; No B is less than 7.
load B,0 ; Set B to zero because evenly divisible.
gotday load X,B ; B holds the resulting day number. Use as index.
load A,sat+X ; Convert to a day lamp.
store A,OUTPUT
halt
error load A,0xff ; Exit with error
store A,OUTPUT ; All lamps lit.
halt
;
; Store inputs.
;
century db
year db
month db
day db
;
; Static table to hold month keys.
;
monkeys 1
4
4
0
2
5
0
3
6
1
4
6
;
; Need to preserve A while performing some steps.
;
saveA db
;
; Subroutine to blink the lamps to indicate working.
;
rotate db ; Pattern to rotate.
working db ; Save space for return adderess.
store A,saveA ; Remember the value in A.
load A,rotate ; Get the rotate pattern.
store A,OUTPUT ; Show the rotated pattern.
rot A,R,1 ; Rotate the pattern.
store A,rotate ; Save the new rotation.
load A,saveA ; Restore the value of A.
jmp (working) ; Return to caller.
org 133 ; Skip over registers.
;
; Subroutine takes a BCD nuber in A as input and returns the equivalent binary number
; also in A.
;
bcd2bin db ; Save space for return address.
store A,X ; Save A.
sft A,R,4 ; Get the 10's digit.
jmk chkdig ; Make sure digit is 0 - 9.
store A,B ; B will hold the 10's digit x 10 result
add B,B ; B now X 2
sft A,L,3 ; A is now 10's digit X 8
add B,A ; B now 10's digit X 10
store X,A ; Retrieve original value of A
and A,0b00001111 ; Get the 1's digit value in binary.
jmk chkdig ; Make sure digit is 0 - 9.
add A,B ; Add the 10's digit value in binary.
jmp (bcd2bin) ; A now has the converted BCD value.
;
; Subroutine determines if the date is a leap year in January or February and returns
; an offset of 1 if it is, and 0 otherwise.
;
leapyr db ; Save space for return address.
load A,month ; Check to see if month is January or February.
and A,0b11111110 ; Are any bits other than bit 0 set?
jmp A,NE,notlpyr ; Yes then not January or February. Return 0.
load A,year ; Is this an even century?
jmp A,NE,chkyear ; No then have to check the year.
load A,century ; Yes so see if century evenly divisible by 4.
and A,0b00000011 ; Are bits 1 or 0 set?
jmp A,EQ,islpyr ; Yes evenly divisible by 4 and is a leap year.
jmp notlpyr ; No this is not a leap year.
chkyear load A,year ; See if rear evenly divisible by 4.
and A,0b00000011 ; Are bits 1 or 0 set?
jmp A,NE,notlpyr ; Yes so not evenly divisible by 4 and not a leap year.
islpyr load A,1 ; Offset 1.
jmp (leapyr) ; Return offset.
notlpyr load A,0 ; Offset 0.
jmp (leapyr) ; Return offset.
;
; Subroutine determines if a century code needs to be applied to the calculation.
;
cencode db ; Save space for return address.
load A,century ; Century must be between 17 - 20.
chkmin sub A,17 ; Is century less than 17?
jmp A,GE,chkmax ; Yes so century >= 17. Check max boundry.
load A,century ; Increase century by 4.
add A,4
store A,century
jmp chkmin
chkmax load A,century ; Century must be between 17 - 20.
sub A,20 ; Is century greater than 20?
jmp A,LT,retcode ; No so calculate century code.
jmp A,EQ,retcode
load A,century ; Decrease century by 4.
sub A,4
store A,century
jmp chkmax+2
retcode load X,century ; Calculate the century code
sub X,17 ; Create an index into the century codes.
load A,ctcodes+X ; Get the appropriate century code.
jmp (cencode) ; Return century code.
;
; Subroutine that checks if the digit passed in A is in range 0 - 9.
;
chkdig db ; Save space for return adderess.
store A,saveA ; Remember value in A.
load A,9
sub A,saveA ; Subtract value passed from 9.
and A,0b10000000 ; Is negative bit set?
jmp A,NE,error ; Yes so value in A not in range 0 - 9.
load A,saveA ; No so A value in range.
jmp (chkdig) ; Return to caller.
;
; Static table to hold the output pattern for the day of the week.
;
sat 0b00000010
sun 0b10000000
mon 0b01000000
tues 0b00100000
wed 0b00010000
thur 0b00001000
fri 0b00000100
;
; Static table to hold century codes.
;
ctcodes 4
2
0
6
虽然有一项检查以确保 BCD 输入仅包含数字 0-9,但由于内存空间不足,未实施对月份 (1-12) 和日期 (1-31) 的一些额外检查。上述程序占用了 255 字节可用内存中的 251 字节。因此,虽然指令集对于大多数任务来说绰绰有余,但在这台机器上做有趣事情的限制因素是内存。
更新后的 IDE 和此示例已添加到此项目的GitHub中。
- 终极电脑旋转输入开源分享
- 消毒机器人Hanth-x1开源分享
- Commodore 64 KU主板复制品开源硬件
- 扫地机器人开源资料 43次下载
- 手提电脑开源分享
- 平板电脑开源项目
- 杰华特服务器和个人电脑JWH6374 JWH7067 JWH7030 JWH7222 JW7221
- USB控制16个继电器中1个的开源案例
- 5合1 Arduino机器人开源项目
- 嵌入式软考——尴尬不,就一个人报名
- Apacheproxy负载均衡和Session复制
- 一个开源的拟人机器人仿生手系统HRI-hand 0次下载
- 使用Python复制文件的方法有哪些 6次下载
- 如何实现PC机与单片机实现通信 49次下载
- 开架式通用水下机器人开源搭建手册.pdf 11次下载
- 平板电脑是什么端 平板电脑属于pc端吗 4272次阅读
- 如何使用cp和rsync命令复制文件和目录 6673次阅读
- 一个易于构建且成本极低的电子设备保护器电路图 1025次阅读
- 不输入密码即可登录电脑的方法 2w次阅读
- 分析总结网优的过去及现状、未来发展趋势 2929次阅读
- 朗锐智科Nvidia K1安卓主板介绍 2355次阅读
- 如何用个人电脑打造量子模拟器? 4439次阅读
- USB实现隔离的四种方法分析 5.9w次阅读
- 用FPGA使当年风靡的Atari 2600 VCS游戏机和Apple II个人电脑再次重生 6317次阅读
- 闪存芯片阵列+计算加速器,在个人电脑达到服务器级性能 4216次阅读
- Web3.0-去中心化网络消灭服务器:重新设计数据结构 6223次阅读
- 电脑硬件基础篇gpu(gpu工作原理及作用_特性参数及型号和位置) 8448次阅读
- 图形处理器在电脑上的哪个地方 1.5w次阅读
- 让机器人通过一段只有一个人的视频来模仿学习 6024次阅读
- 一百个人对“电源”有一百种不同的理解 887次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多