|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 sine_test
3 i7 @6 _" d) V* J: K, w7 B8 m6 q1 b' W8 x/ k+ [1 W% h
module sine_test(clock,key,select,data,seg,dig);( D' A9 T4 K3 L8 }7 v1 |! ?1 x
input clock; //系统时钟(48MHz)8 E- H. H3 z" R5 U" O
input[3:0] key; //按键输入(KEY1~KEY5)
% e; r/ ?0 N s+ r- Zoutput select; //发送数据使能" b2 `$ ~" o2 K c) F$ B' \
output[11:0]data; //要发送的数据* K+ s* v% l& T# c5 Y
output[7:0]seg; //数码管段码输出
$ J4 r( t; g9 o. s) Qoutput[7:0]dig; //数码管位码输出& U. A& J& J/ D
//I/O寄存器
" w+ o& J4 K( ?7 ]reg[11:0] data;
4 y# h6 s {# O- p- W2 ureg select;4 y' ^" P" Z# v S0 z
reg[7:0]seg; 7 I$ F" ^2 c; U" s, O4 d3 s
reg[7:0]dig;
5 q6 `: G+ z8 C5 ^; J" Z//内部寄存器$ K, A9 l# m9 X- \1 D% A$ ~
reg[16:0]count; //时钟分频计数器
7 P1 H5 q$ n- W, a/ w: a! Ereg[3:0]dout1,dout2,dout3; //消抖寄存器% F+ a" ]8 m2 H$ M0 a/ P3 a
reg[3:0]buff; //边沿检测寄存器7 E" C3 s# J- r! y. a, s' V
reg[1:0] cnt; //数码管扫描计数器 / e, r) ?+ X& B _( y( d
reg[3:0]disp_dat; //数码管扫描显存 # }4 S: z# s, c( M$ `9 a
reg div_clk; //分频时钟
& E, O& ` ]* v* Ewire[3:0] key_edge;( Q0 z: s+ T8 P! p+ ^- ]' \& v0 P
; ]( [* w( `8 I) z( Z$ @//时钟分频部分
$ r# s; w; ^- i3 Balways @(posedge clock)7 h/ j# y I4 F# @6 t6 \% _
begin
: B1 Y( i4 v1 O6 f& t- }+ s- |2 M if (count < 17'd120000)
: f- _/ N1 s* ~& J$ P I5 u* F begin) E! N7 Y, j; [" j+ e- Y
count <= count + 1'b1;7 c1 y; T+ _' |% ~* `) n
div_clk <= 1'b0;
/ x- }; ~6 Z2 v, n0 j end
# y/ \# f; q. l% B% K5 Y else0 X6 Y$ w k6 z/ b
begin8 ^- q0 E( H, m+ D! y3 i
count <= 17'd0;
2 O8 P' _: h4 r$ o$ h$ | div_clk <= 1'b1;7 Y8 S9 E' ]# x3 \6 Q
end
9 C3 U& ?0 z* v& ~2 vend6 f' A i8 D' g$ z* S1 n8 }2 }
# i& I" r' t2 c' f' O; d; x//按键消抖部分
* Q- w" _- J5 k; \always @(posedge clock). n8 |& R4 h5 E- C) y) d- T% y
begin
# w/ B5 D5 m( I if(div_clk)
2 x. w c( w3 I5 a# n( x. F begin
! F- x5 \! N4 B. @$ O# d+ d dout1 <= key;
4 l/ u# K" ~8 w9 d: K; Z) ?2 u5 L3 K dout2 <= dout1;% s6 H- p" H/ F( E: a; q
dout3 <= dout2;
% s5 {6 P; H1 v1 F; ^4 { R end
0 c9 q& i @; Y9 a. I3 Hend4 n! h; \% W0 o5 Z
* j& r6 U7 Z, J//按键边沿检测部分
* @$ @1 U, m3 y6 @ i7 nalways @(posedge clock)4 L0 j3 `/ b h- I; i2 r
begin3 {! o$ ^& `; d3 r% c2 U! X
buff <= dout1 | dout2 | dout3;: ]/ t8 n, ?7 B% l& M$ u1 l
end+ A! [& E. S7 ^$ V; q$ c
5 M* f2 F5 l, B4 dassign key_edge = ~(dout1 | dout2 | dout3) & buff;
. P# v$ p* [6 ~0 R. o7 b
$ E- Q3 W- A, r! D B$ C! N
& v/ @" e8 a6 A* [* Z, d4 ~; Ralways @(posedge clock) //按键1
. U1 h- z# {3 X- K: u, ubegin& d! |$ M+ E, [) H
if(key_edge[0]) //下降沿检测7 f- V# T0 o% l* U3 {* ]' L. `
data[11:8] <= data[11:8] + 1'b1;
# G. a3 m% K3 d* m, kend
$ {3 Z. \' q- ^( l% }# c
9 ?# O% F+ f" _8 l8 [9 i! g, kalways @(posedge clock) //按键2
0 T9 j7 f0 s, d+ z' v+ Lbegin
$ h3 j9 ] B# _ if(key_edge[1]) //下降沿检测2 K! \1 U3 i. x
data[7:4] <= data[7:4] + 1'b1;
/ U: t) V; ^& Z9 O8 zend6 \6 G8 @- n. B* s5 P
) z- ~1 ]& H k# B
always @(posedge clock) //按键3( b0 i. h4 Y: E6 ?2 ?# C. L& x
begin
- K/ |1 o8 m8 e if(key_edge[2]) //下降沿检测
4 ~- T# ?' c5 }# N& N7 U data[3:0] <= data[3:0] + 1'b1;
: g0 b1 D* O* y0 I5 D; k1 H/ dend
& {9 q+ N5 i" D' l' E+ a1 p7 b4 q) o4 R; n& |) D
always @(posedge clock) //按键4
, a$ f: s/ ^, f) K# j2 q+ fbegin% G' K7 W. u- H5 Y+ b7 c
if(key_edge[3]) //下降沿检测
+ S0 y* T! }9 B2 m3 u% f select <= ~select;! Z# Q, j1 R1 Z& ~$ r$ | @
end
5 ] s: P/ v Z6 ~) o, x( _" e/ X
% }- p+ b! \, k6 _4 f, w9 F
0 e$ l1 ]0 e' E9 \; ^& |//数码管扫描显示部分
+ N |$ @! D) p9 B; g8 |) D! xalways @(posedge clock) //定义上升沿触发进程5 Z/ l% u8 ]4 O" T+ U: _
begin( N2 A" R3 Q+ x4 `$ R a
if(div_clk)# J" C/ k# S; e$ @/ v2 b' ]
cnt <= cnt + 1'b1;4 _* G/ U7 l3 A8 q# O
end
3 |: P L4 _" u U9 @; l( d2 c' {1 i' h% y4 c
always @(posedge clock) M. @ J M4 r/ `3 t5 N3 P' J
begin
/ [& H$ b9 X- s$ R/ r2 V3 N if(div_clk)
6 ~6 X+ O) T# C* U' E5 e begin6 a; Q: n$ x4 E: R4 e% ?: J
case(cnt) //选择扫描显示数据* n# Z5 ?0 y6 w2 M9 V- k
2'd0:disp_dat = data[11:8]; //第一个数码管
" `( M" o* y. _ 2'd1:disp_dat = data[7:4]; //第二个数码管
$ m/ M+ |. M2 h0 f3 `+ X 2'd2:disp_dat = data[3:0]; //第三个数码管
' ?; v; M/ D! t4 L 2'd3:disp_dat = {3'b0,select}; //第八个数码管3 l$ w% x& o) j
endcase* S" F M1 z' d1 t: n! o2 S9 T
case(cnt) //选择数码管显示位
4 d6 A2 i# l/ B. `. e 2'd0:dig = 8'b01111111; //选择第一个数码管显示! @ U8 Z7 [5 l- C5 s& }
2'd1:dig = 8'b10111111; //选择第二个数码管显示
! F" G3 F. r$ `3 ~$ p 2'd2:dig = 8'b11011111; //选择第三个数码管显示
$ X. M* T G& L 2'd3:dig = 8'b11111110; //选择第八个数码管显示
+ z) b( `' ?. |5 o) C endcase
) i& w1 o9 V! ^- @5 y1 A4 h0 h end
9 a# M: L( x/ k1 M, F6 d' ^end6 z# W5 R3 }- w i
; Z' x7 y# G" H `
always @(disp_dat)
; M/ ]6 |1 Y2 H6 y1 Sbegin# i' A- ?# f1 \
case(disp_dat) //七段译码
7 k) Y3 `8 [6 G% E1 Y& O3 ^- ] 4'h0:seg = 8'hc0; //显示0
. F- Z6 Z5 d% H* G6 q2 S1 O4 v9 t3 F- i 4'h1:seg = 8'hf9; //显示14 B* z: ]% ^9 ^$ p# s' V
4'h2:seg = 8'ha4; //显示2
4 q/ f. n; O& X: y; D0 n* Y1 q4 \6 Y 4'h3:seg = 8'hb0; //显示3
" g# n4 d* [ Q/ n. j 4'h4:seg = 8'h99; //显示4
6 N J' }2 A5 _' N5 o, z4 r: [! i. U 4'h5:seg = 8'h92; //显示5
( |0 C2 B9 c- g- ?" J- [ 4'h6:seg = 8'h82; //显示64 w3 y0 [/ w$ r: `4 u
4'h7:seg = 8'hf8; //显示7
2 \2 u! g6 _" L( z8 i 4'h8:seg = 8'h80; //显示8
z& M+ e( p7 u" w 4'h9:seg = 8'h90; //显示9
{: V" b+ @9 Q* ]- e 4'ha:seg = 8'h88; //显示a1 C9 t7 i/ x1 k' d# Y0 r
4'hb:seg = 8'h83; //显示b
9 I& D# T4 u- |7 ^ v 4'hc:seg = 8'hc6; //显示c
6 q8 z5 Y1 \7 e$ b! g! j; n9 E 4'hd:seg = 8'ha1; //显示d
/ O' S5 ^' @. D' _ 4'he:seg = 8'h86; //显示e' _* F8 f- l" @& n! K
4'hf:seg = 8'h8e; //显示f/ H" R& ]+ D( q2 e6 e/ J
endcase7 k3 E# V+ X0 P# O# n
end8 g& z i4 |, k
, c$ Z' y& P+ A, P/ N
endmodule
: e8 h2 L/ ^* ]" Z) u; \4 ?/ h |
|