lhao2199 发表于 2012-4-19 18:54:02

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

FPGA主要用来做脉冲发生器用之,这里有很多的问题困扰着我,

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

zhangalex88 发表于 2012-4-19 21:24:11

问一些具体问题,别问大问题,相信有不少朋友会作解答的。

deweyled 发表于 2012-4-19 21:48:18

可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有待完善。

hansur 发表于 2012-4-19 21:56:21

在FPGA中实现一个带FIFO的8080端口和ARM通信就可以了

NJ8888 发表于 2012-4-19 22:03:26

SPI口方便

kenson 发表于 2012-4-19 22:09:50

我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉冲然后比例同步。

wye11083 发表于 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 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信号。

vlog_user 发表于 2012-4-19 22:42:40

呵呵,运动控制?

fpga_lab 发表于 2012-4-19 22:48:37

FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。

lhao2199 发表于 2012-4-20 22:39:53

回8楼,现在目前国内研究自动化行业比较热门,尤其是在机电一体化这块。举个很好的例子就是数控机床。

lhao2199 发表于 2012-4-20 22:42:08

fpga_lab 发表于 2012-4-19 22:48 static/image/common/back.gif
FPGA+ARM? 看来XILINX的那个zynx还是有市场的呀。

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

lhao2199 发表于 2012-4-20 22:46:37

deweyled 发表于 2012-4-19 21:48 static/image/common/back.gif
可以把FPGA挂在ARM的总线上,作为一个外部存储地址访问。
然后在FPGA内部做相对应的总线处理。
具体实现有 ...

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

dosomething 发表于 2012-4-20 23:56:50

kenson 发表于 2012-4-19 22:09 static/image/common/back.gif
我就做过相似的,如用CPLD+51来做同步比例控制。
其实就是51设定参数给CPLD,CPLD计数主马达编码器送来的脉 ...

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

aureole 发表于 2012-4-20 23:59:09

lhao2199 发表于 2012-4-20 22:46 static/image/common/back.gif
对,这个主要是挂在ARM的bank上。访问的FPGA是通过总线来访问。

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

xlwxdl1 发表于 2012-4-21 13:49:25

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写数据和读数据了。。
这种结构貌似就可以了。。。

simple_wyj 发表于 2012-4-27 19:12:09

标记一个,,暑假准备用FPGA做运动控制

shangdawei 发表于 2012-4-27 19:17:49

xlwxdl1 发表于 2012-4-21 13:49 static/image/common/back.gif
嗯,这种方法比较好,给FPGA一个CS一组addr一组data一个rd一个wr
always@(posedge wr) begin
      case( ...

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

xlwxdl1 发表于 2012-4-27 19:20:40

shangdawei 发表于 2012-4-27 19:17 static/image/common/back.gif
如果不是同一个时钟, 这样会有问题吗 ?

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

xlwxdl1 发表于 2012-4-27 19:22:28

shangdawei 发表于 2012-4-27 19:17 static/image/common/back.gif
如果不是同一个时钟, 这样会有问题吗 ?

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

shangdawei 发表于 2012-4-27 19:25:11

xlwxdl1 发表于 2012-4-27 19:20 static/image/common/back.gif
这个本来就是异步的。。低速通信用,1M左右基本没啥问题。。

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

wangshaosh123 发表于 2012-4-27 19:58:36

本帖最后由 wangshaosh123 于 2012-4-27 20:00 编辑

我这边差不多也是ARM+FPGAFPGA也发脉冲{:lol:}

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

xlwxdl1 发表于 2012-4-27 20:15:33

shangdawei 发表于 2012-4-27 19:25 static/image/common/back.gif
计划使用 STM32 和 FPGA 通过总线通讯, 想尽可能的快些, 不知道该如何处理.

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

shangdawei 发表于 2012-4-27 21:24:00

STM32 可以提供一个 FSMC_CLK 信号, 不过看图似乎还没有异步的快



281229961 发表于 2012-4-28 00:02:05

有兴趣~ 我也在用fpga做运动控制的

mage99 发表于 2012-5-7 12:55:49

fpga可是万能接口,直接看cpu那边那种通信方式适合你这个项目,fpga这边做接口协议就好了。

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

lhao2199 发表于 2012-5-7 21:34:31

ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互?

mage99 发表于 2012-5-19 13:14:00

lhao2199 发表于 2012-5-7 21:34 static/image/common/back.gif
ARM和FPGA之间是否需要做一个FIFO接口,在不同的总线速度间数据的交互?

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

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

cnzhoujin 发表于 2015-7-8 16:28:19

fpga+arm通信 verilog 有做源码的,贡献研究一下

芯天地 发表于 2015-11-9 20:20:45

专业用fpga做运动控制算法,做过A9+fpga运动控制器 做过PCI运动控制卡,四轴运动控制卡,包括各种插补算法的实现,编码器的读取,IO扩展,有兴趣的可以加我QQ:2401547092 了解哦。
页: [1]
查看完整版本: 有没有人做够ARM+FPGA自动控制的FPGA部分