实验一 多数表决器的设计与实现
实验资料 实验源码

Phase1(基于集成电路模块)

实验要求

采用 SystemVerilog HDL 的行为建模方法,完成 74LS138 和 74LS139 两种译码器的设计。

基于 SystemVerilog HDL 的结构化建模方法,调用 74LS138 和 74LS139 两种译码器,以及若干基本逻辑门,完成 5 输入多数表 决器电路的设计(类似搭积木),并基于 Vivado 完成行为仿真、综合、实现、 生成比特流文件等操作,最终在远程 FPGA 硬件云平台上完成功能验证。

实验思路

5输入多路表决器由1个2-4译码器和4个3-8译码器组成。5路输入的其中两路首先连到2-4译码器上,使能端始终为0,即2-4译码器输出均为有效输出。2-4译码器共有4个输出,每个输出为一位2进制数,每个输出均连接到一个3-8译码器的其中一个使能端,将另外两个使能端设置为有效值。5输入多数表决器应有2的5次方即32种结果,2-4译码器的输出有4种结果,3-8译码器的输出有8种结果,将每个2-4译码器的一个输出连接到3-8译码器使能端时,刚好4×8=32种输出。

1

实验步骤

  1. 打开 Vivado 2018.2 集成开发环境,创建一个名字为“voter_ic”的新工程;
  2. 添加第 1 个 SystemVerilog 设计源文件“dec_74LS138.sv”。根据表 1-1(在实验指导书中), 采用行为建模方法,完成 3:8 译码器 74LS138 的设计;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
`timescale 1ns / 1ps
module dec_74LS138(
input [2:0]D,
input G,
input G2A,
input G2B,
output logic [7:0]Y
);
logic valid;
assign valid=G&(~G2A)&(~G2B);
assign Y[0]=~(valid&~D[2]&~D[1]&~D[0]);
assign Y[1]=~(valid&~D[2]&~D[1]&D[0]);
assign Y[2]=~(valid&~D[2]&D[1]&~D[0]);
assign Y[3]=~(valid&~D[2]&D[1]&D[0]);
assign Y[4]=~(valid&D[2]&~D[1]&~D[0]);
assign Y[5]=~(valid&D[2]&~D[1]&D[0]);
assign Y[6]=~(valid&D[2]&D[1]&~D[0]);
assign Y[7]=~(valid&D[2]&D[1]&D[0]);
endmodule
  1. 添加第 2 个 SystemVerilog 设计源文件“dec_74LS139.sv”。根据表 1-2(在实验指导书中), 采用行为建模方法,完成 2:4 译码器 74LS139 的设计;
1
2
3
4
5
6
7
8
9
10
11
`timescale 1ns / 1ps
module dec_74LS139(
input S,
input [1:0]D,
output logic [3:0]Y
);
assign Y[0]=~(~S&~D[1]&~D[0]);
assign Y[1]=~(~S&~D[1]&D[0]);
assign Y[2]=~(~S&D[1]&~D[0]);
assign Y[3]=~(~S&D[1]&D[0]);
endmodule
  1. 根据表 1-4(在实验指导书中),采用 4 个 74LS138 模块、1 个 74LS139 模块和基本逻辑门 电路实现 5 输入多数表决器(这步不是在 Vivado 中完成,而是给出设计方案);
  2. 继续在工程 voter_ic 中添加第3 个 SystemVerilog 设计源文件“voter5.sv”。 然后,根据第(4)步的设计方案,采用结构化建模方法,通过实例化 74LS138 模 块、74LS139 模块以及基本逻辑门完成 5 输入多数表决器的设计;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
`timescale 1ns / 1ps
module voter5(
input [4:0]l,
output logic led
);
logic [3:0]lt;
dec_74LS139 lastTwo(0,l[1:0],lt);
logic [7:0]ft1;
logic [7:0]ft2;
logic [7:0]ft3;
logic [7:0]ft4;
dec_74LS138 firstThree1(l[4:2],1,lt[0],0,ft1);//0 00
dec_74LS138 firstThree2(l[4:2],1,lt[1],0,ft2);//1 01
dec_74LS138 firstThree3(l[4:2],1,lt[2],0,ft3);//1 10
dec_74LS138 firstThree4(l[4:2],1,lt[3],0,ft4);//2 11
assign led=(~ft1[7])
||(~ft2[3])||(~ft2[5])||(~ft2[6])||(~ft2[7])
||(~ft3[3])||(~ft3[5])||(~ft3[6])||(~ft3[7])
||(~ft4[1])||(~ft4[2])||(~ft4[3])||(~ft4[4])||(~ft4[5])||(~ft4[6])||(~ft4[7]);
// &&(ft4[0]);
endmodule
  1. 编写测试程序“voter5_tb.sv”,对 5 输入多数表决器进行行为仿真,验证 其逻辑功能是否正确;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
`timescale 1ns / 1ps
module voter5_tb(
);
logic [4:0] I;
logic led;
voter5 dut(.l(I),.led(led));
initial begin
I=5'b00000;#20;
I=5'b00001;#20;
I=5'b00010;#20;
I=5'b10010;#20;
I=5'b11000;#20;
I=5'b11100;#20;
I=5'b10110;#20;
I=5'b10011;#20;
I=5'b11110;#20;
I=5'b11111;#20;
I=5'b11011;#20;
I=5'b01010;#20;
$finish;
end
initial begin
$monitor($time,"I=%b,led=%b",I,led);
end
endmodule
  1. 如果仿真通过,则继续完成添加约束文件、综合、实现和生成比特流等 设计流程;
1
2
3
4
5
6
7
8
9
10
11
#Constraints of input ports l
set_property -dict {PACKAGE_PIN B9 IOSTANDARD LVCMOS33} [get_ports {l[0]}];
set_property -dict {PACKAGE_PIN D11 IOSTANDARD LVCMOS33} [get_ports {l[1]}];
set_property -dict {PACKAGE_PIN B11 IOSTANDARD LVCMOS33} [get_ports {l[2]}];
set_property -dict {PACKAGE_PIN B12 IOSTANDARD LVCMOS33} [get_ports {l[3]}];
set_property -dict {PACKAGE_PIN A10 IOSTANDARD LVCMOS33} [get_ports {l[4]}];

#Constraints of output ports led
set_property -dict {PACKAGE_PIN K13 IOSTANDARD LVCMOS33} [get_ports {led}];

set_property BITSTREAM GENERAL.COMPRESS TRUE [current_design]
  1. 登录远程 FPGA 硬件云平台,参照“基于 Vivado 和远程硬件平台的数字 逻辑电路设计流程”一文,按照如图 1-4 (在实验指导书中)所示,在实验画纸搭建验证平台,然后, 将所生成的 bin 文件下载到远程 FPGA 之上完成功能验证。

实验结果

仿真结果

3

波形图

4

5

FPGA测试

6

Phase2(基于行为建模)

实验要求

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

实验步骤

  1. 打开 Vivado 2018.2 集成开发环境,创建一个名为“voter_beh”的新工程;
  2. 添加一个 SystemVerilog 设计源文件“voter5.sv”,采用行为建模的方式 完成 5 输入多数表决器电路的建模;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
`timescale 1ns / 1ps
module voter5(
input [4:0]l,
output logic led
);
assign led=(l[0]&&l[1]&&l[2])
||(l[0]&&l[1]&&l[3])
||(l[0]&&l[1]&&l[4])
||(l[0]&&l[2]&&l[3])
||(l[0]&&l[2]&&l[4])
||(l[0]&&l[3]&&l[4])
||(l[1]&&l[2]&&l[3])
||(l[1]&&l[2]&&l[4])
||(l[1]&&l[3]&&l[4])
||(l[2]&&l[3]&&l[4]);
endmodule
  1. 编写测试程序“voter5_tb.sv”,对 5 输入多数表决器进行行为仿真,验证 其逻辑功能是否正确;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
`timescale 1ns / 1ps
module voter5_tb(
);
logic [4:0] I;
logic led;
voter5 dut(.l(I),.led(led));
initial begin
I=5'b11111;#20;
I=5'b11110;#20;
I=5'b11101;#20;
I=5'b01101;#20;
I=5'b00111;#20;
I=5'b00011;#20;
I=5'b01001;#20;
I=5'b01100;#20;
I=5'b00001;#20;
I=5'b00000;#20;
I=5'b00100;#20;
I=5'b10101;#20;
$finish;
end
initial begin
$monitor($time,"I=%b,led=%b",I,led);
end
endmodule
  1. 如果仿真通过,则继续完成添加约束文件、综合、实现和生成比特流等 设计流程;
1
2
3
4
5
6
7
8
9
10
11
#Constraints of input ports l
set_property -dict {PACKAGE_PIN B9 IOSTANDARD LVCMOS33} [get_ports {l[0]}];
set_property -dict {PACKAGE_PIN D11 IOSTANDARD LVCMOS33} [get_ports {l[1]}];
set_property -dict {PACKAGE_PIN B11 IOSTANDARD LVCMOS33} [get_ports {l[2]}];
set_property -dict {PACKAGE_PIN B12 IOSTANDARD LVCMOS33} [get_ports {l[3]}];
set_property -dict {PACKAGE_PIN A10 IOSTANDARD LVCMOS33} [get_ports {l[4]}];

#Constraints of output ports led
set_property -dict {PACKAGE_PIN K13 IOSTANDARD LVCMOS33} [get_ports {led}];

set_property BITSTREAM GENERAL.COMPRESS TRUE [current_design]
  1. 参照阶段 1,在远程 FPGA 硬件云平台上完成功能验证。

实验结果

仿真结果

3

波形图

4

5

FPGA测试

6

附加题

只采用74LS138译码器和一些基本逻辑门,是否也可以完成5输入多数表决器的设计?如果可以,请画出原理图。

74LS139也就是2-4译码器,可以由一些基本逻辑门组成。所以只要三、实验原理与步骤中的原理图中的2-4译码器换成下图即可只采用74LS138译码器和一些基本逻辑门就可完成5输入多路表决器的设计。

2

番外话

​ 在本次实验中,我们学习了组合逻辑电路的设计方法,包括行为建模、结构 化建模。特别是我们讲解了基于集成电路模块的数字逻辑电路设计。在实际工程 设计中,搭建一个复杂的数字系统并不需要完全从零开始进行设计。通常采用的 方法就是选取一些已有的(开源或付费)、已经经过验证的集成电路模块,对其 进行集成从而完成最终设计。这种设计方法称为可重用设计方法学,而这些集成 电路模块称为 IP 核。

​ 在现代数字集成电路设计中,可重用设计方法学至关重要,也就是说某个模 块会被多个数字系统重复使用。支持可重用设计方法学的基础就是 IP 核,即知 识产权核(Intellectual Property),它是指某一方提供的、预先设计好的并已经经 过验证的、具有某种确定功能的可重用逻辑模块。设计人员常以 IP 核为基础进 行数字系统设计,可以大大缩短设计所需的周期,也降低了设计难度。因此,现 代数字系统的设计人员更多关注的并非模块的设计,而是模块(IP 核)的集成。 IP 核主要分为两大类,软核和硬核。

⚫ 软核:与具体工艺无关的、可综合的 HDL 代码,其优点是灵活性高、可移植 性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发 生错误的可能性,有一定的设计风险。软核是 IP 核应用最广泛的形式。本实 验中所设计的 74LS138 和 74LS139 模块就是一种软核。

⚫ 硬核:与具体工艺相关的、经过了布局布线和验证的网表文件,设计人员不 能对其进行修改。其优点是模块具有稳定的性能、正确性得以最大的保障、 设计风险几乎为零;缺点是灵活性差、不能修改、使用范围窄。

​ Vivado 集成开发环境提倡的是积木式的设计,设计者将功能性模块做成一 个一个的 IP 核,然后组装起来成为产品。Vivado 本身也提供了很多 IP 核供设计 者使用,例如算术运算(乘法、除法、浮点运算等)、信号处理(FFT、DFT)、图 像处理、各类存储器等(在 Vivado 的流程导航栏中选择 PROJECT Manager → IP Catalog 即可调出 Vivado 的 IP 库,查看其所提供的所有 IP 核)。另外,设计 者也可以使用第三方 IP 核来加快设计。当然设计者也可以开发自己的 IP 核,然 后在各个工程中调用或提供给第三方使用。