【原创】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码显示.

 

【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)_第1张图片

【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)_第2张图片

 

 

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 行波进位加法器

 

【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)_第3张图片

 

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.

 

 

【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)_第4张图片

代码

 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 output reg [ 3 : 0 ]S;
6 output reg 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
 

【原创】DE2 实验练习解答—lab 2:数字和显示(digital Logic)(DE2)_第5张图片

解法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     

 

你可能感兴趣的:(git)