|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 uart_test
9 u" j, C4 y5 d3 K0 l
) A" b, Q1 w3 Q X" Smodule uart_test(clock,key,rdata,wen,sdata,seg,dig);/ s l" W' @3 D
input clock; //系统时钟(48MHz)7 X) g4 v8 f0 z& T9 H6 b4 B
input[2:0] key; //按键输入(KEY1~KEY3)
. j+ N# B4 x, R! d" K, N- B/ ?. Binput[7:0]rdata; //接收到的数据" y) l, g2 Z. e& R8 }. ~
output wen; //发送数据使能9 r0 w# ?& {. ^# X b
output[7:0]sdata; //要发送的数据
; n6 B: G" h* \6 l x2 coutput[7:0]seg; //数码管段码输出# R( U0 A2 r- J
output[7:0]dig; //数码管位码输出
. a) n1 C' E4 F1 t+ j9 S% R//I/O寄存器: L2 h* \- B( X7 r
reg[7:0]sdata; - J4 k5 q# _- a( H) C
reg[7:0]seg; * ?( q. G0 L8 \5 a7 E" V7 g# j
reg[7:0]dig; 1 [' ?* v/ D. m4 @- q$ V
//内部寄存器$ }; ^; q ^0 Y0 s' g/ I
reg[16:0]count; //时钟分频计数器
$ ?; a/ m) l7 H* Z2 [: B" @reg[2:0]dout1,dout2,dout3,buff; //消抖寄存器
' _2 t; y; U. Q8 v1 O7 treg[1:0] cnt; //数码管扫描计数器
. W, m2 ], k( D! k; X. }& r }reg[3:0]disp_dat; //数码管扫描显存
% p: x) R; C* B7 t. hreg div_clk; //分频时钟
3 t/ K3 s* ~8 _$ I; cwire[2:0]key_edge; //按键消抖输出0 O! ~! h n, h( a+ l1 g; w4 ~
5 C- U6 P' U/ T# M9 [: y7 g- P
//时钟分频部分
& M- @; q' O% C3 P9 C1 U8 ?always @(posedge clock)
0 Y. O- W9 H# [0 y, R& S! Q; gbegin
: d' ~6 v. x* I% H3 x if (count < 17'd120000) v* @2 Z8 F2 B% E
begin* q5 s* x9 i! X5 e: Q; A, P9 u
count <= count + 1'b1;7 F: M8 [+ W5 f/ y! Y+ D
div_clk <= 1'b0;
7 u' ~: l) B& G1 A& W end
" x# p- I9 f: O+ ~3 m* K( h else, g8 g5 S" _* T. z* `+ Y
begin$ f/ ~- d9 ~/ W/ w2 Z; P" l
count <= 17'd0; h) R5 k6 O* A1 ?2 z
div_clk <= 1'b1;
0 C k* k, N V" g* w end$ J: O# P# q8 Z+ g! g* @
end
" R0 D: u- m+ y" S" r; \" K7 e- W0 h# M2 `
//按键消抖部分
4 ~4 l' C" Y- M9 Zalways @(posedge clock)
7 G5 F. h1 M+ E; q1 U+ fbegin- c( G% u1 K! s6 d; H
if(div_clk)
% R; T' w! Y3 t- S2 b begin
# q6 r7 x/ J' i- U9 @% I6 M) P% M dout1 <= key;1 o' V/ J( N. r: Y% V" Q9 G Z
dout2 <= dout1;8 ~0 g! i" j" U* r7 l8 @
dout3 <= dout2;
& t/ }3 t& h7 |- R( \9 M! h* w end $ _+ O) g" ?; C. D8 n
end: z' F) P. D4 d4 e; T, `
% Y* ~& V1 h8 j8 L* b//按键边沿检测部分/ t2 S9 ~, T4 z
always @(posedge clock)' p( \: F4 X: Q( l( O% F$ s
begin
, _: F0 u w$ h. o1 M buff <= dout1 | dout2 | dout3;# [8 W* w9 }1 ]$ w. |2 L! Y+ o7 C% T
end- i7 o. L1 T2 d
T% b7 y+ q1 p4 H- L5 c
assign key_edge = ~(dout1 | dout2 | dout3) & buff;
* M' f& c9 ~/ E0 H
( i- {6 {# d3 N* \$ l' n3 M//2位16进制数输出部分
8 }4 j+ D! l' c" G0 g @always @(posedge clock) //按键1
. [0 r/ f1 U# Y: _begin
+ v+ y# @" [# u7 }0 \. C" C if(key_edge[0])
9 W, I$ U6 G+ D sdata[7:4] <= sdata[7:4] + 1'b1;
; I5 Z- l, Y2 Q- B5 G5 p8 Aend
) A! _1 u5 a/ q) N9 |; V5 ^. H( ~) ]! [! d' B2 k* Y- o$ H
always @(posedge clock) //按键2
' l1 h7 ^7 e& F/ Mbegin
: p% B1 h+ _; A+ u# H5 c$ Q9 f if(key_edge[1])
/ @5 I. \0 }5 z j sdata[3:0] <= sdata[3:0] + 1'b1;7 B( I. F, H4 E' g4 k8 ^
end
" P! X" q0 k6 L5 o
( K# {; E Q- Y2 ]assign wen = key_edge[2]; //按键3
2 Y& a' L2 K/ v; W, V2 L) b% D7 M; W4 [
//数码管扫描显示部分
3 V% k% s: G, j, \! Valways @(posedge clock) //定义上升沿触发进程
- ~2 o v& q+ J9 T. h/ `, Ybegin
3 L3 A! A2 e- r; v0 B3 o+ J if(div_clk)
2 o7 V5 Q! ?9 S/ t4 M6 n& G1 z: g! V cnt <= cnt + 1'b1;
W8 Y" s( T4 M p5 |4 g9 B: Eend& a1 _* V9 W$ I. |' K
3 F2 P; h2 O, C1 G5 Q& w. {always @(posedge clock) 2 S0 I0 o; L8 u1 h' B: S: X
begin& i$ \: N0 `- s" j
if(div_clk)" m5 X$ g) g3 H0 f$ I, Y) _2 P
begin9 ]3 r/ k6 A. u# L, w+ v
case(cnt) //选择扫描显示数据
6 A3 W6 e2 N' X% T) ~8 E. A 2'd0:disp_dat = sdata[7:4]; //第一个数码管
: o. }- N* j+ i# L; R; R9 g 2'd1:disp_dat = sdata[3:0]; //第二个数码管
, f9 v9 I) N. D- I- s0 l' h 2'd2:disp_dat = rdata[7:4]; //第七个数码管
- s3 g0 B# ]0 P5 v) n 2'd3:disp_dat = rdata[3:0]; //第八个数码管
4 p; o$ j7 E" y5 s7 g endcase$ E4 q; q- b- j5 o2 i
case(cnt) //选择数码管显示位$ M3 v, L8 C w+ F* Q
2'd0:dig = 8'b01111111; //选择第一个数码管显示
r# Y! j1 c0 a8 y8 A 2'd1:dig = 8'b10111111; //选择第二个数码管显示2 I) F8 M7 |2 \" P) i( l ?
2'd2:dig = 8'b11111101; //选择第七个数码管显示: K7 Y" L! v0 X5 U
2'd3:dig = 8'b11111110; //选择第八个数码管显示
- e/ Q* R9 T0 K: q' o endcase
) U- Y+ P5 K* a$ k1 m y3 q end/ b3 t" h# W2 m, }% d
end
3 `+ X# o5 X. a z3 N3 f0 e# p) ~/ T4 D! I: M/ v& j
always @(disp_dat)0 h% H' w, x7 r! m: l7 H
begin4 C7 F' ] U( V$ ]9 X C
case(disp_dat) //七段译码
1 M+ \9 P* J3 m 4'h0:seg = 8'hc0; //显示0$ S% }# \$ Z* }6 h- H k( I
4'h1:seg = 8'hf9; //显示1
" J6 E, H# x' B 4'h2:seg = 8'ha4; //显示2
% {7 Y* S: @ W% E 4'h3:seg = 8'hb0; //显示3* Q/ W; Q Q8 A0 ^
4'h4:seg = 8'h99; //显示47 S! \; X9 k/ N6 y9 E7 K
4'h5:seg = 8'h92; //显示58 L1 A/ p/ i1 N4 }, D" E) @
4'h6:seg = 8'h82; //显示6' m' m/ r4 t" n$ d& ^( o
4'h7:seg = 8'hf8; //显示7
1 u; i0 F. P5 i; W1 B) ] 4'h8:seg = 8'h80; //显示88 O& m# ^2 Y# h' U/ g
4'h9:seg = 8'h90; //显示9
! C9 Y( U: a& T4 l: m 4'ha:seg = 8'h88; //显示a
/ v9 w& _- I0 u 4'hb:seg = 8'h83; //显示b
( | {6 O ?( C0 L9 W 4'hc:seg = 8'hc6; //显示c! `8 z' M- \6 b: n2 b# R& [ P
4'hd:seg = 8'ha1; //显示d
9 z( ^5 M4 p* K% a 4'he:seg = 8'h86; //显示e+ z7 X: S5 H' v
4'hf:seg = 8'h8e; //显示f+ M# c. _& y+ m( V+ [
endcase% H% G8 k! |: w4 w: |# l
end
; v6 G O. ^6 i! W
{0 S8 }6 `& @; I* aendmodule
! n: b) O5 l+ D6 L9 K% [/ N2 J
, v. z2 n( ~) S7 T( h. j1 w( | |
|