|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 moto_test
: a+ A, n; }" W& x* U! J1 A5 z1 S, L q1 ^) d
module moto_test(clock,key,duty_cycle,pwm_en,pwm_in,motoa,motob,led);
, X$ Y! M, s# [" L) Vinput clock; //系统时钟(48MHz)
! Y! v0 J. s' R! zinput[2:0] key; //按键输入(KEY1~KEY3)
1 m& r# w9 D* R2 o7 noutput[3:0]duty_cycle; //PWM占空比控制输出
$ F4 p5 i6 n/ Z1 Woutput pwm_en; //PWM控制使能端
/ P2 b( g" Y* @, @2 a$ [" ainput pwm_in; //产生的PWM波输入
2 }2 C* p3 ]* `! w" \( d: Uoutput motoa; //PWM波输出& g5 D: L6 q2 |. r9 p R$ l
output motob; //PWM波输出, E! h0 i% J, P2 Q) K- _
output[4:0] led;
. L% t8 ~ R5 k6 P. a//I/O寄存器
+ ]& m2 r/ o+ Rreg[3:0]duty_cycle;
" c; n$ e% |" p; jreg pwm_en;
5 b- n: Z* E0 B//内部寄存器
1 n6 I) b) k3 b$ dreg[16:0]count; //时钟分频计数器7 Y' Z# d: V- Q0 r3 e: z; \
reg[2:0] dout1,dout2,dout3,buff; //消抖寄存器
. O( b w& a# l _reg moto_dir; //电机正反转% V) }4 q, d' _" H
reg div_clk; //分频时钟) _) l. C: v. c. R! G: l
wire[2:0] key_edge; //按键消抖输出1 g8 g( h7 B$ \" U" J# P5 C7 V9 D
2 u$ Z4 ?; w4 G" u0 H- T
assign led = ~{pwm_en,duty_cycle}; //LED输出状态指示
! c; h0 B. b4 r7 x) Z! z, G6 Z3 k+ I) Y6 G! h7 U) F
//时钟分频部分
# d% K# u6 k- K& {/ h malways @(posedge clock)
: m0 m# g* D6 I3 U* S. m* sbegin6 x$ r! H+ i2 p0 ]
if (count < 17'd120000)
4 a: R$ @% Z9 B, u( p begin
; F; `0 E! g$ y4 O count <= count + 1'b1;7 f: h$ Z8 q5 {* i( @) x0 T6 `2 ]
div_clk <= 1'b0;' e. t! r3 F) n) Y! ~7 G' b6 m* a3 B
end2 Q2 h8 p5 M+ P) u$ U) j9 t
else
5 t, o8 M2 y8 k begin
- E3 D& v" l+ o6 e count <= 17'd0;
. m6 a8 S$ q: |* ~& j6 s div_clk <= 1'b1;7 a- O8 l2 l3 j- x4 h& `4 {& M/ \4 U8 b
end2 H$ {" F% ^( U( t) O
end4 f1 F* N8 P" V7 U! a& X, D
5 H( K7 R$ l/ e7 o! V8 m, g' c//按键消抖部分& E s/ Q, \6 b2 S ^+ W
always @(posedge clock)# D1 R$ W; U+ E7 ^
begin* X, F+ @8 M7 \4 {
if(div_clk)# e- ]. q! f, c* S7 j
begin
* E2 X3 ?- h; |9 s7 I9 x1 ? dout1 <= key;
- U# ]8 _/ P7 T dout2 <= dout1;) ^* J3 X0 @6 a& m
dout3 <= dout2;
) s& c6 x; R/ k. M5 B end # J, b& |# J- `/ Q+ T* f
end8 E) x/ i; P$ @3 n, k# `9 K3 l" R+ J& W
+ x7 m. U9 x- I8 i2 e; b, j//按键边沿检测部分6 q# A+ \+ h [: A: [
always @(posedge clock)! y0 I, F, O* k# A
begin
& S6 h3 O+ v4 {& h- ` g buff <= dout1 | dout2 | dout3;% O! g# x+ b/ P0 e* ^. _" k- h
end8 n9 B5 z0 z# P, t- ~' k K! `5 w
9 t9 t r5 H. Y& nassign key_edge = ~(dout1 | dout2 | dout3) & buff;
5 Z: I0 t6 D: \ K! `6 b1 m C8 h" d6 Q8 q
always @(posedge clock) //按键1,控制电动机速度% _& D) p! k. C) U" V/ p( s
begin
$ \# L' H7 ^/ \' { if(key_edge[0])
8 |7 ]! o1 ?" {" r" L0 f0 x: d# C duty_cycle <= duty_cycle + 1'b1;
" X0 Z$ m; ?3 i1 }end
! r+ y2 o" H6 N s& \
: l6 j) A( U6 a* N6 V7 a- walways @(posedge clock) //按键2,控制电动机启动、停止' Q* @. w& j; h. b* M9 h' h
begin
( j% K5 z. O1 |. y. U. _* W$ R if(key_edge[1]) 6 \1 G/ b9 ]; o( _! i4 M7 [3 Z
pwm_en <= ~pwm_en;
5 L Z r! k& G! C( S0 c3 Zend
% X' X- S* _' p8 N& d4 Q) ]. B: S* _' I& C% P' V* c8 N9 g
always @(posedge clock) //按键3,控制电动机正/反转1 {" c. W& v1 W$ t3 @& E6 ~% P
begin
5 _7 W, O1 [: v8 X3 b- G$ i# Z6 G3 g if(key_edge[2]) - R8 B1 X- K: K5 J
moto_dir <= ~moto_dir;9 }9 \ U. t$ a% m
end: a! H$ y& i& H* y1 b
l# w% L, C; C) C
assign motoa = moto_dir ? pwm_in : 1'b0;
% c$ {! O* W! C+ j9 Q& nassign motob = moto_dir ? 1'b0 : pwm_in;
' @ X8 ?0 h7 |' z" k% _3 j, N* `
2 k* N6 v% Q" T' k9 Nendmodule
! I& P6 k/ J' X$ N9 Y2 Q9 B |
|