本实验的任务是设计一个JK触发器
带使能端RS锁存器的输入端R=S=1时,锁存器的次态不确定,这一因素限制了其应用。为了解决这个问题,根据双稳态元件两个输出端互补的特点,用Q和非Q反馈控制输入信号,并用J代替S,用K代替R,构成了J-K锁存器。
用行为级描述实现的带异步复位和置位端的边沿触发器
程序清单 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
仿真结果如下图所示: