|
本帖最后由 王涛 于 2017-2-18 14:01 编辑
本人想做一个脱机的CNC系统用的是ARM+FPGA架构。ARM端做UI和G代码解析以及前瞻处理和路径规划,FPGA实现直线插补控制和圆弧插补控制多轴联动。现在ARM 端的程序基本OK。问题就在FPGA这边有做过的能不给点提示要怎么搞?
ARM用的是STM32F4开DSP和FPU速度感觉还可以,FPGA的DDA插补模块希望有直线插补和圆弧插补两部分,两种插补方式在一次插补过程中,只能有一种处于工作状态。直线插补能够实现3个轴的脉冲输出,完成二维或三维的直线轨迹,而圆弧插补是实现两轴的脉冲输出,实现二维的圆弧轨迹。
下面是直线插补
`timescale 1ns/100ps
module dda(s_clk,start,x_start,x_end,puls_x,sign_x,
y_start,y_end,puls_y,sign_y);
input s_clk,start; //s_clk为时钟信号,start=1时正常运行
output reg puls_x,sign_x; //puls_x为输出脉冲信号,sign_x为工作方式信号(正转还是反转)
output reg puls_y,sign_y;
input[3:0] x_start,x_end; //为输入坐标信号
input[3:0] y_start,y_end;
reg[3:0] coun_x=0;
reg[3:0] state_x;
reg[3:0] coun_y=0;
reg[3:0] state_y;
parameter S0 = 1'h0,
S1 = 1'h1,
S2 = 1'h2,
S3 = 1'h3;
parameter M0 = 1'h0,
M1 = 1'h1,
M2 = 1'h2,
M3 = 1'h3;
always@(posedge s_clk)
begin
if(!start)
begin
puls_x = 0;
sign_x = 0;
state_x = S0;
if(x_end >=x_start)
begin
sign_x = 1'b1;
coun_x = x_end - x_start;
end
else
begin
sign_x = 1'b0;
coun_x = x_start - x_end;
end
end
else
begin
case(state_x)
S0:
begin
if(coun_x)
begin
coun_x = coun_x-4'b0001;
puls_x = 1'b1;
state_x = S1;
end
end
S1:
begin
puls_x = 1'b0;
state_x = S2;
end
S2:
begin
if(coun_x)
begin
coun_x = coun_x-4'b0001;
puls_x = 1'b1;
state_x = S3;
end
//else state_x <= S0;
end
S3:
begin
puls_x = 1'b0;
state_x = S0;
end
default: puls_x =1'bZ;
endcase
end
end
/*--------------Y轴方向-----------------------------*/
always@(posedge s_clk)
begin
if(!start)
begin
puls_y = 0;
sign_y = 0;
state_y = S0;
if(y_end >=y_start)
begin
sign_y = 1'b1;
coun_y = y_end - y_start;
end
else
begin
sign_y = 1'b0;
coun_y = y_start - y_end;
end
end
else
begin
case(state_y)
M0:
begin
if(coun_y)
begin
coun_y = coun_y-4'b0001;
puls_y = 1'b1;
state_y = S1;
end
end
M1:
begin
puls_y = 1'b0;
state_y = S2;
end
M2:
begin
if(coun_y)
begin
coun_y = coun_y-4'b0001;
puls_y = 1'b1;
state_y = S3;
end
end
M3:
begin
puls_y = 1'b0;
state_y = S0;
end
default: puls_y =1'bZ;
endcase
end
end
endmodule
下面为仿真效果
(原文件名:fz.JPG) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|