D触发器设计实验报告
一、实验目的
(1)?用ISE14.2 的软件开启一个 Spartan3E的项目.
(2)撰写一个简单的Schematic原理图,?用语法检查器(Syntax Check)来修
正语法的错误
(3)产生测试模板(Test Bench) 来辅助你的设计.
(4)加入系统所需的Constraints 文件.(UCF file)
(5)完成整个设计?程.并产生D.bit文件。
(6)?用Adept软件来烧录D.bit 文件到FPGA.
二、实验器材
ISE14.2 软件
D.V 文件
D.UCF 文件
USB下载线
Adept软件
开发板Basys2
三、实验内容
用电平异步时序逻辑电路,实现下降沿的D触发器(无空翻).需要一个复位信号
RESET,和一个置位信号RET,均为低电平有效.
典型输入时间图如下:
X2(CP)
X1(D)
Z(Q)
接线:
输入信号:
D-------- 接板子上SW0(FPGA内部“p11”);;
CP-------接FPGA内部“B8”(50MHz);
RESET-----接板上Btn0(FPGA内部“g12”);
SET----- 接板上Btn3(FPGA内部“a7”);
输出信号:
Q---------接板子上灯ld0(FPGA内部“m5”);
Q(非)----接板子上灯ld7(FPGA内部“g1”);
四、实验过程
建立原始流程表按照输入信号的变化进行时间的划分,由题意可
知设立8中不同状态,见上图
画出原始流程表:
注:X2为CP,X1为D,Z为Q
化简流程表:
画出状态合并图:
选择最小闭覆盖{(231)(4)(568)(7)}并且用ABCD分别表示:
画出状态相邻图;
状态编码设二次状态用y2y1表示,用00,01,11,10分别表示A,B,C,D四种状态,最简二进制流程表如图;
画出卡诺图并求出激励函数和输出函数;
Y2;
Y2=
Y1;
Y1=
Z
Z=y2;
逻辑电路图:
逻辑电路代码:
module D_top_D_top_sch_tb();
// Inputs
reg SD;
reg D;
reg RD;
reg CP;
// Output
wire QN;
wire Q;
// Bidirs
always #50 CP= ~CP;
always #20 D = {$random}%2;
// Instantiate the UUT
D_top UUT (
.SD(SD),
.QN(QN),
.Q(Q),
.D(D),
.RD(RD),
.CP(CP)
);
/// always #20 RD = {$random}%2;
// Initialize Inputs
// `ifdef auto_init
initial begin
D = 0;
SD = 0;
RD = 0;
CP = 0;
#20 RD = 1;
#40 SD = 1;
end
// `endif
endmodule
输出波形图:
五、课后思考题
1、异步时序逻辑电路与同步时序逻辑电路有何区别?
答:对于同步时序逻辑电路,因为时钟脉冲对电路的控制作用,所以无论输入信号时电平信号还是脉冲信号,对电路引起的状态响应都是相同的。
而对于异步时序逻辑电路,电路中没有统一的时钟脉冲信号同步,电路状态的改变是外部输入信号变化直接作用的结果;在状态转移过程中,各存储元件的状态变化不一定发生在同一时刻,不同状态的维持时间不一定相,并且可能出现非稳定状态。对输入信号的形式有所区分,输入电平信号与脉冲信号,对电路引起的状态响应是不同的
2、如何发现异步电平时序逻辑电路中的竞争并消除临界竞争?
答:观察当输入信号变化时是否会引起电路中两个或两个以上状态变量发生变化,会引起则存在竞争,否则不存在竞争。若竞争的结果可能使电路到达不同的稳态,即状态转移不可预测,则是临界竞争。消除临界竞争主要在状态编码时避免,有三种方法:相邻状态,相邻分配;增加过渡状态,实现相邻分配;容许非临界竞争,避免临界竞争。
六、实验体会
通过这次实验,了解了异步的相关知识,懂得了异步电路的处理办法。提高了自己在电路方面的技能。在使用ISP编程环境时要时刻注意保存,操作这样一个系统也需要牢固的基础知识,再就是多加练习,虽然第一次使用碰了很多钉子,但相信随着对它的了解的深入,我能很好地掌握使用方法,在没有硬件的情况下也能很好地将书本上学到的付诸实践。
计数器的设计
一、实验目的
1、以计数器为例,掌握时序电路设计方法。
2、熟练掌握ISE软件进行FPGA开发的过程以及实验箱的使用方法。
3、了解ISE设计报告中电路资源利用率情况分析。
4、掌握中规模集成计数器的使用方法及功能测试方法
二、实验内容
用verilog语言设计一个能清0、置数和进位输出增1、减1的4位二进制计数器,
如下图1所示:
输入CLR为清0 端,信号LD为置数端,将A、B、C、D的输入值送到计数器中,并立即在QA、QB、QC、QD中输出。输入信号M为模式选择端,当M=1时加1计数,当M=0时减1计数。CP端输入一个上升信号时进行一次计数,计数有进位/借位时,Qcc端输出一个负脉冲。
三、实验过程
1、启动ISE集成开发环境,创建工程并输入设计源文件。
2、对设计进行时序仿真,分析设计的正确性。
3、在设计文件中输入Verilog代码
`timescale 1 ns / 1 ps
4 module qu_dou ( clk ,rst , a ,b );
5
6 input clk ;
7 wire clk ;
8 input rst ;
input a ;
wire a ;
output b ;
reg b ;
reg [31:0] cnt ;
reg clkout ;
always @ ( posedge clk or negedge rst )
begin
if ( rst == 1'b0 )
cnt <= 0 ;
else begin if ( a==1'b1 ) begin
if ( cnt >= 32'd3000000 )
b <= 1 ;
else
cnt <= cnt + 1'b1 ;
end
else begin b <= 1'b0 ;
cnt <= 0 ;
end
end
end
endmodule 功能实现:
`timescale 1 ns / 1 ps
module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst );
input load ;
input clk;
wire load ;
input clr ;
wire clr ;
input up_down ;
wire up_down ;
input [3:0] DIN ;
wire [3:0] DIN ;
input sysclk ;
input rst ;
output c ;
reg c ;
output [3:0] DOUT ;
wire [3:0] DOUT ;
reg [3:0] data_r;
/***************** 例化去抖模块 *************************************/
wire clk_r ;
qu_dou qu_dou (
.clk (sysclk) ,
.rst (rst) ,
.a (clk),
.b (clk_r));
//*********************************************************************
assign DOUT = data_r;
always @ ( posedge clk_r or posedge clr or posedge load)
begin
if ( clr == 1) //同步清零
data_r <= 0;
else if ( load == 1) //同步预置
data_r <= DIN;
else begin if ( up_down ==1)
begin
if ( data_r == 4'b1111) begin //加计数
data_r <= 4'b0000;
c = 1;
end
else begin //减计数
data_r <= data_r +1;
c = 0 ;
end
end
else
begin
if ( data_r == 4'b0000) begin //加计数
data_r <= 4'b1111;
c = 1;
end
else begin //减计数
data_r <= data_r -1;
c = 0 ;
end
end
end
end
Endmodule
波形仿真图:
五、实验体会
刚开始编程时对两位的位选信号不知道怎样更好地实现,通过老师的讲解,我明白了可以用clk1的高低电平来控制选择”01”、”10”实现一个两路选择器,在下载进行验证时,开始锁定的引脚不连续,不方便连线,后来重新锁定引脚后没有保存重新生成bit文件,导致我们的数码管不显示任何结果,经过询问老师后,重新下载成bit文件后出现了结果。总之,我通过这次试验,解决实际问题的能力得到了增强,收获颇大。
第二篇:上升沿触发的D触发器设计
EDA实验报告书
姓名 学号 实验时间