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

EDA实验与实践 uart_test

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 20:12 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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