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

EDA实验与实践 dac_test

[复制链接]

该用户从未签到

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

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

该用户从未签到

2#
发表于 2019-5-8 17:55 | 只看该作者
有代码也太棒了呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 22:47 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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