【SCALA】3、模拟电路
Simulation
package demo17 abstract class Simulation { type Action = () => Unit
case class WorkItem(time: Int, action: Action) private var curtime = 0 def currentTime: Int = curtime //日程,记录所有未执行的工作项目
private var agenda: List[WorkItem] = List() //更新排序
private def insert(ag: List[WorkItem], item: WorkItem): List[WorkItem] = {
//如果头部时间大于当前时间,那么直接头插
if(ag.isEmpty || item.time < ag.head.time) {
item :: ag
} else {
//否则遍历递归到合适位置
ag.head :: insert(ag.tail, item)
}
} //向日程添加工作项,第二个参数是传名参数
def afterDelay(delay: Int)(block: => Unit) = {
val item = WorkItem(currentTime + delay, () => block)
agenda = insert(agenda, item)
} private def next() = {
(agenda: @unchecked) match {
case item :: rest =>
agenda = rest
curtime = item.time
//执行这个工作项的操作
//这里一定要带括号,不然就是相当于get操作
item.action()
}
} def run() = {
//插入方法
afterDelay(0) {
println("*** simulation started, time = " + currentTime + " ***")
}
//执行所有的操作
while(!agenda.isEmpty) next()
} }
BasicCircuitSimulation
package demo17 abstract class BasicCircuitSimulation extends Simulation { //用来做门的延迟
def InverterDelay: Int
def AndGateDelay: Int
def OrGateDelay: Int //线
class Wire { private var sigVal = false
private var actions: List[Action] = List() def getSignal = sigVal
def setSignal(s: Boolean) = {
if(s != sigVal) {
sigVal = s
//这里是对actions每一个元素应用=》_ () 操作也就是f => f(),每次线的状态变化的时候,执行actions
actions foreach (_ ())
}
} def addAction(a: Action) = {
//加入载头部
actions = a :: actions
//并执行一次a
a()
}
} //非门,也就是翻转器,在uinput和output之间建立饭庄器
def inverter(input: Wire, output: Wire) = {
def invertAction() = {
val inputSig = input.getSignal
//在制定的延迟之后执行对应的方法
afterDelay(InverterDelay) {
//设置输出线信号为input相反
output setSignal !inputSig
}
//test
// output setSignal !inputSig
}
//添加动作到input线
input addAction invertAction
} //与门,输入两个线信号的&操作
def andGate(a1: Wire, a2: Wire, output: Wire) = {
def andAction() = {
val a1Sig = a1.getSignal
val a2Sig = a2.getSignal
afterDelay(AndGateDelay) {
output setSignal (a1Sig & a2Sig)
}
//test
// output setSignal (a1Sig & a2Sig)
}
a1 addAction andAction
a2 addAction andAction
} def orGate(o1: Wire, o2: Wire, output: Wire) = {
def orAction() = {
val o1Sig = o1.getSignal
val o2Sig = o2.getSignal
afterDelay(OrGateDelay) {
output setSignal (o1Sig | o2Sig)
}
//test
// output setSignal (o1Sig | o2Sig)
}
o1 addAction orAction
o2 addAction orAction
} //用来观察线的型号变化
def probe(name: String, wire: Wire) = {
def probeAction() = {
println(name + " " + currentTime + " new-value = " + wire.getSignal)
}
wire addAction probeAction
} }
CircuitSimulation
package demo17 abstract class CircuitSimulation extends BasicCircuitSimulation { def halfAdder(a: Wire, b: Wire, s: Wire, c: Wire) = {
val d, e = new Wire
orGate(a, b, d)
andGate(a, b, c)
inverter(c, e)
andGate(d, e, s)
} def fullAdder(a: Wire, b: Wire, cin: Wire, sum: Wire, cout: Wire) = {
val s, c1, c2 = new Wire
halfAdder(a, cin, s, c1)
halfAdder(b, s, sum, c2)
orGate(c1, c2, cout)
} }
MySimulation
package demo17 object MySimulation extends CircuitSimulation {
def InverterDelay: Int = 1 def AndGateDelay: Int = 3 def OrGateDelay: Int = 5 }
测试结果:
package demo17 import demo17.MySimulation._ object Demo18Test {
def main(args: Array[String]): Unit = {
val input1, input2, sum, carry = new Wire
probe("sum", sum)
probe("carry", carry)
halfAdder(input1, input2, sum, carry)
input1 setSignal true
run()
input2 setSignal true
run()
println("over")
}
}
测试结果:
模拟电路的半加器
【SCALA】3、模拟电路的更多相关文章
- 模拟电路"虚短" & "虚断"
<虚短 & 虚断> 运算放大器组成的电路五花八门,令人眼花瞭乱,是模拟电路中学习的重点.遍观所有模拟电子技朮的书籍和课程,在介绍运算放大器电路的时候,无非是先给电路来个定性,比如这 ...
- 初级模拟电路:3-1 BJT概述
回到目录 1. 名称由来 BJT的全称是双极性结型晶体管(Bipolar Junction Transistor),国内俗称三极管.其实,在英语中,三极管(triode)特指以前的真空电子管形式的 ...
- 初级模拟电路:4-1 BJT交流分析概述
回到目录 BJT晶体管的交流分析(也叫小信号分析)是模拟电路中的一个难点,也可以说是模电中的一个分水岭.如果你能够把BJT交流分析的原理全都搞懂,那之后的学习就是一马平川了.后面的大部分内容,诸如:场 ...
- [模拟电路] 2、Passive Band Pass Filter
note: Some articles are very good in http://www.electronics-tutorials.ws/,I share them in the Cnblog ...
- 初级模拟电路:1-2 PN结与二极管
回到目录 1. 掺杂半导体 上面我们分析了本征半导体的导电情况,但由于本征半导体的导电能力很低,没什么太大用处.所以,一般我们会对本征半导体材料进行掺杂,即使只添加了千分之一的杂质,也足以改变半导 ...
- 初级模拟电路:4-3 BJT晶体管的交流建模
回到目录 1. 四种BJT模型概述 对BJT晶体管建模的基本思路就是,用电路原理中的五大基本元件(电阻.电容.电感.电源.受控源)构建一个电路,使其在一定工作条件下能等效非线性半导体器件的实际工作.一 ...
- 初级模拟电路:3-11 BJT实现电流源
回到目录 1. 恒流源 (1)简易恒流源 用BJT晶体管可以构造一个简易的恒流源,实现电路如下: 图3-11.01 前面我们在射极放大电路的分压偏置时讲过,分压偏置具有非常好的稳定性,几乎不受晶体管的 ...
- 初级模拟电路:3-2 BJT的工作原理
回到目录 和前面介绍二极管的PN结的工作原理一样,BJT的量子级工作机制也非常复杂,一般教科书上为了帮助学习者能快速理解,也都是用一种简化模型的方法来介绍BJT的工作机理,一般只需大致了解即可.只要记 ...
- 初级模拟电路:3-8 BJT数据规格书(直流部分)
回到目录 本小节我们以2N4123通用型BJT硅基晶体管为例,来介绍如何阅读BJT的数据规格书,点此链接可以阅读和下载2N4123的数据规格书. 1. 总体性能 打开datasheet后,首先看标题: ...
随机推荐
- 大数据技术之kettle(1)——安装
一. kettle概述 1.kettle是一款开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. 2.kettle的两种设计 简述: ...
- [spring-boot] ControllerAdvice异常类
package com.example.demo.exception; import org.springframework.web.bind.annotation.ControllerAdvice; ...
- vue-使用keepAlive对上下拉刷新列表数据 和 滚动位置细节进行处理
[前言] 使用vue处理项目中遇到列表页面时,有一些细节需要注意,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法触发上拉加载更多的方法 ...
- 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)
转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...
- PHP 二维数组去重(保留各个键值的同时去除重复的项)
对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...
- git 更新fork的远程仓库
1.添加远程仓库到本地remote分支 git remote add upstream git@github.com:apache/flink.git # 远程仓库地址 2.查看当前仓库的远程分支 g ...
- 海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码
在上一篇方案<EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)>我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个 ...
- LeetCode_401. Binary Watch
401. Binary Watch Easy A binary watch has 4 LEDs on the top which represent the hours (0-11), and th ...
- Apache2.4+PHP7.2配置站点访问变下载
问题描述:Apache正常工作,php-fpm正常工作,访问网址就变下载,显然是站点无法正常解析php造成的.php-fpm与apache的通信出现了问题. 解决方案: 如果php-fpm使用的是TC ...
- Elasticsearch - 处理冲突
http://blog.csdn.net/xifeijian/article/details/49615559