找回密码
 注册
关于网站域名变更的通知
查看: 240|回复: 1
打印 上一主题 下一主题

转——ZRtech Altera CycloneIV FPGA开发板——4位数的乘法运算

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-25 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 03:02 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表