文章为Hi_KER原创,因本人能力不足,文章难免有所纰漏,欢迎大家指正。
文章中部分中文内容和名词为HI_KER自行翻译,非官方翻译,特此提醒。
文章主要参考了 Logisim-Help-Tutorial (Logisim自带教程)。
0.触发器总体介绍
触发器可以存储单比特数据,这些数据是通过元件东边的 Q 端口输出的。正常情况下,这个值可以通过西边端口的输入来控制。具体来说,当时钟输入(在每个触发器时钟输入端口用三角形标记)从0上升到1(或其他配置)时,触发器被触发,Q值可能会根据输入发生变化。一般来说,触发器常用的触发方式为时钟上升沿触发和下降沿触发,可在设置中选择需要的触发方式。
Q 称为状态变量。一般把触发器原来的状态(即触发器接收输入信号之前的状态)称为原态或现态,用 表示。改变后的状态(即触发器接收输入信号之后的状态)称为次态,用
表示。
触发器输入端口往往有:异步复位、异步设置和使能端,其作用如下:
异步复位
当端口输入为 0 或未定义时,此输入无效。当输入是1,触发器的值就固定为0。这是异步发生的——也就是说,与当前时钟输入值无关。只要该端口输入是1,其他输入就没有影响。
异步设置
当端口输入为 0 或未定义时,此输入无效。当输入时1,触发器的值就固定为1。这是异步发生的——也就是说,与当前时钟输入值无关。只要该端口输入是1,其他输入就没有影响,除了具有更高优先级的异步复位。
使能端
当该端口输入值为 0 时,时钟触发被忽略, Q 输出保持不变。当此输入为1或未定义时,时钟触发被启用。
上述3个端口均可以不连接输入,触发器也可正常工作。
使用 Poke 工具点击触发器可改变存储在触发器中的值,除非异步设置/复位输入当前锁定了触发器的值。
1.D Flip-flop D触发器
D触发器在触发时值根据下表的变化:
D | Q |
0 | 0 |
1 | 1 |
其中 D 是输入,Q 是输出。
每个端口的名称见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/b0737a50b83d86f5691158b6cd7d374e.png)
2.T Flip-flop T触发器
T触发器在触发时值根据下表的变化:
T | Q |
0 | |
1 |
其中 T 是输入,Q 是输出。
每个端口的名称见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/e720d2b923a51a34227f0a9d28b4ec5a.png)
3.J-K Flip-flop JK触发器
JK触发器在触发时值根据下表的变化:
J | K | Q |
0 | 0 | |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 |
其中 J,K 是输入,Q 是输出。
每个端口的名称见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/b16c0860f9ce9c5d1ac283cdd00bdbc2.png)
4.S-R Flip-flop SR触发器
SR触发器在触发时值根据下表的变化:
S | R | Q |
0 | 0 | |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | ?? |
其中 S,R 是输入,Q 是输出。
每个端口的名称见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/981ad024af11718186ba0dab668cdd3c.png)
5.Register 寄存器
寄存器存储单个多位值,该值以十六进制形式显示在其矩形内,并在其输出端输出。当时钟信号输入满足寄存器触发条件时,存储在寄存器中的值就会在该时刻改变为 D 输入的值。时钟信号指示寄存器储存值发生改变的确切条件是通过触发属性配置的,Logisim 中一般有时钟上升沿和下降沿,高电平和低电平这四种触发方式。
Reset(复位)输入异步地将寄存器的值重置为0(全部为0),也就是说,只要 Reset 为1,寄存器值就固定为 0,不管时钟和输入是什么。
使用 Poke 工具点击寄存器将键盘焦点转移到寄存器(由红色矩形表示),输入十六进制数字将更改存储在寄存器中的值。
![](https://i-blog.csdnimg.cn/blog_migrate/828eff328ebceb0cbf71396d6dec83bb.png)
6.Counter 计数器
计数器持有单个值,其值会在 Q 端口输出。每次时钟输入(输入端口用三角形标记)根据触发属性触发计数器,计数器的值将根据元件左边两个输入 load 和 count(注意:左边有 3 个输入端口,最上方的输入端口称为 load,中间的称为 D,最下方的称为 count)来更新,更新方式:
load | count | 触发情况 |
0或x | 0 | 计数器值不变 |
0或x | 1或x | 计数器值增加 |
1 | 0 | 计数器载入D输入值 |
1 | 1或x | 计数器值减少 |
计数范围可以使用“最大值”属性配置。当计数器达到这个值时,下一个增量将让计数器值回到0,如果计数器值0,那么计数器值减少操作将把计数器设置为它的最大值。
除了输出Q外,该组件还包括一位输出:carry (进位)。当计数器达到最大值时,当 load 和 count 输入指示计数器在下一步该增加时;或者当计数器为0时,load 和 count 输入指示计数器在下一步该减少时,carry 值为1。
clear 输入将计数器的值异步重置为0(全部为0),也就是说,只要 clear 输入为1,无论时钟输入是什么,计数器值都固定为0。
使用 Poke 工具点击计数器将键盘焦点转移到计数器(由红色矩形表示),输入十六进制数字将更改存储在计数器中的值。
计数器较为重要的属性是“溢出时操作”(Action On Overflow),操作当计数器试图递增超过最大值或递减小于 0 时启动。支持四种可能的操作:
Wrap around 重新计数
递增时,下一个值是0
递减时,下一个值时最大值
Stay at value 保持当前值
递增时,保持最大值不变
递减时,保持 0 不变
Countinue counting 继续计数
计数器继续递增/递减,保持数据位属性提供的位数
Load next value 加载下一个值
下一个值从D输入中加载
![](https://i-blog.csdnimg.cn/blog_migrate/8e16d1cf3aa449f33b02998cc16f0ff5.png)
7.Shift Register 移位寄存器
这个寄存器由若干个阶段(Stages)组成,其中每个时钟状态可能导致每个阶段接收前一阶段的值,同时一个新值被加载到第一阶段。该组件还可选地支持并行加载和输出所有阶段的值。
部分引脚介绍
*星号标记只在启用 Parallel Load 属性时存在的引脚
Clear 清空 (输入引脚,位宽 1)
将所有阶段异步重置为 0,也就是说,只要 clear 输入为1,所有输出值都固定为0,而不管时钟和输入是什么。
Shift 移位 (输入引脚,位宽 1)
当断开或输入为 1 时,所有级通过时钟触发右移左边空出的位由 data 填充,但如果输入是0,则不会右移。如果 Load 输入为1,则忽略此输入。
Data 数据 (输入引脚,位宽匹配 Data Bits 属性)
在推进阶段时,在此输入中找到的值被加载到第一阶段。
*Load *加载 (输入引脚,位宽 1)
*Parallel Input *并行输入 (输入引脚,共 Number of Stages 个,位宽匹配 Data Bits 属性)
当 Load 输入为 1 时,其他在上方的引脚(即并行输入引脚)输入值在时钟触发是被加载到移位寄存器中。0 或断开时,不会加载。
Output 串行输出 (输出,位宽匹配 Data Bits 属性)
输出存储在最后阶段的值
*Parallel Output *并行输出 (输出引脚,共 Number of Stages 个,位宽匹配 Data Bits 属性)
输出对应的每个阶段(Stages)的值
部分属性介绍
Parallel Load 并行加载
如果为 Yes,则该组件包括 Load 引脚和用于并行访问所有阶段值的输入和输出
![](https://i-blog.csdnimg.cn/blog_migrate/a196a7a5b1a92a6dfeaafe41ac15d5be.gif)
移位寄存器还有很多其他属性以及特性,在此不再论述,如果读者可自行测试或参考 Logisim 自带教程。
8.Random Generator 随机数生成器
该元件遍历一个伪随机数序列,当启用时,每次时钟被触发时,该序列将前进到序列中的下一个数字。从技术上讲,用来计算伪随机序列的算法是一个线性同余生成器:从种子 开始,下一个的数字就是
:
下一个值 是用相同的计算方法从
计算出来的,以此类推。从组件中看到的值是其位宽属性配置的低阶位。
除了时钟输入,组件还包括一个使能输入,当使能为0时,该时钟输入将被忽略,以及复位输入,该组件的值将异步重置为初始种子 。
初始种子是用户可配置的。如果它被配置为 0(这是默认值),那么种子将基于当前时间;当指示通过重置输入端口进行重置时,组件根据新的当前时间计算一个新的种子。
![](https://i-blog.csdnimg.cn/blog_migrate/cd7e4d359a055009dfd2a9d6a96cde55.gif)
9.RAM 随机存取存储器(Random Access Memory)
RAM 组件是 Logisim 内置库中最复杂的组件,最多可存储 16,777,216 个值(在 地址位宽度/Address Bit Width 属性中指定),每个值最多可包含 32 位(在 数据位宽度/Data Bit Width 属性中指定)。RAM 可加载和存储数据。此外,用户可以通过 Poke 工具(Poke Tool) 交互修改单个值,或者可以通过 菜单工具(Menu Tool) 修改整个内容。
储存的数据值在组件中显示。地址以灰色字体形式陈列在显示区域的左边。在内部,每个值都使用十六进制格式列出。当前选定地址的值将以反色(白字黑底)显示。
RAM组件支持三种不同的接口,这取决于 数据接口(Data Interface) 属性:
一个同步加载/存储端口(默认)
该组件在其东侧包括一个单独的端口,用于加载和存储数据。它的执行取决于标签为 ld 的单比特输入,ld 是 load data(加载数据)的缩写 。ld=1(或浮动)表示以 A 指定的地址加载数据到 D 输出,ld=0 表示存储在 D 端口上输入的数据。
要在组件之间传输数据,将需要使用三态门组件,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/f15c8cb2742da729bfca8ca34cc37547.gif)
一个异步加载/存储端口
这和上面一样,只是没有时钟输入。当 ld 输入为0时,在数据总线上的值被存储到存储器中。当 ld 输入为 0 时,地址或数据发生了变化,则会发生额外的存储。ld 为输入为 1 时,D端口输出当前地址数据的值。
这个选项被用于着更接近地模仿许多可用的随机访问存储器的接口。
![](https://i-blog.csdnimg.cn/blog_migrate/39668093bf4bf3f66ede630b372c325b.png)
分离的加载和存储端口
提供两个数据端口:一个在西面用于存储数据,另一个在东面用于加载数据。该选项消除了三态门的必要性,因此更易于使用。
![](https://i-blog.csdnimg.cn/blog_migrate/a66aa64a618b4e36cdbce1409d0a1ad3.png)
部分引脚介绍
str 储存/Store (输入引脚,位宽 1)
此输入仅在为 Data Interface 属性选择了“分离的加载/存储端口”时出现。当它为1或浮动时,时钟脉冲将导致将左边 D 的数据存储到 RAM 中(假设sel输入也是1或浮点)
sel (Chip Select)(输入引脚,位宽 1)
此输入启用或禁用整个RAM模块,基于值是 1,浮动还是 0。该输入主要用于有多个 RAM 单元的情况,在任何时候只有一个 RAM 单元是启用的
clr 清除数据/Clear(输入引脚,位宽 1)
当该值为1时,RAM 中的所有储存值都固定为0,不管其他输入是什么
10.ROM 只读存储器(Read-Only Memory)
ROM 组件最多可以存储 16,777,216 个值(在地址位宽度属性中指定),每个值最多可以包含32 位(在 数据位宽度/Address Bit Width 属性中指定)。电路可以访问 ROM 中的储存值,但不能改变它们。用户可以通过 Poke 工具交互修改单个值,或者用户可以通过菜单工具修改整个内容。
与 RAM 组件不同,ROM 组件的当前内容是作为组件的属性存储的。因此,如果一个包含ROM 组件的电路被使用了两次,这两个 ROM 组件都持有相同的值。也因为这种行为,ROM 的数据存储在 Logisim 创建的文件中。
当前值显示在组件中。显示的地址以灰色显示在显示区域的左边。在内部,每个值都使用十六进制列出。当前选定地址的值将以相反的文本(白底黑)显示。
![](https://i-blog.csdnimg.cn/blog_migrate/5f58f133968133577b44e0a787456937.gif)