一、实验项目名称: 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语言有进一步的讲解学习。

Verilog组合逻辑设计相关推荐

  1. 为什么在 Verilog HDL 设计中一定要用同步而不能用异步时序逻辑?

    本博文内容来源于:<从算法设计到硬件逻辑的实现>,仅供学习交流使用! 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就 ...

  2. FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)

    FIR滤波器设计 滤波器原理:滤波器就是对特定的频率或者特定频率以外的频率进行消除的电路,被广泛用于通信系统和信号处理系统中.从功能角度,数字滤波器对输入离散信号的数字代码进行运算处理,以达到滤除频带 ...

  3. 序列信号产生器的verilog HDL 设计

    一.状态转移型的序列信号产生器的verilog HDL 设计 用一个不断循环的状态机,循环产生序列信号001011.过程过于简单,我就不画状态图了. 直接给出verilog HDL设计代码: //有限 ...

  4. (05)System Verilog 组合逻辑与时序逻辑区别

    (05)System Verilog 组合逻辑与时序逻辑区别 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 组合逻辑与时序逻辑区别 ...

  5. 移位寄存器专题(verilog HDL设计)

    目录 移位寄存器简介 分类 4位右移位寄存器工作原理 1. 16位右移位寄存器 2. 16位左移寄存器 3. 串行输入并行输出寄存器 4. 并行输入串行输出移位寄存器 移位寄存器简介 移位寄存器内的数 ...

  6. 巴克码相关器的verilog HDL设计

    巴克码相关器 巴克码相关器原理:巴克码相关器能够检测巴克码序列峰值,并且能够在1bits错误情况下检测巴克码序列峰值. 巴克码是20世纪50年代初R.H巴克提出的一种具有特殊规律的二进制码组.它是一个 ...

  7. 10.1-控制单元CU的组合逻辑设计

    [README] 1.本文总结自bilibili<计算机组成原理(哈工大刘宏伟)>的视频讲解,非常棒,墙裂推荐: 2.精简指令集RISC(简单指令集合)采用的就是这种组合逻辑设计的硬连方式 ...

  8. (19)System Verilog模块设计示例

    (19)System Verilog模块设计示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog模块设计示例 5)结语 1.2 FPG ...

  9. 数字电路之Verilog红绿灯设计

    数字电路之Verilog红绿灯设计 一.题目要求 二.分析题目 三.开始设计 四.结果分析 五.最后的话 写在前面:以下仿真实验设计应用的是Xilinx Vivado. 一.题目要求 题目要求应用Ve ...

最新文章

  1. APT(高级可持续性威胁)
  2. Foundations of Qt Development 学习笔记 Part1 Tips1-50
  3. MySQL数据库:分区Partition
  4. Xamarin简介与Xamarin支持MVC设计模式
  5. 2019-02-21-算法-进化
  6. javax.servlet.ServletException: Circular view path []: would dispatch back to the current....
  7. 希望这些建议对你有帮助
  8. 13.相机和图像——聚焦于对象实战,不断变化的焦距,景深_3
  9. leetcode python3 简单题118. Pascal's Triangle
  10. 雷林鹏分享:MySQL 元数据
  11. 在C#中使用SQL语句什么情况需要使用‘单引号’和“双引号”
  12. python读取csv文件出错:显示utf-8编码问题该怎么解决
  13. 屏幕录像专家的使用说明
  14. 主成分分析(PCA)步骤及代码
  15. 企业级和个人苹果帐号AppleId申请
  16. iOS frame与bounds区别详解
  17. 华三防火墙NAT配置CLI
  18. 数学二、英语二、政治
  19. 流行QQ在线客服代码
  20. [阅读记录]《数据分析师求职面试指南》-2

热门文章

  1. Object常用的几种方法
  2. Unity内置资源如何打包避免冗余
  3. css案例--旋转木马
  4. MATLAB信号处理——分解信号,双谱重构
  5. 程序学3DMax之自动展UV
  6. 带你重新认识一个不太正经的HTML
  7. PHP 3DES加密
  8. cortana android 地图,地图-系统爱好者
  9. tdk怎么设置_网站的TDK如何设置及优化
  10. Retrofit中关于CallAdapter使用的设计模式分析