|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 moto_test
% q& P/ H4 Q" {3 p- `4 u4 j+ [
7 [- F- J4 k' c0 V) b E! smodule moto_test(clock,key,duty_cycle,pwm_en,pwm_in,motoa,motob,led);% r1 h8 z0 I! c! n7 E
input clock; //系统时钟(48MHz)6 d7 x( R( K0 P; h- k7 _) r
input[2:0] key; //按键输入(KEY1~KEY3)% ?7 |: Z& ? ]1 ^; Z7 B. z
output[3:0]duty_cycle; //PWM占空比控制输出( `. n( p5 f7 @3 A6 ?( O
output pwm_en; //PWM控制使能端4 I; A8 U& U0 z3 J
input pwm_in; //产生的PWM波输入
$ }* ?0 R1 v, G) w; routput motoa; //PWM波输出# ~% f9 o( b" w I& t6 |
output motob; //PWM波输出8 Q* S4 s0 ~# C
output[4:0] led;
$ |3 _7 a" y. W- `! Y//I/O寄存器6 L a: n3 {9 K1 v3 H
reg[3:0]duty_cycle;* ?3 _7 X" c r9 M- R
reg pwm_en; ' A0 l9 h) S6 @4 \" f4 }4 J9 \3 p
//内部寄存器
6 O3 @$ S; m0 O' i9 g$ Wreg[16:0]count; //时钟分频计数器3 `4 z) C" Q$ b) {/ m( O3 S
reg[2:0] dout1,dout2,dout3,buff; //消抖寄存器" g- y' j; w# s0 m) @* s1 D
reg moto_dir; //电机正反转
6 p; x8 U. g+ ]2 m; h- `! nreg div_clk; //分频时钟6 e; h6 j( v5 d3 V/ J
wire[2:0] key_edge; //按键消抖输出
) W! ^# n! t! T3 D2 A$ C
; n! O# _+ N9 O/ \assign led = ~{pwm_en,duty_cycle}; //LED输出状态指示
( X2 G2 f. ?2 r( V3 p( Q8 Y0 b$ r6 Z
//时钟分频部分
* n t- Y) Q# y falways @(posedge clock)" U/ V+ F7 a4 X$ L0 G2 _
begin1 @. v' { F( O( P
if (count < 17'd120000)' F7 L3 f& a, M! d# m8 @# c
begin
V! @, R% \$ U7 J% m2 x1 [( ? count <= count + 1'b1;0 Z* j9 Z3 B5 R9 Q0 {! O' O
div_clk <= 1'b0;
6 b% L* A. n6 Y- G$ K/ q* q3 a, Y end6 R- K6 |5 g4 ]$ b3 r# v# H0 n
else; J ?: @8 y5 d3 O: D7 h/ i* f
begin
5 z0 y# y9 C7 ?+ t count <= 17'd0;
* j3 R/ d6 g- F2 N# G( [/ I3 I div_clk <= 1'b1;
+ i; T8 ~2 ?; M# M9 F end
* ^) }- H( f3 v( M5 Kend
4 P. c4 C& j+ e- J5 x+ ^. w
8 k7 I L7 w- _7 i) I3 r//按键消抖部分
+ u: o- E# F/ F) E# c: valways @(posedge clock)- S5 b. }7 b$ h9 g
begin
! B! g9 f0 J& ^! G if(div_clk)
) d# b! v3 \, q% ?$ ]8 a begin: u" H( ?0 J! \
dout1 <= key;6 u& {5 P$ x* s1 y+ a
dout2 <= dout1;- ^1 F; C2 M+ B; m: s6 ~
dout3 <= dout2;
9 b1 S" }, D; B6 E end
# y8 @' v! t- q M/ g- Z6 Q0 v( dend
9 m" i. p0 m( j E; j" w. y% V: s* J. ?* j- ?! I
//按键边沿检测部分
/ M4 U+ C) k* f0 l" yalways @(posedge clock)
# l& u; g6 r6 M' z) @begin+ A9 x0 ]8 {2 R8 z: }
buff <= dout1 | dout2 | dout3;
; |0 d+ Y, K- Y u% w Uend
7 m( @( F! p) i. Y5 @
8 w9 q$ e3 M0 T. q- Lassign key_edge = ~(dout1 | dout2 | dout3) & buff;+ [" g- k }: e
+ l% Q( j7 Z( {! Q, u/ r1 i$ \# ^3 Qalways @(posedge clock) //按键1,控制电动机速度 G) k# s9 z9 [! N0 S, E4 N; q' B' x$ \/ f
begin2 |* K( I7 E! _
if(key_edge[0]) 6 y: F7 Y5 c7 e) n
duty_cycle <= duty_cycle + 1'b1;
$ s* [1 |5 P+ w5 aend
" D. X3 G! h$ q
" M) q7 i4 t# f& galways @(posedge clock) //按键2,控制电动机启动、停止
8 a3 ]- q/ i# f8 H5 @$ wbegin( z+ h: ^+ x0 a- P% c8 N
if(key_edge[1]) - ?# N9 v# }# t: r, D2 E% o
pwm_en <= ~pwm_en;
. R( S, x8 u6 r: D* h. Bend! M9 n1 m3 d& Y; F
6 U6 p: r! T( m7 `2 ]always @(posedge clock) //按键3,控制电动机正/反转
, x: J. M9 j* J# w: }# Wbegin, }# W5 x& d. V+ [. t7 _1 D
if(key_edge[2])
5 S6 d! D2 O7 y4 \3 r$ j: C moto_dir <= ~moto_dir;
, z$ U3 {# @3 F0 v# k4 ?end
. X4 E' F/ r" R) S2 U' H+ r7 |6 u) Z% A6 w8 y9 T, V" B
assign motoa = moto_dir ? pwm_in : 1'b0;: X& N3 C6 g* I3 }) ^
assign motob = moto_dir ? 1'b0 : pwm_in;9 u0 U V4 H" u$ m7 Z3 ~
- S) ^# A; q% I& I6 t8 x
endmodule
* k* J; A! X9 X! v: L! C5 T/ Q |
|