Circuitjs 创建自定义逻辑(Custom Logic)器件

news2024/9/23 16:19:32

您可以使用 自定义逻辑芯片 来实现自己的简单逻辑器件.

位于“菜单–绘制–数字芯片–添加自定义逻辑”下, 或者是"右键–数字芯片–添加自定义逻辑".

视频简介: Circuitjs 自定义逻辑电路(custom logic)功能简介

一个具体示例

来看一个具体的示例, 通过它来讲述 自定义逻辑 是什么, 为什么以及怎么去做.

这个示例如下, 两个输入 A1 和 A0, 两个输出 S1 和 S0, 两者间的关系也很简单, 就是对输入简单取反, 因此使用了两个 非门 就达到了目的.

circuitjs 自定义逻辑 custom logic 电路原型

输出与输入间的关系就是:

S1=!A1
S0=!A0

其中感叹号 ! 表示取反.

上述的逻辑是用电路直接实现, 现在假设要使用自定义逻辑的方式去做一个等价实现, 从而取代上述 非门 构成的电路, 要怎么去做呢?

至于为什么引入自定义逻辑, 放在后面再解释.

第一步是添加一个自定义逻辑器件, 在菜单或右键中选择 添加自定义逻辑, 然后拖动生成一个缺省的自定义逻辑器件:

circuitjs 自定义逻辑 custom logic 实例

默认情况, 它包含两个输入 A 和 B, 两个输出 C 和 D, 但这只是缺省情况, 可以进一步调整, 输入和输出均可以是一个或多个, 而不是限于两个.

下一步是双击(或"右键–编辑")组件编辑其属性:

circuitjs 自定义逻辑 custom logic 编辑属性

首先给它一个名称, 比如"two-bit-invert":

circuitjs 自定义逻辑 custom logic 编辑属性

接着点击 编辑模型, 在弹出窗口中, 有四个属性可以编辑, 分别为 输入, 输出, 信息文本, 定义, 下面将一一说明:

circuitjs 自定义逻辑 custom logic 编辑模型

  1. 输入

    改为 A1,A0, 与原型一致, 以(英文)逗号分隔. 当然, 这里实际叫什么并不是特别重要, 根据你自己需要去定义即可, 但建议尽可能简短.

    视具体情况不同, 输入端可以有更多或更少. 比如 X,Y,Z 就表示有三个输入端, 名称分别被设为 X, Y 和 Z.

  2. 输出

    改为 S1,S0, 与原型一致(同理, 这里实际叫什么也不是特别重要)

    同样的, 输出端也不限于两个, 可以更多或更少.

  3. 信息文本

    这里可以填入对功能的一个具体描述, 比如"对输入的每一位取反"

  4. 定义

    这是最重要的, 它定义了输入输出间的逻辑关系.

怎么定义呢? 最简单方式就是枚举所有输入的组合情况, 并给出对应输出的值.

如果你有数字电路基础, 很明显这跟所谓的 真值表(True Table) 就是一回事.

那么对于前述取反逻辑, 最终的定义如下:

00=11
01=10
10=01
11=00

最终如下:

circuitjs 自定义逻辑 custom logic 模型定义最终结果

等号左边对应输入, 右边对应输出.

第一行, 左边 00 分别表示 A1=0, A0=0, 右边 11 表示 S1=1, S0=1;

第二行, 左边 01 分别表示 A1=0, A0=1, 右边 10 表示 S1=1, S0=0;

第三行, 左边 10 分别表示 A1=1, A0=0, 右边 01 表示 S1=0, S0=1;

第四行, 左边 11 分别表示 A1=1, A0=1, 右边 00 表示 S1=0, S0=0;

很显然, 以上通过枚举所有输入(及对应的输出)情况, 表达了前述的取反逻辑:

S1=!A1
S0=!A0

如果创建另一个自定义逻辑, 并有如下定义:

00=0
01=1
10=1
11=1

那么就是定义了一个具有两个输入端, 一个输出端的逻辑组件.

显然, 上述定义实际上就是一个 或门.

同样的, 还可以定义更复杂的如异或门, 半加器, 全加器, 译码器以及其它你想要的逻辑组件等等.

确定之后, 组件按我们定义的输入, 输出名称显示如下, 当鼠标移上去后, 画布的右下角还将显示对应名称及信息文本:

circuitjs 自定义逻辑 custom logic 最终的组件效果

接下来可以测试其是否满足相应逻辑, 如果不能满足, 则可能需要仔细检查 定义 里的规则是否有误; 如果一切 OK, 则可以用它取代两个非门构成的电路.

自然, 对于简单的, 容易实现的逻辑来说, 自定义逻辑并没有什么优势;

但对于更复杂一些, 更多输入, 输出的情况, 你可能一下子想不出用电路怎么去实现, 又或者能用电路实现, 但非常庞杂, 各种组件, 连线非常多, 这时自定义逻辑就有优势了.

最终, 所有的逻辑还是要落到具体的电路实现上, 自定义逻辑有时更像是一种"投机取巧", 但用得好, 它还是可以辅助你在整体设计期间, 先忽略部分模块的具体实现, 不至于迷失在过多的细节里, 你可以假设这些子部件是已经实现的, 然后测试整体的逻辑是否 OK.

当大的框架及交互没有问题时, 你可以回过头来再一一去实现那些自定义逻辑, 所以, 它也可以帮你推迟某些实现, 但又不影响整体的功能.

小结

每个自定义逻辑器件都有一个模型名称, 该名称指向描述其工作方式的模型.

您可以创建具有相同型号的任意数量的器件.

编辑模型会更改使用该模型的所有器件的行为.

编辑模型时, 可以指定输入, 输出, 一些信息文本(将鼠标悬停在器件上时显示在右下角)和定义.

输入(和输出)是(英文)逗号分隔的引脚标签列表(最多一个或两个字符).

您还可以指定 取反标签, 像 /Q 对应 Q.

示例:A,B,/C,/D

定义是形式为多行的 输入=输出.

与输入引脚匹配的第一个输入模式将被选中, 并将输出引脚设置为与输出模式匹配.

模式可以包含比特值(0, 1), 过渡(+, -), 通配符/任意值(?), 和模式字母(A, B, 等等).

输入必须不少于输入引脚的数量.

如果更长, 则会将额外的模式字符与输出引脚进行匹配;这使您可以创建带有状态的器件.

输出模式还可包含 _, 以指示高阻抗状态.

更多示例

前面举的具体示例代表了最基本, 最常用的情况, 但自定义逻辑还支持更复杂的表达方式, 比如通配之类的; 甚至, 除了组合逻辑外, 你还可以定义时序逻辑组件.

下面是一些具体示例及说明.

3输入与非门

输入: A,B,C

输出: X

定义:

111=0
???=1

如果所有三个输入均为 1, 则输出为 0. 否则为 1.

全加器

输入: A,B,C

输出: S,C

定义:

111=11
110=10
011=10
101=10
100=01
010=01
001=01
000=00

SR 锁存器

输入: S,R

输出: Q,/Q

定义:

?? 00=10
10 ??=10
01 ??=01
?? AB=AB

输入模式(等号的左侧)按顺序匹配 S, R, Q 和 Q.

等号右侧指定对应的 Q 和 Q 结果值.

第一行, 如果两个输入均为低电平, 则将 Q 输出置位(复位电路时需要此设置).

第二行, 如果 置位端(set) 为高, 则将输出设置为 1,0.

第三行, 如果 复位端(reset) 为高, 则将输出设置为 0,1.

第四行, 除以上情况外, 将使输出保持不变.

前两个字母与输入引脚匹配, 后两个字母与输出引脚匹配.

空格会被忽略, 此处添加空格仅为清晰起见.

D 触发器

输入: D,Clk

输出: Q,/Q

定义:

?? 00=10
0+ ??=01
1+ ??=10
?? AB=AB

如果两个输入均为低电平, 则第一行将 Q 输出置位(复位电路时需要此设置).

接下来的两行在时钟的上升沿时将 Q 输出设置为与 D 输入匹配.

除以上情况外, 最后一行使输出保持不变.

JK 触发器

输入: J,K,Clk

输出: Q,/Q

定义:

??? 00=10
00- AB=AB
10- ??=10
01- ??=01
11- AB=BA
??? AB=AB

如果两个输入均为低电平, 则第一行将 Q 输出置位(复位电路时需要此设置).

接下来的四行在时钟的负跳变上实现JK触发器逻辑.

除以上情况外, 最后一行使输出保持不变.

数字比较器

输入: A2,A1,A0,B2,B1,B0

输出: Eq,A>,A<

定义:

ABC ABC=100
1?? 0??=010
A1? A0?=010
AB1 AB0=010
??? ???=001

第一行检查两个输入是否相等. 接下来的三行测试 A 是否更大. 否则, B 更大.

3位计数器

输入: Clk

输出: A,B,C

定义:

+ AB0=AB1
+ A01=A10
+ 011=100
+ 111=000
? ABC=ABC

该计数器在 Clk 输入的正跳变时递增计数.

第一行处理从 000、010、100 或 110 开始的计数.

第二行处理从 001 或 101 开始的计数.

接下来的两行处理 011 和 111.

最后一行确保除非时钟产生正跳变, 否则输出不会改变.

具有 使能功能 的 3 输入与非门

输入: A,B,C,En

输出: X

定义:

1111=0
???1=1
???0=_

与上面的 3 输入与非门相同, 不同之处在于如果 使能引脚 为低电平, 则输出进入高阻抗状态.

三态缓冲器

输入: A,En

输出: X

定义:

A1=A
?0=_

如果 使能位 为高, 则输出与A相同;否则, 如果 使能引脚 为低, 则输出进入高阻状态.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例56】安全设备导致请求被拦截

问题现象 访问相关报表 第二次访问发现有相关的连接问题 问题分析 服务器访问相关节点&#xff0c;发现相关节点无此问题。从客户的客户端访问缺有问题。在nclog中发现如下日志&#xff0c;链接被重置。 直接访问服务器无丢包现象。客户端未开防火墙。装了杀毒软件已经卸载。…

vue3 实现历史步骤记录

通过vueuse中的 useManualRefHistory&#xff0c;快速实现历史操作记录 所需环境&#xff1a; vue 实现目标 历史记录撤销重做记录覆盖 代码原理 把键盘监听事件挂载在document上&#xff0c;当键盘事件发生时&#xff0c;依次匹配事先订阅的快捷键/单按键事件&#xff0c…

在定义的接口前加前缀路径

前因 在一个服务中&#xff0c;既定义了app端接口&#xff0c;又定义了pc端接口&#xff0c;为了方便区分&#xff0c;可以在项目里建立一个名为"app"、"pc"的文件夹&#xff0c;分别为app、pc提供接口。当app和pc接口一致时&#xff0c;写完一端接口后&a…

Axure设计之动态条形图教程(中继器)

在Axure RP中&#xff0c;中继器是一个非常强大的工具&#xff0c;它允许我们动态地展示数据&#xff0c;并且可以轻松实现复杂的交互效果。本文将详细介绍如何使用中继器来制作一个动态条形图&#xff0c;并展示其在实际项目中的应用。 一、效果预览 预览地址&#xff1a;http…

BC131 矩阵相等判定(c语言)

1.描述 :KiKi得到了两个n行m列的矩阵&#xff0c;他想知道两个矩阵是否相等&#xff0c;请你回答他。 (当两个矩阵对应数组元素都相等时两个矩阵相等)。 // //输入描述&#xff1a; //第一行包含两个整数n和m&#xff0c;表示两个矩阵包含n行m列&#xff0c;用空格分隔。 // //…

深刻理解JDK中线程池的使用

一、线程池状态 线程结构关系 ThreadPoolExecutor使用int的高3位来表示线程池状态,低29位标识线程数量. 注意 : 第一位为符号位,所以RUNNING状态为负数,最小. 这些信息存储在一个原子变量ctl中,目的是将线程池状态与线程个数合二为一,这样就可以用一次cas原子操作进行赋值. /…

如何从零编程实现《黑神话:悟空》

随着游戏行业的不断发展&#xff0c;越来越多的技术被应用于游戏的开发之中。其中&#xff0c;《黑神话&#xff1a;悟空》作为一款备受期待的动作冒险游戏&#xff0c;不仅以其精美的画面和丰富的剧情吸引了无数玩家的关注&#xff0c;还因其背后的技术实现了独特的游戏体验。…

怎么生成一个springboot的项目

这个很简单,只是想记录一下使用springboot的创建工具去创建项目 创建完成之后,删除一些不必要的东西 确认springboot的版本号,我这里要用2.4.0 刷新一下maven,等待下载完成就完成了

T6:好莱坞明星识别

文章目录 **T6周&#xff1a;好莱坞明星识别****一、前期工作**1.设置GPU&#xff08;用CPU可忽略该步骤&#xff09;2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****…

Circuitjs 分支电路(子电路, subcircuit)功能简介

在 circuitjs 中, 可以使用 分支电路 来实现自定义的"黑盒"器件. 分支电路 也称为 子电路(subcircuit). 因为菜单上已经叫成了 分支电路, 以下均称为 分支电路. 通过分支电路, 可以实现对电路的封装与抽象, 从而达到模块化并简化电路的目的. 更进一步的, 被抽象的黑盒…

Apache Paimon V0.9最新进展

摘要&#xff1a;本文整理自 Paimon PMC Chair 李劲松老师在 8 月 3 日 Streaming Lakehouse Meetup Online&#xff08;Paimon x StarRocks&#xff0c;共话实时湖仓架构&#xff09;上的分享。主要分享 Apache Paimon V0.9 的最新进展以及遇到的一些挑战。 一、Paimon&#x…

无人系统特刊合集(二)丨Springer特刊推荐

期刊推荐 期刊征稿&#xff1a;JOURNAL OF INTELLIGENT & ROBOTIC SYSTEMS Journal of Intelligent & Robotic Systems是一本同行评议的期刊&#xff0c;致力于智能系统和机器人技术的理论和实践。 专注于无人系统、机器人和自动化以及人机交互等领域。 在每期中都包…

天猫 登录滑块 淘系滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关 前言 玩了几天现在才有空研究轨迹直接用了之前的…

日志组件导致的内存溢出问题分析

1、 内存溢出日志 普通的http请求&#xff0c;导致堆内存直接溢出&#xff0c;看了下代码实现非常简单的一次DB查询且数据量也比较小&#xff0c;不可能导致内存溢出呢 java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at…

网上花店设计+vue

TOC ssm017网上花店设计vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以及管理需求&a…

CSS3页面布局-三栏-中栏流动布局

三栏-中栏流动布局 用负外边距实现 实现三栏布局且中栏内容区不固定的核心问题就是处理右栏的定位&#xff0c; 并在中栏内容区大小改变时控制右栏与布局的关系。 控制两个外包装容器的外边距&#xff0c;一个包围三栏&#xff0c;一个包围左栏和中栏。 <!DOCTYPE html&…

计算机毕业设计 在线问诊系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

海运整箱成本与拼箱成本对比 | 国际贸易服务平台 | 箱讯科技

整箱和拼箱 在集装箱运输业务中&#xff0c;我们把一个集装箱、一个出口人、一个收货人、一个目的港&#xff0c;满足这“四个一”条件的货物叫做整箱货&#xff0c;而把一个集装箱、出口人、收货人和目的港这三项之中只要有一项是在两个或两个以上的出口运输货物&#xff0c;就…

批量将labelme的json文件转为png图片查看

文章目录 前提修改 l a b e l m e labelme labelme然后你就可以在这个环境下用代码批量修改了 前提 安装anaconda或者miniconda安装labelme 修改 l a b e l m e labelme labelme 查看labelme所处环境的路径&#xff1a;conda info --envs 比如我的是在py39_torch里面 修改la…

Anki自动生成语音

文章目录 前言安装插件制作音频一些注意事项语音消失现象不同端出现媒体文件丢失 参考文章 前言 已经实现了通过使用Obsidian实现Anki快速制卡。 对于语言学习&#xff0c;仅仅只有不同语言文字的对照是不够的&#xff0c;我们还需要声音。 所以就需要加入音频。 幸好 Anki…