DE2 实验练习解答lab 2数字和显示digital LogicDE2.docx
- 文档编号:30409899
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:15
- 大小:134.52KB
DE2 实验练习解答lab 2数字和显示digital LogicDE2.docx
《DE2 实验练习解答lab 2数字和显示digital LogicDE2.docx》由会员分享,可在线阅读,更多相关《DE2 实验练习解答lab 2数字和显示digital LogicDE2.docx(15页珍藏版)》请在冰豆网上搜索。
DE2实验练习解答lab2数字和显示digitalLogicDE2
本节练习主要用组合逻辑电路实现2进制到10进制数字的转换以及BCD码的加法。
PartI2进制数字的显示
在HEX3到HEX0上显示SW15-0的值。
SW15-12,SW11-8,SW7-4,SW3-0分别对应于HEX3,HEX2,HEX1,HEX0.在数码管上显示0-9,忽略开关表示的数值1010-1111.
本练习的目的是手工推导数码管显示的逻辑,要求只用赋值语句和布尔表达式实现。
part1.v
part1顶层文件
1//part1display0-9onthe7-segmentdisplays
2modulepart1(HEX3,HEX2,HEX1,HEX0,SW);
3input[15:
0]SW;
4output[0:
6]HEX3,HEX2,HEX1,HEX0;
5
6btdH3(SW[15:
12],HEX3);
7btdH2(SW[11:
8],HEX2);
8btdH1(SW[7:
4],HEX1);
9btdH0(SW[3:
0],HEX0);
10
11endmodule
数码管译码电路:
1//binary-to-decimal
2modulebtd(s,seg);
3input[3:
0]s;
4output[0:
6]seg;
5
6assignseg[6]=~s[3]&~s[2]&~s[1]|s[2]&s[1]&s[0];
7assignseg[5]=~s[3]&~s[2]&s[0]|~s[2]&s[1]|s[1]&s[0];
8assignseg[4]=s[0]|s[2]&~s[1];
9assignseg[3]=~s[3]&~s[2]&~s[1]&s[0]|
10s[2]&~s[1]&~s[0]|
11s[2]&s[1]&s[0];
12assignseg[2]=~s[2]&s[1]&~s[0];
13assignseg[1]=s[2]&~s[1]&s[0]|s[2]&s[1]&~s[0];
14assignseg[0]=s[2]&~s[1]&~s[0]|~s[3]&~s[2]&~s[1]&s[0];
15
16endmodule
Part II 2进制值转换为10进制
将4位二进制输入V=v3v2v1v0转换成2位十进制数D=d1d0,在HEX1和HEX0上分别显示d1和d0.输出值与输入值的对应关系如表1.图1给出了电路的部分设计。
比较器用来检测V>9.电路A用来将>9的输入转换成对应的个位的BCD码.电路B用来将1位二进制的输入转换为对应的BCD码显示.
part2.v
1//part2
2modulepart2(V,D1,D0);
3input[3:
0]V;
4output[0:
6]D1,D0;
5wirez;//comparatoroutput
6wire[2:
0]a;//circuitAoutput
7wire[3:
0]m;//multiplexeroutput
8
9comparatorC(V,z);
10circuitaA(V[2:
0],a);
11mux_4b_2to1M(V,{1'b0,a},z,m);
12circuitbB(z,D1);
13btdD(m,D0);
14
15endmodule
16
17//circuitB
18modulecircuitb(z,seg);
19inputz;
20output[0:
6]seg;
21
22assignseg[6]=1;
23assignseg[5]=z;
24assignseg[4]=z;
25assignseg[3]=z;
26assignseg[2]=0;
27assignseg[1]=0;
28assignseg[0]=z;
29
30endmodule
31
32
33//4-bit2-to-1multiplexer
34modulemux_4b_2to1(x,y,s,m);
35input[3:
0]x;
36input[3:
0]y;
37inputs;
38output[3:
0]m;
39
40mux_2to1u3(x[3],y[3],s,m[3]);
41mux_2to1u2(x[2],y[2],s,m[2]);
42mux_2to1u1(x[1],y[1],s,m[1]);
43mux_2to1u0(x[0],y[0],s,m[0]);
44
45endmodule
46//2to1multiplexer
47modulemux_2to1(a,b,s,m);
48inputa,b,s;
49outputm;
50
51assignm=s?
b:
a;
52
53endmodule
54
55
56//circuitA
57modulecircuita(v,a);
58input[2:
0]v;
59output[2:
0]a;
60
61assigna[2]=v[2]&v[1];
62assigna[1]=v[2]&~v[1];
63assigna[0]=(v[1]&v[0])|(v[2]&v[0]);
64
65endmodule
Part III 行波进位加法器
part3.v
1//4-bitripple-carryaddercircuit
2modulepart3(SW,LEDR,LEDG);
3input[8:
0]SW;
4output[8:
0]LEDR;
5output[4:
0]LEDG;
6wire[3:
0]a,b;
7wirecin;
8wire[3:
0]s;
9wirecout;
10wire[3:
1]c;
11
12assignLEDR=SW;
13assigncin=SW[8];
14assigna=SW[7:
4];
15assignb=SW[3:
0];
16assignLEDG[4]=cout;
17assignLEDG[3:
0]=s;
18
19fadder(cin,a[0],b[0],s[0],c[1]);
20fadder(c[1],a[1],b[1],s[1],c[2]);
21fadder(c[2],a[2],b[2],s[2],c[3]);
22fadder(c[3],a[3],b[3],s[3],cout);
23
24endmodule
25
26//fulladder
27modulefadder(ci,a,b,s,co);
28inputci,a,b;
29outputs,co;
30
31assigns=ci^a^b,
32co=(a^b)?
ci:
b;
33
34endmodule
Part IV 1位BCD加法器
注意处理和的最大值S1S0=9+9+1=19。
part4.v
1//partIV:
BCDadder
2
3//circuitA
4modulecircuit_A(s,ao);
5input[3:
0]s;
6output[3:
0]ao;
7
8assignao[3]=~s[3]&~s[2]&s[1],
9ao[2]=(~s[3]&~s[2]&~s[1])|(s[3]&s[2]&s[1]),
10ao[1]=(~s[3]&~s[2]&~s[1])|(s[3]&s[2]&~s[1]),
11ao[0]=(~s[3]&~s[2]&s[0])|(s[3]&s[2]&s[0])|
12(~s[2]&s[1]&s[0]);
13
14endmodule
15
16//4-bit2-to-1multiplexer
17modulemux2to1_4b(x,y,s,m);
18input[3:
0]x,y;
19inputs;
20output[3:
0]m;
21
22mux_2to1u3(x[3],y[3],s,m[3]);
23mux_2to1u2(x[2],y[2],s,m[2]);
24mux_2to1u1(x[1],y[1],s,m[1]);
25mux_2to1u0(x[0],y[0],s,m[0]);
26
27endmodule
28//2to1multiplexer
29modulemux_2to1(a,b,s,m);
30inputa,b,s;
31outputm;
32
33assignm=s?
b:
a;
34
35endmodule
36
37//circuitB
38modulecircuit_B(z,seg);
39inputz;
40output[0:
6]seg;
41
42assignseg[6]=1;
43assignseg[5]=z;
44assignseg[4]=z;
45assignseg[3]=z;
46assignseg[2]=0;
47assignseg[1]=0;
48assignseg[0]=z;
49
50endmodule
51
52//7-segmentdecoder
53modulebtd(s,seg);
54input[3:
0]s;
55output[0:
6]seg;
56
57assignseg[6]=~s[3]&~s[2]&~s[1]|s[2]&s[1]&s[0];
58assignseg[5]=~s[3]&~s[2]&s[0]|~s[2]&s[1]|s[1]&s[0];
59assignseg[4]=s[0]|s[2]&~s[1];
60assignseg[3]=~s[3]&~s[2]&~s[1]&s[0]|
61s[2]&~s[1]&~s[0]|
62s[2]&s[1]&s[0];
63assignseg[2]=~s[2]&s[1]&~s[0];
64assignseg[1]=s[2]&~s[1]&s[0]|s[2]&s[1]&~s[0];
65assignseg[0]=s[2]&~s[1]&~s[0]|~s[3]&~s[2]&~s[1]&s[0];
66
67endmodule
68
69//4-bitfulladder
70modulefa_4b(a,b,s,cin,cout);
71input[3:
0]a,b;
72inputcin;
73output[3:
0]s;
74outputcout;
75
76wire[3:
1]c;
77
78fadderfao(cin,a[0],b[0],s[0],c[1]);
79fadderfa1(c[1],a[1],b[1],s[1],c[2]);
80fadderfa2(c[2],a[2],b[2],s[2],c[3]);
81fadderfa3(c[3],a[3],b[3],s[3],cout);
82
83endmodule
84
85//fulladder
86modulefadder(ci,a,b,s,co);
87inputci,a,b;
88outputs,co;
89
90assigns=ci^a^b,
91co=(a^b)?
ci:
b;
92
93endmodule
94
95//circuitcomparator
96modulecomparator(v,z);
97input[3:
0]v;
98outputz;
99
100assignz=(v[3]&v[2])|(v[3]&v[1]);
101
102endmodule
103
104//part4topfile
105modulepart4(SW,LEDR,LEDG,LEDG8,HEX6,HEX4,HEX1,HEX0);
106input[8:
0]SW;//Cin,A,B
107output[8:
0]LEDR;
108output[4:
0]LEDG;
109output[0:
6]HEX6,HEX4,HEX1,HEX0;
110outputLEDG8;
111
112wire[3:
0]sum;//sum
113wireco;//cout
114wire[3:
0]ao;//circuit_Aoutput
115wire[3:
0]m;//mux2to1_4boutput
116wirez;//comparatoroutput
117wirebi;//circuit_Binput
118wireva,vb;//A,Bcomparatoroutput
119assignLEDR=SW,
120LEDG[4]=co,
121LEDG[3:
0]=sum,
122LEDG8=va|vb;
123assignbi=co|z;
124
125fa_4bu0(SW[7:
4],SW[3:
0],sum,SW[8],co);
126circuit_Au1(sum,ao);
127comparatoru7(sum,z);
128mux2to1_4bu2(sum,ao,bi,m);
129btdu3(m,HEX0);
130circuit_Bu4(bi,HEX1);
131btdu5(SW[7:
4],HEX6);
132btdu6(SW[3:
0],HEX4);
133comparatoru8(SW[7:
4],va),
134u9(SW[3:
0],vb);
135
136
137
138endmodule
139
Part V 2位BCD加法器
part5.v
1/*...TheADDERCIRUIT....*/
2//AFullAdderCircuit
3modulefulladder(C,A,B,S,O);
4inputC,A,B;
5outputS,O;
6
7//C=CarryIn,A&B=Inputs,S=Sum,O=Carryout
8assignS=C^(A^B);
9assignO=(~(A^B)&B)|((A^B)&C);
10endmodule
11
12//4Bit,FullAdderCircuit
13modulefulladder_4bit(C,A,B,S,O);
14inputC;
15input[3:
0]A,B;
16outputO;
17output[3:
0]S;
18wire[3:
0]cwire;
19
20//C=CarryIn,A&B=Inputs,S=Sumb,O=CarryOut,CWIRE=Carrywirebetweenadders
21fulladderN0(C,A[0],B[0],S[0],cwire[0]);
22fulladderN1(cwire[0],A[1],B[1],S[1],cwire[1]);
23fulladderN2(cwire[1],A[2],B[2],S[2],cwire[2]);
24fulladderN3(cwire[2],A[3],B[3],S[3],cwire[3]);
25
26//BCDCarry
27assignO=cwire[3]|(S[3]&S[2])|(S[3]&S[1]);
28endmodule
29
30//BCDAdder:
SumFinder
31modulebcdAdder(C,A,B,S,O);
32inputC;
33input[3:
0]A,B;
34output[3:
0]S;
35outputO;
36wire[3:
0]cwire;
37wire[3:
0]preSum;
38
39fulladder_4bitMidAd1(C,A,B,preSum,O);
40
41assigncwire[0]=0;
42assigncwire[1]=O;
43assigncwire[2]=O;
44assigncwire[3]=0;
45
46
47fulladder_4bitMidAd2(0,cwire,preSum,S);
48
49endmodule
50
51//top_levelfile
52modulepart5(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
53HEX0);
54input[16:
0]SW;
55output[0:
6]HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
56HEX0;
57
58wire[3:
0]s0,s1;
59wireco0,co1;
60
61btdua1(SW[15:
12],HEX7);
62btdua0(SW[11:
8],HEX6);
63btdub1(SW[7:
4],HEX5);
64btdub0(SW[3:
0],HEX4);
65
66bcdAdderu0(SW[16],SW[11:
8],SW[3:
0],s0,co0);
67bcdAdderu1(co0,SW[15:
12],SW[7:
4],s1,co1);
68circuit_Bus2(co1,HEX2);
69btdus1(s1,HEX1);
70btdus0(s0,HEX0);
71
72endmodule
Part VI 另种实现2位BCD加法器的方法
用if-else结构实现,抽象描述,让编译器去实现具体电路。
part6.v
1//1-digitbcd_adder
2modulebcdadder(Ci,A,B,S,Co);
3inputCi;
4input[3:
0]A,B;
5outputreg[3:
0]S;
6outputregCo;
7
8reg[3:
0]z;
9reg[4:
0]t;
10
11always@(Ci,A,B)
12begin
13t=A+B+Ci;
14if(t>9)
15begin
16z=4'd10;
17Co=1'b1;
18end
19else
20begin
21z=0;
22Co=0;
23end
24S=t-z;
25end
26endmodule
27
28//top_levelfile
29modulebcdadder_2(SW,HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
30HEX0);
31input[16:
0]SW;
32output[0:
6]HEX7,HEX6,HEX5,HEX4,HEX2,HEX1,
33HEX0;
34
35wire[3:
0]s0,s1;
36wireco0,co1;
37
38btdua1(SW[15:
12],HEX7);
39btdua0(SW[11:
8],HEX6);
40btdub1(SW[7:
4],HEX5);
41btdub0(SW[3:
0],HEX4);
42
43bcdadderu0(SW[16],SW[11:
8],SW[3:
0],s0,co0);
44bcdadderu1(co0,SW[15:
12],SW[7:
4],s1,co1);
45circuit_Bus2(co1,HEX2);
46btdus1(s1,HEX1);
47btdus0(s0,HEX0);
48
49endmodule
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……等等等等。
参考:
BCDandAdd3ConverterbyDr.JohnS.Loomis:
http:
//www.johnloomis.org/ece314/notes/devices/binary_to_BCD/bin_to_bcd.html
part7.v
1//6-bitbinaryto2-digitBCD
2moduleb2b(a,ones,tens);
3input[5:
0]a;
4output[3:
0]ones,tens;
5
6wire[3:
0]c1,c2,c3;
7wire[3:
0]d1,d2,d3;
8
9assignd1={1'b0,a[5:
3]};
10assignd2={c1[2:
0],a[2]};
11assignd3={c2[2:
0],a[1]};
12add3m1(d1,c1);
13add3m2(d2,c2);
14add3m3(d3,c3);
15assignones={c3[2:
0],a[0]};
16assigntens={1'b0,c1[3],c2[3],c3[3]};
17
18endmodule
19
20//add3.v
21moduleadd3(in,out);
22input[3:
0]in;
23output[3:
0]out;
24reg[3:
0]out;
25
26always@(in)
27case(in)
284'b0000:
out<=4'b0000;
294'b0001:
out<=4'b0001;
304'b0010:
out<=4'b0010;
314'b0011:
out<=4'b0011;
324'b0100:
out<=4'b0100;
334'b0101:
out
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DE2 实验练习解答lab 2数字和显示digital LogicDE2 实验 练习 解答 lab 数字 显示 digital