设计一个 硬件 实现的 Dictionary(字典)
Dictionary 就是 字典, 是一种可以根据 Key 来 快速 查找 Value 的 数据结构 。
比如 我们在 C# 里用到的 Dictionary<T>,
在 程序设计 里, 字典 通常使用 哈希表(Hash 表) 的 方式 实现, 也可以用 索引 的 方式 实现,
不过 索引 太占空间 了, 所以 在 数据库 里 用的 很普遍, 但是 在 应用程序(内存) 这一层面 好像 没有看到过用 索引 的 。
今天 我们 来 设计一个 用 硬件 实现 的 字典 : ^^
要开始研究 硬件 来 实现一个 字典 呢, 需要 先 准备 一些 基础知识, 可以先看一下我写的另外一篇文章 《漫谈计算机硬件的设计和实现》
https://www.cnblogs.com/KSongKing/p/9866334.html
首先, 我们要引入一个 “开关门” 门电路, 就是 除了 “与”、“或”、“非” 门电路 外, 还需要一个 “开关门” 门电路,
实际上, “开关门” 电路 就是 构成 “与”、“或”、“非” 门电路 的 基础 。
我们来看一下 “开关门” 电路 的 逻辑电路图 :

当 控制端 输入 0 时, 开关 关, 即 输入端 到 输出端 之间的 电路 断开,
当 控制端 输入 1 时, 开关 开, 即 输入端 到 输出端 之间的 电路 接通 。
这个 “开关门 ” 是不是有点像 三极管 ? 哈哈哈
接下来, 我们要设计一个 “电子开关”,
“电子开关” 就是
当 设定端 是 0 时, 输入端 若 输入 0 , 则 输出端 输出 1, 若 输入端 输入 1 时, 输出端 输入 0,
当 设定端 是 1 时, 输入端 若 输入 0 , 则 输出端 输出 0, 若 输入端 输入 1 时, 输出端 输入 1,
这是 …… ?
哈哈哈, 就是 输入端 输入的 值 和 设定端 相同 时, 输出端 输出 1 (开), 否则 输出端 输出 0 (关) 。
这有什么用 ?
利用 这个 “设定” 的 功能, 可以实现 “设置 Key” 的 效果 。
我们来看一下 “电子开关” 的 逻辑电路图 :

有了 “电子开关”, 我们 就可以 实现一个 “字典单元”, 一个 “字典单元” 可以 存放 一个 键值对 。
我们来看一下 “字典单元” 的 逻辑电路图 :

简单起见, 上图的这个 字典单元 只有 2 位(2 Bit), 就是说 可以支持 “00”、“01”、“10”、“11” 4 个 键 。
在 设定端 可以 设定键, 比如 设定端 是 “00”, 则 输入端 输入 “00” 时, 最上方 的 “与门” 输出 1 , “Value 存储单元” 接通, 可以读取数据, 读取到的就是 键 对应的 值 。 输入端 输入 非 “00” 的 其它 值 时, 与门 输出 0, “Value 存储单元” 不接通, 不能读取数据 。
又比如 设定端 是 “01”, 则 输入端 输入 “01” 时, 最上方 的 “与门” 输出 1 , “Value 存储单元” 接通, 可以读取数据, 读取到的就是 键 对应的 值 。 输入端 输入 非 “01” 的 其它 值 时, 与门 输出 0, “Value 存储单元” 不接通, 不能读取数据 。
这就实现了一个 字典单元,
我们把 若干个 字典单元 并联起来(按引脚并联), 即 设定端 的 引脚 1 和 引脚 1 并联, 引脚 2 和 引脚 2 并联 …… 输入端, 输出端 亦然 。
这样 就 组成了一个 字典, 或者说 字典阵列, 就像 内存 的 一组 存储单元 一样 。
n 个 字典单元 组成 的 字典阵列 可以 存放 n 个 键值对 。
哎 ? 等,,, 说到 “阵列” , 如果 设定端 在 断电 的 情况下 也能 保存 设定值, 那这岂不就成了 “可编程逻辑阵列” 了嘛 ~!
设计一个 硬件 实现的 Dictionary(字典)的更多相关文章
- 为 .NET Core 设计一个 3D 图形渲染库
原文地址:https://mellinoe.wordpress.com/2017/02/08/designing-a-3d-rendering-library-for-net-core/ 作者:ERI ...
- 你能熟练使用Dictionary字典和List列表吗?(转)
命名空间System.Collections.Generic中有两个非常重要,而且常用的泛型集合类,它们分别是Dictionary<TKey,TValue>字典和List<T> ...
- (转)C#中的Dictionary字典类介绍
关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionar ...
- C#中的Dictionary字典类介绍
Dictionary字典类介绍 必须包含名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是 ...
- C# Dictionary 字典
C#中的Dictionary字典类介绍 关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/ ...
- 关于Dictionary字典和List列表
命名空间System.Collections.Generic中有两个非常重要,而且常用的泛型集合类,它们分别是Dictionary<TKey,TValue>字典和List<T> ...
- 如何一步一步用DDD设计一个电商网站(十三)—— 领域事件扩展
阅读目录 前言 回顾 本地的一致性 领域事件发布出现异常 订阅者处理出现异常 结语 一.前言 上篇中我们初步运用了领域事件,其中还有一些问题我们没有解决,所以实现是不健壮的,下面先来回顾一下. 二.回 ...
- 深入理解计算机系统(4.2)------逻辑设计和硬件控制语言HCL
上一篇博客我们简单介绍了Y86指令集体系,而这篇博客我们将介绍指令集体系的逻辑设计和硬件控制语言HCL,为后面去实现Y86打下基础. 在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器 ...
- 如何设计一个异步Web服务——任务调度
接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...
随机推荐
- 数字签名-MD5
MD5是信息摘要的意思,报文产生摘要是唯一的(1:1),而且是单向的(通过摘要反推不出源报文) java中的java.security.MessageDigest类,参考MessageDigest的功 ...
- 插入排序算法 Java实现
插入排序算法是算法排序中的一种: 该算法是假设已有序列是有序序列,从首元素(首元素为单个元素,肯定是有序的...)开始分析,对其他元素的位置进行有序的确定: 以算法为例: public class I ...
- Html.DropDownList()的用法
页面代码如下: <%= Html.DropDownList("Category", ViewData["Categories"] as SelectLis ...
- L314 单音节词读音规则(二)-元音字母发音规则
1 单个元音发音尽量拖音一下(2S),发音会饱满一些. 2开音节: 辅音(辅组)(没有)+元音+辅音+e 的单词其中:元音发字母本身音,辅音字母不为r , 字母e不发音. 相对开音节:第一个元音都发字 ...
- audit:backlog limit exceeded
今天发现存储服务器业务不可用,服务器能ping通,远程不了! 到机房管理员那里查看服务器状态后,发现显示如下: 显然系统已经崩溃,只能先重启服务器,先恢复业务,然后针对backlog limit e ...
- JS之鼠标改变img
代码用途: 通过点击图片,来改变图片内容 代码: <!DOCTYPE html> <html> <body> <script> function cha ...
- live555 学习资料
下载源码 http://www.live555.com/liveMedia/public/live555-latest.tar.gz 安装tar xzf live555-latest.tar.gz c ...
- 用 C# 编写 NEO 智能合约
工具 -> 扩展和更新安装 NeoContractPlugin 插件 打开 Visual Studio 2017,打开 工具, 扩展和更新 ,在左侧点击 联机 ,搜索 Neo,安装 NeoCon ...
- block-chain
维护一条链,只能增加记录,不能删除.修改. 去中心化,达到共识 密码学,保证交易无法抵赖和破坏 共识机制 PoW(Proof of Work),工作量证明,是一个博弈论的应用,来防止作恶. 示例:两个 ...
- pycharm中如何安装Scrapy库
先打开pycharm软件. 然后先安装pywin32和setuptools库. 安装成功后再尝试Twisted库,如果失败,就去晚上下载一个库:https://www.lfd.uci.edu/~goh ...