|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 dds_test
' \; v3 A8 z# G4 i$ i) M
$ e+ L+ z- D! i* S* _/ nmodule dds_test(clock,key,fword,seg,dig);0 {: N" b* z6 A/ @- W' Z/ {' V
input clock; //系统时钟(48MHz)7 [9 R2 J b4 T g
input[7:0] key; //按键输入(KEY1~KEY5): d/ x- K9 O' k" T; u' O' X: B
output[31:0]fword; //要发送的数据
; @+ V- n# e* q. [output[7:0]seg; //数码管段码输出
5 e1 r. R- M# J& {& C, |* zoutput[7:0]dig; //数码管位码输出. E: ]4 j' l/ _/ A: `8 f8 }$ b. h" g- y
//I/O寄存器# M9 y: V8 z: `
reg[31:0]fword;
i( P x" N9 u9 oreg[7:0]seg; % S. `5 N+ d) p( O9 [+ ]) c
reg[7:0]dig;
0 d6 T1 S7 \6 m7 d//内部寄存器
6 R: S# b" W9 nreg[16:0]count; //时钟分频计数器
# g& _4 i' F+ T) Z" h) h- W) `reg[7:0]dout1,dout2,dout3; //消抖寄存器. e% J3 F" f( `, n/ W
reg[7:0]buff; //边沿检测寄存器/ p) D. u+ {% m( c( ]) }6 M4 O9 U
reg[2:0] cnt; //数码管扫描计数器 2 @% O f+ I1 A$ b- u' e: f& {# x
reg[3:0]disp_dat; //数码管扫描显存
8 Z: d' _1 K0 y% d# t Zreg div_clk; //分频时钟
" ]+ c6 t2 g3 {' Z# Awire[7:0] key_edge;
8 K( X, R& x8 w' f: j! z9 C& f) P* U+ Z9 n( @5 j
//时钟分频部分7 V8 q. H- g# d$ B3 v9 ^
always @(posedge clock)
6 d' ~9 W- h; F1 ybegin( k0 @9 {9 d4 p9 q! ?1 u& g
if (count < 17'd120000)
0 C" O/ d, ? u! B5 K( S begin) p& W }3 C# L3 r
count <= count + 1'b1;! p0 d/ Q% }* e- F4 W! h+ ^$ E$ I9 Z
div_clk <= 1'b0;& n( k, H2 h$ W7 L7 L
end1 |0 Q: Q0 h- ^3 [: H2 e
else
8 M- _3 _& G G/ v1 u& k begin
8 V+ o' `% ?. ^* R% _. Q8 v count <= 17'd0;8 u9 U3 F8 l f. J: d% Q0 Z8 [4 F
div_clk <= 1'b1;0 H) ^. z8 r, |& O
end
8 F' h% F1 M5 }8 K2 \/ {2 O! @end( [) d2 r1 o" h& G* b5 y) M
; Z$ `7 q4 ~+ k$ s. T
//按键消抖部分" y5 X- T. j% E! e* w: Z7 n9 \
always @(posedge clock)
# q) h6 w d+ E/ e, Y) bbegin3 {9 z `' `, @5 J# d4 u" G* B2 Y
if(div_clk)
+ v. d- \. V9 f. H% {* f4 f begin6 n& E/ m- ?# q/ A- M
dout1 <= key;
( k7 J8 w8 @4 i% y# u dout2 <= dout1;
8 c V% ]* k; Y) y$ w6 g dout3 <= dout2;; w/ c0 Y8 ~ N, Y9 d1 L! S7 e
end
$ _+ g; X0 P% [ l# W* send5 L2 R0 Z5 \2 Q' O0 D8 R. p
6 R; D* S `4 T+ j
//按键边沿检测部分# F) W2 f( ]/ ]" b" ]# |: X! _: j
always @(posedge clock)
5 G7 C2 p* C' I1 d/ n# R9 ~% Ebegin
; [+ \$ n3 S$ W/ l/ K6 ] buff <= dout1 | dout2 | dout3;, [) U$ O, a# K5 o
end
4 E* x+ K* s* s: [) o+ s. Z/ Z3 q( K2 i" h
assign key_edge = ~(dout1 | dout2 | dout3) & buff;
6 }4 e, W5 ]6 G5 r, a- l r2 D% P8 Z j) u$ t
2 X/ y' U2 O$ o9 z! ualways @(posedge clock) //按键1
8 v" Y8 J; v0 ?4 lbegin# Z7 v7 V4 W3 ~# O
if(key_edge[0]) //下降沿检测4 [/ j7 M Z \& F
fword[31:28] <= fword[31:28] + 1'b1;
: R4 x, n& b% {end( o: H' e0 J! `1 M9 o$ g
9 `8 W, t+ h1 m& H& P
always @(posedge clock) //按键2
" [6 a# _# ?- b/ t' bbegin
" ?! O2 Z; n' C3 H if(key_edge[1]) //下降沿检测0 \& z' T* S, K/ K
fword[27:24] <= fword[27:24] + 1'b1;# P; F/ y, P1 T* \' b0 @' G( Y
end5 _: z' J6 T* A5 O% d3 `. n" g3 Y3 D
" k, @' _0 a3 }: Aalways @(posedge clock) //按键3
; F) X3 C+ s0 k) F. i% [+ {begin% `$ j: c0 R( w7 u5 F: ~
if(key_edge[2]) //下降沿检测3 X) {1 X$ t: z; h& ?' ?
fword[23:20] <= fword[23:20] + 1'b1;
$ ]0 ]: d) h- L8 J send
; S, y8 ?9 |* c6 c+ g1 B) Z, m& c7 B7 ?. j; f' n2 D2 }
always @(posedge clock) //按键4
9 \3 D' ` ~* z' B! R obegin# X2 x9 F8 i& I, K j
if(key_edge[3]) //下降沿检测
: p# R+ d* Q% U; A6 I, {$ T fword[19:16] <= fword[19:16] + 1'b1;- ^# }) F1 b! R: _9 `% N2 o4 Y7 d
end# Y8 f8 y) o* A/ D8 @
* y* Z: u* L: z! @. Yalways @(posedge clock) //按键5
. }2 P+ {- T" w f- Y b/ Obegin0 b# j% p% U; _' H9 o0 O) r
if(key_edge[4]) //下降沿检测7 y/ g: E! R9 s
fword[15:12] <= fword[15:12] + 1'b1;1 w, ~7 y- F' u% P& _
end
" a; Z6 ^% Z% g# h8 |1 I( e9 g+ q* R2 b5 B: }$ k
always @(posedge clock) //按键6
: N/ Y2 G" ^7 q$ Z9 ]begin
3 V4 U! @$ G, h3 } if(key_edge[5]) //下降沿检测) j8 r9 Y+ c- H7 H
fword[11:8] <= fword[11:8] + 1'b1;: C4 E, J9 Z; b3 _9 m( k
end5 g `: E9 S' C
% `: M7 F* L' R, ]3 X
always @(posedge clock) //按键7( E4 J1 x: J0 L" h7 l8 K
begin K" }' T8 f4 i5 @; s
if(key_edge[6]) //下降沿检测4 I5 U# Q4 s% q0 n; S$ j/ U& ^
fword[7:4] <= fword[7:4] + 1'b1;
" y2 y- i- [1 }# Y( e; ]( wend
+ @+ P3 ]9 ?: u- g6 k- s+ x- h6 C
& w4 ~7 y+ m, ^1 Ralways @(posedge clock) //按键8 P6 q$ c$ y4 C2 E
begin- w4 N n" x0 I6 \: k' U- y% N
if(key_edge[7]) //下降沿检测0 {8 G% ]7 Q$ x& O& w7 s
fword[3:0] <= fword[3:0] + 1'b1;
$ O" ]) ^" |8 O6 y3 vend# n6 X" N2 _8 n1 Z4 m( a# K
" C1 r" z- Z6 @& D
" U) m; X4 S* o! T! F; a* `
//数码管扫描显示部分) o5 W( n- Z8 o3 }5 R, a, S: i
always @(posedge clock) //定义上升沿触发进程. s! W- |1 @& w
begin, `- Z- M. x, K0 S6 h
if(div_clk)! L) l$ f9 ~5 ?: P7 @0 N
cnt <= cnt + 1'b1;
3 u* c- Y' I/ g. f& m" eend
- J$ ]9 Y! O0 ~! |
( b' s$ t3 A5 `" b r# E% z' Ealways @(posedge clock)
0 v3 B& W& d" d, e, ]begin5 w) Z6 y7 I" q& t/ f
if(div_clk)/ \. f+ v8 L K$ H
begin
* V! @7 }3 M8 d: R$ ?$ _ case(cnt) //选择扫描显示数据1 w0 i1 b5 O( f# r6 ]) R
3'd0:disp_dat = fword[31:28]; //第一个数码管
7 x. B2 ?6 }- N# C5 Q, g 3'd1:disp_dat = fword[27:24]; //第二个数码管# n1 e$ a. _$ n$ ^* u
3'd2:disp_dat = fword[23:20]; //第三个数码管
1 H" ~. G8 @1 |4 B 3'd3:disp_dat = fword[19:16]; //第四个数码管& s5 N0 K# }/ `: K3 F
3'd4:disp_dat = fword[15:12]; //第五个数码管
( w3 z/ R2 a8 U5 _ 3'd5:disp_dat = fword[11:8]; //第六个数码管8 k2 q' D; s7 w% @7 i) u5 g! l1 G
3'd6:disp_dat = fword[7:4]; //第七个数码管8 t. U1 l/ M. K7 [3 @
3'd7:disp_dat = fword[3:0]; //第八个数码管* o7 F- J- h J+ `1 c- o
endcase
' l2 T/ Z" b0 @, H& ?0 B O2 f0 ~ case(cnt) //选择数码管显示位3 M/ X0 ` ]4 t( t
3'd0:dig = 8'b01111111; //选择第一个数码管显示
% |7 @ @6 E" l" @' H0 ?5 a7 { 3'd1:dig = 8'b10111111; //选择第二个数码管显示
- i1 ?5 l9 X. m9 H" v1 Q 3'd2:dig = 8'b11011111; //选择第三个数码管显示
. [6 y2 |4 D: v; ]2 X6 V, @ 3'd3:dig = 8'b11101111; //选择第四个数码管显示, c, P8 i: C& Y1 \- z6 K
3'd4:dig = 8'b11110111; //选择第五个数码管显示
) {0 B8 a; S5 H- L 3'd5:dig = 8'b11111011; //选择第六个数码管显示
/ ~4 z0 z+ j4 N5 b5 I+ S8 O 3'd6:dig = 8'b11111101; //选择第七个数码管显示
9 d0 E, v- n5 C! Z: |; g 3'd7:dig = 8'b11111110; //选择第八个数码管显示1 p, h+ b! e+ `$ I8 X! _6 s
endcase
0 N" P) j+ a; O! X" k4 ? end# ~: d, `1 N- l$ O
end! b& X! ]; n, Q/ n+ G
% Y4 Z+ Q; l- Z4 nalways @(disp_dat)
! v, J0 d& w8 ~0 ]! }; y; Kbegin6 H1 ?2 i* B! X' |) d+ J2 [+ x
case(disp_dat) //七段译码3 n& T, Z2 }5 W* R! v& r/ u8 Y* q
4'h0:seg = 8'hc0; //显示06 Q' l* O. U5 S# h
4'h1:seg = 8'hf9; //显示1
$ t: Z* @0 @% d( T5 f/ h/ z 4'h2:seg = 8'ha4; //显示2
0 s. S8 t2 a* n0 u( x. T* `% B 4'h3:seg = 8'hb0; //显示3
4 \3 m! z6 M7 [+ z# V C" J& C 4'h4:seg = 8'h99; //显示4* M+ u/ D7 J+ Z; g; ^+ U: @+ p C9 a
4'h5:seg = 8'h92; //显示5% n0 V6 E$ H. J& B, L* @; Z
4'h6:seg = 8'h82; //显示6
; F0 [: ~. o9 _3 G* y* v% J 4'h7:seg = 8'hf8; //显示74 l1 ~8 I/ c$ _* c" z
4'h8:seg = 8'h80; //显示8+ o b" M8 w* ~/ O4 x
4'h9:seg = 8'h90; //显示9. P, K3 R* E8 A8 V6 R* q
4'ha:seg = 8'h88; //显示a; e; H2 n5 j; \$ [# D0 H7 k- o: g
4'hb:seg = 8'h83; //显示b# H" d: l8 \+ g- H1 I9 N2 \9 D
4'hc:seg = 8'hc6; //显示c
2 y6 F8 \# \( k4 p+ s 4'hd:seg = 8'ha1; //显示d6 Q. o$ c8 N3 s) L
4'he:seg = 8'h86; //显示e" Z7 q T' z& V& o7 W; b' m
4'hf:seg = 8'h8e; //显示f
5 B- i/ V8 x" g- y( j endcase, {$ r9 d( R+ L9 I
end
2 p, b. L3 B5 [: D
% | q; B/ t4 b1 ]endmodule
; j% h, K6 G9 z5 n o |
|