跳到主要内容

4.2 实验十二 边沿触发的D触发器

4.2.1 实验目的

(1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法;

(2)通过实验理解和掌握D触发器原理;

(3)学习用Verilog HDL语言行为机描述方法描述D触发器电路。

4.2.2 实验任务

本实验的任务是描述一个带有边沿触发的同步D触发器电路,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clk,拨码开关的状态作为触发器输入信号d,触发器的输出信号q和~q,用来分别驱动开发板上的LED,在clk上升沿的驱动下,当拨码开关状态变化时LED状态发生相应变化。

4.2.3 实验原理

从D触发器的特性我们知道,它的状态仅仅取决于时钟信号达到之前瞬间的D信号。为了防止SR锁存器的S、R被同时置1的情况,常采用维持阻塞结构的D触发器,其电路结构如下,边沿触发器的次态仅仅取决于CLK信号上升沿(或下降沿)到达时刻输入信号的状态。

alt text
上升沿触发的边沿D触发器电路结构

4.2.4 Verilog HDL建模描述

(1)用行为描述方式实现的D触发器

程序清单dff.v

module dff
( //模块名及参数定义
input clk,rst,d,
output reg q,
output wire qb
);
assign qb = ~q;
always @( posedge clk ) //只有clk上升沿时刻触发
if(!rst) //复位信号判断,低有效
q <= 1'b0; //复位有效时清零
else
q <= d; //触发时输出q值为输入d
endmodule

(2)仿真文件dff_tb.v

`timescale 1ns/100ps    //仿真时间单位/时间精度

module dff_tb();

reg clk,rst,d; //需要产生的激励信号定义
wire q,qb; //需要观察的输出信号定义

//初始化过程块
initial
begin
clk = 0;
rst = 0;
d = 0;
#50
rst = 1;

end
always #10 clk = ~clk; //产生输入clk,频率50MHz
always #15 d = ~d;

//module调用例化格式
dff u1 ( //dff表示所要例化的module名称,u1是我们定义的例化名称
.clk(clk), //输入输出信号连接。
.rst(rst),
.d(d),
.q(q), //输出信号连接
.qb(qb)
);
endmodule

4.2.5 实验步骤

1.打开Lattice Diamond,建立工程。

2.新建Verilog HDL设计文件,并键入设计代码。

3.根据逻辑综合并分配管脚。

clkC1
rst_nL14
dM7
qN13
qbM12

4.根据仿真教程,实现对本工程的仿真,验证仿真结果是否与预期相符。

5.如果仿真无误,构建并输出编程文件,烧写至FPGA的Flash之中。

6.观察输出结果。

4.2.6 仿真结果和实验现象

(1)仿真结果如下图所示:

alt text
带边沿触发的D触发器仿真结果

(2)实验现象:

拨动拨码开关的第1位到ON,给D触发器输入1,则LED1灭,LED2亮输出q=1,notq输出0;拨到OFF时LED1亮,LED2灭,即q输出0,notq输出1(注意LED上拉到3.3V,所以LED管脚为0时亮)。