zoukankan      html  css  js  c++  java
  • 【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)

    本节练习主要用组合逻辑电路实现2进制到10进制数字的转换以及BCD码的加法。

    Part I 2进制数字的显示

    在HEX3到HEX0上显示SW15-0的值。SW15-12,SW11-8,SW7-4,SW3-0分别对应于HEX3,HEX2,HEX1,HEX0.在数码管上显示0-9,忽略开关表示的数值1010-1111.

    本练习的目的是手工推导数码管显示的逻辑,要求只用赋值语句和布尔表达式实现。

    part1.v

     part1顶层文件

    1 //part1 display 0-9 on the 7-segment displays
    2  module part1(HEX3,HEX2,HEX1,HEX0,SW);
    3 input [15:0]SW;
    4 output [0:6]HEX3,HEX2,HEX1,HEX0;
    5
    6 btd H3(SW[15:12],HEX3);
    7 btd H2(SW[11:8],HEX2);
    8 btd H1(SW[7:4],HEX1);
    9 btd H0(SW[3:0],HEX0);
    10
    11  endmodule

    数码管译码电路:

    1 //binary-to-decimal
    2  module btd(s,seg);
    3 input [3:0]s;
    4 output [0:6]seg;
    5
    6 assign seg[6]=~s[3]&~s[2]&~s[1]|s[2]&s[1]&s[0];
    7 assign seg[5]=~s[3]&~s[2]&s[0]|~s[2]&s[1]|s[1]&s[0];
    8 assign seg[4]=s[0]|s[2]&~s[1];
    9 assign seg[3]=~s[3]&~s[2]&~s[1]&s[0]|
    10 s[2]&~s[1]&~s[0]|
    11 s[2]&s[1]&s[0];
    12 assign seg[2]=~s[2]&s[1]&~s[0];
    13 assign seg[1]=s[2]&~s[1]&s[0]|s[2]&s[1]&~s[0];
    14 assign seg[0]=s[2]&~s[1]&~s[0]|~s[3]&~s[2]&~s[1]&s[0];
    15
    16  endmodule

    Part II 2进制值转换为10进制

    将4位二进制输入V=v3v2v1v0转换成2位十进制数D=d1d0,在HEX1和HEX0上分别显示d1和d0.输出值与输入值的对应关系如表1.图1给出了电路的部分设计。比较器用来检测V>9.电路A用来将>9的输入转换成对应的个位的BCD码.电路B用来将1位二进制的输入转换为对应的BCD码显示.

    001

    002

    part2.v

    1 //part 2
    2  module part2(V,D1,D0);
    3 input [3:0]V;
    4 output [0:6]D1,D0;
    5 wire z; //comparator output
    6  wire [2:0]a; //circuit A output
    7  wire [3:0]m; //multiplexer output
    8  
    9 comparator C(V,z);
    10 circuita A(V[2:0],a);
    11 mux_4b_2to1 M(V,{1'b0,a},z,m);
    12   circuitb B(z,D1);
    13 btd D(m,D0);
    14
    15  endmodule
    16
    17  //circuit B
    18  module circuitb(z,seg);
    19 input z;
    20 output [0:6]seg;
    21
    22 assign seg[6]=1;
    23 assign seg[5]=z;
    24 assign seg[4]=z;
    25 assign seg[3]=z;
    26 assign seg[2]=0;
    27 assign seg[1]=0;
    28 assign seg[0]=z;
    29
    30  endmodule
    31
    32
    33  //4-bit 2-to-1 multiplexer
    34  module mux_4b_2to1(x,y,s,m);
    35 input [3:0]x;
    36 input [3:0]y;
    37 input s;
    38 output [3:0]m;
    39
    40 mux_2to1 u3(x[3],y[3],s,m[3]);
    41 mux_2to1 u2(x[2],y[2],s,m[2]);
    42 mux_2to1 u1(x[1],y[1],s,m[1]);
    43 mux_2to1 u0(x[0],y[0],s,m[0]);
    44
    45  endmodule
    46  //2to1 multiplexer
    47  module mux_2to1(a,b,s,m);
    48 input a,b,s;
    49 output m;
    50
    51 assign m=s?b:a;
    52
    53  endmodule
    54
    55
    56  //circuit A
    57  module circuita(v,a);
    58 input [2:0]v;
    59 output [2:0]a;
    60
    61 assign a[2]=v[2]&v[1];
    62 assign a[1]=v[2]&~v[1];
    63 assign a[0]=(v[1]&v[0])|(v[2]&v[0]);
    64
    65  endmodule

    Part III 行波进位加法器

    003

    part3.v

    1 //4-bit ripple-carry adder circuit
    2  module part3(SW,LEDR,LEDG);
    3 input [8:0]SW;
    4 output [8:0]LEDR;
    5 output [4:0]LEDG;
    6 wire [3:0]a,b;
    7 wire cin;
    8 wire [3:0]s;
    9 wire cout;
    10 wire [3:1]c;
    11
    12 assign LEDR=SW;
    13 assign cin=SW[8];
    14 assign a=SW[7:4];
    15 assign b=SW[3:0];
    16 assign LEDG[4]=cout;
    17 assign LEDG[3:0]=s;
    18
    19 fadder(cin,a[0],b[0],s[0],c[1]);
    20 fadder(c[1],a[1],b[1],s[1],c[2]);
    21 fadder(c[2],a[2],b[2],s[2],c[3]);
    22 fadder(c[3],a[3],b[3],s[3],cout);
    23
    24  endmodule
    25
    26  //full adder
    27  module fadder(ci,a,b,s,co);
    28 input ci,a,b;
    29 output s,co;
    30
    31 assign s=ci^a^b,
    32 co=(a^b)?ci:b;
    33
    34  endmodule

    Part IV 1位BCD加法器

    注意处理和的最大值S1S0=9+9+1=19。

    part4.v

    1 //part IV:BCD adder
    2
    3  //circuit A
    4  module circuit_A(s,ao);
    5 input [3:0]s;
    6 output [3:0]ao;
    7
    8 assign ao[3]=~s[3]&~s[2]&s[1],
    9 ao[2]=(~s[3]&~s[2]&~s[1])|(s[3]&s[2]&s[1]),
    10 ao[1]=(~s[3]&~s[2]&~s[1])|(s[3]&s[2]&~s[1]),
    11 ao[0]=(~s[3]&~s[2]&s[0])|(s[3]&s[2]&s[0])|
    12 (~s[2]&s[1]&s[0]);
    13
    14  endmodule
    15
    16  //4-bit 2-to-1 multiplexer
    17  module mux2to1_4b(x,y,s,m);
    18 input [3:0]x,y;
    19 input s;
    20 output [3:0]m;
    21
    22 mux_2to1 u3(x[3],y[3],s,m[3]);
    23 mux_2to1 u2(x[2],y[2],s,m[2]);
    24 mux_2to1 u1(x[1],y[1],s,m[1]);
    25 mux_2to1 u0(x[0],y[0],s,m[0]);
    26
    27  endmodule
    28  //2to1 multiplexer
    29  module mux_2to1(a,b,s,m);
    30 input a,b,s;
    31 output m;
    32
    33 assign m=s?b:a;
    34
    35  endmodule
    36
    37  //circuit B
    38  module circuit_B(z,seg);
    39 input z;
    40 output [0:6]seg;
    41
    42 assign seg[6]=1;
    43 assign seg[5]=z;
    44 assign seg[4]=z;
    45 assign seg[3]=z;
    46 assign seg[2]=0;
    47 assign seg[1]=0;
    48 assign seg[0]=z;
    49
    50  endmodule
    51
    52  //7-segment decoder
    53  module btd(s,seg);
    54 input [3:0]s;
    55 output [0:6]seg;
    56
    57 assign seg[6]=~s[3]&~s[2]&~s[1]|s[2]&s[1]&s[0];
    58 assign seg[5]=~s[3]&~s[2]&s[0]|~s[2]&s[1]|s[1]&s[0];
    59 assign seg[4]=s[0]|s[2]&~s[1];
    60 assign seg[3]=~s[3]&~s[2]&~s[1]&s[0]|
    61 s[2]&~s[1]&~s[0]|
    62 s[2]&s[1]&s[0];
    63 assign seg[2]=~s[2]&s[1]&~s[0];
    64 assign seg[1]=s[2]&~s[1]&s[0]|s[2]&s[1]&~s[0];
    65 assign seg[0]=s[2]&~s[1]&~s[0]|~s[3]&~s[2]&~s[1]&s[0];
    66
    67  endmodule
    68
    69  //4-bit full adder
    70  module fa_4b(a,b,s,cin,cout);
    71 input [3:0]a,b;
    72 input cin;
    73 output [3:0]s;
    74 output cout;
    75
    76 wire [3:1]c;
    77
    78 fadder fao(cin,a[0],b[0],s[0],c[1]);
    79 fadder fa1(c[1],a[1],b[1],s[1],c[2]);
    80 fadder fa2(c[2],a[2],b[2],s[2],c[3]);
    81 fadder fa3(c[3],a[3],b[3],s[3],cout);
    82
    83  endmodule
    84
    85  //full adder
    86  module fadder(ci,a,b,s,co);
    87 input ci,a,b;
    88 output s,co;
    89
    90 assign s=ci^a^b,
    91 co=(a^b)?ci:b;
    92
    93  endmodule
    94
    95  //circuit comparator
    96  module comparator(v,z);
    97 input [3:0]v;
    98 output z;
    99
    100 assign z=(v[3]&v[2])|(v[3]&v[1]);
    101
    102  endmodule
    103
    104  //part 4 top file
    105  module part4(SW,LEDR,LEDG,LEDG8,HEX6,HEX4,HEX1,HEX0);
    106 input [8:0]SW; //Cin,A,B
    107  output [8:0]LEDR;
    108 output [4:0]LEDG;
    109 output [0:6]HEX6,HEX4,HEX1,HEX0;
    110 output LEDG8;
    111
    112 wire [3:0]sum; //sum
    113  wire co; //cout
    114  wire [3:0]ao; //circuit_A output
    115  wire [3:0]m; //mux2to1_4b output
    116  wire z; //comparator output
    117 wire bi; //circuit_B input
    118 wire va,vb; //A,B comparator output
    119 assign LEDR=SW,
    120 LEDG[4]=co,
    121 LEDG[3:0]=sum,
    122 LEDG8=va|vb;
    123 assign bi=co|z;
    124
    125 fa_4b u0(SW[7:4],SW[3:0],sum,SW[8],co);
    126 circuit_A u1(sum,ao);
    127 comparator u7(sum,z);
    128 mux2to1_4b u2(sum,ao,bi,m);
    129 btd u3(m,HEX0);
    130 circuit_B u4(bi,HEX1);
    131 btd u5(SW[7:4],HEX6);
    132 btd u6(SW[3:0],HEX4);
    133 comparator u8(SW[7:4],va),
    134 u9(SW[3:0],vb);
    135
    136
    137
    138 endmodule
    139

    Part V 2位BCD加法器

    part5.v

    1 /*...The ADDER CIRUIT....*/
    2 //A Full Adder Circuit
    3 module fulladder(C,A,B,S,O);
    4 input C,A,B;
    5 output S,O;
    6
    7 //C = CarryIn, A & B = Inputs, S = Sum, O = Carryout
    8 assign S = C^(A^B);
    9 assign O = (~(A^B)&B)|((A^B)&C);
    10 endmodule
    11
    12 //4 Bit, Full Adder Circuit
    13 module fulladder_4bit(C,A,B,S,O);
    14 input C;
    15 input [3:0]A,B;
    16 output O;
    17 output [3:0]S;
    18 wire [3:0]cwire;
    19
    20 //C=CarryIn, A&B = Inputs, S = Sumb, O = CarryOut, CWIRE= Carry wire between adders
    21 fulladder N0(C,A[0],B[0],S[0],cwire[0]);
    22 fulladder N1(cwire[0],A[1],B[1],S[1],cwire[1]);
    23 fulladder N2(cwire[1],A[2],B[2],S[2],cwire[2]);
    24 fulladder N3(cwire[2],A[3],B[3],S[3],cwire[3]);
    25
    26 //BCD Carry
    27 assign O = cwire[3]|(S[3]&S[2])|(S[3]&S[1]);
    28 endmodule
    29
    30 //BCD Adder: Sum Finder
    31 module bcdAdder(C,A,B,S,O);
    32 input C;
    33 input [3:0]A,B;
    34 output [3:0]S;
    35 output O;
    36 wire [3:0]cwire;
    37 wire [3:0]preSum;
    38
    39 fulladder_4bit MidAd1(C,A,B,preSum,O);
    40
    41 assign cwire[0] =0;
    42 assign cwire[1] = O;
    43 assign cwire[2] = O;
    44 assign cwire[3] =0;
    45
    46
    47 fulladder_4bit MidAd2(0,cwire,preSum,S);
    48
    49 endmodule
    50
    51 //top_level file
    52 module part5(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
    53 HEX0);
    54 input [16:0]SW;
    55 output [0:6]HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
    56 HEX0;
    57
    58 wire [3:0]s0,s1;
    59 wire co0,co1;
    60
    61 btd ua1(SW[15:12],HEX7);
    62 btd ua0(SW[11:8],HEX6);
    63 btd ub1(SW[7:4],HEX5);
    64 btd ub0(SW[3:0],HEX4);
    65
    66 bcdAdder u0(SW[16],SW[11:8],SW[3:0],s0,co0);
    67 bcdAdder u1(co0,SW[15:12],SW[7:4],s1,co1);
    68 circuit_B us2(co1,HEX2);
    69 btd us1(s1,HEX1);
    70 btd us0(s0,HEX0);
    71
    72 endmodule

     设计思想

      参考 University of Sulaimani College of Engineering Electrical Engineering Department --Advanced Electronic Lab-fourth Year 2010-2011, prepared by:Mr. Arazs.Ameen.

    代码

     1 module part5(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,HEX0);
     2     input [15:0] SW;
     3     output [0:6] HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,HEX0;
     4     
     5     wire [3:0] a1,a0,b1,b0;
     6     wire k0,s2;
     7     wire [3:0] s1,s0;
     8     
     9     assign a1=SW[15:12];
    10     assign a0=SW[11:8];
    11     assign b1=SW[7:4];
    12     assign b0=SW[3:0];
    13     
    14     bcd_adder u0(a0,b0,1'b0,k0,s0);
    15     bcd_adder u1(a1,b1,k0,s2,s1);
    16     
    17     circuit_B u3(s2,HEX2);
    18     btd u4(s1,HEX1);
    19     btd u5(s0,HEX0);
    20     btd u6(a1,HEX7);
    21     btd u7(a0,HEX6);
    22     btd u8(b1,HEX5);
    23     btd u9(b0,HEX4);
    24     
    25 endmodule     
    module bcd_adder(a,b,cin,k,s);
        input [3:0] a,b;
        input cin;
        output [3:0] s;    //bcd_adder sum
        output k;        //bcd_adder cout
        
        wire [3:0] sum;
        wire co;
        wire [3:0] ao;
        wire [3:0] m;
        wire z;
        wire bi;
        
        assign bi=co|z;
        
        fa_4b u0(a,b,sum,cin,co);
        circuit_A u1(sum,ao);
        comparator u7(sum,z);
        mux2to1_4b u2(sum,ao,bi,m);
        
        assign k=bi;
        assign s=m;
        
    endmodule 

    ok,至此,解法更完善。

    Part VI 另种实现2位BCD加法器的方法

    用if-else结构实现,抽象描述,让编译器去实现具体电路。

    part6.v

    1 //1-digit bcd_adder
    2 module bcdadder(Ci,A,B,S,Co);
    3 input Ci;
    4 input [3:0]A,B;
    5 outputreg [3:0]S;
    6 outputreg Co;
    7
    8 reg [3:0]z;
    9 reg [4:0]t;
    10
    11 always @(Ci,A,B)
    12 begin
    13 t=A+B+Ci;
    14 if(t>9)
    15 begin
    16 z=4'd10;
    17 Co=1'b1;
    18 end
    19 else
    20 begin
    21 z=0;
    22 Co=0;
    23 end
    24 S=t-z;
    25 end
    26 endmodule
    27
    28 //top_level file
    29 module bcdadder_2(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
    30 HEX0);
    31 input [16:0]SW;
    32 output [0:6]HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
    33 HEX0;
    34
    35 wire [3:0]s0,s1;
    36 wire co0,co1;
    37
    38 btd ua1(SW[15:12],HEX7);
    39 btd ua0(SW[11:8],HEX6);
    40 btd ub1(SW[7:4],HEX5);
    41 btd ub0(SW[3:0],HEX4);
    42
    43 bcdadder u0(SW[16],SW[11:8],SW[3:0],s0,co0);
    44 bcdadder u1(co0,SW[15:12],SW[7:4],s1,co1);
    45 circuit_B us2(co1,HEX2);
    46 btd us1(s1,HEX1);
    47 btd us0(s0,HEX0);
    48
    49 endmodule

     解法2:完全照搬伪码

     1 //2-digit bcd_adder
     2 module part6(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,HEX0);
     3     input [15:0] SW;
     4     output [0:6] HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,HEX0;
     5     
     6     wire [3:0] A1,A0,B1,B0;
     7     wire [4:0] T1,T0;
     8     wire [3:0] S1,S0;
     9     wire S2;
    10     reg [3:0] Z1,Z0;
    11     reg c1,c2;
    12     
    13     assign T0=A0+B0;
    14     assign T1=A1+B1+c1;
    15     assign S0=T0-Z0;
    16     assign S1=T1-Z1;
    17     assign S2=c2;
    18     
    19     always @(T1,T0)
    20     begin
    21         if(T0>9)
    22             begin
    23                 Z0=4'd10;
    24                 c1=1'b1;
    25             end
    26         else
    27             begin
    28                 Z0=4'd0;
    29                 c1=1'b0;
    30             end
    31         if(T1>9)
    32             begin
    33                 Z1=4'd10;
    34                 c2=1'b1;
    35             end
    36         else
    37             begin
    38                 Z1=4'd0;
    39                 c2=1'b0;
    40             end
    41     end
    42 
    43     assign A1=SW[15:12];
    44     assign A0=SW[11:8];
    45     assign B1=SW[7:4];
    46     assign B0=SW[3:0];
    47     
    48     circuit_B u3(S2,HEX2);
    49     btd u4(S1,HEX1);
    50     btd u5(S0,HEX0);
    51     btd u6(A1,HEX7);
    52     btd u7(A0,HEX6);
    53     btd u8(B1,HEX5);
    54     btd u9(B0,HEX4);
    55     
    56 endmodule     

    Part VII 6位二进制数转换为2位十进制数的电路

    方法:

    用两个寄存器,一个6bit,一个8bit,分别存bin码和有待实现的bcd码。接下来,逐位将BIN的最高位移入BCD的最低位。同时,将BCD的16位寄存器按每四位划成一块,我们称之为个十百千好了。但记住,个,十,百,千都有4个bit位。

    1.将bin[5](bin是bin[5:0])移入bcd[0]。这样,bin[5]就变成了原来的bin[4],bin[0]=0。

    2.分别检查个十百千里存的数是不是大于等于5(按二进制换十进制那样换算),如果是,加3。

    3.重做1,2。直到全部移进去。

    原理:bin和bcd的表示方法的差别,就在于10用bin表示为1010,用bcd表示成10000。但左移一位就是乘2,这个是没问题的。因此,如果不做2的操作,就等于不停的把个位数乘2加上新的个位数,这样还是原来的数。做了2之后,就等于把原来的1010变成10000,因为1010在bcd码里是不可能出现的,因此要把10变成bin下面的16。而5=10/2,3=(16-10)/2,也等于(18-12)/2……等等等等。

    参考:

    BCD and Add3 Converter by Dr. John S. Loomis:
                http://www.johnloomis.org/ece314/notes/devices/binary_to_BCD/bin_to_bcd.html

    part7.v

    1 //6-bit binary to 2-digit BCD
    2 module b2b(a,ones,tens);
    3 input [5:0]a;
    4 output [3:0]ones,tens;
    5
    6 wire [3:0]c1,c2,c3;
    7 wire [3:0]d1,d2,d3;
    8
    9 assign d1={1'b0,a[5:3]};
    10 assign d2={c1[2:0],a[2]};
    11 assign d3={c2[2:0],a[1]};
    12 add3 m1(d1,c1);
    13 add3 m2(d2,c2);
    14 add3 m3(d3,c3);
    15 assign ones={c3[2:0],a[0]};
    16 assign tens={1'b0,c1[3],c2[3],c3[3]};
    17
    18 endmodule
    19
    20 //add3.v
    21 module add3(in,out);
    22 input [3:0] in;
    23 output [3:0] out;
    24 reg [3:0] out;
    25
    26 always @ (in)
    27 case (in)
    28 4'b0000: out <= 4'b0000;
    29 4'b0001: out <= 4'b0001;
    30 4'b0010: out <= 4'b0010;
    31 4'b0011: out <= 4'b0011;
    32 4'b0100: out <= 4'b0100;
    33 4'b0101: out <= 4'b1000;
    34 4'b0110: out <= 4'b1001;
    35 4'b0111: out <= 4'b1010;
    36 4'b1000: out <= 4'b1011;
    37 4'b1001: out <= 4'b1100;
    38 default: out <=4'b0000;
    39 endcase
    40 endmodule
    41
    42 //top_level file
    43 module binary2bcd(SW,HEX1,HEX0);
    44 input [5:0]SW;
    45 output [0:6]HEX1,HEX0;
    46
    47 wire [3:0]ones,tens;
    48
    49 b2b u3(SW,ones,tens);
    50 btd u1(ones,HEX0);
    51 btd u2(tens,HEX1);
    52
    53 endmodule
     

    解法2:

     1 //bcd conversion
     2 module bcd(
     3     input [5:0] binary,
     4     output reg [3:0] tens,
     5     output reg [3:0] ones
     6     );
     7     
     8     integer i;
     9     always @(binary)
    10     begin
    11         //set 10's,and 1's to 0
    12         tens=4'd0;
    13         ones=4'd0;
    14         
    15         for(i=5;i>=0;i=i-1)
    16         begin
    17             //add 3 to clumns >=5
    18             if(tens>=5)
    19                 tens=tens+3;
    20             if(ones>=5)
    21                 ones=ones+3;
    22             
    23             //shift left one
    24             tens=tens<<1;
    25             tens[0]=ones[3];
    26             ones=ones<<1;
    27             ones[0]=binary[i];
    28         end
    29     end
    30 
    31 endmodule     
  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/halflife/p/1718797.html
Copyright © 2011-2022 走看看