=====实验目的=====
* (1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法;
* (2)通过实验理解和掌握JK触发器原理;
* (3)学习用Verilog HDL语言行为机描述方法描述JK触发器电路。
=====实验任务=====
本实验的任务是设计一个JK触发器
=====实验原理=====
带使能端RS锁存器的输入端R=S=1时,锁存器的次态不确定,这一因素限制了其应用。为了解决这个问题,根据双稳态元件两个输出端互补的特点,用Q和非Q反馈控制输入信号,并用J代替S,用K代替R,构成了J-K锁存器。\\
{{::jk触发器11.png?nolink&800|}}\\
=====Verilog HDL建模描述=====
用行为级描述实现的带异步复位和置位端的边沿触发器\\
程序清单 jk_ff.v\\
module jk_ff
( //模块名及参数定义
input clk,j,k,rst,set,
output reg q,
output wire qb
);
assign qb = ~q;
//clk上升沿以及复位和置位下降沿时触发器工作
always@(posedge clk or negedge rst or negedge set)
begin
if(!rst)
q <= 1'b0; // 异步清零
else if (!set)
q <= 1'b1; // 异步置1
else
case({j,k})
2'b00: q <= q; //保持
2'b01: q <= 0; //置0
2'b10: q <= 1; //置1
2'b11: q <= ~q; //翻转
endcase
end
endmodule
仿真文件jkff_tb.v\\
`timescale 1ns/100ps //仿真时间单位/时间精度
module jk_ff_tb();
reg clk,j,k,rst,set; //需要产生的激励信号定义
wire q,qb; //需要观察的输出信号定义
//初始化过程块
initial
begin
clk = 0;
j = 0;
k = 0;
rst = 1;
set = 1;
#50
set = 0;
#50
set = 1;
#50
rst = 0;
#50
rst = 1;
end
always #10 clk = ~clk; //产生输入clk,频率50MHz
always #20 j = ~j;
always #30 k = ~k;
//module调用例化格式
jk_ff u1 ( //jk_ff表示所要例化的module名称,u1是我们定义的例化名称
.clk(clk), //输入输出信号连接。
.j(j),
.k(k),
.rst(rst),
.set(set),
.q(q), //输出信号连接
.qb(qb)
);
endmodule
=====实验步骤=====
- 打开Lattice Diamond,建立工程。
- 新建Verilog HDL设计文件,并键入设计代码。
- 根据仿真教程,实现对本工程的仿真,验证仿真结果是否与预期相符。
=====仿真结果和实验现象=====
仿真结果如下图所示:{{::jk仿真.png?nolink&1000|}}