|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——ZRtech Altera CycloneIV FPGA开发板——4位数的乘法运算 # _; [6 `. C3 Y; Q2 P7 G
1、新建工程
: G& Z2 _% R4 l# v7 t" H' S" i& z8 A
2、本实验实现的功能是:4位数的乘法运算,对于运算结果,成绩的低四位数显示在左数第四个数码管上,高四位显示在左数第三个数码管上。由于本实验中两个乘数分别为1011和0111,所以乘积就为:01001101,所以左数第四个数码管上显示d,左数第三个数码管上显示4,由于数码管段选的复用,所以数码管以1s的间隔交替显示。乘法器如下:该图中,对乘法器中的各个加法器进行了编号处理。% D; @' y( r# P
" }5 u6 N* |* b2 i
程序如下:
' g! ^0 N) `: z Z4 Z7 q4 V1 hmodule 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);
& n$ I. Q8 ]6 B& W; h. e
% f2 x% b( V& ~input clk;
3 F2 T: F4 {5 c+ u4 \6 S# i9 kinput Key4,Key3,Key2,Key1;
2 A( Y; i9 N9 i% q; w- M# `6 Moutput wire DS_EN4,DS_EN3,DS_EN2,DS_EN1;
7 i' v7 G0 ]$ X0 V8 j. b9 c# zoutput wire DS_A,DS_B,DS_C,DS_D,DS_E,DS_F,DS_G,DS_DP;
% a) M0 r& ~2 e+ T
2 [3 ^$ e0 S8 T8 Uwire [3:0]Key;1 [, w- H. q8 s' t8 b2 m- h
wire [3:0]wei;2 J; \# h& [0 L3 ~: g
wire [7:0]duan;7 A+ g/ h# \* Q w9 q2 O
reg [3:0]wei_r;$ \1 P X4 c! S) j
reg [7:0]duan_r;
# g; B! B" R# ~& g& @ Hwire Cout1,Cout2,Cout3,Cout4,Cout5,Cout6,Cout7,Cout8,Cout9,Cout10,Cout11,Cout12;//图中各加法器的进位6 C: n* R, Z* M$ U5 Y; b8 y6 @! o( {
wire Sout1,Sout2,Sout3,Sout4,Sout5,Sout6,Sout7,Sout8,Sout9,Sout10,Sout11,Sout12;//图中各加法器的和" \' G! }5 a" P% U3 P& Y
wire [7:0]P;
# e e8 x# ~1 \- swire clk_1k,clk_1s;
+ A; _( ]( o/ p7 z. p
! a# ^6 x- X$ ?9 }* x% Cparameter B=4'b1011,
9 D" G0 ]9 g$ B# d; l$ }$ u# p A=4'b0111;
' V) Z+ r6 q/ c3 e" ?! l
3 w" V: C- b& C9 bassign Key={Key4,Key1,Key2,Key3};
$ L; c3 w' s# e2 [2 E5 Dassign {DS_EN1,DS_EN2,DS_EN3,DS_EN4}=wei;//低电平选中对应数码管
4 d4 w; w" A4 M* D9 a; M6 Wassign {DS_DP,DS_G,DS_F,DS_E,DS_D,DS_C,DS_B,DS_A}=duan; //数码管共阴极
; b) y: p- ^8 X3 W8 h7 e" z8 p2 y
fp_k fp_1k(clk,clk_1k);8 j3 |0 o$ E3 t# p8 P
fp_s fp_1s(clk_1k,clk_1s);- @$ W# Q: h" Y; V; M
, R7 w$ z: @, A5 b( e; H. C2 Y Z; @
//乘法器) z' ]. P* c) S9 r5 P! B
assign P[0]=A[0]&B[0]; //P0 d8 B& \) L1 B. y# \
adder_1bit add1(0,(A[1]&B[0]),(A[0]&B[1]),P[1],Cout1); //P1
2 ]! I* C# I$ F. I, ?adder_1bit add2(Cout1,(A[2]&B[0]),(A[1]&B[1]),Sout2,Cout2); //P22 M$ h: J/ o9 [( e$ s7 M
adder_1bit add3(0,Sout2,(A[0]&B[2]),P[2],Cout3); //P2
7 q$ G' r+ L' g( q( N8 nadder_1bit add4(Cout2,(A[3]&B[0]),(A[2]&B[1]),Sout4,Cout4); //P38 S; q" u- J) D/ i$ l1 {7 o1 C3 {
adder_1bit add5(Cout3,Sout4,(A[1]&B[2]),Sout5,Cout5); //P3
# \ l# V% F1 f+ \ v A' Aadder_1bit add6(0,Sout5,(A[0]&B[3]),P[3],Cout6); //P3+ R4 B; L2 X! ^! W7 _
adder_1bit add7(Cout4,Cin,(A[3]&B[1]),Sout7,Cout7); //P4
8 c; Z' L1 h9 r% X, ^adder_1bit add8(Cout5,Sout7,(A[2]&B[2]),Sout8,Cout8); //P4$ ^' w' x T& o9 X6 x$ x
adder_1bit add9(Cout6,Sout8,(A[1]&B[3]),P[4],Cout9); //P4
) V- F' s$ K( ^/ a* k5 ]& tadder_1bit add10(Cout8,Cout7,(A[3]&B[2]),Sout10,Cout10); //P5
' G. t( w2 \+ E* E5 iadder_1bit add11(Cout9,Sout10,(A[2]&B[3]),P[5],Cout11); //P5
5 c6 i4 v, S# Iadder_1bit add12(Cout11,Cout10,(A[3]&B[3]),P[6],Cout12); //P6
" {2 T1 B; {4 z! j7 N9 iassign P[7]=Cout12; //P7
& ^8 g6 ~+ ]9 C6 L1 R' {+ W" x8 ^# j3 V- w
initial
$ q( S( G" x4 W, ibegin
0 b2 v- j! j$ r$ N# d4 c0 d( J* F //Key<=4'b1111;9 E' X* r. Z3 D* d. F1 C) h
wei_r<=4'b1111;' y4 Q. C8 _' I4 E+ D
end
1 }/ |9 L7 M# H& b0 o* S
- z: a( ^* D& o* x7 {$ oalways @(posedge clk_1s)3 y# S7 h: f; @( r
begin& l+ Y1 t% z1 M5 N: i: H: x$ a
//if(Key==4'b1110)//按下最右边的那个个按键时,进行复位操作8 [1 t- z; o1 L! M2 }
//begin
! b' D( n1 f: E! M //wei_r<=4'b1111;3 V- I2 H$ V: M6 \( Y( r
//end* j! B1 k# E: R2 D( y9 ]
if(wei_r==4'b1111)9 v* g) Y" i9 z; u& F% H! e# Y
begin' _; D1 L% E% Z* o& H6 D! t( B8 c
wei_r<=4'b1110; //左数第四个数码管亮- q5 d; g/ N6 a# g
end z6 T$ M! Q$ i5 L% x& f
else if(wei_r==4'b1110)
5 \$ E2 h( D8 a* N! Y! b begin# V2 T; C. d# s5 n1 G4 M
wei_r<=4'b1101; //左数第三个数码管亮) }1 T% x7 g3 ~3 {( S
end/ S) _4 T7 i; J/ [7 \' k
else if(wei_r==4'b1101)# P; T8 Y3 p1 }- P0 t
begin
: {$ g: L3 t5 S" J wei_r<=4'b1110; //左数第四个数码管亮& S, z9 H3 l$ A; M' Z
end; b$ h- b( w b* m) q$ {
end, A& t8 L0 e- z/ g7 Y( b+ L( r
9 b6 J/ ~8 o4 J. xalways @(clk_1k)
5 q1 L7 n* X( {( d5 i) ?; `begin! Q; q' [ A, q3 _ X' o4 P1 a+ g
if(wei_r==4'b1110) //左数第四个数码管亮,并且显示乘积数的低四位 e: Q# a# a _' k: F
begin8 o2 l# [, P! Q) ]2 H; H
case(P[3:0]) w- D5 x' a0 n, O
4'b0000: duan_r=7'b00111111;& ~' i2 D9 p# }! J( h7 r
4'b0001: duan_r=7'b00000110;/ H- ?4 L- S9 u% H7 a( _8 Y, D$ }
4'b0010: duan_r=7'b01011011;
5 _: {+ M, e2 Z0 f/ R! u- k9 }4 X 4'b0011: duan_r=7'b01001111;) i8 q; S% ]5 X/ I! d5 z9 ~% M) N
4'b0100: duan_r=7'b01100110;
/ S% O" ^4 t! ]5 }. X1 c 4'b0101: duan_r=7'b01101101;
( e" N( w( k& T7 N$ w 4'b0110: duan_r=7'b01111101;
" f' c6 G# t% s' Y# l 4'b0111: duan_r=7'b00000111;2 i# {' i9 B: c# a
4'b1000: duan_r=7'b01111111;
' p/ _" \( N' X. n& P2 Q; Q 4'b1001: duan_r=7'b01101111;) h0 }7 x/ [. L" y) a
4'b1010: duan_r=7'b01110111;
# z9 f% i" a3 v' H. C 4'b1011: duan_r=7'b01111100;( |2 B" n( x Z
4'b1100: duan_r=7'b00111001;
3 z( Z2 Y; E4 S8 T/ [6 E" q' t- o7 F, F 4'b1101: duan_r=7'b01011110;
6 w0 U# T# L; t, X, F" s! c% J 4'b1110: duan_r=7'b01111001;
% [9 ^& Y# c% |+ ]- ^( }: I 4'b1111: duan_r=7'b01110001;
5 a9 b% B' e) H6 \ default: duan_r=7'b00000000;& f' A" Y9 A; t/ k; P; k: G: F% [
endcase
. A! n+ G$ s3 F end9 K7 p9 c M4 _) }# H# ?* M& n- G' c
else if(wei_r==4'b1101) //左数第三个数码管亮,并且显示乘积数的高四位
0 q/ ]; [- w4 \$ e begin
# [4 m: ]! _; Q4 v" } case(P[7:4])& U/ o! D7 D; u- [; Q( s
4'b0000: duan_r=7'b00111111;
# I4 _8 c7 Z- m5 J, E0 r& f 4'b0001: duan_r=7'b00000110;
, g2 y% i9 u1 I9 A, [ 4'b0010: duan_r=7'b01011011;
L2 ~1 ^. K8 } 4'b0011: duan_r=7'b01001111;. r* k0 o- P1 B' S# v
4'b0100: duan_r=7'b01100110;+ A. X: c% A7 B1 E! d
4'b0101: duan_r=7'b01101101;
+ j/ k5 v, A6 q 4'b0110: duan_r=7'b01111101;
# e1 V( e# s; E! @ s+ n. D1 v8 g 4'b0111: duan_r=7'b00000111;
; z2 v4 { B1 r2 @4 b 4'b1000: duan_r=7'b01111111;5 Q& C: I8 h" _, Y4 `) l
4'b1001: duan_r=7'b01101111;
8 K, F7 }) Z- Y5 j 4'b1010: duan_r=7'b01110111;8 f [% i A! A8 L! t
4'b1011: duan_r=7'b01111100;
7 s5 o# o# p! t6 u 4'b1100: duan_r=7'b00111001;
0 [2 v* h& J: J% H" ~ 4'b1101: duan_r=7'b01011110;
! S, j& P( P1 i: w' e! R( _ 4'b1110: duan_r=7'b01111001;
* u( ^& V8 c8 S2 f* ? 4'b1111: duan_r=7'b01110001;
; `+ B, @: `4 W. o6 O8 v default: duan_r=7'b00000000;
6 e: n. H% Q9 [ endcase
j9 Y% e1 C2 B- W, b- i4 u1 l end
2 f9 ~: P! H/ C5 \- vend
# I1 a7 p# Z+ Z+ K& u w9 v9 x+ c) t* t8 h4 j0 o
assign wei=wei_r;
* {# ^: \2 Z+ G/ ?7 }9 x; i. Eassign duan=duan_r;! j$ y4 s3 M% F5 h! n
endmodule
; R% B6 w: X5 |) W
) V$ ] h) g$ ?2 s, q4 o& B//分频48M-----1k/ w2 R3 g4 f% S p% x! v
module fp_k(clk,clk_1k);
0 }% Z( L, l0 ?8 i/ w& Y0 y( u, Dinput clk;
2 O% ~% U" |7 M( routput reg clk_1k;( [. X: }6 {7 w- J: m& W
reg [31:0]cout;' ] p. \) S# ?( t0 t$ l7 t
//reg clk_en;
7 r5 Y: ] t+ Z- { }8 u: ainitial
) t- L, s0 P- A z8 kbegin8 y; k8 ?$ [( `6 h
cout<=32'd0;( W' @. ~1 ~3 ?$ s' H7 y f
clk_1k<=1'd0; Q( o: V& G: m) B
end% A r, Y7 ^8 k
always @(posedge clk); }+ ~7 i4 k: @
begin. |2 ~3 G8 V" x* j) j& H$ b. q% |
if(cout==32'd24000)* o3 z6 U& b6 R3 S
begin
( ^0 _/ T7 h6 l. _ cout<=32'd0;
6 s9 H' D1 X9 T8 A5 m8 M clk_1k<=~clk_1k;
0 y @! W& @& Z' F; }0 U$ I1 M end& n) T7 g4 N5 X! }
else7 b9 C9 a. l- I& @
begin
- E8 i8 c7 A8 Y! {0 {$ N9 V cout<=cout+1;
& t! K/ B7 \6 d k- O* d5 U: V end) G6 R2 P* \+ |& \) {: O$ _
//clk_1s<=clk_en;
, }$ P; N( a$ P Y7 T' [- mend4 s8 \, j( w( d" D. | \ N! X/ g9 q9 _
/ j% C S( |7 D" ^5 Q7 v
endmodule
, t3 Z' N% g% P2 Y$ S4 ?3 q, U//分频1k-----1s& u" P/ o1 s7 S! ]' a2 p% t% ?( w" G
module fp_s(clk_1k,clk_1s);
, g+ h. c! N( p- I8 D+ s! Finput clk_1k;' o. f3 C4 s R$ P" n
output reg clk_1s;% E& n7 D8 n2 x) g" [( y7 h0 z- I
reg [10:0]cout;
& V; M# U7 R x) j//reg clk_en;
% m9 U6 B; y8 q! Ninitial
, \! ~, y8 k! \# o8 jbegin/ O8 F- B7 V- U8 v
cout<=10'd0;1 Z" O, Q+ l4 Y2 i4 t: Z* v9 S
clk_1s<=1'd0; D, C3 P, p: i. S& ~, t
end
6 m5 O+ q( v2 I' M% _) Oalways @(posedge clk_1k)
( Q. ]0 Y( x6 T( x7 \begin
% l3 t* M0 p) u' s& ~ if(cout==10'd500)
# V1 M0 a% S) S- K begin# T3 I0 \3 p0 q! K+ {
cout<=10'd0;9 m) J7 p4 C# A
clk_1s<=~clk_1s; ^; @& Q. r4 D) X- C/ {8 } E
end2 a4 |$ d! c) k5 I; x
else5 K1 n8 ?3 I/ a3 I
begin
; G$ z, n+ W( {. `& `+ c/ H1 H3 [" {6 K cout<=cout+1; # ~8 M+ N1 {$ Z/ f
end' E3 p# D3 Q. z6 b# l$ ?
//clk_1s<=clk_en;5 d/ a/ K1 V! v! b$ C& A1 Q
end W0 _6 [/ b4 r
' e+ ^; F a, \0 V3 T5 x
endmodule
: a6 J k/ f# b* \9 J6 ?4 e
8 L7 N0 J, T7 E) R6 G; F//1bit_adder- L4 l& X) G/ j* H
module adder_1bit(Cin,A,B,S,Cout);/ A/ ?) d, T, l/ B
input Cin;; J- h" ^' E! ~
input A,B;' [3 `# l9 {# L6 }
output S;1 a' j9 L' a% O3 w3 G0 C: X5 ~) x/ k
output Cout;
- p$ \2 ?9 G2 ~4 u" Y* wassign S=A^B^Cin;
/ l8 l/ C! C' e5 w' Hassign Cout=(A&B)|(A&Cin)|(Cin&B);1 i8 F& j, ^8 j9 G$ G& P
endmodule2 }: G) j' m3 {2 r9 s2 w+ }
% \; s. O, f- M$ W4 Y" ?0 }! u3、实验结果7 ~! g2 e9 B9 X' q1 @" o; s5 Y/ c
$ K1 X. B3 _4 a+ n) m2 `+ {
乘积的低四位
3 M9 g7 W. c5 G, k5 V* L# H; }- k ' b' F) A, I) i) q9 w
乘积的高四位
' q; N2 \) K' ~: F% c7 W9 S |
|