|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 dac_test
( h, \2 @ ~2 ^% I; n7 z: I7 o7 T1 u- n/ h, b: s9 g+ x9 A
module dac_test(clock,key,wr_act,wr_data,seg,dig);& I" t2 {& ^2 j/ k3 F
input clock; //系统时钟(48MHz)7 G* [' F0 P" f' q9 w/ m! g1 Z
input[4:0] key; //按键输入(KEY1~KEY5)" l' k; D0 }! @- ~, a% e
output wr_act; //发送数据使能
: P* `/ A" Y6 |" H! R% n8 A. t Uoutput[10:0]wr_data; //要发送的数据
4 M+ ~/ t8 \$ G3 koutput[7:0]seg; //数码管段码输出* S* J5 F2 L. l/ ^, P' z+ h/ p
output[7:0]dig; //数码管位码输出! R/ {% e% F! V! i4 S/ G3 C% s
//I/O寄存器6 K' L8 S9 l; S0 Z
reg[10:0]wr_data;
* M1 }' U4 [0 \9 U% [reg wr_act;
* I) R5 N' @3 P5 P, |reg[7:0]seg;
+ ^0 r1 K+ G9 ]* `) |reg[7:0]dig;
+ G/ g$ I& \$ w2 w9 j2 m//内部寄存器; |' A) _* ~3 V+ M0 C$ ~
reg[16:0]count; //时钟分频计数器% W8 N2 @! l% @7 N
reg[4:0]dout1,dout2,dout3; //消抖寄存器
3 T0 k' V3 e9 Y4 j7 Mreg[4:0]buff; //边沿检测寄存器
$ E- N* \" F- _. d( I" vreg[1:0] cnt; //数码管扫描计数器
+ r# H6 b" |3 Q% hreg[3:0]disp_dat; //数码管扫描显存
8 e$ F; x' l& w; p; g* {$ O) _/ O, @reg div_clk; //分频时钟
* W& P4 y5 N! L2 }: Ewire[4:0] key_edge;+ Y, ]! @0 `1 F; c
# ]; o. d* j! Z3 D' {( v
//时钟分频部分. p2 a3 t# R; k" i# W
always @(posedge clock)
3 [% s& L. a- e# Tbegin
) K+ A7 _& x o, {" M' o. h+ @ if (count < 17'd120000)
; J4 j$ }6 p; x9 G1 \4 ] begin; m. L, A/ J f( Q$ H( B) F! w7 J! o
count <= count + 1'b1;
. k0 R+ k. k2 ? div_clk <= 1'b0;
# x3 y) t6 d* F' Y9 O2 { end2 S4 \ b0 n8 k0 o0 q
else
# H. `; K7 s( R+ r0 h begin$ O. H5 {2 L, I
count <= 17'd0;. H# f6 H# G/ D' b
div_clk <= 1'b1;5 ?+ }- R) \4 a# Z0 D
end; S) a2 g5 q @. [+ s7 v% C
end; H0 J3 V2 G+ P# m
" z7 D+ J& c! p! n6 x& s% z& K//按键消抖部分
; ?: Z# i: g0 z( x* @8 balways @(posedge clock)
; n+ m, p8 w. `+ kbegin
7 C. d9 T5 C% S% ?) x- ^6 U* j if(div_clk)
8 A7 J: L9 a' d s6 ]9 a begin
* C( N2 @$ E" {$ K8 @# U dout1 <= key;7 L) X+ g8 Z+ I9 X: Q. v( k
dout2 <= dout1;
# Y f" y; f3 b( y9 q dout3 <= dout2;
7 i f5 L5 Z" W3 _! ] end % H2 J" J$ z# w; b" I. P
end) g/ W: v$ K: T! p) \- e. C) T
' t* i& \1 l8 \3 Y//按键边沿检测部分5 U, A( I. p6 m x' K( j3 g
always @(posedge clock)' }2 N( o$ R) R
begin
+ m2 Q2 u" E4 a F! t% y buff <= dout1 | dout2 | dout3;" ]" }% k( l8 }1 y( L
end
& h( b' \) x) b3 _# s3 f* R+ M3 `* Q7 ~$ \7 h
assign key_edge = ~(dout1 | dout2 | dout3) & buff;! P- ^/ j; B& P
8 c2 J9 h0 w+ Y) n+ e4 Q, v- o! j# ~
0 T* `/ c X# X0 E: ]& s! z
always @(posedge clock) //按键1
! t3 }: k7 G* l4 d" d/ Hbegin
. G+ R8 X* f9 M- m* ^! L- U if(key_edge[0]) //下降沿检测
! F4 [$ @+ g5 {/ ~1 n5 R- L! D5 Z wr_data[10:9] <= wr_data[10:9] + 1'b1;
' F9 ?* X4 V( Dend
) j6 z( h6 x. ^
) [4 }- j* C: v+ X* A/ E3 v. ]always @(posedge clock) //按键2# P' T1 M! _6 v- Q
begin1 p% w. f, K# q4 j
if(key_edge[1]) //下降沿检测0 D8 T$ @" j3 |
wr_data[7:4] <= wr_data[7:4] + 1'b1;
1 D1 Q3 ~5 V* J- L6 \5 f! t7 @& m: Dend" S9 y1 R9 r9 v$ Q
+ p6 F8 j8 j, _) {always @(posedge clock) //按键3
; n7 s! Z2 T* A" a% f( k; Dbegin
8 q2 E+ o2 J3 X if(key_edge[2]) //下降沿检测
! o! p3 ?" D, D: M0 ], P wr_data[3:0] <= wr_data[3:0] + 1'b1;
C' I* F! c1 v5 _end
2 \2 J. M; f4 u/ t6 K( I3 e
- `0 a0 D3 g0 `8 @8 u: Balways @(posedge clock) //按键4
) f% j5 @8 z5 \! ebegin
- |6 Q1 c' n" Q9 ~+ L! G5 s2 C q$ y if(key_edge[3]) //下降沿检测
7 j) v* O1 c3 ^% z, D wr_data[8] <= ~wr_data[8];1 j- y, C/ v5 y- E( N; S
end
K( T0 B" E2 I3 w! D' Q# y* |/ L6 [
always @(posedge clock) //按键5
% _/ ]) [9 ]& wbegin m4 t9 f [1 D) z' q! F. v( V
if(key_edge[4]) //下降沿检测! }, Q3 L& Q' s8 i8 H# i/ u
wr_act <= 1'b1;& h! F& G" w. o" g3 \5 R
else . y! R' n E ^& ~+ k5 i1 I+ y
wr_act <= 1'b0;
( p: g: @) B6 Bend
& b$ {" A! |* o m3 I
+ O* b3 k- O% ]" I$ a8 n) J$ P" {. {/ i1 I! m E3 u S
//数码管扫描显示部分
i7 s8 s8 @' O8 Qalways @(posedge clock) //定义上升沿触发进程4 N2 ^* u) U6 H. L- D
begin; B/ D S) l! \) c7 j
if(div_clk)
8 Y }, G P+ n8 { cnt <= cnt + 1'b1;
* Z7 G& J; F! L0 N1 z7 f" q6 p4 z# }& ]end( m4 I; o# ?# Q z0 F, h+ c
- H4 i( c& ~4 m/ R5 w: I
always @(posedge clock) 8 f9 V% o U) V* m3 ?2 |( e4 _& N8 p+ @
begin
! T7 D+ W" Z( @2 D! J8 m if(div_clk)
2 @ Y$ R1 g/ W, q begin
* S# J8 N9 n: z3 b/ v! `8 g case(cnt) //选择扫描显示数据8 x8 h; c. M$ }
2'd0:disp_dat = wr_data[10:9] + 4'd1; //第一个数码管
3 u7 ]( H+ q. H7 [! q 2'd1:disp_dat = wr_data[7:4]; //第三个数码管
v- e/ T7 Z* s+ Y" J" ]' h7 r/ | 2'd2:disp_dat = wr_data[3:0]; //第四个数码管
7 X& |8 R- P( ~6 A f, Q% @ 2'd3:disp_dat = {3'b0,wr_data[8]}; //第八个数码管" W3 {3 l8 E4 _7 m. s, J
endcase0 e( t$ ^ R* k% R" b5 C* j# B- i
case(cnt) //选择数码管显示位
( f4 s3 U% W( v! a: N 2'd0:dig = 8'b01111111; //选择第一个数码管显示
6 ?: T1 N( M* c, r" `0 W& S 2'd1:dig = 8'b11011111; //选择第三个数码管显示4 r! N1 F' e1 z9 @% B6 i( Q. {7 W
2'd2:dig = 8'b11101111; //选择第四个数码管显示
3 I! d9 m! C# d" t" [/ j; u 2'd3:dig = 8'b11111110; //选择第八个数码管显示
" l$ ^9 i" m3 H( q+ K. X8 E endcase : Q" N# p7 J8 O' H
end
9 h+ J7 y7 T' K* G- o/ \end* @: o# f2 C4 u$ J. p7 b, h
& l4 W) k/ ^0 e' n4 o& \always @(disp_dat)
7 i# Z+ j; s( \5 o; Zbegin
4 O3 }& S) M4 b* h: a# z case(disp_dat) //七段译码
) U3 q1 @8 r6 _" D6 k4 D 4'h0:seg = 8'hc0; //显示03 N! {* `5 C3 d
4'h1:seg = 8'hf9; //显示1
2 K4 q" F3 F( U+ |6 g/ \ ~ 4'h2:seg = 8'ha4; //显示2
5 \3 v, b& J3 m! l! J# ` 4'h3:seg = 8'hb0; //显示32 M1 L% w' \- J! V' b W4 a/ i6 t- O T j
4'h4:seg = 8'h99; //显示41 C5 L; w! b# N+ p* P
4'h5:seg = 8'h92; //显示51 u j* V2 @, d. N q3 [/ N5 h
4'h6:seg = 8'h82; //显示6- v4 B" R( w4 |2 Y. H
4'h7:seg = 8'hf8; //显示7! a) h1 H1 B8 m
4'h8:seg = 8'h80; //显示83 z x. B& h: Y+ X* H5 j
4'h9:seg = 8'h90; //显示9, s* s- v5 D8 P$ \$ [- {* O; f3 F
4'ha:seg = 8'h88; //显示a
8 v4 j! ?- J8 K( E" Y0 o/ a 4'hb:seg = 8'h83; //显示b" d$ R" W& X7 ?0 l i3 H
4'hc:seg = 8'hc6; //显示c4 E! R4 Y: W; v, a" a; N
4'hd:seg = 8'ha1; //显示d
% h! { y t+ c 4'he:seg = 8'h86; //显示e D( R9 f4 g* w6 C: p
4'hf:seg = 8'h8e; //显示f$ F/ ?/ P! {+ x: G
endcase$ c) h$ b4 u% ^$ m5 c
end4 b/ d9 ?) \) @& L1 ~1 d# \
5 {6 K3 C+ k& Z' B4 eendmodule* o: i% f0 `+ ]+ o, u& y4 }. G
|
|