281229961 发表于 2012-2-3 13:40:57

FPGA通信问题请求帮助。。

有个想法在实施过程中遇到坎了,悲剧了就。。。
想用fpga控制运动部分,ARM负责运算和界面。fpga和arm之间数据不多,但是要高速。

于是我想直接用总线方式控制,我只要在fpga内部建立几个内存空间就好,arm可以读写,fpga本身也可以读写,达到数据交换的目的。。。。我是用nios做的。

在编译程序的时候就悲剧了。

先奉上程序,现在只写了 arm写,nios总线读的部分 就出问题了

module ddram(
        reset_n,
        clk,
        chipselect,
        address,
        write,
        writedata,
        read,
        byteenable,
        readdata,
        wr,//arm写
        rd,//arm读
        datain,//数据
        addr,//地址
        ctr//片选
        );

input clk;
input reset_n;
input chipselect;
input address;
input write;
input writedata;
input read;
input byteenable;
output readdata;

input wr;
input rd;
input ctr;
input datain;
input addr;

reg x_reg;
reg y_reg;   
reg z_reg;
reg x_reg_selected;
reg y_reg_selected;
reg z_reg_selected;
reg readdata;


always @ (address)
begin
                      x_reg_selected<=0;
                      y_reg_selected<=0;
                      z_reg_selected<=0;
                      case(address)
                                 2'b00:x_reg_selected<=1;
                                 2'b01:y_reg_selected<=1;
                                 2'b10:z_reg_selected<=1;
                                  default:
                                       begin
                                                x_reg_selected<=0;
                                                y_reg_selected<=0;
                                                z_reg_selected<=0;
                                       end
                       endcase
end         

always @ (address or read or x_reg or y_reg or z_reg or chipselect)
    begin
          if(read & chipselect)
                    case(address)
                                2'b00:readdata<=x_reg;
                                2'b01:readdata<=y_reg;
                                2'b10:readdata<=z_reg;
                                default:readdata=32'h8888;
                  endcase       
end
       

       
always @ (posedge clk or negedge reset_n)
begin
                if(reset_n==1'b0)
                  begin
                                x_reg=32'h0000;
                                y_reg=32'h0000;
                                z_reg=32'h0000;
                  end
                else
                  begin
                                if(ctr==1'b0)
                                              if(wr==1'b0)
                                                                       case(addr)
                                                                                  4'b0000:x_reg= datain;
                                                                                  4'b0001:x_reg = datain;
                                                                                  4'b0010:x_reg= datain;
                                                                                  4'b0011:x_reg= datain;
                                                                                  4'b0100:y_reg= datain;
                                                                                  4'b0101:y_reg = datain;                                                                       
                                                                                  4'b0110:y_reg= datain;
                                                                                  4'b0111:y_reg= datain;
                                                                                  4'b1000:z_reg= datain;                                                       
                                                                                  4'b1000:z_reg = datain;                                                       
                                                                                  4'b1000:z_reg= datain;
                                                                                  4'b1000:z_reg= datain;                                                       
                                                                                  default:
                                                                                         begin
                                                                                                 x_reg=32'h8888;
                                                                                                 y_reg=32'h8888;
                                                                                                 z_reg=32'h8888;
                                                                                        end
                                                                       endcase       

                        end
end      
endmodule



在加入软核的时候报错如下
http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_715783JC0LM2.jpg
(原文件名:报错.jpg)

不知道如何解决了。。。

nono2000 发表于 2012-2-3 23:12:39

你的 SOPC 是定義有錯,少很多東西。
      
      s_irq,
      s_chipselect_n,
      s_read_n,
      s_write_n,
      s_address,
      s_readdata,
      s_writedata,
      
   
      m_waitrequest,   //表示無法接受新的讀寫操作
      m_address,       //讀寫操作的位址
      m_read,          //讀信號
      m_readdata,      //讀出去的資料
      m_write,         //寫信號
      m_writedata,   //寫進來的數據
      m_byteenable,    //位元組有效信號
      m_burstcount,    //顯示需要burst的資料數量
      m_readdatavalid, //返回資料有效信號

一般使用 ARM 與 FPGA溝通就好,NIOS II 有仲裁機制增加自己問題多。
页: [1]
查看完整版本: FPGA通信问题请求帮助。。