|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
EDA实验与实践 moto_test
' S( p: i, h. p0 w e' ~' f' u! v2 g/ D
module moto_test(clock,key,duty_cycle,pwm_en,pwm_in,motoa,motob,led);
; D+ k. R/ q" iinput clock; //系统时钟(48MHz)
! M' m1 W+ D$ w5 O/ [+ O% q! hinput[2:0] key; //按键输入(KEY1~KEY3)$ a. U* ^' Q6 {5 v
output[3:0]duty_cycle; //PWM占空比控制输出/ ?" g3 P* f' T) a1 _! f0 ]) ?9 M, f1 K
output pwm_en; //PWM控制使能端6 n- w$ R& ~3 Q: B; I
input pwm_in; //产生的PWM波输入
; {4 m: A( Q& i* ]; koutput motoa; //PWM波输出4 ?8 d. N; b7 e, U# N$ W' K
output motob; //PWM波输出
6 A( Z4 W! U0 O! C! c1 Loutput[4:0] led;! }6 g7 ~* L1 Q! B
//I/O寄存器. Q# w4 `7 U6 F- s" ~
reg[3:0]duty_cycle;- }# i: [. p( { D5 x2 w
reg pwm_en;
7 c- X V7 u& S% i//内部寄存器
6 f/ T$ t4 s+ y, nreg[16:0]count; //时钟分频计数器 V" M5 m; S1 Z% a5 w; E
reg[2:0] dout1,dout2,dout3,buff; //消抖寄存器0 {: H! h6 K, A' O$ r" j; v
reg moto_dir; //电机正反转
3 J* C# L# A( d Sreg div_clk; //分频时钟
5 V/ a4 T5 y: Q. t; \wire[2:0] key_edge; //按键消抖输出
, J- d6 i+ S8 i0 U
4 d3 I1 i) _% e9 R- fassign led = ~{pwm_en,duty_cycle}; //LED输出状态指示
" R. K/ w" k% a' |, |- y8 w: ], f Y3 S7 \5 n1 R0 Q! Q! F
//时钟分频部分
M9 U- I4 W8 jalways @(posedge clock)
5 L- `+ R% v7 n+ ^3 m, dbegin8 F/ `. O8 \$ `+ w2 b' o
if (count < 17'd120000)
( X' R8 d3 M3 Y. E( a begin
7 c- V6 O. q9 H5 m( z count <= count + 1'b1;
3 F, r9 D: g) R8 e7 X, R+ ]$ G! m div_clk <= 1'b0;# v: ^2 B# n- q7 Z+ }
end
% X. A; M/ e4 M6 D: Q: Z else& T) ~6 D% ^: Z5 F: o) l" T4 d9 g
begin% y& ~8 ^2 l! U' \/ C: q# Q
count <= 17'd0;# w! L. f$ A0 O/ z8 R4 b
div_clk <= 1'b1;
' M8 [8 ?& s2 f& b end
( I, f7 Z' V8 N1 ]: v. S: v; ^+ T9 ~. Pend
/ f# S7 R9 [9 z8 `' X4 d
# N" I6 Y/ T- H' n- X* T//按键消抖部分, A! e' W# I+ r/ L
always @(posedge clock)
C$ ^( }& D. B& P" lbegin8 S: u$ |0 H9 P, C- i
if(div_clk)7 p. T+ y- f/ w# @ n
begin& d/ N$ w C0 W/ O
dout1 <= key;! J l' U( b8 z5 T- ?% n
dout2 <= dout1;
3 D% B8 ]5 x8 _9 j" B dout3 <= dout2;
2 T7 K* m( N) `0 W end
. t0 z) Z) Y& [! d! e8 Aend
4 B( \" H2 i6 H2 n* O" p0 |4 C0 V$ }! e% t1 ]
//按键边沿检测部分
3 ^ f# p# C" U/ W9 Aalways @(posedge clock)" E# c, u9 z; W7 d0 n4 M# j8 x
begin
, _" U2 `* }1 C4 y; ` U9 [/ n buff <= dout1 | dout2 | dout3;7 L6 Z4 X5 _! W! P1 O2 \9 v) G
end0 K3 i5 R5 e3 f4 z
: h. z9 i I4 L2 s
assign key_edge = ~(dout1 | dout2 | dout3) & buff;" O5 n& C1 J& k1 Z
: X, R4 u% ~: ?. r/ Y
always @(posedge clock) //按键1,控制电动机速度
5 Q5 d' s5 K! Abegin$ B; s. h2 L. `( Q
if(key_edge[0]) " E# S5 g B p
duty_cycle <= duty_cycle + 1'b1;* u7 q3 u' F' ~$ v) l4 T
end
2 z* w# Z, S$ f5 _& h+ B( e8 m/ G; Y. g/ s6 G
always @(posedge clock) //按键2,控制电动机启动、停止
/ h N8 [) g" bbegin
! ]2 v8 K" e+ R if(key_edge[1]) $ ~2 Q% P6 d2 e4 L' B7 c
pwm_en <= ~pwm_en;
# z4 G: s% ]& {: q( |end
% m6 Z _4 ~4 v- s' Z$ Y' K8 C: m
% ?2 ^7 B' m: h% F/ ualways @(posedge clock) //按键3,控制电动机正/反转" q7 {+ f2 e& ?6 w6 \- _+ P9 f0 N
begin1 v0 b9 p% C4 Y$ m
if(key_edge[2])
; }3 x+ i$ o! A9 L' O ^; u moto_dir <= ~moto_dir; [) ?6 f+ ]3 `
end
6 E, X" ], O0 v' K. V6 ?2 y a" h& _# S; Q" F
assign motoa = moto_dir ? pwm_in : 1'b0;
_/ c8 u# v( y# J$ fassign motob = moto_dir ? 1'b0 : pwm_in;
7 ?8 \2 ~- `6 O
% J) Y$ u0 W! ^0 Wendmodule- g4 r/ G4 K, g2 T6 |
|
|