EDA技术试验二:组合逻辑电路设计、仿真与实现实验

实验目的

  1. 掌握常用组合逻辑电路的 EDA 设计方法;
  2. 熟练掌握基于 QuartusII 集成开发环境的组合逻辑电路设计流程;
  3. 加深对 VerilogHDL 语言的理解;
  4. 熟练掌握 DE2-115 开发板的使用方法;
  5. 掌握多层电路在 QuartusII 集成开发环境中的实现;

实验任务及要求

  1. 任务一:BCD 码译码器设计/仿真/与实现
    要求:用 DE2-115 开发板上的四个拨动开关(从板子上的 18 个拨动开关中任 选 4 个)输入 BCD 码,用 DE2-115 开发板上的一个七段数码管(从 8 个七段数 码管中任选一个)显示译码结果。
  2. 任务二:译码器设计/仿真/与实现
    要求:选用 DE2-115 开发板上的 3 个拨动开关(从板子上的 18 个拨动开关 中任选 4 个)输入,选用 DE2-115 开发板上的 8 个 LED 灯(从 18 个 led 红灯中 任选 8 个)显示译码结果。
  3. 任务三:4 位全加器的设计、仿真与实现
    要求:(1)将两个输入数据和运算结果均显示在 DE2-115 开发板的七段数码管上;用拨动开关输入数据。(2)分两个模块实现:运算模块、显示模块。运算模块是主模块,调用显示 模块实现输入和结果显示。

实验原理与步骤

原理:

  1. 任务一:用 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;其他的依次类推,便可实现。

  2. 任务二:
    使能端值、输入值、输出值、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;其他的以此类推,便可实现。

  1. 任务三:
    对于第三个实验4位全加器的设计,原理很简单,可以直接使用assign语句对输出进行赋值。难点在于调用显示。本次采用调用任务的方式进行显示。首先考虑到4位的二进制数会超过9,因此输入和结果都应该分配两个7段数码管,一个显示个位,一个显示十位。另外就是在任务中对数码管的值进行分配时,可以通过取整和取余的操作,分别获取十位和个位的值,从而进行赋值。考虑到输入和结果均要调用一个任务,因此在任务中声明输入端的时候,可以声明为5位的,另外就是不设置进位输出,这样就可以实现共用。之后在主模块里分别调用任务即可实现显示功能。

步骤:

  1. 任务一:
    (1) 在开始菜单中打开 quartusII10.0 软件;
    (2)在 D 盘新建一个文件夹,命名为 sy21;
    (3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy21,工程名为sy21;
    (4)新建一个文本文件;
    (5)输入程序。并进行管脚分配;
    (6)保存文件;
    (7)编译;
    (8)编译成功后,下载程序;
    (9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
    不一样则需要修改程序。
  2. 任务二:
    (1) 在开始菜单中打开 quartusII10.0 软件;
    (2)在 D 盘新建一个文件夹,命名为 sy22;
    (3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy22,工程名为sy22;
    (4)新建一个文本文件;
    (5)输入程序。并进行管脚分配;
    (6)保存文件;
    (7)编译;
    (8)编译成功后,下载程序;
    (9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
    不一样则需要修改程序。
  3. 任务三:
    (1) 在开始菜单中打开 quartusII10.0 软件;
    (2)在 D 盘新建一个文件夹,命名为 sy23;
    (3) 在 quartusII10.0软件中新建一个工程,工程路径为D:/sy23,工程名为sy23;
    (4)新建一个文本文件;
    (5)输入程序。并进行管脚分配;
    (6)保存文件;
    (7)编译;
    (8)编译成功后,下载程序;
    (9)在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若
    不一样则需要修改程序。

源程序清单以及注释:

  1. 任务一:
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//模块描述结束
  1. 任务二:
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
  1. 任务三:
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. 任务一:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 任务二:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 任务三:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

实验结果分析

任务一:
代码编译通过。七段数码管成功呈现出1~9位数字。
任务二:
代码编译通过。能够通过拨动开关来体现结果。
任务三:
代码编译通过。全加器的结果能够成功显示、

  • 11
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值