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

基于FPGA的一位十进制计算器的verilog代码修改???

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

下面是我下载的代码,采用FPGA的4*4键盘输入 。 我的板子是24M时钟,所以输入clk应该是24M吗?但是我仿真的时候col输出没有达到扫描的效果,不知道为什么?而且我想共阳极用四位数码管动态显示或者两位静态数码管显示,应该怎么改呢?大一生刚接触verilog,不是太懂,而且急用,望指教!谢谢!
# J" e5 H1 |4 omodule jisuanqi(clk, reset,row, col, seg_com, seg_data);2 Y" t, C# Z! h3 \8 S  p
input clk;
& j' R8 L' A# p  `0 V6 ^input reset;
5 A, K  n, _% ninput [3:0] row;
0 a! F5 J9 Y1 H: youtput [3:0] col;
# @* G/ r' a% boutput [7:0] seg_data;$ p: q( A; @: C# r+ \1 {
output [7:0] seg_com;

reg [7:0]outdata;
! j1 b( H" ^% B# \: Q1 k2 l; Y. greg [7:0]datain[7:0];
" y: ]+ c" ]6 U2 wreg [7:0]seg_com;3 C5 r$ ~! `& Z* t1 R/ P+ F
reg [7:0]seg_data;
5 U3 }. l: b; a( ^. P( A# Kreg [7:0]bcd_led;

reg [31:0] count1;

reg CLK_DIV;& M% [6 \( o, m. w3 e% G
reg [31:0]DCLK_DIV;
: v! q/ F/ N; ]# lreg [7:0]key_temp;

reg [3:0] col;
; v: |7 b! a4 g4 k1 Creg [3:0] data; //按键值编码+ D. P# N( [( z: y" m
reg [5:0] count;//delay_20ms. _& {$ P* S- G. i$ q; O6 D
reg [2:0] state; //
9 L  y  _! Y0 @6 ]reg key_flag; //
# C3 G& M7 U0 d) C" S) n( Areg clk_500khz; //500KH" |& n6 _/ V, Q0 @, c
reg [3:0] col_reg; //
! ^( {( e8 A$ p8 `! h) ^; Hreg [3:0] row_reg; //

reg [7:0] buff,temp,mid;) |/ Y0 S8 i+ O0 A
reg [3:0] num1,num2;. U9 C2 J8 b( X  x' V/ u
reg [3:0] res;
) K7 J# o0 h* h5 N& n1 F; ?% yreg [3:0] op,buff_reg;
+ ]. y. p: h& k3 @" q% A" s5 Preg [3:0] btemp;# a7 `4 Q! V, {- `; E% u0 b7 v
reg flag_neg,eoc;
$ {5 F  L& u  Q2 aparameter add=4'b1010,sub=4'b1011,mult=4'b1100,div=4'b1101;& h" [# F! U+ ]9 P4 y3 ~5 v% l/ f
integer i;

always @(posedge clk or negedge reset)0 J$ W, P2 d, e( I8 A5 h8 [
if(!reset) begin clk_500khz<=0; count<=0; end
4 Z* T- _8 I$ D7 ^4 W  }else
' `+ E5 o$ |- @2 k: W3 d9 mbegin
4 M1 l4 S% h) k: V; aif(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end
3 C/ |8 _- j, E) r% q# Yelse count<=count+1;
) I( k" w) _9 |# |end
3 h2 T& i/ a$ f/ r; t/ V2 j% g4 Valways @(posedge clk_500khz or negedge reset)# `' N/ T; Y8 G% V" d* w/ ~
if(!reset) begin col<=4'b0000;state<=0;end  W( x7 C/ }! @- w
else 3 y# a0 r# o6 R
begin . C$ R* w! N( o' ]
case (state)
" W: }# J  z$ h: o! d: H# X, @0:
& w2 E8 M) D& hbegin5 W8 W, m! [: o# g1 y- f
col[3:0]<=4'b0000;
+ W6 R. Q  L* Q" Y5 Nkey_flag<=1'b0;; Z8 ]3 A% V. S
if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //
- c) _* S# q$ n' [: gelse state<=0;
& ~$ ^% I  E) z+ M8 `0 Oend
% A; F+ Z8 G% o7 ^6 a1: . H2 u+ Z: b. L2 e  f, e5 A: p' H
begin2 z8 H: o- V9 l1 S) I
if(row[3:0]!=4'b1111) begin state<=5;end   j8 A7 z1 O% n
else begin state<=2;col[3:0]<=4'b1101;end " w- Q- J: l- ~: x/ Y% I
end , n- l2 V1 g" W" J6 S6 V9 @
2:
; y, d' H6 F( l& s1 X% x/ Zbegin
2 L# ]: [. ]  j; F* I. gif(row[3:0]!=4'b1111) begin state<=5;end //
# u7 ?* {3 u% i! ]2 w1 c, i0 ^else begin state<=3;col[3:0]<=4'b1011;end //
2 @6 v+ M0 b& _  uend
+ \( ~$ `: ]" \% g" R3:
8 a* h/ c8 S# g) F& obegin
) }( q" Y) ^% A9 m" Oif(row[3:0]!=4'b1111) begin state<=5;end //
; y2 N' Y8 ?- P7 u7 p) ]$ Velse begin state<=4;col[3:0]<=4'b0111;end //% P, m7 `  l/ ]- U( I" \6 {# n
end
0 \$ l% _- C9 t; x* f, W: e3 Z4:
: ]- M9 [- q. r( l) z) y9 tbegin 3 U9 I. B* A4 u! }
if(row[3:0]!=4'b1111) begin state<=5;end //% U) h5 U( x  w) c4 Q
else state<=0;
# e  _  ~6 c+ a6 N# q; Oend
) V+ s! c- \  A# D! Q9 R/ }# i* B5:8 q% a5 `) E0 a: T* }. ?- H
begin
) L" h- v1 D4 ~+ fif(row[3:0]!=4'b1111)
, W7 E9 E! D' b1 T# r- D. y! Mbegin
% b: H: @1 l* G" D  wcol_reg<=col; //
+ s; V' `+ N/ S& H3 c% v, v, P' mrow_reg<=row; //$ Y: Q2 y7 Q( h/ J
state<=5;/ w0 D4 R; K  Z( D2 F1 W
key_flag<=1'b1; //" N9 G# P: C7 W
end 0 F9 A  h) t7 J4 L( G# w
else
# \- `* c# ~5 N  \3 d/ R' q- xbegin state<=0;end% y( y; [# [% N8 `
end * z( J; r- O% [& z3 }% K
endcase
, W# Z0 k) X- [- d( @0 s) E' Oend; D" t1 m3 B& t2 D& ^
6 r8 u" J- ?" u6 U* i
always @(clk_500khz or col_reg or row_reg)
0 f. e( s, J% b  {% kbegin
5 T6 O) K  y" G3 O! m& Aif(key_flag == 1'b1)
% z0 I5 ?5 u# ]& X8 r  x0 E/ C7 Y* |# Xbegin% C1 m, X; J, X$ ~
case ({row_reg,col_reg})
5 m7 \: h  i- m+ G7 I8'b1110_1110:data<=4'b0000;//0
1 V0 o) G9 r& h* A, y$ F8'b1110_1101:data<=4'b0001;//17 b" [+ s9 t8 X
8'b1110_1011:data<=4'b0010;//2- ]" g% j# B! b; y) n% t: I
8'b1110_0111:data<=4'b0011;//3

         8'b1101_1110:data<=4'b0100;//4         8'b1101_1101:data<=4'b0101;//5         8'b1101_1011:data<=4'b0110;//6         8'b1101_0111:data<=4'b0111;//7         8'b1011_1110:data<=4'b1000;//8         8'b1011_1101:data<=4'b1001;//9         8'b1011_1011:data<=4'b1010;//10 '+'         8'b1011_0111:data<=4'b1011;//11 '-'           8'b0111_1110:data<=4'b1100;//12 '*'         8'b0111_1101:data<=4'b1101;//13 '/'         8'b0111_1011:data<=4'b1110;//14 '='         8'b0111_0111:data<=4'b1111;//15fuwei        endcase     end

end

//caculator part

always@(posedge clk)
9 w+ Q* l8 W5 t3 I* d* jbegin. m, C- j: b! y9 M# A0 H5 B0 ^
if(data == 4'b1111)
9 B  g1 [* z4 F+ L! m- pbegin buff=0;op=0;eoc=0;num1=0;num2=0;temp=0;mid=0;end  D+ W) h$ ]4 c& ~# k" c, o
else begin
- H9 D% u  U+ Q3 y' |if(data!=4'b1110)
$ C- G5 }( _9 r7 C/ D. Sbegin  A/ g3 j5 \  |" |9 t
if((data>=4'b0000)&&(data<=4'b1001))! Q0 o5 v; a  w  k
begin buff={4'b0000,data};end$ ]8 k: u1 ?' ]! t1 r9 K; }
else if((data>=4'b1010)&&(data<=4'b1110)), B: g0 M4 ~& O* d) W5 l
begin op=data;num1=buff[3:0];end
. e, |5 u6 J+ b5 K& s; Vend( p, [" ^, f2 C1 w+ L+ B5 `
else- g; A0 q' n7 i! r9 H
begin7 m$ Q4 `0 N" S$ M9 v7 C: a
if(eoc==0); ]9 y4 K0 Y. |' E# C+ g6 o. [8 f" w0 p
begin5 M' s" u& U$ n! H/ I) V. M. ?
num2=buff[3:0];
0 u6 `6 _, I* }3 ]case(op)4 ?$ l: D2 Z; H
add:
9 e+ Z7 I/ _/ i- ~* N1 Jbegin
* {" a. v4 \% S; l) L+ f( G+ j' vbuff=num1+num2;, n5 d1 k0 L3 R
/*if(buff>8'b00001001)
4 w1 @' L/ k2 r3 bbegin. {' ~' z' C5 V/ z0 J
mid=buff;
% z. T& _) h5 T  i: j, n9 P0 _9 V( ftemp=8'b00000000;
5 |& E2 M2 O5 e! a+ h! Tfor(i=1;i<=7;i=i+1)1 X. m$ @$ }/ c3 @2 r5 I+ ~! y
begin8 h9 Q) l' a. ^& ~
{temp,mid}={temp[6:0],mid,1'b0};2 ~( ~- X& u1 J6 j
if(temp[3:0]>4'b0100)! \: }% g3 V1 S# c9 m, r" A1 A
begin temp[3:0]=temp[3:0]+4'b0011;end
: a# q4 E7 x6 l& \7 w9 f! P' x: dif(temp[7:4]>4'b0100)8 z+ M: r4 P) n# X
begin temp[7:4]=temp[7:4]+4'b0011;end! k0 u8 T4 A& I, o- ?% [1 Z2 c! e) V
{buff_reg,res}={temp[6:0],buff[0]};2 V( A3 }+ }( d
end
/ Q+ R% T7 _7 p, }3 Wbuff={buff_reg,res};( i7 ~- i% b+ w$ B, L; N
end*/
* [: p$ E6 K0 L. R1 Deoc=1;' o$ P0 V/ }" k, ?% b! ^  H3 I9 c% O
5 ~. s, P- m0 J
end //add end& r& ?6 [4 ]5 t) E* g
sub:5 m1 `% N2 X4 }4 E. }' T
begin
; e  y9 d) b( E. c( r/*if(num1>num2)1 t+ Q; c2 X0 x- E  s2 @, C
begin
4 [: t0 E( Z4 ]- gbuff_reg=num1+((~num2)+4'b0001);
, |$ ]' l- Y' _4 m- @; P( Tbuff={4'b0000,buff_reg};
& F0 y0 s  C. w. g' {" f# qflag_neg=1'b0;5 p' l( o0 i# Y3 W* A3 t7 p
end$ A5 R. t% i. F
else
1 K5 q! y' ]. [' f6 U. d3 K/ N5 Hbegin
# L  y1 o! ~% G% U* z* l& |4 Lbuff_reg=num2+((~num1)+4'b0001);
! r3 L9 @5 x2 r! ^( ubuff={4'b0000,buff_reg};
2 `; |/ A( \1 X' H  u; ~flag_neg=1'b1;
3 Z* m' z' f  V* @3 X) b9 \end
  ^0 y+ }% A; y5 M1 D1 {4 G8 aif(flag_neg==1)
2 t- u0 L9 N( X% d4 d4 o" p) `) Abuff[7:4]=4'b1111;*// @2 L, W* F6 Z& B: }
buff=num1-num2;/ J* m0 G" s* x+ u# N! L( ^) O
flag_neg=1'b0;4 g0 T5 g+ W8 Q$ W& C. n* q0 B
if(buff>200)
$ }+ U% f' _' ^. k& Bbegin2 O9 b3 q4 q" f- |  T
buff=256-buff;
* {) b9 w9 P! D, T$ Q6 F//buff[7:4]=4'b1111;
8 i. y, G, ?3 M6 r- Z1 j# m7 Oflag_neg=1'b1;) p1 s  j% Y* \1 \; ^2 e
end
1 L2 {% B$ c  ~; K3 x' g& q( Y5 r' e' [* H3 _1 u' z/ p
eoc=1;! k% |2 \. E  z" D2 X
0 f$ p  Q: A' Q6 B
end

            mult:            begin            buff=num1*num2;            eoc=1;            end            div:            begin                if(num2==4'b0000) buff=0;                else                 begin                buff_reg=num1;                res=0;                for(i=0;i<9;i=i+1)                    begin                    if(buff_reg>=num2)                        begin                        res=res+1;                        buff_reg=buff_reg-num2;                        end                    else                        buff={buff_reg,res};                    end                eoc=1;                end            end            endcase                     end     end     end

end

parameter CLK_FREQ = 'D50_000_000;//50MHZ+ }$ d  F& Z& w. D8 f1 u. D
parameter DCLK_FREQ = 'D10;//AD_CLK 10/2HZ

always @(posedge clk)5 r$ x$ d! N! C1 m8 L, Q
if(DCLK_DIV < (CLK_FREQ / DCLK_FREQ)) // CLK_FREQ/DCLK_FREQ=5_000_000
9 H/ r9 h% {; J6 v7 }DCLK_DIV <= DCLK_DIV+1'b1; // 10Hz
- Q9 |; m8 G+ i! ^else
$ F3 F- c3 }: x8 R* B7 g# |% Xbegin % V' t  q; g4 G  m4 F
DCLK_DIV <= 0;# P! `# C" Z# X8 N
CLK_DIV <= ~CLK_DIV; //5Hz
0 \, D+ F: b! u4 F* |  Wend

//display part
; P5 X2 h1 M0 T/ @! yalways @(negedge reset or negedge CLK_DIV )6 j7 `& p$ b5 Q$ ]( `: N# [
begin
. s: E. V8 p0 w* m9 _key_temp <= buff; # I/ ^% K; {- T( k4 l4 @% w, O
if(!reset)
% Q) t1 x& a6 y7 K* Abegin
8 X$ K  y. d) Y2 Z4 `& vdatain[0]<=8'b00000000;
: X! {& c5 y. \/ B, Ydatain[1]<=8'b00000000;: `& g* b; f. {1 S; r2 }
datain[2]<=8'b00000000;6 r2 x0 x7 `/ O) s& R7 P, B( ?; x
datain[3]<=8'b00000000;* Y  G) ], [& I% t6 o6 K4 Q
datain[4]<=8'b00000000;2 V7 o5 v+ m! `0 B+ ]- b1 _
datain[5]<=8'b00000000;2 v7 K( W) @+ A+ q
datain[6]<=8'b00000000;
+ m3 p# G6 U2 o  `datain[7]<=8'b00000000;2 D( C7 _, G( x
end
/ z# g+ y1 z3 J5 Celse
8 C- X' o7 L$ n$ P1 s+ p7 p* r- e6 jbegin. Z0 x: A( d+ O5 U8 h. Q1 r" t# N
datain[0]<=key_temp%10;& _2 L# E' C" d0 z0 h9 P
datain[1]<=key_temp/10%10;$ j* ^" q2 l: l" v: K/ f
datain[2]<=key_temp/100%10;0 Y# @' u9 E  m! p
datain[3]<=key_temp/1000%10;

     end

end

always @(posedge clk)
! K' |0 E" S6 Y7 }: e% C$ obegin
% J0 l; H; s! Q: S# l4 icount1=count1+1; //32bit
9 m. k8 @, ]( V  ^# E5 B. K' c* Kend

always @(count1[14:12]) //scan LED *8, 50M/2^12=12k
1 o0 z, f! c4 s, F/ ?9 a' t, s, ]begin
# C1 |/ f- P) S. Bcase(count1[14:12])' ~+ T  m; p+ Z8 m
3'b000: begin; n" p# \# U/ \3 x9 \/ V# f+ n
bcd_led = datain[0];- ~  @9 I& ?  W* I* u
seg_com = 8'b00000001;
9 t: L" t; B* `5 |& v: @end
: p) n: X/ E3 w" H; u+ t3'b001: begin5 s& ]( V) Y: h' O$ f9 b
bcd_led=datain[1];: m" y; b( }; Z4 c
seg_com=8'b00000010;& F. V9 O8 |: y* \6 t( k
end: X7 j0 g) _8 a$ D% t" |* m
3'b010: begin5 }. W) Q% m6 e! E; Q2 }! K2 g
bcd_led=datain[2];
$ p" ~+ S+ q( n  e, v5 i* Oseg_com=8'b00000100;
3 }3 T$ k* ]1 _end
' g$ f6 ]* [' P! N3'b011: begin9 P7 c. @. L* R% M( H
bcd_led=datain[3];
$ Z% a  B, P" e! dseg_com=8'b00001000;
1 D. T1 m5 V- |  H0 x/ J8 h- Wend
1 S( E& o  l6 p1 D" p" i3'b100: begin0 \4 L% o4 A% H' i0 d9 d
bcd_led=datain[4];
' |, l/ ~9 `% X, {: R- @# |seg_com=8'b00010000;
) ], t. A. k4 n. Aend+ c' z3 J6 {7 G; ^/ Q/ \
3'b101: begin
# S3 C) S2 G, z- z3 Z; l- rbcd_led=datain[5];
1 }6 I0 Q' J  H! h6 {seg_com=8'b00100000;9 Q7 W3 b5 X0 u3 n& H1 ^
end
; q$ Y* I1 l: d8 N3'b110: begin
# Y8 I/ U% A8 y1 u4 l; ]bcd_led=datain[6];
. R( ^% o7 z0 Useg_com=8'b01000000;
2 b; C/ ]: ?6 C* mend4 K- b! \! m! _5 {
3'b111: begin
, b" e% `6 B: ^" obcd_led=datain[7];
7 M' M2 f. Y5 u9 l- v" `seg_com=8'b10000000;$ k: q" }5 L+ j! v
end
; }6 Q3 b" I: _& r9 y3 I4 h% xendcase& v7 L; U% w6 M* V8 D3 Z
end

always @(seg_com or bcd_led) //write code to LED
: B1 }5 M! Z1 `2 j" o# Jbegin
; A) ^3 ~/ Y1 |( |, acase(bcd_led[3:0]) //display 0,1,2,.....9
* Z9 G8 W0 `: d* h! A% m4'h0:seg_data=8'hc0; //hgfedcba = 1100_0000  k$ ~3 [! B1 C+ T
4'h1:seg_data=8'hf9; //hgfedcba = 1111_1001- e9 E+ Y: o8 b' e3 }1 f' m
4'h2:seg_data=8'ha4;. l' o4 {3 e6 T9 {9 {: u
4'h3:seg_data=8'hb0;
) T$ K3 X* `" s1 J' _; Z4'h4:seg_data=8'h99;% ~- P. j( r% \- M/ F7 e4 c+ _+ t
4'h5:seg_data=8'h92;) Y+ d6 _( }) f) V. o' [
4'h6:seg_data=8'h82;4 p; S; W4 Z, i+ A
4'h7:seg_data=8'hf8;. b% H6 _/ ?2 _6 V
4'h8:seg_data=8'h80;
* ?. K! {: y( }& W8 o' p8 M4'h9:seg_data=8'h90;$ |, ^$ T2 q1 h3 S
4'ha:seg_data=8'h88;
0 W- K5 E! c1 l' o8 b" m1 u4'hb:seg_data=8'h83;$ U! T2 c- a& g+ v5 ~& i/ y
4'hc:seg_data=8'hc6;
/ }1 {8 E- E1 u" V1 F$ q% Y9 \4'hd:seg_data=8'ha1;+ S( ]  Q2 P9 Z4 i6 `
4'he:seg_data=8'h86;0 e6 }4 ^9 u  Y8 f! \9 H
4'hf:seg_data=8'h8e;
. O8 n, k- o& J; Jendcase
& |; b" i. D; f8 f8 X
$ W. O) ^9 f' y# M4 z7 d: v" qend

endmodule


: F# e5 d2 I+ l* m- V; N

该用户从未签到

2#
发表于 2019-6-17 17:02 | 只看该作者
代码这么长真不太想看..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-4 18:49 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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