实验目的
- 掌握常用组合逻辑电路的 EDA 设计方法;
- 熟练掌握基于 QuartusII 集成开发环境的组合逻辑电路设计流程;
- 加深对 VerilogHDL 语言的理解;
- 熟练掌握 DE2-115 开发板的使用方法;
- 掌握多层电路在 QuartusII 集成开发环境中的实现;
实验任务及要求
- 任务一:BCD 码译码器设计/仿真/与实现
要求:用 DE2-115 开发板上的四个拨动开关(从板子上的 18 个拨动开关中任 选 4 个)输入 BCD 码,用 DE2-115 开发板上的一个七段数码管(从 8 个七段数 码管中任选一个)显示译码结果。 - 任务二:译码器设计/仿真/与实现
要求:选用 DE2-115 开发板上的 3 个拨动开关(从板子上的 18 个拨动开关 中任选 4 个)输入,选用 DE2-115 开发板上的 8 个 LED 灯(从 18 个 led 红灯中 任选 8 个)显示译码结果。 - 任务三:4 位全加器的设计、仿真与实现
要求:(1)将两个输入数据和运算结果均显示在 DE2-115 开发板的七段数码管上;用拨动开关输入数据。(2)分两个模块实现:运算模块、显示模块。运算模块是主模块,调用显示 模块实现输入和结果显示。
实验原理与步骤
原理:
-
任务一:用 DE2-115 开发板上的四个拨动开关(从板子上的18个拨动开关中任选4个)输入 BCD 码,用 DE2-115 开发板上的一个七段数码管(从8个七段数码管中任选一个)显示译码结果。注意课本中的7段数码管是共阴极连接,而实验室的数码管是共阳极连接,所以逻辑1、0灯应当取相反值。
对于第一个实验中的4-7BCD码译码器,由于要实现输入的数字能够在7段数码管上显示相应的数字的功能,就需要对每一个输入的情况一一进行输出设计。注意到DE2-115开发板上的7段数码管是共阳极的,因此当这段数码管的输入是低电平时,该管才能发亮。
DE2-115的7段数码管已经分配好标号,为此我们可以直接进行设置。而输入的4位二进制数可以直接转化为十进制数方便设计。例如当输入的是0000时,输出端按照从高位到低位的顺序应该依次为1000000,输入为1001时,输出端应该是0010000;其他的依次类推,便可实现。 -
任务二:
使能端值、输入值、输出值、LED灯状态的关系如下图所示:
使能端 3-8译码器的3位输入 3-8译码器的8位输出 8个LED灯的状态
1 000 8’b00000001 灭灭灭灭灭灭灭亮
1 001 8’b00000010 灭灭灭灭灭灭亮灭
1 010 8’b00000100 灭灭灭灭灭亮灭灭
1 011 8’b00001000 灭灭灭灭亮灭灭灭
1 100 8’b00010000 灭灭灭亮灭灭灭灭
1 101 8’b00100000 灭灭亮灭灭灭灭灭
1 110 8’b01000000 灭亮灭灭灭灭灭灭
1 111 8’b10000000 亮灭灭灭灭灭灭灭
0 灭灭灭灭灭灭灭灭
3-8译码器简化示意图
第二个实验中的3-8译码器,设计思路与第一个实验大致相同。主要还是要根据每次的输入,对输出端进行一一赋值。该题有个细微的区别是增添了使能端,当使能端为高电平时,译码器工作,否则不工作。当使能端为低电平时,所有的LED灯都不亮。当使能端为高电平时,根据输入的3位二进制码决定哪一个LED灯亮。例如输入000时,则第1个灯(标号为0)亮,即赋值为00000001;输入111时,则第8个灯(序号为7)亮,即赋值为10000000;其他的以此类推,便可实现。
- 任务三:
对于第三个实验4位全加器的设计,原理很简单,可以直接使用assign语句对输出进行赋值。难点在于调用显示。本次采用调用任务的方式进行显示。首先考虑到4位的二进制数会超过9,因此输入和结果都应该分配两个7段数码管,一个显示个位,一个显示十位。另外就是在任务中对数码管的值进行分配时,可以通过取整和取余的操作,分别获取十位和个位的值,从而进行赋值。考虑到输入和结果均要调用一个任务,因此在任务中声明输入端的时候,可以声明为5位的,另外就是不设置进位输出,这样就可以实现共用。之后在主模块里分别调用任务即可实现显示功能。
步骤:
- 任务一:
(1) 在开始菜单中打开 quartusII10.0 软件;
(2)在 D 盘新建一个文件夹,命名为 sy21;
(3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy21,工程名为sy21;
(4)新建一个文本文件;
(5)输入程序。并进行管脚分配;
(6)保存文件;
(7)编译;
(8)编译成功后,下载程序;
(9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
不一样则需要修改程序。 - 任务二:
(1) 在开始菜单中打开 quartusII10.0 软件;
(2)在 D 盘新建一个文件夹,命名为 sy22;
(3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy22,工程名为sy22;
(4)新建一个文本文件;
(5)输入程序。并进行管脚分配;
(6)保存文件;
(7)编译;
(8)编译成功后,下载程序;
(9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
不一样则需要修改程序。 - 任务三:
(1) 在开始菜单中打开 quartusII10.0 软件;
(2)在 D 盘新建一个文件夹,命名为 sy23;
(3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy23,工程名为sy23;
(4)新建一个文本文件;
(5)输入程序。并进行管脚分配;
(6)保存文件;
(7)编译;
(8)编译成功后,下载程序;
(9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
不一样则需要修改程序。
源程序清单以及注释:
- 任务一:
module sy21(decodeout,indec); //定义了sy21模块
(*chip_pin="G18,F22,E17,L26,L25,J22,H22"*)output reg[6:0] decodeout;//7个管脚一起 ,H22,J22,L25,L26,E17,F22,G18分别为HEX6、5、4、3、2、1、0的引脚号
(*chip_pin="AB28,AC28,AC27,AD27"*)input[3:0] indec;//4个管脚一起分配,AD27,AC27,AC28,AB28分别为SW3、2、1、0的引脚号
Always@(indec)
Begin
Case(indec)
4’d0:decodeout = 7’b0000001; //显示0
4’d1:decodeout = 7’b1001111;//显示1
4’d2:decodeout = 7’b0010010;//显示2
4’d3:decodeout = 7’b0000110;//显示3
4’d4:decodeout = 7’b1001100;//显示4
4’d5:decodeout = 7’b0100100;//显示5
4’d6:decodeout = 7’b0100000;//显示6
4’d7:decodeout = 7’b0001111//显示7
4’d8:decodeout = 7’b0000000;//显示8
4’d9:decodeout = 7’b0000100;//显示9
Default: decodeout = 7’b1111111; // 默认不亮
Endcase
End
Endmodule//模块描述结束
- 任务二:
module sy22(in,out); //定义了sy22模块
(*chip_pin="AB28,AC28,AC27,AD27"*)input[3:0] in; //4个管脚一起分配,AD27,AC27,AC28,AB28分别为SW3、2、1、0的引脚号
(*chip_pin="G19,F19,E19,F21,E18,J19,H19"*)output reg[7:0] out; //8个管脚一起分配,H19,J19,E18,F18,F21,E19,F19,G19分别为LED7、6、5、4、3、2、1、0的引脚号
Always(*)
Begin
If(in[3])//最高位为使能端,使能端有效的情况
begin
Case(in[2:0])
3’d0:out =8’b00000001;//序号为0的灯亮
3’d1:out =8’b00000010;//序号为1的灯亮
3’d2:out =8’b00000100;//序号为2的灯亮
3’d3:out =8’b00001000;//序号为3的灯亮
3’d4:out =8’b00010000;//序号为4的灯亮
3’d5:out =8’b00100000;//序号为5的灯亮
3’d6:out =8’b01000000;//序号为6的灯亮
3’d7:out =8’b10000000;//序号为7的灯亮
Endcase
End
Else//使能端无效
out=8'b00000000; //都不亮
Endmodule
- 任务三:
module sy23(a,b,cin,da,db,dout);
(*chip_pin="Y23,Y24,AA22,AA23"*) input [3:0]a;
(*chip_pin="AA24,AB23,AB24,AC24"*) input [3:0]b;
(*chip_pin="AB25"*) input cin;
(*chip_pin="AD17,AE17,AG17,AH17,AF17,AG18,AA14,AA17,AB16,AA16,AB17,AB15,AA15,AC17"*) output [13:0]da;
(*chip_pin="AD18,AC18,AB18,AH19,AG19,AF18,AH18,AB19,AA19,AG21,AH21,AE19,AF19,AE18"*) output [13:0]db;
(*chip_pin="V21,U21,AB20,AA21,AD24,AF23,Y19,AA25,AA26,Y25,W26,Y26,W27,W28"*) output [13:0]dout;
wire [4:0]out;
assign
out=a+b+cin; // 相加结果
display m1 (a,da); // 显示第一个数
display m2 (b,db); // 显示第二个数
display m3 (out,dout);// 显示结果
endmodule
module display(din,Dout);
input [4:0] din;
output reg [13:0]Dout;
always@(*)
begin
case(din)
5'd0: Dout=14'b00000010000001; //显示0
5'd1: Dout=14'b00000011001111; //显示1
5'd2: Dout=14'b00000010010010; //显示2
5'd3: Dout=14'b00000010000110; //显示3
5'd4: Dout=14'b00000011001100; //显示4
5'd5: Dout=14'b00000010100100; //显示5
5'd6: Dout=14'b00000010100000; //显示6
5'd7: Dout=14'b00000010001111; //显示7
5'd8: Dout=14'b00000010000000; //显示8
5'd9: Dout=14'b00000010000100; //显示9
5'd10: Dout=14'b10011110000001; //显示10
5'd11: Dout=14'b10011111001111; //显示11
5'd12: Dout=14'b10011110010010; //显示12
5'd13: Dout=14'b10011110000110; //显示13
5'd14: Dout=14'b10011111001100; //显示14
5'd15: Dout=14'b10011110100100; //显示15
5'd16: Dout=14'b10011110100100; //显示16
5'd17: Dout=14'b10011110100100; //显示17
5'd18: Dout=14'b10011110100100; //显示18
5'd19: Dout=14'b10011110100100; //显示19
5'd20: Dout=14'b00100100000001; //显示20
5'd21: Dout=14'b00100101001111; //显示21
5'd22: Dout=14'b00100100010010; //显示22
5'd23: Dout=14'b00100100000110; //显示23
5'd24: Dout=14'b00100101001100; //显示24
5'd25: Dout=14'b00100100100100; //显示25
5'd26: Dout=14'b00100100100000; //显示26
5'd27: Dout=14'b00100100001111; //显示27
5'd28: Dout=14'b00100100000000; //显示28
5'd29: Dout=14'b00100100000100; //显示29
5'd30: Dout=14'b00001100000001; //显示30
5'd31: Dout=14'b00001101001111; //显示31
endcase
end
endmodule
实验结果与分析
实验结果
- 任务一:
- 任务二:
- 任务三:
实验结果分析
任务一:
代码编译通过。七段数码管成功呈现出1~9位数字。
任务二:
代码编译通过。能够通过拨动开关来体现结果。
任务三:
代码编译通过。全加器的结果能够成功显示、