专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
FPGA与单片机之间的通信
2019-03-25 09:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
FPGA
2314
9
1289
想通过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里面弄的一个握手协议例子,供参考
加载中...
查看其它9个回答
一周热门
更多
>
相关问题
相关文章
基于FPGA的详细设计流程
0个评论
Xilinx的FPGA开发工具——ISE开发流程
0个评论
嵌入式领域,FPGA的串口通信接口设计,VHDL编程,altera平台
0个评论
干货分享,FPGA硬件系统的设计技巧
0个评论
你知道Verilog HDL程序是如何构成的吗
0个评论
一种通过FPGA对AD9558时钟管理芯片进行配置的方法
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/*该实例的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里面弄的一个握手协议例子,供参考
一周热门 更多>