=====实验目的===== * (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|}}