Verilog组合逻辑设计

一、实验项目名称: Verilog组合逻辑设计

二、实验目的:

使用ISE软件和Verilog语言进行组合逻辑的设计与实现。

三、实验内容:

1.3-8译码器的设计和实现。

2.4位并行进位加法器的设计和实现。

3.两输入4位多路选择器的设计和实现。

实验要求如下:

1.采用Verilog语言设计,使用门级方式进行描述。

2.编写仿真测试代码。

3.编写约束文件,使输入、输出信号与开发板的引脚对应。

4.下载到FPGA开发板,拨动输入开关,观察Led灯的显示是否符合真值表。

四、实验原理:

174x138译码器是输出低有效的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

    21数据选择器的真值表如表1所示,其中,D0D12路数据输入,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语言有进一步的讲解学习。

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

名为28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值