0%

数电lab1

数电实验实验报告

实验一 多数表决器的设计与实现

一、实验目的

  1. 掌握基于 Vivado 的数字逻辑电路设计流程;

  2. 熟练使用 SystemVerilog HDL 的行为建模方法对组合逻辑电路进行描述;

  3. 熟练使用 SystemVerilog HDL 的结构建模方法对组合逻辑电路进行描述;

  4. 掌握基于远程 FPGA 硬件云平台对数字逻辑电路进行功能验证的流程。

二、实验环境

  1. 操作系统:Windows 10 或 Ubuntu 16.04

  2. 开发环境:Xilinx Vivado 2018.2

  3. 硬件平台:远程 FPGA 硬件云平台

三、 实验原理

1. 3-8 译码器 — — 74LS138

image-20240413173607981

2. 2-4 译码器 — — 74LS139

image-20240413173627842

具体的真值表就不做说明了

四、实验内容和步骤

内容1:(基于集成电路模块)

  1. 根据表 1-1 和 1-2,采用 SystemVerilog HDL 的行为建模方法,完成 74LS138

和 74LS139 两种译码器的设计。

  1. 根据图 1-3 和表 1-4,基于 SystemVerilog HDL 的结构化建模方法,调用

74LS138 和 74LS139 两种译码器,以及若干基本逻辑门,完成 5 输入多数表

决器电路的设计(类似搭积木),并基于 Vivado 完成行为仿真、综合、实现、

生成比特流文件等操作,最终在远程 FPGA 硬件云平台上完成功能验证。

步骤1:(基于集成电路模块)

①首先添加源文件“dec_74LS138.sv”,通过行为建模的方法,设计一个3:8译码器,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module dec_74LS138(
input logic G,G2a,G2b,
input logic [2:0] D,
output logic [7:0] Y
);
always_comb begin
if(G==0) Y=8'b11111111;
else if(G2a==1) Y=8'b11111111;
else if(G2b==1) Y=8'b11111111;
else begin
case(D)
3'b000: Y=8'b11111110;
3'b001: Y=8'b11111101;
3'b010: Y=8'b11111011;
3'b011: Y=8'b11110111;
3'b100: Y=8'b11101111;
3'b101: Y=8'b11011111;
3'b110: Y=8'b10111111;
3'b111: Y=8'b01111111;
endcase
end
end
endmodule

②然后添加源文件“dec_74LS139.sv”,通过行为建模的方法,设计一个2:4译码器,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module dec_74LS139(
input logic S,
input logic [1:0] D,
output logic [3:0] Y
);

always_comb begin
if(S == 0) begin
case(D)
2'b00: Y = 4'b1110;
2'b01: Y = 4'b1101;
2'b10: Y = 4'b1011;
2'b11: Y = 4'b0111;
default: Y = 4'b1111;
endcase
end else begin
Y = 4'b1111;
end
end
endmodule

③下面通过结构化建模的方法实现五人多数表决器

方法一

需要:

一个2:4译码器和四个3:8译码器

思路分析:

首先把五个人分为A、B、C、D、E,考虑D和E(分四种情况)

第一种情况:D和E都同意,A、B和C中至少有一人同意灯就亮,即排除A、B和C三个人都不同意的情况(即图中Y8正常,Y5、Y6、Y7均为8'b11111111)

第二种情况:D同意E不同意,A、B和C中至少有两人同意等才亮(假设Y7正常,其余全为8'b11111111)

第三种情况:E同意D不同意,A、B和C中至少有两人同意等才亮(假设Y6正常,其余全为8'b11111111)

第四种情况:E和D的不同意,A、B和C必须都同意

下面是电路图

多数表决器电路图

相应的代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module voter5(
input logic [4:0] I,
output logic pass
);
logic G = 1'b1;
logic G1 = 1'b0;
logic [3:0] TEMP;
logic [7:0] Y5;
logic [7:0] Y6;
logic [7:0] Y7;
logic [7:0] Y8;

dec_74LS139 T4(.S(1'b0),.D(I[4:3]),.Y(TEMP));
dec_74LS138 T5(.G(G),.G2a(G1),.G2b(TEMP[0]),.D(I[2:0]),.Y(Y5));
dec_74LS138 T6(.G(G),.G2a(G1),.G2b(TEMP[1]),.D(I[2:0]),.Y(Y6));
dec_74LS138 T7(.G(G),.G2a(G1),.G2b(TEMP[2]),.D(I[2:0]),.Y(Y7));
dec_74LS138 T8(.G(G),.G2a(G1),.G2b(TEMP[3]),.D(I[2:0]),.Y(Y8));

assign pass = ~(Y5[7]&Y6[3]&Y6[5]&Y6[6]&Y6[7]&Y7[3]&Y7[5]&Y7[6]&Y7[7]&Y8[1]&Y8[2]&Y8[3]&Y8[4]&Y8[5]&Y8[6]&Y8[7]);
endmodule

方法二附加题

需要:

3个3:8译码器

思路分析:

首先把五个人分为A、B、C、D、E,考虑D和E(分三种情况)

第一种情况:D和E都同意,A、B和C中至少有一人同意灯就亮,即排除A、B和C三个人都不同意的情况

第二种情况:判断D是否同意,如果同意,则再至少有两人同意即可;否则至少需要3人同意灯才能亮

第三种情况:判断E是否同意,如果同意,则再至少有两人同意即可;否则至少需要3人同意灯才能亮

第二三种情况可以通过观察A、B和C的输入情况判断相应的输出情况,如A、B和C的输入情况有000,001,010,011,100,101,110,111,其中000,001,010,100这些情况最多只有1人不满足条件(输出为1),所以只需要将这些情况取与,如果全为1,则代表不满足这些情况,自然就满足了至少两人的条件

而3人同意,即A、B和C都同意的情况下,输出的第七位为0

根据上面的分析,我们可以画出相应的电路图(不完整版)

多路表决器电路图——附加题

相应的代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module voter5(
input logic [4:0] I,
output logic pass
);
logic G = 1'b1;
logic G1 = 1'b0;
logic G2 = 1'b0;
logic [7:0] Y5;
logic [7:0] Y6;
logic [7:0] Y7;
logic A1,A2,A3;
dec_74LS138 T5(.G(G),.G2a(G1),.G2b(I[3]),.D(I[2:0]),.Y(Y5));
dec_74LS138 T6(.G(G),.G2a(I[4]),.G2b(G2),.D(I[2:0]),.Y(Y6));
dec_74LS138 T7(.G(G),.G2a(G1),.G2b(G2),.D(I[2:0]),.Y(Y7));
assign A1 = (!((~Y5)|(~Y6)))& (Y7[0]);
assign A2 = Y5 == 8'b11111111 ? (Y7[0] & Y7[1] & Y7[2] & Y7[4]) : (!Y7[7]);
assign A3 = Y6 == 8'b11111111 ? (Y7[0] & Y7[1] & Y7[2] & Y7[4]) : (!Y7[7]);
assign pass = A1 | A2 |A3;
endmodule

④编写测试程序

添加测试文件"voter5_tb.sv",编写相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`timescale 1ns/1ns
module voter5_tb();
logic [4:0] I;
logic pass;
integer i;
voter5 DUT(.I(I),.pass(pass));
initial begin
for(i=0;i<32;i=i+1) begin
I=i;
#20;
end
end
initial begin
$timeformat(-9,0,"ns",5);
$monitor("At time %t: I=%b,pass=%b",$time,I,pass);
end
endmodule

仿真结果:

image-20240418213106251image-20240418213118749image-20240418213318678

⑤编辑约束文件

根据"远程硬件平台管脚对应关系.xlsx",选择对应的管脚,约束文件(voter_xdc.sv)如下:

1
2
3
4
5
6
7
set_property -dict {PACKAGE_PIN B9  IOSTANDARD LVCMOS33} [get_ports {I[0]}];
set_property -dict {PACKAGE_PIN D11 IOSTANDARD LVCMOS33} [get_ports {I[1]}];
set_property -dict {PACKAGE_PIN B11 IOSTANDARD LVCMOS33} [get_ports {I[2]}];
set_property -dict {PACKAGE_PIN B12 IOSTANDARD LVCMOS33} [get_ports {I[3]}];
set_property -dict {PACKAGE_PIN A10 IOSTANDARD LVCMOS33} [get_ports {I[4]}];

set_property -dict {PACKAGE_PIN K13 IOSTANDARD LVCMOS33} [get_ports {pass}];

确认无误后,再分别综合、实现、生成bin文件。

⑥远程云端硬件实验平台验证

自定义管脚:

输入管脚分别为I[0]、I[1]、I[2]、I[3]、I[4],位宽均为1BIT,连接的管脚分别为0、1、2、3、4

输出管脚为pass,位宽为1BIT,连接的管脚为4

具体如图:

image-20240413181132483

FPGA烧写上传bin文件,然后运行实验,以下是示例

image-20240413181329167image-20240413181342965image-20240413181400790image-20240413181507357

内容 2:(基于行为建模)

  1. 不使用 74LS138 和 74LS139 芯片,直接使用行为建模的方法完成 5 输入多数表决器电路的设计,并基于 Vivado 完成电路的行为仿真、综合、实现、生成比特流文件等操作,最终在远程 FPGA 硬件云平台上完成功能验证。

步骤 2:(基于行为建模)

①思路分析:

可以把输入的值每一位都相加,如果这个sum大于半数,则通过;否则没有通过。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//voter5.sv
module voter5(
input logic [(2*count):0] I,
output logic pass
);
parameter count = 2;
logic [7:0] mysum;
integer i;

always_comb begin
mysum = 0;
for (i = 0; i <= 2 * count; i = i + 1) begin
mysum = mysum + I[i];
end
pass = (mysum > count) ? 1'b1 : 1'b0;
end
endmodule

②测试程序

和内容1中的测试程序一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`timescale 1ns/1ns
module voter5_tb();
logic [4:0] I;
logic pass;
integer i;
voter5 DUT(.I(I),.pass(pass));
initial begin
for(i=0;i<32;i=i+1) begin
I=i;
#20;
end
end
initial begin
$timeformat(-9,0,"ns",5);
$monitor("At time %t: I=%b,pass=%b",$time,I,pass);
end
endmodule

结果如下:

image-20240418213106251image-20240418213118749image-20240418213318678

③编辑约束文件,综合、实现并生成bin文件

④远程平台验证

结果如下:

image-20240413181329167image-20240413181342965image-20240413181400790image-20240413181507357

五、实验总结

注意附加题已在上面的步骤1:(基于集成电路模块)中给出

本次实验对于我而言,在结构化建模构造五人表决器时还是有一定难度的,通过查阅相关资料,目前已经学会了两种方法来构造;

对于行为建模而言较为简单,也是基础题型。

另外,由于第一次使用vivado和远程硬件平台,相关操作不太熟练,耗费了大量的时间,希望以后能够多加练习。

注意,以下代码是错误的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module dec_74LS139(
input logic S,
input logic [1:0] D,
output logic [3:0] Y
);

assign Y = 4'b1111;

always_comb begin
if(S == 0) begin
case(D)
2'b00: Y[0] = 0;
2'b01: Y[1] = 0;
2'b10: Y[2] = 0;
2'b11: Y[3] = 0;
endcase
end
end
endmodule

具体原因是不能现在always_comb外部定义Y,然后内部进行赋值;同时if..else语句不完整,case没有default

-------------本文结束感谢您的阅读-------------