3 分•作者: rafa_rrayes•15 天前
大家好!
我构建了 SHDL(Simple Hardware Description Language,简单硬件描述语言),作为一种将硬件描述精简到绝对基础的实验。
在 SHDL 中,没有算术运算符,没有隐式的位宽,也没有高级结构。你完全从逻辑门和导线开始构建一切,然后以分层的方式组合更大的组件。目标不是合成或性能,而是理解:当抽象被移除时,数字系统实际上是什么样子的。
SHDL 附带 PySHDL,这是一个 Python 接口,可以让你加载电路、探测输入、步进模拟并观察输出。在底层,SHDL 将电路编译成 C 以实现快速执行,但语言本身保持了有意的小巧和透明。
这并不是要取代 Verilog 或 VHDL。它的目标是:
- 从基本原理学习数字逻辑
- 试验 HDL 和语言设计
- 教学或可视化复杂硬件如何从简单门电路演变而来
我特别希望收到关于以下方面的反馈:
- 语言设计选择
- 哪些感觉不必要地受限,哪些具有教育价值
- 这种“反抽象”的 HDL 对你是否有用
代码仓库:[https://github.com/rafa-rrayes/SHDL](https://github.com/rafa-rrayes/SHDL)
Python 包:PySHDL on PyPI
为了更具体,这里有一些用 SHDL 编写的小型工作示例:
1. 全加器
```
component FullAdder(A, B, Cin) -> (Sum, Cout) {
x1: XOR; a1: AND;
x2: XOR; a2: AND;
o1: OR;
connect {
A -> x1.A; B -> x1.B;
A -> a1.A; B -> a1.B;
x1.O -> x2.A; Cin -> x2.B;
x1.O -> a2.A; Cin -> a2.B;
a1.O -> o1.A; a2.O -> o1.B;
x2.O -> Sum; o1.O -> Cout;
}
}
```
2. 16 位寄存器
```
# clk 必须高电平持续两个周期才能存储一个值
component Register16(In[16], clk) -> (Out[16]) {
>i[16]{
a1{i}: AND;
a2{i}: AND;
not1{i}: NOT;
nor1{i}: NOR;
nor2{i}: NOR;
}
connect {
>i[16]{
# 在 clk 上捕获
In[{i}] -> a1{i}.A;
In[{i}] -> not1{i}.A;
not1{i}.O -> a2{i}.A;
clk -> a1{i}.B;
clk -> a2{i}.B;
a1{i}.O -> nor1{i}.A;
a2{i}.O -> nor2{i}.A;
nor1{i}.O -> nor2{i}.B;
nor2{i}.O -> nor1{i}.B;
nor2{i}.O -> Out[{i}];
}
}
}
```
3. 16 位行波进位加法器
```
use fullAdder::{FullAdder};
component Adder16(A[16], B[16], Cin) -> (Sum[16], Cout) {
>i[16]{ fa{i}: FullAdder; }
connect {
A[1] -> fa1.A;
B[1] -> fa1.B;
Cin -> fa1.Cin;
fa1.Sum -> Sum[1];
>i[2,16]{
A[{i}] -> fa{i}.A;
B[{i}] -> fa{i}.B;
fa{i-1}.Cout -> fa{i}.Cin;
fa{i}.Sum -> Sum[{i}];
}
fa16.Cout -> Cout;
}
}
```