|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 uart_test 7 T1 |! V7 n7 r# a) }
4 _$ [; n+ |9 O( N/ ^0 U3 J
module uart_test(clock,key,rdata,wen,sdata,seg,dig);' b; B1 Q' Z& M
input clock; //系统时钟(48MHz)# ?! k* v r; g
input[2:0] key; //按键输入(KEY1~KEY3)
# B7 i* I2 Y* M2 E$ f* E4 [input[7:0]rdata; //接收到的数据! o1 j& m4 ~' B0 E. s
output wen; //发送数据使能 L* `6 B1 D/ N
output[7:0]sdata; //要发送的数据
8 V1 Z! O. P: i) P" @9 G0 Youtput[7:0]seg; //数码管段码输出( H7 H7 d% q1 n! g
output[7:0]dig; //数码管位码输出
. R/ Z/ e3 ]1 U B- C6 a; L* U9 @ T//I/O寄存器/ ^* W o& N Q# ]. ^) g
reg[7:0]sdata; 3 r& _5 M1 |- E, y
reg[7:0]seg;
0 R( w' H# z3 q9 Oreg[7:0]dig;
: J4 _! M, Q' A- ^) g//内部寄存器
6 E- k' N; T; a0 C! n" @' Xreg[16:0]count; //时钟分频计数器
. d/ _/ m3 p/ R+ Ereg[2:0]dout1,dout2,dout3,buff; //消抖寄存器( {& v9 |& w4 b8 U9 V
reg[1:0] cnt; //数码管扫描计数器
/ D( X {# d" c, R+ A6 l: treg[3:0]disp_dat; //数码管扫描显存 & n: D; q3 @ w; P, l* a+ J
reg div_clk; //分频时钟
( J8 b" C. A, W: X" g6 N0 Cwire[2:0]key_edge; //按键消抖输出
$ n z# v D4 b3 |+ h# c+ e
7 }- ^- w4 B- _8 b& h//时钟分频部分: B s1 J7 X4 c2 {. M" x7 X6 k& T
always @(posedge clock)
; J/ C) @5 |: e/ vbegin4 v/ H) U! D( s' u2 ?. z0 T
if (count < 17'd120000)
t. d- y, r$ O" i* v8 T3 v begin6 y+ f: ~& u' h$ @# L6 _
count <= count + 1'b1;9 W1 q) S" y( ]8 t. }, o5 m
div_clk <= 1'b0;
" h$ X! M, e: @3 H2 w end
7 U6 v' k& u5 Y6 V4 t else8 D1 _1 t, a) @, E6 f% f# _: D* h& I; \
begin
+ X5 k& `# X& Z3 o) \ count <= 17'd0;
?4 U; }4 v! g/ V. [" y div_clk <= 1'b1;/ r5 [( X9 X4 x* F7 x, E8 S# \: p
end
' M+ [! s `* W8 w# Y) Dend: o- D9 Z0 O* g3 a4 }( H1 L `
- H( Q- S6 c+ n& o- l//按键消抖部分
7 E* d0 N# D' k5 Y8 W: L+ e# Q+ Valways @(posedge clock)
% | H! y9 e. L7 J' nbegin
9 A) u8 @* v3 V8 s2 R8 K if(div_clk)3 t: g; b. @. c7 }
begin
+ S% |( j6 }9 h/ q4 L dout1 <= key;
& w9 n# r4 E8 d0 Z dout2 <= dout1;$ l# B j$ O* c4 H
dout3 <= dout2;; O8 g( C. @0 m
end ' T5 v3 U& B5 ~( ~! B9 e% T7 B
end3 U F. u* h) X& D7 H
! w+ I6 I6 \7 D ]5 K" S//按键边沿检测部分4 v- s0 C% a" p6 d4 m/ H
always @(posedge clock)
$ u9 j# f" |, H# p* Z1 N' pbegin* z# ~. L/ Q0 D) J4 U
buff <= dout1 | dout2 | dout3;
9 \/ @% s8 a9 _9 l0 Nend
- U1 V+ @' N5 ~/ h
# N% n3 g: K2 r8 a9 Massign key_edge = ~(dout1 | dout2 | dout3) & buff;
! M1 _2 L1 B5 n4 e, ^9 @( y* `
. `4 [- f3 k- D* w3 t0 r//2位16进制数输出部分3 `" e6 J( Q5 P8 {
always @(posedge clock) //按键1
: |5 X) \4 b& G! sbegin$ g3 ^! _. \9 t; d* |
if(key_edge[0]) $ K, [ ^- q6 O
sdata[7:4] <= sdata[7:4] + 1'b1;
& u- _4 s, H. i; lend6 Q; y5 a( `, L9 G6 t2 W0 [: F. D
: @ A( o& k+ _9 H0 N
always @(posedge clock) //按键2) O! B3 p+ `' O! s& O5 q
begin
; a v3 Y! N$ a/ K+ j* n- n if(key_edge[1]) : y l7 o# [ r6 u
sdata[3:0] <= sdata[3:0] + 1'b1;2 M5 x, k* P& E; \0 m
end$ |0 q F% X. O% {* m. q
3 q' o" I9 _, F: U5 M% P% u7 f
assign wen = key_edge[2]; //按键3+ I: g( f- J8 r3 `1 ^; f
2 m4 n) g" Y h
//数码管扫描显示部分# \$ d1 g1 b) w* l6 U! ^
always @(posedge clock) //定义上升沿触发进程6 @, p! x; _! u4 N
begin( B4 h: U( `( j- F q+ i) d
if(div_clk)
" D7 O' c/ F! \, n9 U cnt <= cnt + 1'b1;
# v* l& ^( w n7 I9 E. I0 Send' X. i4 Z/ f% H3 _7 x( a) I
. ]( K C/ y7 C0 D" ]: T2 Ualways @(posedge clock)
* m. |# \6 g# P' w# v: Mbegin
% q. P1 K* _6 \/ u& S, b) e. J if(div_clk)
3 r6 Z4 h9 w; T% ]8 n4 e begin
/ O' O+ W8 [2 x4 t' C# A% g case(cnt) //选择扫描显示数据% F# k9 G; Z: ]6 ]0 x5 _
2'd0:disp_dat = sdata[7:4]; //第一个数码管* e& S/ B! f1 B2 G* n% Y# q
2'd1:disp_dat = sdata[3:0]; //第二个数码管2 a# a& b: u3 d& ~
2'd2:disp_dat = rdata[7:4]; //第七个数码管
# h1 \, e9 q/ d8 \& N: Z 2'd3:disp_dat = rdata[3:0]; //第八个数码管
$ i5 r5 @& i3 P- h# H endcase
! j( P1 s/ L) O% b2 s6 I case(cnt) //选择数码管显示位
1 H( n2 c$ c$ G/ B9 c% [) F7 M 2'd0:dig = 8'b01111111; //选择第一个数码管显示9 j2 v8 s7 ?3 d7 J
2'd1:dig = 8'b10111111; //选择第二个数码管显示- O3 x5 t! O$ T% m
2'd2:dig = 8'b11111101; //选择第七个数码管显示
8 ]0 b- c+ b$ V 2'd3:dig = 8'b11111110; //选择第八个数码管显示
- Y% [; O k; w/ v% Z) O* l endcase
7 z; ^* ?" H5 m! b/ @ end
+ [# Z, O0 z8 V; eend L v# i' d- S) s1 X
6 i( E$ Z$ Z- M7 ?/ H6 `" S
always @(disp_dat)
9 n. F& v0 b4 v6 p% ~) w4 o) Vbegin
2 t @7 n e' i- [# Y2 }! r8 b. ]" b case(disp_dat) //七段译码! C& X8 B% V/ Z4 V7 ^4 z- `
4'h0:seg = 8'hc0; //显示0
% s2 b* `) l+ P: S1 p: L 4'h1:seg = 8'hf9; //显示16 P( N4 H. S% h
4'h2:seg = 8'ha4; //显示2
' C: d9 S+ T$ F$ E; g7 q 4'h3:seg = 8'hb0; //显示3
/ F$ k5 I% x6 \+ L W% b' Q 4'h4:seg = 8'h99; //显示4 T% D! L5 a" Y$ f4 o! e
4'h5:seg = 8'h92; //显示5
8 Q7 A& C2 X9 R 4'h6:seg = 8'h82; //显示6' m1 n% H+ S' l" Y. C
4'h7:seg = 8'hf8; //显示79 R H Y, M9 M" g' V& ~# U3 T, F* u
4'h8:seg = 8'h80; //显示8
0 G/ C: g% e# a) ]/ e e 4'h9:seg = 8'h90; //显示96 j* w1 e: V3 S" i
4'ha:seg = 8'h88; //显示a
* \7 j0 @5 V, A, r: ^7 _ 4'hb:seg = 8'h83; //显示b
+ k5 k3 W i( l2 d- b! G) o( J3 ] 4'hc:seg = 8'hc6; //显示c
4 Y; N2 j {. I2 v& y 4'hd:seg = 8'ha1; //显示d
- i6 a5 `- K) M: h" e 4'he:seg = 8'h86; //显示e% T" i \' c! @! b
4'hf:seg = 8'h8e; //显示f
( K9 ]2 o& B; c4 I7 J* ~" k9 B endcase
& Q0 p0 A/ k0 `7 Iend' Z- Y' }# _7 [% J! ^- N U
( U2 _& u0 \/ e- I+ |$ [$ a
endmodule( M' Z" c) O: j) K4 H! t) R
0 ?! Z; S8 _) J! k% R$ h |
|