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