找回密码
 注册
关于网站域名变更的通知
查看: 186|回复: 1
打印 上一主题 下一主题

EDA实验与实践 uart_test

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-8 07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-2 08:32 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表