【原创】DE2 实验练习解答—lab 3:锁存器、触发器和寄存器(digital Logic)(DE2)(quartus II)

本练习的目的是研究锁存器、触发器和寄存器。

 

Part I RS锁存器

 

Altera的FPGA含有可供用户使用的触发器电路。在Part IV演示如何使用它。这里探讨如何不使用专用触发器来创建存储单元。

图1描述了门控锁存器电路。可用门级电路或表达式来描述。

007

part1.v //rs锁存器门级描述

 

1 //part 1:rs_ff
2 module rs_ff(q,r,s,clk);
3 input clk,r,s;
4 output q;
5
6 wire r_g,s_g,qa,qb/*synthesis keep*/;
7
8 and(r_g,r,clk);
9 and(s_g,s,clk);
10 nor(qa,r_g,qb);
11 nor(qb,s_g,qa);
12
13 assign q=qa;
14
15 endmodule
16

 

 

其中/*synthesis keep*/是编译指令,用来指定每个信号用一个单独的逻辑单元实现。RTL Viewer查看结果如下:

 

001

图2 未加编译指令的RTL图

002

图3 图2的内部结构

 

 

003

图5 图4的内部结构

004

图4 加上编译指令的RTL图

 

005

图6 RS锁存器功能仿真结果

 

006

图7 RS锁存器时序仿真结果

 

Part II 门控D锁存器

如图8所示:

001

图8 门控D锁存器

 

  1. 新建一个工程。为门控D锁存器创建类似Part I中的代码,分析。

part2.v 门控锁存器

 

1 //part2 top_level file
2  module top_level(SW,LEDR0);
3 input [1:0]SW; //clk & d
4  output LEDR0; //q
5  
6 gated_d_latch(LEDR0,SW[0],SW[1]);
7
8  endmodule
9
10  

 

1 //part2.v gated d_latch
2  module gated_d_latch(q,d,clk);
3 input d,clk;
4 output q;
5
6 wire r,s_g,r_g,qa,qb/*synthesis keep*/;
7
8 nand(s_g,d,clk);
9 nand(r_g,r,clk);
10 not(r,d);
11 nand(qa,s_g,qb);
12 nand(qb,r_g,qa);
13
14 assign q=qa;
15
16  endmodule

 

 

逻辑单元映射结果:

002

图9 Technology Map Viewer结果

 

仿真:

003

图10 功能仿真结果

 

004

图11 时序仿真结果

 

2. 另建一个工程,新建一个顶层文件,定义相应的输入/出引脚,使用D锁存器,在DE2上验证。

指定引脚:

SW0
SW1 clk
LEDR0
   

小结:锁存器是电平敏感型电路,D锁存器的优点在于不可能出现S=R=1这个麻烦状态。

 

 

Part III 主从D触发器

 

001

图12 主从D触发器

 

part3.v 主从D触发器

 

1 //part3.v master_slave dff
2  module ms_dff(SW,LEDR0);//Qm);
3  input [1:0]SW;
4 output LEDR0;
5 //output Qm;
6  
7 wire qm,qs;
8
9 gated_d_latch um(qm,SW[0],SW[1]);
10 gated_d_latch us(qs,qm,~SW[1]);
11
12 assign LEDR0=qs;
13 //assign Qm=qm;
14  
15  endmodule

 

 

仿真:

002

图13 主从D触发器功能仿真结果

 

 

 

Part IV 三种存储单元

 

电平敏感存储元件与跳变沿触发的存储元件之间的比较。

001

图14 三种存储元件

 

part4.v 代码

 

1 //part4 top_level file
2  module su_3(d,clk,qa,qb,qc);
3 input d,clk;
4 output qa,qb,qc;
5
6 d_latch ul(d,clk,qa);
7 dff_p udp(d,clk,qb);
8 dff_n udn(d,clk,qc);
9
10 endmodule
11
12 //dff_p
13 module dff_p(d,clk,q);
14 input d,clk;
15 output q;
16
17 wire qm,qs;
18
19 d_latch um(d,~clk,qm);
20 d_latch us(qm,clk,qs);
21
22 assign q=qs;
23
24 endmodule
25
26 //dff_n
27 module dff_n(d,clk,q);
28 input d,clk;
29 output q;
30
31 wire qm,qs;
32
33 d_latch um(d,clk,qm);
34 d_latch us(qm,~clk,qs);
35
36 assign q=qs;
37
38 endmodule
39
40 //D latch
41 module d_latch(d,clk,q);
42 input d,clk;
43 outputreg q;
44
45 always @(d,clk)
46 if(clk)
47 q=d;
48
49 endmodule
50

 

 

 

002

图15 在fpga内实现的电路

 

003

图16 功能仿真结果

Part V D触发器的应用

 

在DE2上显示两个16位的16进制数A和B,A在HEX7-4上显示,B在HEX3-0上显示。用SW15-0输入A,然后输入B,即要求数A存储在电路中。指定KEY1为clock,KEY0为Reset。

part5.v 代码:

 

1 //dff_R with asynchronous reset
2 module dff_R(d,clk,rst_n,q);
3 input d,clk,rst_n;
4 outputreg q;
5
6 always @(negedge rst_n,posedge clk)
7 if(!rst_n)
8 q<=0;
9 else
10 q<=d;
11
12 endmodule
13
14 //top-level file
15 module part5(SW,KEY,HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,
16 HEX1,HEX0);
17 input [15:0]SW;
18 input [1:0]KEY;
19 output [6:0] HEX7,HEX6,HEX5,HEX4,HEX3,HEX2,
20 HEX1,HEX0;
21
22 wire [15:0]q;
23
24 dff_R u0(SW[0],KEY[1],KEY[0],q[0]);
25 dff_R u1(SW[1],KEY[1],KEY[0],q[1]);
26 dff_R u2(SW[2],KEY[1],KEY[0],q[2]);
27 dff_R u3(SW[3],KEY[1],KEY[0],q[3]);
28 dff_R u4(SW[4],KEY[1],KEY[0],q[4]);
29 dff_R u5(SW[5],KEY[1],KEY[0],q[5]);
30 dff_R u6(SW[6],KEY[1],KEY[0],q[6]);
31 dff_R u7(SW[7],KEY[1],KEY[0],q[7]);
32 dff_R u8(SW[8],KEY[1],KEY[0],q[8]);
33 dff_R u9(SW[9],KEY[1],KEY[0],q[9]);
34 dff_R u10(SW[10],KEY[1],KEY[0],q[10]);
35 dff_R u11(SW[11],KEY[1],KEY[0],q[11]);
36 dff_R u12(SW[12],KEY[1],KEY[0],q[12]);
37 dff_R u13(SW[13],KEY[1],KEY[0],q[13]);
38 dff_R u14(SW[14],KEY[1],KEY[0],q[14]);
39 dff_R u15(SW[15],KEY[1],KEY[0],q[15]);
40
41 //number B
42 seg7_lut uh0(q[3:0],HEX0);
43 seg7_lut uh1(q[7:4],HEX1);
44 seg7_lut uh2(q[11:8],HEX2);
45 seg7_lut uh3(q[15:12],HEX3);
46 //number A
47 seg7_lut uh4(q[3:0],HEX4);
48 seg7_lut uh5(q[7:4],HEX5);
49 seg7_lut uh6(q[11:8],HEX6);
50 seg7_lut uh7(q[15:12],HEX7);
51
52 endmodule

 

 

Conclusion

 

本实验是目前为止(altera DE2 数字逻辑)最容易的一个,所花时间较少即可完成。主要从门级到类似C语言的行为描述来构建存储单元。区分电平敏感和边沿触发。

 

Reference

1. Altera 数字逻辑设计实验练习3 (DE2光盘)

2. 《数字逻辑基础与verilog设计》 ch7.  Stephen Brown …

ps: 这个实验要么是Stephen本人设计的,要么设计者看了他的这本书。完全一样。:)

posted on 2010-04-23 23:05  yf.x  阅读(8158)  评论(10编辑  收藏  举报

导航