实现74HC85的功能以及16位数值比较器


VerilogHDL程序设计与仿真作业6:

——实现74HC85的功能以及16位数值比较器

文章目录

  • VerilogHDL程序设计与仿真作业6:
        • ——实现74HC85的功能以及16位数值比较器
    • 一、实验目的
    • 二、实现74HC85的功能
      • 1、设计思路
      • 2、实现代码
      • 3、测试代码
      • 4、仿真
    • 三、用74HC85组成16位数值比较器
      • 1、设计思路
      • 2、实现代码
      • 3、测试代码
      • 4、仿真

一、实验目的

  • 实现74HC85的功能
  • 用74HC85组成16位数值比较器

二、实现74HC85的功能

1、设计思路

  • 74HC85的功能表
    在这里插入图片描述

  • 74HC85的逻辑符号

在这里插入图片描述

2、实现代码

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//文件名称:_74HC85.v
//fuchaoxinHUST12052020
module _74HC85(I_geq,I_leq,I_eq,A,B,F_geq,F_leq,F_eq);
input [3:0] A,B;
input I_geq,I_leq,I_eq;
output reg F_geq, F_leq, F_eq;
/*说明:
输入端:I是用于级联的输入信号,[3:0] A,B是输入的待比较数字;
输出端:F是大小比较后输出的信号,也可当作级联下一级的输入信号。
*/

always @(*) begin
   
    // 默认比较时A在前B在后
    if (A[3]>B[3]) begin
        F_geq=1; F_leq=0; F_eq=0;
    end
    else if (A[3]<B[3]) begin
        F_geq=0; F_leq=1; F_eq=0;
    end
    else begin
        if (A[2]>B[2]) begin
            F_geq=1; F_leq=0; F_eq=0;
        end
        else if (A[2]<B[2]) begin
            F_geq=0; F_leq=1; F_eq=0;
        end
        else begin
            if (A[1]>B[1]) begin
                F_geq=1;
                F_leq=0;
                F_eq=0;
            end
            else if (A[1]<B[1]) begin
                F_geq=0; F_leq=1; F_eq=0;
            end
            else begin
                if (A[1]>B[1]) begin
                    F_geq=1; F_leq=0; F_eq=0;
                end
                else if (A[1]<B[1]) begin
                    F_geq=0; F_leq=1; F_eq=0;
                end
                else begin
                    if (I_geq==1&&I_leq==0&&I_eq==0) begin
                        F_geq=1; F_leq=0; F_eq=0;
                    end
                    else if (I_geq==0&&I_leq==1&&I_eq==0) begin
                        F_geq=0; F_leq=1; F_eq=0;
                    end
                    else if (I_eq==1) begin
                        F_geq=0; F_leq=0; F_eq=1;
                    end
                    else if (I_geq==1&&I_leq==1&&I_eq==0) begin
                        F_geq=0; F_leq=0; F_eq=0;
                    end
                    else if (I_geq==0&&I_leq==0&&I_eq==0) begin
                        F_geq=1; F_leq=1; F_eq=0;
                    end
                end
            end
        end
    end
    // 四位不全相等时I无效,四位都相等时I有效
    // 该方法比较繁琐,可以写一位比较器再进行四个级联
end
endmodule

3、测试代码

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
26
27
28
29
30
//文件名称:Test_74HC85.v
//fuchaoxinHUST12052020
`timescale 10ns/1ns
module Test_74HC85;
reg [3:0] A,B;
reg I_geq,I_leq,I_eq;
wire F_geq, F_leq, F_eq;

 _74HC85 U0(I_geq,I_leq,I_eq,A,B,F_geq,F_leq,F_eq);//实例化元件
initial
    $monitor($time,":\t I_geq=%b, I_leq=%b, I_eq=%b, A=%b, B=%b F_geq=%b, F_leq=%b, F_eq=%b \n",I_geq,I_leq,I_eq,A,B,F_geq,F_leq,F_eq);
    //监视器的显示内容
initial begin
// I无效 即四位不全相等
    A=4'b1000; B=4'b0100;
    #5
    A=4'b0100;B=4'b1000;
    #5
    A=4'b0110;B=4'b0111;
    #5
// I有效 即四位都相等
    I_geq=0; I_leq=0; I_eq=1; A=4'b0110; B=4'b0110;
    #5
    I_geq=1; I_leq=0; I_eq=0; A=4'b0001; B=4'b0001;
    #5
    I_geq=0; I_leq=0; I_eq=0; A=4'b0010; B=4'b0010;
    #5
    $stop;//停止模拟仿真
end
endmodule

4、仿真

  • 波形

在这里插入图片描述

  • 监控器

在这里插入图片描述

三、用74HC85组成16位数值比较器

1、设计思路

  • 将四个四位数值比较器通过级联的方式组成16位数值比较器;
  • 16位数值比较器(串联拓展方式)

在这里插入图片描述

2、实现代码

以串联拓展为例:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//文件名称:_74HC85.v
//文件名称:Compare_16.v
//fuchaoxinHUST12052020
module _74HC85(I_geq,I_leq,I_eq,A,B,F_geq,F_leq,F_eq);
input [3:0] A,B;
input I_geq,I_leq,I_eq;
output reg F_geq, F_leq, F_eq;
/*说明:
输入端:I是用于级联的输入信号,[3:0] A,B是输入的待比较数字;
输出端:F是大小比较后输出的信号,也可当作级联下一级的输入信号。
*/

always @(*) begin
   
    // 默认比较时A在前B在后
    if (A[3]>B[3]) begin
        F_geq=1; F_leq=0; F_eq=0;
    end
    else if (A[3]<B[3]) begin
        F_geq=0; F_leq=1; F_eq=0;
    end
    else begin
        if (A[2]>B[2]) begin
            F_geq=1; F_leq=0; F_eq=0;
        end
        else if (A[2]<B[2]) begin
            F_geq=0; F_leq=1; F_eq=0;
        end
        else begin
            if (A[1]>B[1]) begin
                F_geq=1;
                F_leq=0;
                F_eq=0;
            end
            else if (A[1]<B[1]) begin
                F_geq=0; F_leq=1; F_eq=0;
            end
            else begin
                if (A[1]>B[1]) begin
                    F_geq=1; F_leq=0; F_eq=0;
                end
                else if (A[1]<B[1]) begin
                    F_geq=0; F_leq=1; F_eq=0;
                end
                else begin
                    if (I_geq==1&&I_leq==0&&I_eq==0) begin
                        F_geq=1; F_leq=0; F_eq=0;
                    end
                    else if (I_geq==0&&I_leq==1&&I_eq==0) begin
                        F_geq=0; F_leq=1; F_eq=0;
                    end
                    else if (I_eq==1) begin
                        F_geq=0; F_leq=0; F_eq=1;
                    end
                    else if (I_geq==1&&I_leq==1&&I_eq==0) begin
                        F_geq=0; F_leq=0; F_eq=0;
                    end
                    else if (I_geq==0&&I_leq==0&&I_eq==0) begin
                        F_geq=1; F_leq=1; F_eq=0;
                    end
                end
            end
        end
    end
    // 四位不全相等时I无效,四位都相等时I有效
    // 该方法比较繁琐,可以写一位比较器再进行四个级联
end
endmodule
//四位比较器

module Compare_16(I_geq,I_leq,I_eq,A,B,F_geqq,F_leqq,F_eqq);
input I_geq,I_leq,I_eq;
input [15:0] A,B;
output F_geqq,F_leqq,F_eqq;
/*说明:
输入端:
输出端:
*/

//中间变量定义
wire [3:0] A_0,B_0,A_1,B_1,A_2,B_2,A_3,B_3;
wire [3:0] F_geq,F_leq,F_eq;

//循环赋值
genvar i;
for(i=3;i>=0;i=i-1)   assign A_0[i]=A[i], B_0[i]=B[i];
for(i=7;i>=4;i=i-1)   assign A_1[i-4]=A[i], B_1[i-4]=B[i];
for(i=11;i>=8;i=i-1)  assign A_2[i-8]=A[i], B_2[i-8]=B[i];
for(i=15;i>=12;i=i-1) assign A_3[i-12]=A[i], B_3[i-12]=B[i];

//先后执行四位数值比较
_74HC85 U0(I_geq,I_leq,I_eq,A_0,B_0,F_geq[0],F_leq[0],F_eq[0]);
_74HC85 U1(F_geq[0],F_leq[0],F_eq[0],A_1,B_1,F_geq[1],F_leq[1],F_eq[1]);
_74HC85 U2(F_geq[1],F_leq[1],F_eq[1],A_2,B_2,F_geq[2],F_leq[2],F_eq[2]);
_74HC85 U3(F_geq[2],F_leq[2],F_eq[2],A_3,B_3,F_geq[3],F_leq[3],F_eq[3]);

//输出
assign F_geqq=F_geq[3];
assign F_leqq=F_leq[3];
assign F_eqq =F_eq [3];

endmodule

3、测试代码

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
26
27
28
29
30
//文件名称:Test_Compare_16.v
//fuchaoxinHUST12052020
`timescale 10ns/1ns
module Test_CD4532;
reg I_geq,I_leq,I_eq;
reg [15:0] A,B;
wire F_geqq,F_leqq,F_eqq;

Compare_16 U0(I_geq,I_leq,I_eq,A,B,F_geqq,F_leqq,F_eqq);//实例化元件
initial
    $monitor($time,":\t I_geq=%b, I_leq=%b, I_eq=%b, A=%b, B=%b, F_geqq=%b, F_leqq=%b, F_eqq=%b \n", I_geq,I_leq,I_eq,A,B,F_geqq,F_leqq,F_eqq);
    //监视器的显示内容
initial begin
//使能信号为0时
    I_geq=0; I_leq=0; I_eq=1; A=16'b0010_0000_0000_0000; B=16'b0010_0000_0000_0100;
    #5
    I_geq=0; I_leq=0; I_eq=1; A=16'b1000_0000_0000_0000; B=16'b0100_0000_0000_0000;
    #5
    I_geq=0; I_leq=0; I_eq=1; A=16'b0100_0000_0000_0000;B=16'b0100_0000_0000_0000;
    #5
//使能信号为1时
    I_geq=0; I_leq=0; I_eq=1; A=16'b0001_0000_0000_0000; B=16'b1000_0000_0000_0000;
    #5
    I_geq=0; I_leq=0; I_eq=1; A=16'b0000_0000_0100_0000; B=16'b0100_0000_0000_0000;
    #5
    I_geq=0; I_leq=0; I_eq=1; A=16'b0000_0000_0000_0001; B=16'b1000_0000_0000_0000;
    #5
    $stop;//停止模拟仿真
end
endmodule

4、仿真

  • 波形

在这里插入图片描述

  • 监视器

在这里插入图片描述

fuchaoxinHUST12052020