FPGA与单片机之间的通信

2019-03-25 09:11发布

想通过9根线实现单片机与fpga之间的通信,一根是时钟线,8根数据线,来一个时钟,单片机把p0口的八位数据传给fpga,结果发现fpga接到的数据不稳定 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
陈远明
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里面弄的一个握手协议例子,供参考

一周热门 更多>