FPGA与单片机之间的通信

2019-03-25 09:11发布

想通过9根线实现单片机与fpga之间的通信,一根是时钟线,8根数据线,来一个时钟,单片机把p0口的八位数据传给fpga,结果发现fpga接到的数据不稳定 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
tx_xy
1楼-- · 2019-03-25 14:57
< / fpga与单片机之间这么通信  一点技术含量都没有  极度不推荐 。。。

fpga内部例化一个小ram, 把fpga当做单片机的一个外设 通过地址 数据总线访问fpga  从而达到两者通讯的目的 。。。

当然楼主现在的问题,我个人感觉应该是同步异步没有处理好的原因 。

把同步的问题考虑好 应该没问题 。。。
swfc_qinmm
2楼-- · 2019-03-25 19:50
嗯,异步时钟域的同步问题应该考虑……
eeleader
3楼-- · 2019-03-26 00:15

正确实现这个通信,有几点需要注意;

  1. 正确操作双向数据总线;

  2. FPGA对单片机的输入信号都要做同步处理;

  3. 要设计正确的通信机制(协议);

yanjin
4楼-- · 2019-03-26 00:34
 精彩回答 2  元偷偷看……
陈远明
5楼-- · 2019-03-26 06:09
你这样做的话,应该以脉冲的形式作为握手信号,例如mcu先把第一个数据送到P0端口,然后发一个脉冲给FPGA,如果FPGA检测到这个脉冲的上升沿就接收端口上的数据,然后发信号给MCU表示接收了数据,可以发下一个数据了,但你也可以做一个握手协议,这样更方便,数据不稳定,可能是电平的问题:

/*该实例的Verilog代码模拟了握手通信的接受域,在发送域请求信号(req)有效地若干个时钟周期后,先是数据(datain)被有效锁存在输出(dataout)上,然后接收域的应答信号(ack)也处于有效状态,此后发送域撤销请求信号接收域也跟着撤销了应答信号,由此完成了一次通信

*/
module handshack(
                   clk,rst_n,
                   reg,datain,ack,dataout
                );
input clk;
input rst_n;

input reg;           //请求信号,高电平有效
input [7:0] datain;  //输入数据
output ack;          //应答信号,高电平有效
output[7:0] dataout; //输出数据,主要用于观察是否和输入一致

//-------------------------------------------------------------

//req 上升沿检测
reg reqr1,reqr2,reqr3;
always@(posedge clk or negedge rst_n)
if(!rst_n) begin
        reqr1 <= 1'b1 ;
        reqr2 <= 1'b1 ;
        reqr3 <= 1'b1 ;
end
else begin
        reqr1 <= req ;
        reqr2 <= reqr1 ;
        reqr3 <= reqr2 ;
end

//pos_req2比pos_req1延时一个时钟周期,确保数据被稳定锁存
wire pos_req1 = reqr1 & ~reqr2;    //req 上升沿标志位,高有效一个时钟周期
wire pos_req2 = reqr2 &  ~reqr3;    //req 上升沿标志位,高有效一个时钟周期

//-------------------------------------------------------------------------
//数据锁存

reg[7:0] dataoutr;

alway@(posedge clk or negedge rst_n)
  if(!rst_n) dataoutr <= 8'h00;
      else if (pos_req1)  dataoutr <= datain;   //检测到req 有效后锁存输入数据

         assign  dataout = dataoutr;
//-----------------------------------------
//产生应答信号SCK


reg ackr;
always@( posedge clk or negedge rst_n)
  if(!rst_n) ackr <= 1'b0;
  else if(pos_req2) ackr <= 1'b1;
  else if(!reg) ackr <= 1'b0;

assign ack =ackr;

endmodule

这个是特权同学深入浅出FPGA里面弄的一个握手协议例子,供参考
gz475514589
6楼-- · 2019-03-26 09:28
我是觉得楼主的通信更像:在FPGA中是一个状态机,单片机的P0口给FPGA发送不不同的状态,fpga去在做各个状态下做的事情,不算是真正意义上的通信、

一周热门 更多>