我是想用CPLD来实现控制步进电机转1圈(400个脉冲),速度从慢到快,然后匀速,然后在逐渐变慢,最后停止;START是控制信号,上升沿触发;OUT是输出;
module iDrv(reset,clk,START,OUT);
parameter DLYREG0 = 8'd250;
parameter DLYREG1 = 8'd230;
parameter DLYREG2 = 8'd210;
parameter DLYREG3 = 8'd190;
parameter DLYREG4 = 8'd170;
parameter DLYREG5 = 8'd150;
parameter DLYREG6 = 8'd130;
parameter DLYREG7 = 8'd110;
parameter DLYREG8 = 8'd90;
parameter DLYREG9 = 8'd70;
parameter DLYREG10 = 8'd50;
parameter DLYOFF = 8'd50;
input reset;
input clk;
input START;
output OUT;
reg OUT;
reg START0;
reg START1;
reg [2:0]ST;
reg [7:0]DLYON;
reg [8:0]PLSCNT;
reg [7:0]DLCNT;
always @(posedge clk or negedge reset)
begin
if (reset == 1'b0)
begin
START0 <= 1'b1;
START1 <= 1'b1;
ST <= 3'b000;
OUT <= 1'b1;
end
else
begin
case (ST)
3'b000:
begin
START0 <= START;
START1 <= START0;
if (START0 == 1'b1 && START1 == 1'b0) //start rise
begin
ST <= 3'b001;
PLSCNT <=9'd0;
DLYON <= DLYREG0;
end
end
3'b001:
begin
OUT <= 1'b0; //turn on
ST <= 3'b010;
DLCNT <= 8'd0;
PLSCNT <= PLSCNT + 9'd1;
end
3'b010:
begin
DLCNT <= DLCNT + 8'd1;
if (DLCNT == DLYON)
begin
OUT <= 1'b1; //turn off
ST <= 3'b011;
DLCNT <= 8'd0;
end
end
3'b011:
begin
DLCNT <= DLCNT + 8'd1;
if (DLCNT == DLYOFF)
begin
if (PLSCNT < 9'd400)
begin
ST <=3'b001;
case (PLSCNT)
9'd395 : DLYON <= DLYREG0;
9'd5 : DLYON <= DLYREG1;
9'd390 : DLYON <= DLYREG1;
9'd10 : DLYON <= DLYREG2;
9'd385 : DLYON <= DLYREG2;
9'd15 : DLYON <= DLYREG3;
9'd380 : DLYON <= DLYREG3;
9'd20 : DLYON <= DLYREG4;
9'd375 : DLYON <= DLYREG4;
9'd25 : DLYON <= DLYREG5;
9'd370 : DLYON <= DLYREG5;
9'd30 : DLYON <= DLYREG6;
9'd365 : DLYON <= DLYREG6;
9'd35 : DLYON <= DLYREG7;
9'd360 : DLYON <= DLYREG7;
9'd40 : DLYON <= DLYREG8;
9'd355 : DLYON <= DLYREG8;
9'd45 : DLYON <= DLYREG9;
9'd350 : DLYON <= DLYREG9;
9'd50 : DLYON <= DLYREG10;
default:;
endcase
end
else
begin
ST <=3'b000;
end
end
end
default:;
endcase
end
end
endmodule |