有没有人做够ARM+FPGA自动控制的FPGA部分
FPGA主要用来做脉冲发生器用之,这里有很多的问题困扰着我,希望与高手多多交流指教。 问一些具体问题,别问大问题,相信有不少朋友会作解答的。 可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有待完善。 在FPGA中实现一个带FIFO的8080端口和ARM通信就可以了
SPI口方便 我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉冲然后比例同步。 本帖最后由 wye11083 于 2012-4-19 22:37 编辑
Hi,我已经实现了一个命令控制器模块,支持输入输出指令,8位数据,1位Probe。输入格式:
D15--Direction,0:Host->Device,1:Device->Host(Only valid when Probe=1),
D14-D8--Command,
D7-D0--Data.
所有操作都是同步操作。所有Probe信号均保持一个周期,或者仅在一个周期有效。
module CPUIO_CommandControl(
input int_in_GCLK,
input int_in_GRST,
inout port_io_FIFOD,
input port_in_DIN,
output int_out_FIFOD,
output int_out_Cmd_Valid,
output int_out_Cmd_Is_Read,
input int_in_Data_Out,
input int_in_Data_Latch_Valid
);
// Use DIN (PA0) as input trigger. Whenever a rising transition occurs on DIN,
// Latch FIFO and send command.
// For the first cycle of DIN high, load command and data in. For the second cycle,
// if command is Read, then output data; else load as usual.
reg r_port_io_FIFOD = 16'h0000;
wire w_CommandIsRead = r_port_io_FIFOD;
reg r_port_io_FIFOD_Output = 16'h0000;
reg r_port_in_DIN_delay;
wire w_port_in_DIN_Edge = ^r_port_in_DIN_delay;
reg rs_FIFOD_Command;
reg r_FIFOD_Output_Enable;
assign port_io_FIFOD = (port_in_DIN & w_CommandIsRead & r_FIFOD_Output_Enable)?r_port_io_FIFOD_Output:'bz;
reg r_Command_Input_Ready;
assign int_out_FIFOD = r_port_io_FIFOD;
assign int_out_Cmd_Valid = r_Command_Input_Ready;
assign int_out_Cmd_Is_Read = w_CommandIsRead;
// r_Command_Input_Ready and r_port_io_FIFOD is INPUT.
// r_port_io_FIFOD_Output is OUTPUT.
// OUTPUT is valid only when previously command is READ command.
always @(posedge int_in_GCLK or negedge int_in_GRST)
begin
if(~int_in_GRST)
begin
r_port_io_FIFOD <= 16'h0000;
r_port_in_DIN_delay <= 0;
rs_FIFOD_Command <= 0;
r_Command_Input_Ready <= 0;
r_FIFOD_Output_Enable <= 0;
end
else
begin
r_port_in_DIN_delay <= {r_port_in_DIN_delay,port_in_DIN};
if(int_in_Data_Latch_Valid)
r_port_io_FIFOD_Output <= int_in_Data_Out;
else
r_port_io_FIFOD_Output <= r_port_io_FIFOD_Output;
case (rs_FIFOD_Command)
0:
begin
// State is input default.
if(w_port_in_DIN_Edge & r_port_in_DIN_delay)
begin
r_port_io_FIFOD <= port_io_FIFOD;
r_Command_Input_Ready <= 1;
rs_FIFOD_Command <= 1;
end
else
begin
r_Command_Input_Ready <= 0;
end
end
1:
begin
r_Command_Input_Ready <= 0;
// Jump on falling edge of DIN
if(w_port_in_DIN_Edge & ~r_port_in_DIN_delay & w_CommandIsRead)
begin
rs_FIFOD_Command <= 2;
r_FIFOD_Output_Enable <= 1;
end
else if(w_port_in_DIN_Edge & ~r_port_in_DIN_delay)
rs_FIFOD_Command <= 0;
else
rs_FIFOD_Command <= rs_FIFOD_Command;
end
2:
begin
// Read operation.
if(w_port_in_DIN_Edge & ~r_port_in_DIN_delay)
begin
rs_FIFOD_Command <= 0;
r_port_io_FIFOD <= 0;
r_FIFOD_Output_Enable <= 0;
end
else
begin
rs_FIFOD_Command <= rs_FIFOD_Command;
end
end
default:
rs_FIFOD_Command <= 0;
endcase
end
end
endmodule
这个模块是从顶模块中抠出来下放的,为了保持顶层模块简洁,所以没有单独的TestBench。就简单说下吧,DIN一般为低,当输入时,D15置0,后面命令等等置好,然后DIN拉高,再拉低,则命令/数据就载入了。如果要输出,D15置1,然后置命令和数据,然后DIN拉高,拉低(完成第一步,输入命令)。只要这个命令接收到(DIN上升沿有效),FPGA后面应该处理命令,并且置int_in_Data_Out数据,且置int_in_Data_Latch_Valid为1(1个周期)。当第二个周期时,DIN拉高,就可以从FPGA中读数据了,然后DIN拉低,一个读周期完成,FPGA自动进入写命令周期。
即写周期:D15置0,然后DIN拉高再拉低;
读周期:D15置1,然后DIN拉高再拉低,然后置单片机IO为输入,DIN拉高,读数据,DIN再拉低。目前上板正常工作,且顺利接驳I2C模块读写。
有一点要注意,这个port_开头的信号都是连FPGA管脚的信号,int_开头的都是连的内部信号。inout可以直接连内部模块,只要连的是port_io信号。 呵呵,运动控制? FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。 回8楼,现在目前国内研究自动化行业比较热门,尤其是在机电一体化这块。举个很好的例子就是数控机床。 fpga_lab 发表于 2012-4-19 22:48 static/image/common/back.gif
FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。
绝对了,类似的还有ACTEL,也出了芯片 deweyled 发表于 2012-4-19 21:48 static/image/common/back.gif
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有 ...
对,这个主要是挂在ARM的bank上。访问的FPGA是通过总线来访问。 kenson 发表于 2012-4-19 22:09 static/image/common/back.gif
我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉 ...
能扣出关键部分跟我们分享一下吗? lhao2199 发表于 2012-4-20 22:46 static/image/common/back.gif
对,这个主要是挂在ARM的bank上。访问的FPGA是通过总线来访问。
可以参考我的《iboard 电子学堂》啊 deweyled 发表于 2012-4-19 21:48 static/image/common/back.gif
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有 ...
嗯,这种方法比较好,给FPGA一个CS一组addr一组data一个rd一个wr
always@(posedge wr) begin
case({cs,arm_addr})
9'h0xx : reg <= arm_data;
.............
endcase
end
always * begin
read_reg = ‘h00;
case({cs,arm_addr})
9'h0xx : read_reg =reg ;
.................
endcase
end
assignarm_data =((!cs)&&(!rd)) ? read_reg: 'hxxxx;
用reg 和read_reg就可以实现arm给fpga写数据和读数据了。。
这种结构貌似就可以了。。。 标记一个,,暑假准备用FPGA做运动控制 xlwxdl1 发表于 2012-4-21 13:49 static/image/common/back.gif
嗯,这种方法比较好,给FPGA一个CS一组addr一组data一个rd一个wr
always@(posedge wr) begin
case( ...
如果不是同一个时钟, 这样会有问题吗 ? shangdawei 发表于 2012-4-27 19:17 static/image/common/back.gif
如果不是同一个时钟, 这样会有问题吗 ?
这个本来就是异步的。。低速通信用,1M左右基本没啥问题。。 shangdawei 发表于 2012-4-27 19:17 static/image/common/back.gif
如果不是同一个时钟, 这样会有问题吗 ?
主要是靠CS ,wr,rd时序来控制。然后到FPGA内部把这个接口的数据转成你想用的时钟域就可以了。 xlwxdl1 发表于 2012-4-27 19:20 static/image/common/back.gif
这个本来就是异步的。。低速通信用,1M左右基本没啥问题。。
计划使用 STM32 和 FPGA 通过总线通讯, 想尽可能的快些, 不知道该如何处理. 本帖最后由 wangshaosh123 于 2012-4-27 20:00 编辑
我这边差不多也是ARM+FPGAFPGA也发脉冲{:lol:}
ARM11的出来是16位的总线跟FPGA通信
然后FPGA上做个FIFO来定时发脉冲!@ shangdawei 发表于 2012-4-27 19:25 static/image/common/back.gif
计划使用 STM32 和 FPGA 通过总线通讯, 想尽可能的快些, 不知道该如何处理.
那就再给个时钟做成同步总线。速度就能上去了。 STM32 可以提供一个 FSMC_CLK 信号, 不过看图似乎还没有异步的快
有兴趣~ 我也在用fpga做运动控制的 fpga可是万能接口,直接看cpu那边那种通信方式适合你这个项目,fpga这边做接口协议就好了。
arm的话 9263 双总线,一般是挂sram做显存用,你可以把fpga挂在扩展总线上就ok了。~ ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互? lhao2199 发表于 2012-5-7 21:34 static/image/common/back.gif
ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互?
这个要看的系统处理时钟了。
fifo主要是解决跨时钟域问题。
说白了就是快慢时钟间的缓冲 fpga+arm通信 verilog 有做源码的,贡献研究一下 专业用fpga做运动控制算法,做过A9+fpga运动控制器 做过PCI运动控制卡,四轴运动控制卡,包括各种插补算法的实现,编码器的读取,IO扩展,有兴趣的可以加我QQ:2401547092 了解哦。
页:
[1]