10 个版本
0.5.2 | 2023年3月24日 |
---|---|
0.5.1 | 2023年3月24日 |
0.3.0 | 2020年6月14日 |
0.2.1 | 2020年6月11日 |
0.1.3 | 2020年6月7日 |
#33 in 模拟器
每月下载量 59
215KB
5K SLoC
虚拟集成电路
这个库是一个集成电路模拟器后端,可以模拟多个芯片之间的交互。
注意,目前主要是数字电路模拟,模拟信号有所体现,但仍需改进。
您首先创建一个板,注册芯片和迹线,并将芯片引脚连接在一起以形成一个虚拟电路。然后您可以运行电路来模拟芯片及其之间的连接。
这个库是一个后端模拟器,这意味着没有GUI来创建板。
关于 0.5.0 更新说明
为了简化这个crate的使用,移除所有那些降低代码可读性的 Rc<RefCell>
,整个库已从头开始重写。因此,virt-ic 0.5.0 之前版本的 完全不兼容 新版本。
功能
- 使用芯片和它们之间的迹线构建板
- 以一定的步长和持续时间模拟板,也可以实时运行!
- 保存和加载板以备份设计或稍后继续模拟
可用的内置芯片
- 发生器
- 逻辑门(与、或、非、与非、或非)
- 按钮
- 时钟
- 存储器(RAM、ROM)
- 段显示器
- 中央处理器(6502,缺少中断和十进制模式)
贡献
此项目欢迎任何形式的贡献,从代码审查到直接贡献!您可以
- 建议或改进当前代码
- 建议或添加新功能
- 建议或添加新的内置芯片
- 欢迎任何倡议!
示例用法
use std::time::Duration;
use virt_ic::{
board::{Board, Trace},
chip::{gates::AndGate, generators::Generator, Chip, ChipBuilder, ChipType},
};
fn main() {
// create a new board
let mut board: Board<ChipType> = Board::new();
// place an AND gate to the board
let and_gate = board.register_chip(AndGate::build());
// also place a generator
let vcc = board.register_chip(Generator::build().into());
let gnd = board.register_chip(Generator::build().with_state(virt_ic::State::Low).into());
// Connect the AndGate's VCC, A and B pins with the Generator
let mut trace = Trace::new();
trace.connect(vcc, Generator::OUT);
trace.connect(and_gate, AndGate::VCC);
trace.connect(and_gate, AndGate::A);
trace.connect(and_gate, AndGate::B);
let trace_vcc = board.register_trace(trace);
// Alternative way to connect chips via board, connect GND pins
let trace_gnd = board.connect(gnd, Generator::OUT, and_gate, AndGate::GND);
// simulate the board for 10ms
board.run(Duration::from_millis(10));
// check the results
if let Some(chip) = board.get_chip(&and_gate) {
println!(
"A={:?}, \tB={:?}, \tA&B={:?}",
chip.get_pin(AndGate::A).map(|p| p.state),
chip.get_pin(AndGate::B).map(|p| p.state),
chip.get_pin(AndGate::AB).map(|p| p.state)
);
}
// disconnect AndGate's pin B from VCC and connect it instead to GND
if let Some(t) = board.get_trace_mut(&trace_vcc) {
t.disconnect(and_gate, AndGate::B)
}
if let Some(t) = board.get_trace_mut(&trace_gnd) {
t.connect(and_gate, AndGate::B)
}
// simulate the board for another 10ms
board.run(Duration::from_millis(10));
// check the results
if let Some(chip) = board.get_chip(&and_gate) {
println!(
"A={:?}, \tB={:?}, \tA&B={:?}",
chip.get_pin(AndGate::A).map(|p| p.state),
chip.get_pin(AndGate::B).map(|p| p.state),
chip.get_pin(AndGate::AB).map(|p| p.state)
);
}
}
文档
请参阅 生成的文档。
示例
请参阅 示例
- extend:如何通过扩展内置芯片集添加自定义芯片的示例
- pins:使用 Pin::read 和 Pin::write 读取和写入一组引脚
- ram:RAM 芯片的简单测试
- readme:与本说明中提供的相同的示例
- save:板保存和加载示例
- segment-display:简单的段显示器测试
- sr-latch:工作 SR-Latch 的示例
- test-6502:使用小型程序和基本的ROM和RAM布局测试Nes6502 CPU
依赖项
~0.7–1.5MB
~33K SLoC