|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——ZRtech Altera CycloneIV FPGA开发板——4位数的乘法运算
& z q% E# F r" F" Q1、新建工程
% h+ I5 w ~! B6 V, h
* \8 V/ D# v, j' s- \/ a/ _2、本实验实现的功能是:4位数的乘法运算,对于运算结果,成绩的低四位数显示在左数第四个数码管上,高四位显示在左数第三个数码管上。由于本实验中两个乘数分别为1011和0111,所以乘积就为:01001101,所以左数第四个数码管上显示d,左数第三个数码管上显示4,由于数码管段选的复用,所以数码管以1s的间隔交替显示。乘法器如下:该图中,对乘法器中的各个加法器进行了编号处理。* l, d M$ Q& ]" @. f9 t
! H- {( L+ A) o, |+ Y& u3 B程序如下:7 g' n4 f+ w& b% t( ]# H1 ?( V+ n
module 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);
% H, p7 ^6 q# d5 M, q
0 I9 ] ]( ?: m0 F7 { p+ y8 A* ~input clk;4 z4 w" ^) r+ \3 k) `; ^
input Key4,Key3,Key2,Key1;% T' E( I4 Y7 c; h% `+ P/ w
output wire DS_EN4,DS_EN3,DS_EN2,DS_EN1;% J9 R$ J* {. U. n+ R( g5 }
output wire DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP;
+ m$ C1 `7 e" H/ J$ L
# {8 ]' k; _% Z% L$ @ G8 _4 Owire [3:0]Key;
6 L+ Z4 C3 J9 T" dwire [3:0]wei;' d; K$ S- `( G3 F) J0 P; u6 }
wire [7:0]duan;
# a: M) k7 M: N* c* B, breg [3:0]wei_r;
1 N4 V: o/ O: zreg [7:0]duan_r;% }8 p$ J5 A( u8 C' }' P
wire Cout1,Cout2,Cout3,Cout4,Cout5,Cout6,Cout7,Cout8,Cout9,Cout10,Cout11,Cout12;//图中各加法器的进位
# K4 I5 a% L. \) U2 Awire Sout1,Sout2,Sout3,Sout4,Sout5,Sout6,Sout7,Sout8,Sout9,Sout10,Sout11,Sout12;//图中各加法器的和1 m) w' B5 G* F' [3 e9 E6 }, }
wire [7:0]P;8 p% `+ V) p8 Z9 r- ]" V: r" Z4 W
wire clk_1k,clk_1s; v+ W' q% @3 H
/ w+ \! S" a$ n! R E# j3 } b
parameter B=4'b1011,% Y0 a% } p' ?5 E6 ]( f6 q' y
A=4'b0111;
1 t1 ]; v3 C! w" B( k7 {. P
5 H1 B9 ]+ g' W, c% Z* `! q/ Sassign Key={Key4,Key1,Key2,Key3};
2 Q8 C1 S) Y6 Z i& ~' k1 \assign {DS_EN1,DS_EN2,DS_EN3,DS_EN4}=wei;//低电平选中对应数码管% ~' P0 W* v0 _2 M& k5 O' m
assign {DS_DP,DS_G,DS_F,DS_E,DS_D,DS_C,DS_B,DS_A}=duan; //数码管共阴极
% X, J7 l& N1 f2 \, P+ V
Z- U4 {1 a, J1 Pfp_k fp_1k(clk,clk_1k);+ @* }4 y) f# E
fp_s fp_1s(clk_1k,clk_1s);) |9 g3 Z% Z* l, z6 h) w& J. |
: D2 Y/ }. j1 H% s2 n; U$ v% ~: b* p( [//乘法器
1 D7 J' O9 y3 C7 w! @assign P[0]=A[0]&B[0]; //P0& N$ f A* H% T
adder_1bit add1(0,(A[1]&B[0]),(A[0]&B[1]),P[1],Cout1); //P1$ j& U0 ]( G2 l4 y2 D
adder_1bit add2(Cout1,(A[2]&B[0]),(A[1]&B[1]),Sout2,Cout2); //P2
9 k) a& \7 A# fadder_1bit add3(0,Sout2,(A[0]&B[2]),P[2],Cout3); //P20 v u; u6 B9 N' |1 Y3 ]2 A6 R
adder_1bit add4(Cout2,(A[3]&B[0]),(A[2]&B[1]),Sout4,Cout4); //P3
/ x* y M6 M: E$ h$ C6 R0 Xadder_1bit add5(Cout3,Sout4,(A[1]&B[2]),Sout5,Cout5); //P3
3 z+ F+ D# `1 U L" M5 w1 ]9 [adder_1bit add6(0,Sout5,(A[0]&B[3]),P[3],Cout6); //P3# H6 [0 u+ x0 K$ n
adder_1bit add7(Cout4,Cin,(A[3]&B[1]),Sout7,Cout7); //P4
0 [4 T A; \+ \3 e4 V; [( Oadder_1bit add8(Cout5,Sout7,(A[2]&B[2]),Sout8,Cout8); //P4- @+ v. U0 } W9 B9 J* i
adder_1bit add9(Cout6,Sout8,(A[1]&B[3]),P[4],Cout9); //P4
8 L$ |+ L3 Z; madder_1bit add10(Cout8,Cout7,(A[3]&B[2]),Sout10,Cout10); //P5
# V6 q( X2 r" s: j# [9 m" d7 Hadder_1bit add11(Cout9,Sout10,(A[2]&B[3]),P[5],Cout11); //P5
! ]0 R- k: e/ ]7 G/ ^+ n& iadder_1bit add12(Cout11,Cout10,(A[3]&B[3]),P[6],Cout12); //P6
( d7 |' V; E) }7 v/ m! [* Rassign P[7]=Cout12; //P7* p; W- ~! U2 ^& Y2 `
$ E7 T% r8 x+ `7 M
initial G; H* m' @3 O: i; ~
begin
: R* J, ~0 u, p6 \6 I: f. U9 q //Key<=4'b1111;- u/ e2 _( Y! Q) ]+ g/ R! l9 P
wei_r<=4'b1111;0 D$ r) }4 `) e: ^3 Z& ~+ @
end9 s8 z" f( J F
& \7 O) i, x9 T3 y7 V! p+ _
always @(posedge clk_1s)) r7 L7 C0 P* F4 w K* K, Y
begin) S. t# l t" o0 m( w; t4 ~
//if(Key==4'b1110)//按下最右边的那个个按键时,进行复位操作
: X5 x8 n. ]4 D7 a- j2 J; f //begin Z$ q8 i- t& G+ e, I0 i4 z, Q
//wei_r<=4'b1111;
, P8 d: R' ?# a. p //end
) b% |$ v& k* p if(wei_r==4'b1111)
! g D, E5 }3 x6 G begin& D8 ]3 l. H- l% @0 ]8 a+ P
wei_r<=4'b1110; //左数第四个数码管亮; P# c# s; [4 N; ?
end
3 ~- q- h+ E; C: T/ Z7 U4 N% n else if(wei_r==4'b1110) q( T7 b/ ?; J6 ~' g/ [, a
begin" j7 m& s7 T' H2 l6 E) p1 B# J
wei_r<=4'b1101; //左数第三个数码管亮
) d) n& O3 `" c5 z7 \0 D. R T1 | end% B7 R4 G9 x) T( f& A: @
else if(wei_r==4'b1101)
/ z: v" q, m. }6 {% r begin: u; G0 b8 L' C. H2 k
wei_r<=4'b1110; //左数第四个数码管亮
% f D0 {, m7 z6 J, u. t0 C end
0 v) j, z3 l4 xend7 x1 X( ?# I* ~4 `- T, U
* B2 ?3 E! b" n( n3 k: V4 u; j: kalways @(clk_1k)
" R0 U! n1 ~* f8 z6 c' `! A9 t9 B5 ubegin
I" ^' E, h, M. j4 f if(wei_r==4'b1110) //左数第四个数码管亮,并且显示乘积数的低四位5 r) m" M% F' k8 l
begin
# H2 k# ~- \% ]% \' J7 q- R case(P[3:0])
# Z" G& F5 ]: q 4'b0000: duan_r=7'b00111111;
5 P/ t* Q+ j, k/ w: }, K7 i8 ` 4'b0001: duan_r=7'b00000110; d5 ?6 {- d/ Z/ U
4'b0010: duan_r=7'b01011011;' m+ [0 G5 p/ ]% I- k/ I: ?/ O
4'b0011: duan_r=7'b01001111;
6 S) g& r/ d+ T u# ]9 X" v 4'b0100: duan_r=7'b01100110;$ v U9 F, `" r1 l: A3 B5 G
4'b0101: duan_r=7'b01101101;
6 Y4 g. R1 }4 D A u3 T/ u2 y 4'b0110: duan_r=7'b01111101;1 a; V. H- l" f
4'b0111: duan_r=7'b00000111;8 R1 z7 D- ?8 R. m+ H% r
4'b1000: duan_r=7'b01111111;
3 B& s' @: u8 L# D. t 4'b1001: duan_r=7'b01101111;
/ n' F c0 b5 \1 \/ J( p, q 4'b1010: duan_r=7'b01110111;
7 }/ X+ Y5 m+ U6 f, }7 _ 4'b1011: duan_r=7'b01111100;$ |. N2 x$ _' U$ u( H' e
4'b1100: duan_r=7'b00111001;: @+ S) l1 q1 @6 V, G
4'b1101: duan_r=7'b01011110;
! X& e* X0 [1 ], G8 g$ V) c 4'b1110: duan_r=7'b01111001;
5 {5 b5 c* p; K4 \& { 4'b1111: duan_r=7'b01110001;, J! E3 u; O* f! |, L# ~" _* d
default: duan_r=7'b00000000;
# Z; V$ \. X6 V4 T e3 c; e endcase 7 I! L6 K9 \6 D) ]2 X
end
* h4 K5 Q# M6 H0 A, \# o* K7 [ else if(wei_r==4'b1101) //左数第三个数码管亮,并且显示乘积数的高四位
0 L3 v1 N" ^7 i9 V4 ^ begin
: S G. v- q( r3 N( c1 N6 I case(P[7:4])# g4 L- L" j% I2 n4 J ]% ]6 p
4'b0000: duan_r=7'b00111111;
! l2 o, |4 m) | ` 4'b0001: duan_r=7'b00000110;# L: F% n" W9 o3 b8 j) c( V
4'b0010: duan_r=7'b01011011;. }+ g1 `# x P3 R
4'b0011: duan_r=7'b01001111;
, V$ \" \* p+ l* u( S' N' E 4'b0100: duan_r=7'b01100110;
" {* p2 d2 X+ m+ {& x 4'b0101: duan_r=7'b01101101;
# G8 ], I5 e$ f: d 4'b0110: duan_r=7'b01111101;
! |0 A! V: U) Y5 A9 V 4'b0111: duan_r=7'b00000111;7 [8 B$ ^ H# d& X& y/ s0 O( `
4'b1000: duan_r=7'b01111111;5 V, R0 o! m+ Q+ A2 [& N
4'b1001: duan_r=7'b01101111;8 M/ y$ B. Z1 x- V. }' { ~
4'b1010: duan_r=7'b01110111;
. G( l) X1 ?- g) f1 \ o) w 4'b1011: duan_r=7'b01111100;
: A" ]( E7 y4 m$ Z, s( e* g 4'b1100: duan_r=7'b00111001;
, ^" v! G5 f6 s8 ? 4'b1101: duan_r=7'b01011110;
/ }/ R) P' S( {* _- ? 4'b1110: duan_r=7'b01111001;5 ?$ d+ z' w) X% u
4'b1111: duan_r=7'b01110001;& E& }# d4 y7 \3 j8 [
default: duan_r=7'b00000000;; d: c O% u! c+ Y
endcase 9 G! \% b% X0 U5 V0 E4 o2 I
end
1 B; }: Q7 K7 s( r/ K- cend
" M$ V) \$ n0 N9 o7 u: p7 M
; M; _, }0 {, O% [/ Zassign wei=wei_r;
& w7 c7 I6 d! C7 ~8 k8 Passign duan=duan_r;
/ q. v$ I% h4 k- q. m" ?endmodule
8 U4 y, I2 {* M" y. ]) \% m- M; @
, z1 m, }7 ?; X" w i% ?' U//分频48M-----1k
: n# {& I% ~4 x# Y" kmodule fp_k(clk,clk_1k); T/ o2 `% z% [9 B4 j
input clk;# O$ N/ y! N1 x$ n( w
output reg clk_1k;
$ i0 h! z5 C, N: [reg [31:0]cout;+ F( O% p, S5 b) x' ]! d
//reg clk_en;
0 l2 U d, f9 q0 [. w/ [) D, D* y1 ainitial - {5 Q: F0 ]; m, O/ Z, C
begin
, ~2 P1 a: `, M2 _. f cout<=32'd0;
. G, O) I+ g6 L' M9 u7 [; A clk_1k<=1'd0;
. s% m; ]0 B$ W5 ^" O& vend* v8 y8 r% \& e: e# R4 S0 Q3 v z
always @(posedge clk)
. ~* N1 `9 h, |/ L# s- I; ^8 ]begin- q; U$ K, N& {
if(cout==32'd24000)3 ]- T& X' U5 l/ Y
begin
2 b4 @* x- r' C3 M& ? cout<=32'd0;
+ `# _) j6 ^( n clk_1k<=~clk_1k;! ]2 s4 N& g6 Y- o e" A5 Z
end" o, F# l0 ]9 J5 t
else
2 ~7 i* a& ?" {0 d4 n begin3 [& _! @0 z5 U/ W
cout<=cout+1; , W' ^% q6 M7 z I) a `
end/ A J/ O1 i9 l6 w" \
//clk_1s<=clk_en;. C) w( a2 D& ]' `9 I ^
end7 _" c0 u5 z/ z! N [: w9 y9 l, G; K
5 M6 `1 w1 z; x; e
endmodule ' X. G! P2 S- A
//分频1k-----1s) D+ y6 c* S. S' K, s Q. }. _
module fp_s(clk_1k,clk_1s);0 a C, Y$ o# J' d3 Q
input clk_1k;3 B% A# G5 e7 Q% n' H$ ~" [8 i* V7 b
output reg clk_1s;
& G+ u. G4 o, Z2 }7 D& B8 Treg [10:0]cout;4 ?2 m# M. f# z9 G+ z1 ^
//reg clk_en;' ]! t, A, J- |: s0 B4 J; R
initial * N) t6 F0 F% t; K9 @
begin% z' L" l4 o0 A$ x8 j
cout<=10'd0;; u" P) n# H e7 ^
clk_1s<=1'd0;- Z% R3 p& e! w. C- N) ~0 w
end
. W( F0 l; [" [1 R* salways @(posedge clk_1k)' i, k. J% t: F' E8 z& `
begin: k& l% _+ L' c8 J" s& k- A
if(cout==10'd500)& ?4 c7 A9 w- z" O: s' @" X% y
begin% Y% }% t. G* W# P" p
cout<=10'd0;2 r, h& n( H2 @+ R. F
clk_1s<=~clk_1s;" b! R0 d2 |6 h( j$ c, \
end. ~6 r% G0 y- X* z& K+ d2 | o/ Y
else8 J5 D L2 r S- a7 h
begin
6 w* S& d1 C' R$ V* v5 q cout<=cout+1;
1 G6 b* ^5 N( @6 c end
0 E/ l: P* p% |1 M8 O //clk_1s<=clk_en;/ G. ]3 P/ y; A# X+ J
end
) G- m l2 D5 y; o7 F' `. k9 x1 m$ n1 W4 n
endmodule 9 Y2 Y. G+ S' I/ l$ M s
5 O6 c7 G4 i; p4 N* p- ^
//1bit_adder
~: a2 V( x7 @& H6 G- E# p( E( Nmodule adder_1bit(Cin,A,B,S,Cout);
, O+ [/ h$ q% a4 @7 Z$ Q1 O) ]! ninput Cin;
. R2 ]/ P! K& H0 Minput A,B;; B" h5 o" z0 C/ a1 E x7 G8 t- j
output S;" z$ E5 {9 x, {) y) X$ D8 l+ Z7 X h
output Cout;
5 {" n8 m% M+ ?: x: \0 N: kassign S=A^B^Cin;1 K ]. w0 X1 g% L
assign Cout=(A&B)|(A&Cin)|(Cin&B);
! S2 S$ r% i& ^- Hendmodule% Q8 y! d$ |5 w" N
3 s8 M, ?# {- t3、实验结果: |+ D. d- b! I9 Y) W* T" x4 i
/ Q1 b7 c8 C7 B% M; @$ y乘积的低四位
9 z, x5 U! N, C7 O' h4 ] b/ C+ D a1 g1 k9 a: c6 g% \) T
乘积的高四位
# F4 B) B1 D5 w2 I |
|