实验五 触发器 实验5.3 实现4JK触发器

一、实验设计目标

(1)设计实现一个4输入的带置位和清零端的正边沿触发的JK触发器。

(2)通过此实验学习利用编程得到任意频率的时钟信号的基本方法。

二、实验设计思路

类似于实验5.2节,本节实验设计实现一个带置位和清零端的正边沿触发的JK触发器。包含时钟信号CLK1,置位端Setn,清零端Clrn,四组数据输入信号J3J0、K3K0和四组数据输出信号Q3~Q0。当Setn和 Clrn都为高电平时,输出Q在时钟信号CLK1的上升沿处随输入J、K的值变化,在J、K端均为1时,每遇到一个时钟的上升沿,输出端的状态翻转一次。

表5.2是第i组输入输出信号的真值表,img表示该组输出的当前值,img表示该组输出上一刻的状态,从真值表可以写出img的逻辑表达式:

img img (5.2)

5.2 带置位与清零端的JK触发器真值表

置位 清零 输入 输出
img img img img img img img
0 X X X X 1 0
1 0 X X X 0 1
1 1 img 0 0 img(保持) img(保持)
1 1 img 0 1 0 1
1 1 img 1 0 1 0
1 1 img 1 1 img(翻转) img(翻转)

三、功能模块图与输入输出引脚说明

JK触发器工程包含顶层模块triggerJK1和底层模块trigger_module,图5.8是整个工程的模块功能图。下面介绍一下顶层模块各引脚的功能:

img

图5.8 JK触发器模块功能图

(1)CLK:50MHz的系统基准时钟输入。为了能观察到JK触发器的翻转效果,必须降低时钟信号CLK1的频率,将CLK适当分频可得到频率为12.5HZ的时钟信号CLK1,用CLK1的上升沿作为JK触发器的触发信号。

(2)Setn:置位输入信号,连接至Key_Col[0]。当Key_Row[3]输出低电平,KEY0按下时,Setn由高电平变为低电平,JK触发器输出Q恒为1。

(3)Clrn:清零输入信号,连接至Key_Col[1],当Key_Row[3]输出低电平,KEY1按下时,Clrn由高电平变为低电平。当Setn为高电平,且Clrn为低电平时输出Q恒为0。且Setn信号的优先级高于Clrn信号。

(4)SW_In:拨动开关输入,共有八位总线。SW_In[7:4]分别连接“JK触发器”的输入J3J0,SW_In[3:0]分别连接“JK触发器”的输入K3K0,用于模拟输入信号。

(5)LED_Out:输出到LED灯,共有八位总线。LED_Out[7:4]分别连接“JK触发器”的输出Q3~Q0;LED_Out[3:0]分别连接“JK触发器”的输出Q_n0(对应于表5.2中的img),通过LED灯的亮灭情况来观察触发器的输出效果。

四、程序设计

​ 图5.9是截取自底层模块trigger_module的部分代码:

img

5.9 JK触发器实验核心代码

13-26:一个分频程序的基本写法,用于产生频率为12.5Hz的时钟信号CLK1。13-15定义了该分频程序需用到的内部信号及参数,需要注意的是常量的书写格式;19行代码中的“-1’b1”用于保证所得到的时钟信号CLK1的频率的准确性,非常重要;时钟信号CLK1的频率计算公式为

img (5.3)

img

28-38:实现带异步置位和清零端的JK触发器的逻辑表达式,见公式(5.2)。Setn信号的优先级高于Clrn信号。

五、FPGA管脚配置

以下是Anlogic FPGA的IO Constraint,CLK信号、Setn信号、Clrn信号、SW_In[7:0]输入信号和LED_Out[7:0]的引脚连接信息如下表。

set_pin_assignment { CLK } { LOCATION = R7; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Clrn } { LOCATION = D11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Key_Row[0] } { LOCATION = D9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Key_Row[1] } { LOCATION = F9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Key_Row[2] } { LOCATION = C10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Key_Row[3] } { LOCATION = E10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[0] } { LOCATION = B14; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[1] } { LOCATION = B15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[2] } { LOCATION = B16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[3] } { LOCATION = C15; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[4] } { LOCATION = C16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[5] } { LOCATION = E13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[6] } { LOCATION = E16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { LED_Out[7] } { LOCATION = F16; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Setn } { LOCATION = E11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[0] } { LOCATION = A9; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[1] } { LOCATION = A10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[2] } { LOCATION = B10; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[3] } { LOCATION = A11; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[4] } { LOCATION = A12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[5] } { LOCATION = B12; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[6] } { LOCATION = A13; IOSTANDARD = LVCMOS33; }

set_pin_assignment { Sw_In[7] } { LOCATION = A14; IOSTANDARD = LVCMOS33; }

六、实验结果

本实验设计实现包含4组输入输出信号的JK触发器,在验证实验时仅需挑选其中一组进行观察。如挑选第四组输入输出信号,SW7和SW3分别连接J3、K3输入信号,LED7和LED3分别连接Q3、Q_n3输出信号。当SW7和SW3均拨至“DOWN”时,输出处于“保持”状态,LED7和LED3的状态不改变;当SW7和SW3分别拨至“DOWN、UP”时,输出Q为0,LED7灭,LED3亮;当SW7和SW3分别拨至“UP、DOWN”时,输出Q为1,LED7亮,LED3灭;当SW7和SW3均拨至“UP”时,输出处于“翻转”状态,每遇到一个时钟信号CLK1的上升沿,LED7和LED3的状态翻转一次。因篇幅受限,其他情况请自行验证。

七、思考与拓展

(1)在观察现象时,发现实验结果不太理想,LED灯的状态变换情况存在一定的延时,请问这是什么原因造成的?

(2)为解决(1)中的延时问题,令trigger_module.v文件中的参数Timex =

21’d200_000,当SW7和SW3均拨至“UP”时,LED7和LED3快速闪烁。

(3)参考实验5.1中D触发器实验思路,使用结构描述的方式实现带置位和清零端的JK触发器功能。