|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——ZRtech Altera CycloneIV FPGA开发板——4位数的乘法运算
; W6 Z7 x4 [" y8 w1、新建工程4 a6 i' [9 {( u/ ~" \
% w7 a4 K$ u9 L3 X0 c( R6 _& o
2、本实验实现的功能是:4位数的乘法运算,对于运算结果,成绩的低四位数显示在左数第四个数码管上,高四位显示在左数第三个数码管上。由于本实验中两个乘数分别为1011和0111,所以乘积就为:01001101,所以左数第四个数码管上显示d,左数第三个数码管上显示4,由于数码管段选的复用,所以数码管以1s的间隔交替显示。乘法器如下:该图中,对乘法器中的各个加法器进行了编号处理。
8 J, h% o6 f% m( u9 r! V' s
7 A3 W0 W2 X& J+ g8 Q5 Y2 L1 y程序如下:
4 t( @* n% T: J2 e7 i0 V4 Mmodule multiplication(clk,Key4,Key3,Key2,Key1,DS_EN4,DS_EN3,DS_EN2,DS_EN1,DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP);
, A, f+ S* O* Y; j ~8 S6 o5 l# A1 |4 [4 T" m* A
input clk; h2 J3 K: N4 ~. M
input Key4,Key3,Key2,Key1;+ O3 Q8 `2 r! a7 w9 c
output wire DS_EN4,DS_EN3,DS_EN2,DS_EN1;
@) y; H8 M- [' o0 D( Q( boutput wire DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP;
9 _1 m9 \9 c0 s8 D2 [% I4 ?) ~0 I6 N
wire [3:0]Key;. S$ }, J) a/ q8 X
wire [3:0]wei;
& z1 d$ [) L) y( i4 ^wire [7:0]duan;
0 d: {9 s4 a! M6 D9 {* Z# b/ Ereg [3:0]wei_r;
" n! Q: ~- K% J: y( v7 u( Nreg [7:0]duan_r;! o& f( P$ x+ Y7 }8 j' g
wire Cout1,Cout2,Cout3,Cout4,Cout5,Cout6,Cout7,Cout8,Cout9,Cout10,Cout11,Cout12;//图中各加法器的进位. S1 Q+ I2 ?, p; Z. \- ~& v
wire Sout1,Sout2,Sout3,Sout4,Sout5,Sout6,Sout7,Sout8,Sout9,Sout10,Sout11,Sout12;//图中各加法器的和
1 \, C: g/ a5 Ewire [7:0]P;
. }, A/ T `. l: ]) Xwire clk_1k,clk_1s;" N7 ~6 h0 j8 K2 e: u
& B9 w! p7 l& g* _' w/ e' tparameter B=4'b1011, Z! ]% D& y( o2 Z9 A
A=4'b0111;- v& e& X* ?) A5 Q- U/ L! H- T3 m
% N* k" ]) X f+ _assign Key={Key4,Key1,Key2,Key3};
9 H0 T# c! ?8 k3 Z! fassign {DS_EN1,DS_EN2,DS_EN3,DS_EN4}=wei;//低电平选中对应数码管
* M1 K# Z$ g1 E; massign {DS_DP,DS_G,DS_F,DS_E,DS_D,DS_C,DS_B,DS_A}=duan; //数码管共阴极7 }" p. U$ u: [9 u
4 ~8 t* \# p. h! f3 u
fp_k fp_1k(clk,clk_1k);
% |" Z g( I* o- m+ Y! Sfp_s fp_1s(clk_1k,clk_1s);
' W9 ~- |0 }9 r7 t# {) R& |% J
$ n& O5 e; ]; `, j+ f1 C- u; ?/ E//乘法器$ l6 p+ c/ h7 u" q+ S# n! g
assign P[0]=A[0]&B[0]; //P08 l4 y$ R1 I, g0 g. m& j2 I
adder_1bit add1(0,(A[1]&B[0]),(A[0]&B[1]),P[1],Cout1); //P1+ k: M/ }3 A' ~; y/ s, }* F
adder_1bit add2(Cout1,(A[2]&B[0]),(A[1]&B[1]),Sout2,Cout2); //P2
; `! Q0 j3 Z7 D0 l) _adder_1bit add3(0,Sout2,(A[0]&B[2]),P[2],Cout3); //P2
( ~" w# f- z" Hadder_1bit add4(Cout2,(A[3]&B[0]),(A[2]&B[1]),Sout4,Cout4); //P3
# ^: T" ?. M6 kadder_1bit add5(Cout3,Sout4,(A[1]&B[2]),Sout5,Cout5); //P3
' g. i1 y' t) g7 Vadder_1bit add6(0,Sout5,(A[0]&B[3]),P[3],Cout6); //P3
* P# F- M. `8 Ladder_1bit add7(Cout4,Cin,(A[3]&B[1]),Sout7,Cout7); //P4& w; E2 y7 @/ y* \- a1 w
adder_1bit add8(Cout5,Sout7,(A[2]&B[2]),Sout8,Cout8); //P4
) m+ j, a/ |0 s4 i9 h2 N- Badder_1bit add9(Cout6,Sout8,(A[1]&B[3]),P[4],Cout9); //P4) w1 I3 y8 f; w( p9 k# a
adder_1bit add10(Cout8,Cout7,(A[3]&B[2]),Sout10,Cout10); //P5- m( l. W! R, K8 P
adder_1bit add11(Cout9,Sout10,(A[2]&B[3]),P[5],Cout11); //P5; @- S6 V2 Z; d" K" }5 I- ]/ I
adder_1bit add12(Cout11,Cout10,(A[3]&B[3]),P[6],Cout12); //P67 L5 J+ s" ], G- I3 O
assign P[7]=Cout12; //P7 i& I3 w0 D$ ~- j, J% P
5 j0 V' X! I$ z9 _ |; `initial
0 C, q! Y6 `- N6 Ybegin8 }3 }! h0 l6 ^0 H, a
//Key<=4'b1111;6 {6 |! J0 N& I+ a) U; |' s
wei_r<=4'b1111;) y! ?6 F2 z4 F" O! ]$ v
end5 s% u1 K" N. Q- ~5 U
$ u/ y0 K. L4 S2 Ealways @(posedge clk_1s)/ X7 W( T" k: \6 D
begin
* V$ v! w7 U/ c& f) C9 S4 j //if(Key==4'b1110)//按下最右边的那个个按键时,进行复位操作
9 @7 @6 @4 R: _+ s( E' Q, o //begin5 J) J; V Z i% {& ]
//wei_r<=4'b1111;
' b" o- {$ T/ R( M) k) x" d //end
5 _8 C4 [/ Y4 M/ \" o/ T. x if(wei_r==4'b1111)0 V3 t- |8 T0 w. t. E
begin
/ C8 x( N. R8 ?6 A* k wei_r<=4'b1110; //左数第四个数码管亮) X% v6 V* n$ A0 M5 c3 B
end
9 _- c: Q0 @& v% y& D# A else if(wei_r==4'b1110)* K4 h5 v7 s- S) U& O1 z& L
begin
* ]; `3 ^/ n8 [& J wei_r<=4'b1101; //左数第三个数码管亮
4 [" y% A8 x+ n0 q/ o8 | end
6 R" k* Y) g& r& U$ P+ _- ` else if(wei_r==4'b1101); d. p2 I1 K0 I6 E
begin
0 Z0 F# ?" G4 M5 B wei_r<=4'b1110; //左数第四个数码管亮
0 y6 M E# A" |, Z1 | end
1 ^' h0 m3 V- a# R! Gend
0 L3 T) i- H* b; X& O0 V6 x x* r5 H+ v: a5 X9 l
always @(clk_1k)3 C4 Y* i- }4 \# n+ o3 a# {$ M$ }
begin* t; R1 k6 ]8 E- j
if(wei_r==4'b1110) //左数第四个数码管亮,并且显示乘积数的低四位
7 C8 h7 z8 q- Z6 d K7 R& B begin
" h3 F' V0 i2 l+ A1 j X- \ case(P[3:0])
' A9 _' c; v) n/ Q& S9 d1 x 4'b0000: duan_r=7'b00111111;/ K4 M. X3 p& z! a) v+ L3 @, J
4'b0001: duan_r=7'b00000110;$ _. X( S' H N: b( E) Q0 K
4'b0010: duan_r=7'b01011011;1 o0 c1 W6 `# f! b& ~
4'b0011: duan_r=7'b01001111;
2 e1 u' }: y2 [/ _1 R3 A 4'b0100: duan_r=7'b01100110;
2 O# w m. l) {4 ]! M- C& _$ X 4'b0101: duan_r=7'b01101101;2 X4 Y8 R8 a1 S. p9 I0 s" G! c
4'b0110: duan_r=7'b01111101;
7 z5 J6 |( n. h5 E7 ?, m2 C 4'b0111: duan_r=7'b00000111;
1 I1 q% H2 f* G5 |: O1 ]" i2 F 4'b1000: duan_r=7'b01111111;
: U3 ]; {8 W$ D2 K& d' B9 S 4'b1001: duan_r=7'b01101111;
! r1 x5 h7 A; p% e2 A2 B8 g! \$ f 4'b1010: duan_r=7'b01110111;
/ n+ x( t% x" k: ?# I 4'b1011: duan_r=7'b01111100;
7 D& m8 [" I; H0 ~+ n, ^2 ? 4'b1100: duan_r=7'b00111001;
7 i5 l- Y5 A8 I P! P# g 4'b1101: duan_r=7'b01011110;6 D6 q9 [4 G/ A( N: r. y5 x' O
4'b1110: duan_r=7'b01111001; y: R! I8 [% N0 K
4'b1111: duan_r=7'b01110001;
9 z" X& ^8 x* E- e- c default: duan_r=7'b00000000;
& V) l( x$ e/ x# D x G* j endcase - R; G8 H/ I4 O0 a3 C7 h" v
end
7 A4 ^0 P0 _) C* ? else if(wei_r==4'b1101) //左数第三个数码管亮,并且显示乘积数的高四位
* b( m8 n, W$ Y, K begin) M e- T) y! l2 K# ]% H; Q
case(P[7:4])4 @+ g2 X; @2 z" i1 Z( d1 l4 T/ ^+ ]
4'b0000: duan_r=7'b00111111;
8 j* y) X; o; |% K' N 4'b0001: duan_r=7'b00000110;
" `- M) A7 {: f$ q 4'b0010: duan_r=7'b01011011;4 z* s2 |8 q% w% Q5 g
4'b0011: duan_r=7'b01001111;+ _5 _' s5 {9 q
4'b0100: duan_r=7'b01100110;6 d5 g8 l. u+ J" u
4'b0101: duan_r=7'b01101101;
; k0 e7 i8 |* k% W& m4 k8 l 4'b0110: duan_r=7'b01111101;
9 e; T9 S% b0 Q* L+ @6 q 4'b0111: duan_r=7'b00000111;, l& O7 B) h, k
4'b1000: duan_r=7'b01111111;2 E) y/ ~, l3 F t. o9 j: s% |# P
4'b1001: duan_r=7'b01101111;
. B2 B& w1 O! J* U+ X$ h: |. C 4'b1010: duan_r=7'b01110111;5 N- X! _3 O m+ u
4'b1011: duan_r=7'b01111100;) W6 _& z" n8 ?( L
4'b1100: duan_r=7'b00111001;
* e# W4 R/ ?# j- \3 p6 ` 4'b1101: duan_r=7'b01011110;( ]4 I8 X! }( ?. w8 J* q( j3 v t
4'b1110: duan_r=7'b01111001;
( a' E! N2 Z0 r2 y" Y: G% l2 } 4'b1111: duan_r=7'b01110001;
) b, ` d9 ]. E% N3 A default: duan_r=7'b00000000;: u9 S4 @7 r+ ] ^
endcase
7 \; K& H o% {4 I* ? end0 b$ J9 q6 I9 Z( d; @
end) j U- ~' x: [& H
. \- a& o& y: q) ]. |) p# r
assign wei=wei_r;, `! l# Y" W3 F: L) l9 l3 \1 h! D* ~
assign duan=duan_r;4 f' y% j! d( N4 e
endmodule
9 T, c9 w# T( x, }; W3 a
" b- s4 v$ ?; |; T//分频48M-----1k
* ], O) o- a# B- ]/ jmodule fp_k(clk,clk_1k);
8 {& I! U# S4 b4 j# _0 z# ^input clk;$ i, s7 C. l: _: s7 i1 ~
output reg clk_1k;
. K* w. {+ [" C0 r5 t- ^; N5 lreg [31:0]cout;; ^1 `7 g( z( g. \9 t
//reg clk_en;- F/ K0 f# C- f2 a0 E
initial
+ }- v1 }- V: |/ Kbegin
. m: o D5 Y; D: \8 D r& ` cout<=32'd0;
4 H$ O7 r% D! `! H; | clk_1k<=1'd0;
6 R i& c: ^; k( {% aend. `1 T. o/ ]4 B" T
always @(posedge clk). L5 @* r3 q* j. [( i
begin
1 A1 |( j7 P7 V6 I if(cout==32'd24000)
9 t; z7 H }' n$ `7 U, n' Q% Y( F& e begin
& L3 Y; j2 x1 |1 ~2 \9 Z2 `+ V cout<=32'd0;9 X' R/ n/ k- T0 [3 G4 u
clk_1k<=~clk_1k;
6 P2 O2 i' h6 H2 u end6 U2 }" h- G/ q. N
else
$ F! K# U" w# J( u) r$ ^ begin
K5 q2 P9 V+ H& g. K6 O; Z cout<=cout+1;
7 |/ d# Z7 \3 k' u# v end
# M( G8 ?$ v6 J' U5 \1 O; ` //clk_1s<=clk_en;
9 K4 `4 l2 s0 r. `% `5 q/ pend; U$ n3 K. i. L, j/ d0 \3 K3 d
% q3 _* x3 @$ p
endmodule
" P$ d& L; I" ]6 R& b# K//分频1k-----1s
3 Y( H; S, j+ M9 m1 s) X* ~module fp_s(clk_1k,clk_1s);+ `, a7 _1 C, J1 c2 i7 v0 Q. N
input clk_1k;7 Z5 e2 y, ^5 e5 J! P0 |& ?; J. ]" y
output reg clk_1s;6 U8 n7 q! }- L* z( x
reg [10:0]cout;' S# c) O# h9 O
//reg clk_en;; O; p+ U# O, V$ w" P
initial
3 d+ [" x( h K; K' R( y5 lbegin4 o* g! Z3 g, Y0 c. J
cout<=10'd0;! F) e7 ` R) {6 D$ S; r8 r! ]
clk_1s<=1'd0;/ v' I# Y8 P$ M$ k! i
end
" j( M' U' O. O2 j0 z3 Y$ ]always @(posedge clk_1k), n0 J9 Z$ y3 b& \0 e! X
begin/ d0 c, }2 Z, Y x: `) O
if(cout==10'd500)
. l; t! z: q C begin
' `# F6 y7 Z( O* l& l) d# C- m; a$ _ cout<=10'd0;' L2 L' y0 @. C& F: `
clk_1s<=~clk_1s;
. ]% `% c) T: c1 E7 L+ S end( ~7 Z$ H1 [" y) N) {( s
else
. B U( d, h, C begin9 ~* h+ E. r, a z+ l( C
cout<=cout+1;
% z. C/ `. q+ S end" g- O( P3 A$ N! u f6 G* m: j' ]
//clk_1s<=clk_en;
1 W7 E3 S+ N9 n; L }0 j/ K& ]end/ x( ^- n3 a4 H4 ^" u4 z' \3 I
! W, r3 i3 @7 a& W
endmodule 8 [% T# ^6 G* b% ^4 k
9 {' ^9 M) p% q2 m" ~5 N
//1bit_adder
! c9 A7 N0 ^) G- x& r. Q9 ^module adder_1bit(Cin,A,B,S,Cout);7 |* ?9 V( t, @& i
input Cin;, c+ P$ \+ r$ t$ {0 h3 O) d8 e+ w
input A,B;
" |1 T% L6 @1 L+ Poutput S;
S5 c) h1 I0 [5 J' M& z2 J0 C9 }: noutput Cout;
1 b G5 f3 w& H0 F7 Y7 Xassign S=A^B^Cin;
& Y/ A/ _: l) S( \assign Cout=(A&B)|(A&Cin)|(Cin&B);/ x1 I. g7 B1 U* p
endmodule9 q* S1 g: l9 m' ~
) n- ^5 j! J6 i3、实验结果
' a* y( y- ~: _ & v; `' o. a! r- v! [* l* U
乘积的低四位, O, P$ X" Q, O
& d1 Z6 p+ b9 N C% H
乘积的高四位
* T6 }4 V' ^/ p |
|