一、实验项目名称: Verilog组合逻辑设计
二、实验目的:
使用ISE软件和Verilog语言进行组合逻辑的设计与实现。
三、实验内容:
1.3-8译码器的设计和实现。
2.4位并行进位加法器的设计和实现。
3.两输入4位多路选择器的设计和实现。
实验要求如下:
1.采用Verilog语言设计,使用门级方式进行描述。
2.编写仿真测试代码。
3.编写约束文件,使输入、输出信号与开发板的引脚对应。
4.下载到FPGA开发板,拨动输入开关,观察Led灯的显示是否符合真值表。
四、实验原理:
1.74x138译码器是输出低有效的3-8译码器。表1所示为74x138译码器的真值表。
表1 74x138译码器的真值表
输入 | 输出 | ||||||||||||
G1 | G2A_L | G2B_L | C | B | A | Y7_L | Y6_L | Y5_L | Y4_L | Y3_L | Y2_L | Y1_L | Y0_L |
0 | x | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
x | 1 | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
x | x | 1 | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
根据3-8译码器的真值表,可得输出的函数表达式为
根据上述函数表达式,可画出逻辑电路图为。
图1 3-8译码器的逻辑电路图
2. 数据选择器的逻辑功能是根据地址选择端的控制,从多路输入数据中选择一路数据输出。因此,它可实现时分多路传输电路中发送端电子开关的功能,故又称为复用器(Multiplexer),并用MUX来表示。
表2 2输入1位多路选择器的真值表
数据输入 | 选择控制S | 输出Y | |
D0 | D1 | ||
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
2选1数据选择器的真值表如表1所示,其中,D0、D1是2路数据输入,S为选择控制端,Y为数据选择器的输出,根据真值表可写出它的输出函数表达式为:
如果输入再加上低有效的输入使能端,则输出的表达式变为
根据上述函数表达式,可画出2输入4位多路选择器的逻辑电路图为。
图2 2输入4位多路选择器的逻辑电路图
2. 1位全加器的真值表如下
表3 1位全加器的真值表
输入变量 | 输出变量 | |||
A | B | Ci | Ci+1 | S |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 0 |
根据真值表,输出表达式为:
对于4位并行加法器,可以按以下公式进行设计
图3所示为4位并行进位加法器框图,本实验中用Verilog语句来描述。
图3 4位并行进位加法器
五、实验器材(设备、元器件):
PC机、Windows XP、Anvyl或Nexys3开发板、Xilinx ISE 14.7开发工具、Digilent Adept下载工具。
六、实验步骤:
实验步骤包括:建立新工程、原理图或代码输入、设计仿真、输入输出引脚设置、生成流代码与下载调试。
七、关键源代码:
1.在ISE设计中可以直接输入如下3-8译码器的代码
module Vr74x138( G1, G2A_L, G2B_L, C,B,A, Y7_L, Y6_L, Y5_L, Y4_L, Y3_L, Y2_L, Y1_L, Y0_L); input G1, G2A_L, G2B_L; input C,B,A; output Y7_L, Y6_L, Y5_L, Y4_L, Y3_L, Y2_L, Y1_L, Y0_L; wire G1_L; wire G; wire A_L, B_L, C_L; wire A_H, B_H, C_H; not ( G1_L , G1 ); nor ( G , G1_L, G2A_L, G2B_L); not ( A_L , A); not ( B_L , B); not ( C_L , C); not ( A_H , A_L); not ( B_H , B_L); not ( C_H , C_L); nand ( Y0_L , C_L , B_L , A_L , G ); nand ( Y1_L , C_L , B_L , A_H , G ); nand ( Y2_L , C_L , B_H , A_L , G ); nand ( Y3_L , C_L , B_H , A_H , G ); nand ( Y4_L , C_H , B_L , A_L , G ); nand ( Y5_L , C_H , B_L , A_H , G ); nand ( Y6_L , C_H , B_H , A_L , G ); nand ( Y7_L , C_H , B_H , A_H , G ); endmodule |
2.3-8译码器的仿真测试代码
module Vr74x138_tb; // Inputs reg G1; reg G2A_L; reg G2B_L; reg C; reg B; reg A; // Outputs wire Y7_L; wire Y6_L; wire Y5_L; wire Y4_L; wire Y3_L; wire Y2_L; wire Y1_L; wire Y0_L; // Instantiate the Unit Under Test (UUT) Vr74x138 uut ( .G1(G1), .G2A_L(G2A_L), .G2B_L(G2B_L), .C(C), .B(B), .A(A), .Y7_L(Y7_L), .Y6_L(Y6_L), .Y5_L(Y5_L), .Y4_L(Y4_L), .Y3_L(Y3_L), .Y2_L(Y2_L), .Y1_L(Y1_L), .Y0_L(Y0_L) ); initial begin // Initialize Inputs G1 = 0; G2A_L = 0; G2B_L = 0; C = 0; B = 0; A = 0; |
// Wait 100 ns for global reset to finish #100;
// Add stimulus here G1 = 0; G2A_L = 1'bx; G2B_L = 1'bx; C = 1'bx; B = 1'bx; A = 1'bx;
#100; G1 = 1'bx; G2A_L = 1; G2B_L = 1'bx; C = 1'bx; B = 1'bx; A = 1'bx;
#100; G1 = 1'bx; G2A_L = 1'bx; G2B_L = 1; C = 1'bx; B = 1'bx; A = 1'bx;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 0; B = 0; A = 0;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 0; B = 0; A = 1; #100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 0; |
B = 1; A = 0;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 0; B = 1; A = 1;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 1; B = 0; A = 0;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 1; B = 0; A = 1;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 1; B = 1; A = 0;
#100; G1 = 1; G2A_L = 0; G2B_L = 0; C = 1; B = 1; A = 1; end
endmodule |
仿真结果如下图所示。
图4 译码器的仿真结果
3.译码器在Nexys3开发板上的约束文件
NET A LOC = T10; NET B LOC = T9; NET C LOC = V9; NET G2B_L LOC = M8; NET G2A_L LOC = N8; NET G1 LOC = U8; NET Y0_L LOC = U16; NET Y1_L LOC = V16; NET Y2_L LOC = U15; NET Y3_L LOC = V15; NET Y4_L LOC = M11; NET Y5_L LOC = N11; NET Y6_L LOC = R11; NET Y7_L LOC = T11; |
4.4位并行加法器的代码
module Vr74x283(A3,A2,A1,A0, B3,B2,B1,B0, C0, C4,S3,S2,S1,S0 ); input A3,A2,A1,A0; input B3,B2,B1,B0; input C0; output C4,S3,S2,S1,S0;
wire g3_L,p3_L,g2_L,p2_L,g1_L,p1_L,g0_L,p0_L; wire c0_L; wire w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12,w13,w14; wire hs3,c3,hs2,c2,hs1,c1,hs0,c0;
nand(g3_L,A3,B3); nor(p3_L,A3,B3);
nand(g2_L,A2,B2); nor(p2_L,A2,B2); nand(g1_L,A1,B1); nor(p1_L,A1,B1);
|
nand(g0_L,A0,B0); nor(p0_L,A0,B0); not(c0_L,C0); not(w1,p3_L); nand(w2,p2_L,g3_L); nand(w3,p1_L,g3_L,g2_L); nand(w4,p0_L,g3_L,g2_L,g1_L); nand(w5,g3_L,g2_L,g1_L,g0_L,c0_L); and(C4,w1,w2,w3,w4,w5);
and(hs3,g3_L,~p3_L); not(w6,p2_L); nand(w7,p1_L,g2_L); nand(w8,p0_L,g2_L,g1_L); nand(w9,g2_L,g1_L,g0_L,c0_L); and(c3,w6,w7,w8,w9); xor(S3,hs3,c3);
and(hs2,g2_L,~p2_L); not(w10,p1_L); nand(w11,p0_L,g1_L); nand(w12,g1_L,g0_L,c0_L); and(c2,w10,w11,w12); xor(S2,hs2,c2);
and(hs1,g1_L,~p1_L); not(w13,p0_L); nand(w14,g0_L,c0_L); and(c1,w13,w14); xor(S1,hs1,c1);
and(hs0,g0_L,~p0_L); not(c0,c0_L); xor(S0,hs0,c0); endmodule |
5.加法器的仿真测试代码
module Vr74x283_tb; // Instantiate the Unit Under Test (UUT) Vr74x283 uut ( ); initial begin // Initialize Inputs // Wait 100 ns for global reset to finish #100;
// Add stimulus here C0 = 1;
#100; C0 = 0; B3 = 1; B2 = 1; B1 = 1; B0 = 1;
#100; A3 = 1; A2 = 1; A1 = 1; A0 = 1; #100; C0 = 1; end
endmodule |
仿真结果如下图所示。
图5 加法器的仿真结果
6.加法器在Nexys3开发板上的约束文件
NET B0 LOC = T10; NET B1 LOC = T9; NET B2 LOC = V9; NET B3 LOC = M8; NET A0 LOC = N8; NET A1 LOC = U8; NET A2 LOC = V8; NET A3 LOC = T5; NET S0 LOC = U16; NET S1 LOC = V16; NET S2 LOC = U15; NET S3 LOC = V15; NET C4 LOC = M11; NET C0 LOC = B8; |
7.数据选择器的代码
module Vr74x157( input EN_L ,S, input [4:1] D0, D1, output [4:1] Y );
wire w0, w1, w2, w3, w4; wire w5, w6, w7, w8, w9; wire S_L;
not( S_L ,S);
nor( w0, EN_L ,S); nor( w1, EN_L ,S_L);
and( w2, D0[1], w0); and( w3, D1[1], w1);
and( w4, D0[2], w0); and( w5, D1[2], w1);
and( w6, D0[3], w0); and( w7, D1[3], w1);
and( w8, D0[4], w0); and( w9, D1[4], w1);
or (Y[1] , w2 , w3); or (Y[2] , w4 , w5); or (Y[3] , w6 , w7); or (Y[4] , w8 , w9); endmodule |
8. 数据选择器的仿真测试代码
module Vr74x157_tb; // Inputs reg EN_L; reg S; reg [4:1] D0; reg [4:1] D1; // Outputs wire [4:1] Y; // Instantiate the Unit Under Test (UUT) Vr74x157 uut ( .EN_L(EN_L), .S(S), .D0(D0), .D1(D1), .Y(Y) ); initial begin // Initialize Inputs EN_L = 0; S = 0; D0 = 0; D1 = 0; // Wait 100 ns for global reset to finish #100;
// Add stimulus here EN_L = 1; S = 1'bx;
#100; EN_L = 0; S = 0; D0 = 4'b0101;
#100; EN_L = 0; S = 1; D1 = 4'b1010;
end
endmodule |
仿真结果如下图所示。
图6 数据选择器的仿真结果
9.数据选择器在Nexys3开发板上的约束文件
NET D0[1] LOC = T10; NET D0[2] LOC = T9; NET D0[3] LOC = V9; NET D0[4] LOC = M8; NET D1[1] LOC = N8; NET D1[2] LOC = U8; NET D1[3] LOC = V8; NET D1[4] LOC = T5; NET Y[1] LOC = U16; NET Y[2] LOC = V16; NET Y[3] LOC = U15; NET Y[4] LOC = V15; NET S LOC = B8; NET EN_L LOC = C4; |
八、实验结论:
请补充下载到开发板后的调试照片
8.1 3-8译码器
8.2 四位并行加法器
8.3 数据选择器
九、总结及心得体会:
1.实验的代码对实验者能力有较高的要求,在实验的过程中,需要实验者小心谨慎、灵活变动,具有较强的学习能力,敢于直面挫折。
2.电路实验器材精巧奇妙,易于损坏,在实验过程中应该小心谨慎。
十、对本实验过程及方法、手段的改进建议:
本实验对代码要求较高,需要对Verilog语言熟悉认识,并对其语法结构熟悉,应当对Verilog语言有进一步的讲解学习。