2019-03-25 09:11发布
正确实现这个通信,有几点需要注意;
1. 正确操作双向数据总线;
2. FPGA对单片机的输入信号都要做同步处理;
3. 要设计正确的通信机制(协议);
最多设置5个标签!
fpga内部例化一个小ram, 把fpga当做单片机的一个外设 通过地址 数据总线访问fpga 从而达到两者通讯的目的 。。。
当然楼主现在的问题,我个人感觉应该是同步异步没有处理好的原因 。
把同步的问题考虑好 应该没问题 。。。
正确实现这个通信,有几点需要注意;
1. 正确操作双向数据总线;
2. FPGA对单片机的输入信号都要做同步处理;
3. 要设计正确的通信机制(协议);
/*该实例的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里面弄的一个握手协议例子,供参考
一周热门 更多>