搜索
bottom↓
回复: 28

有没有人做够ARM+FPGA自动控制的FPGA部分

[复制链接]

出0入0汤圆

发表于 2012-4-19 18:54:02 | 显示全部楼层 |阅读模式
FPGA主要用来做脉冲发生器用之,这里有很多的问题困扰着我,

希望与高手多多交流指教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-4-19 21:24:11 | 显示全部楼层
问一些具体问题,别问大问题,相信有不少朋友会作解答的。

出0入0汤圆

发表于 2012-4-19 21:48:18 | 显示全部楼层
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有待完善。

出0入0汤圆

发表于 2012-4-19 21:56:21 | 显示全部楼层
在FPGA中实现一个带FIFO的8080端口和ARM通信就可以了

出0入0汤圆

发表于 2012-4-19 22:03:26 | 显示全部楼层
SPI口方便

出0入0汤圆

发表于 2012-4-19 22:09:50 | 显示全部楼层
我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉冲然后比例同步。

出0入442汤圆

发表于 2012-4-19 22:36:02 | 显示全部楼层
本帖最后由 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 [15:0] port_io_FIFOD,
    input port_in_DIN,
    output [15:0] int_out_FIFOD,
    output int_out_Cmd_Valid,
    output int_out_Cmd_Is_Read,
        input [15:0] 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 [15:0] r_port_io_FIFOD = 16'h0000;
        wire w_CommandIsRead = r_port_io_FIFOD[15];
       
        reg [15:0] r_port_io_FIFOD_Output = 16'h0000;
       
        reg [1:0] r_port_in_DIN_delay;
        wire w_port_in_DIN_Edge = ^r_port_in_DIN_delay;
       
        reg [1:0] 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[0],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[0])
                                                                        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[0] & 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[0])
                                                                        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[0])
                                                                        begin
                                                                                rs_FIFOD_Command <= 0;
                                                                                r_port_io_FIFOD[15] <= 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信号。

出0入0汤圆

发表于 2012-4-19 22:42:40 | 显示全部楼层
呵呵,运动控制?

出0入0汤圆

发表于 2012-4-19 22:48:37 | 显示全部楼层
FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。

出0入0汤圆

 楼主| 发表于 2012-4-20 22:39:53 | 显示全部楼层
回8楼,现在目前国内研究自动化行业比较热门,尤其是在机电一体化这块。举个很好的例子就是数控机床。

出0入0汤圆

 楼主| 发表于 2012-4-20 22:42:08 | 显示全部楼层
fpga_lab 发表于 2012-4-19 22:48
FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。

绝对了,类似的还有ACTEL,也出了芯片

出0入0汤圆

 楼主| 发表于 2012-4-20 22:46:37 | 显示全部楼层
deweyled 发表于 2012-4-19 21:48
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有 ...

对,这个主要是挂在ARM的bank上。访问的FPGA是通过总线来访问。

出0入0汤圆

发表于 2012-4-20 23:56:50 | 显示全部楼层
kenson 发表于 2012-4-19 22:09
我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉 ...

能扣出关键部分跟我们分享一下吗?

出0入0汤圆

发表于 2012-4-20 23:59:09 | 显示全部楼层
lhao2199 发表于 2012-4-20 22:46
对,这个主要是挂在ARM的bank上。访问的FPGA是通过总线来访问。

可以参考我的《iboard 电子学堂》啊

出0入0汤圆

发表于 2012-4-21 13:49:25 | 显示全部楼层
deweyled 发表于 2012-4-19 21:48
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有 ...

嗯,这种方法比较好,给FPGA一个CS一组addr一组data一个rd一个wr
always@(posedge wr) begin
      case({cs,arm_addr[7:0]})
         9'h0xx : reg   <=    arm_data;
          .............
     endcase
end

always *   begin
       read_reg = ‘h00;
       case({cs,arm_addr[7:0]})
         9'h0xx : read_reg   =  reg   ;
        .................
        endcase
end

assign  arm_data =  ((!cs)&&(!rd)) ? read_reg  : 'hxxxx;
用reg 和read_reg就可以实现arm给fpga写数据和读数据了。。
这种结构貌似就可以了。。。

出0入0汤圆

发表于 2012-4-27 19:12:09 | 显示全部楼层
标记一个,,暑假准备用FPGA做运动控制

出0入0汤圆

发表于 2012-4-27 19:17:49 | 显示全部楼层
xlwxdl1 发表于 2012-4-21 13:49
嗯,这种方法比较好,给FPGA一个CS一组addr一组data一个rd一个wr
always@(posedge wr) begin
      case( ...

如果不是同一个时钟, 这样会有问题吗 ?

出0入0汤圆

发表于 2012-4-27 19:20:40 | 显示全部楼层
shangdawei 发表于 2012-4-27 19:17
如果不是同一个时钟, 这样会有问题吗 ?

这个本来就是异步的。。低速通信用,1M左右基本没啥问题。。

出0入0汤圆

发表于 2012-4-27 19:22:28 | 显示全部楼层
shangdawei 发表于 2012-4-27 19:17
如果不是同一个时钟, 这样会有问题吗 ?

主要是靠CS ,wr,rd时序来控制。然后到FPGA内部把这个接口的数据转成你想用的时钟域就可以了。

出0入0汤圆

发表于 2012-4-27 19:25:11 | 显示全部楼层
xlwxdl1 发表于 2012-4-27 19:20
这个本来就是异步的。。低速通信用,1M左右基本没啥问题。。

计划使用 STM32 和 FPGA 通过总线通讯, 想尽可能的快些, 不知道该如何处理.

出0入0汤圆

发表于 2012-4-27 19:58:36 | 显示全部楼层
本帖最后由 wangshaosh123 于 2012-4-27 20:00 编辑

我这边差不多  也是ARM+FPGA  FPGA也发脉冲

ARM11的出来是16位的总线  跟FPGA通信
然后FPGA上做个FIFO来定时发脉冲!@

出0入0汤圆

发表于 2012-4-27 20:15:33 | 显示全部楼层
shangdawei 发表于 2012-4-27 19:25
计划使用 STM32 和 FPGA 通过总线通讯, 想尽可能的快些, 不知道该如何处理.

那就再给个时钟做成同步总线。速度就能上去了。

出0入0汤圆

发表于 2012-4-27 21:24:00 | 显示全部楼层
STM32 可以提供一个 FSMC_CLK 信号, 不过看图似乎还没有异步的快



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-28 00:02:05 来自手机 | 显示全部楼层
有兴趣~ 我也在用fpga做运动控制的

出0入0汤圆

发表于 2012-5-7 12:55:49 | 显示全部楼层
fpga可是万能接口,直接看cpu那边那种通信方式适合你这个项目,fpga这边做接口协议就好了。

arm的话 9263 双总线,一般是挂sram做显存用,你可以把fpga挂在扩展总线上就ok了。~

出0入0汤圆

 楼主| 发表于 2012-5-7 21:34:31 | 显示全部楼层
ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互?

出0入0汤圆

发表于 2012-5-19 13:14:00 | 显示全部楼层
lhao2199 发表于 2012-5-7 21:34
ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互?

这个要看的系统处理时钟了。
fifo主要是解决跨时钟域问题。

说白了就是快慢时钟间的缓冲

出0入0汤圆

发表于 2015-7-8 16:28:19 | 显示全部楼层
fpga+arm通信 verilog 有做源码的,贡献研究一下

出0入0汤圆

发表于 2015-11-9 20:20:45 | 显示全部楼层
专业用fpga做运动控制算法,做过A9+fpga运动控制器 做过PCI运动控制卡,四轴运动控制卡,包括各种插补算法的实现,编码器的读取,IO扩展,有兴趣的可以加我QQ:2401547092 了解哦。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 05:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表