Engee 文档
Notebook

JK 触发器型号

在本示例中,我们将演示如何使用模块库基本调色板中的组件为 JK 触发器建模。

模型描述

该模型展示了如何通过逻辑元件(块Logic )和延迟块(UnitDelay )组装 JK 触发器。触发器随时钟信号(块PulseGenerator )的每个脉冲更新其状态,因此该模型可用于展示输入信号如何根据 J 和 K 输入端的切换而产生。

如果模型的输入开关处于初始状态(向上位置),触发器的两个 JK 输入端都被置 1,然后触发器的输出状态在时钟信号的每个下降沿(后沿)切换。

image.png

JK 触发器子系统内有两个 SR 触发器:

image.png

SR 触发器的外观如下(所有逻辑元件均使用Logic 块实现):

image.png

在输出Q 之前,上层块Unit Delay 的初始化值为-1 ,下层输出的初始化值为 0。

模型运行

让我们通过程序控制来加载(如果模型尚未打开)和执行模型:

In [ ]:
if "jk_trigger"  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/jk_trigger.engee");
end;

data = engee.run( "jk_trigger" )
Out[0]:
SimulationResult(
    "Q" => WorkspaceArray("jk_trigger/Q"),
    "J" => WorkspaceArray("jk_trigger/J"),
    "CLK" => WorkspaceArray("jk_trigger/CLK"),
    "~Q" => WorkspaceArray("jk_trigger/~Q"),
    "K" => WorkspaceArray("jk_trigger/K")
)

将模型绘制为两个输入端均设置为上限位置时的状态。

In [ ]:
gr()

plot(
    plot( data["CLK"].time,
        [ data["CLK"].value, data["J"].value, data["K"].value ],
          lc=[1 2 5], lw=2, titlefont=font(9), linestyle=[:solid :solid :dash], legend = :outerright,
          label=["CLK" "J" "K"], title="Сигналы на входе синхронного JK триггера"),
    plot( data["CLK"].time,
          [ data["Q"].value, data["~Q"].value ],
          lc=[3 4], lw=2, legend = :outerright, titlefont=font(9),
          label=["Q" "~Q"], title="Сигналы на выходе синхронного JK триггера"),
    layout=(2,1)
)
Out[0]:

当时钟信号CLK 处于上位时,第一个 RS 触发器被激活,而第二个没有被激活。此时,信号JK 可以改变第一个触发器的值,而第二个触发器的值被冻结。如果通过设置J=1K=0 来更改输入参数,则第一个触发器Q 的输出将设为 1,但第二个触发器的输入不会改变。

一旦时钟信号CLK 变为低电平,第二个 RS 触发器即被激活,第一个触发器被禁用。第二个触发器处于第一个触发器的状态,其输出值现在等于上一步中第一个触发器的输出值(第一个触发器保留其先前的状态)。第一个触发器的输出为Q=0 ,因此第二个触发器接收S=1R=0 作为输入,第二个触发器的输出变为Q=1 。但由于输入触发器被禁用,改变输入端的信号并不会改变其状态。

当时钟信号CLK 再次变为高电平时,第一触发器被激活,第二触发器被禁用。JK 触发器的输出不会在上升沿发生变化,因为第二个触发器被禁用,不会改变其状态。

结论

我们研究了 JK 触发器的模型,这是一种能够长时间保持两种稳定状态之一,并在外部信号影响下交替变化的装置。

我们可以利用 CMOS 逻辑块建立更详细的模型,但目前的模型完美地展示了 JK 触发器的工作原理。