微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于在FPGA上实现串口通信的问题

关于在FPGA上实现串口通信的问题

时间:10-02 整理:3721RD 点击:
在特权同学的代码中(接收模块)出现了这么一段代码always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
rs232_rx0 <= 1'b0;
rs232_rx1 <= 1'b0;
rs232_rx2 <= 1'b0;
rs232_rx3 <= 1'b0;
end
else begin
rs232_rx0 <= rs232_rx;
rs232_rx1 <= rs232_rx0;
rs232_rx2 <= rs232_rx1;
rs232_rx3 <= rs232_rx2;
end
end
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;
他是怎么实现数据线接收到下降沿的

neg_rs232_rx =  rs232_rx2 & ~rs232_rx1;
rs232_rx3 和 rs232_rx2 是相等的。

老范你好,这个我最近也看了,我认为他写错了,你觉得呢?   似乎是这样的
f(!rst_n) begin
rs232_rx0 <= 1'b1;
rs232_rx1 <= 1'b1;
rs232_rx2 <= 1'b1;
rs232_rx3 <= 1'b1;
end
else begin
rs232_rx0 <= rs232_rx;
rs232_rx1 <= rs232_rx0;
rs232_rx2 <= rs232_rx1;
rs232_rx3 <= rs232_rx2;
end
end
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 &rs232_rx1 & ~rs232_rx0;

加我QQ94465924  大家讨论一下



回复 4# 元合羽 [attach]581979[/attach]
复位时初始值可以为0;你的公式assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & rs232_rx1 & ~rs232_rx0是对的。特权那个可能打错啦。我验证过



用他的代码,发送数据后显示一直在接受数据,这是为什么?

他代码理论上是对的,而且传递出一种延时抗干扰的效果,但这样写出来的串口程序,对于延时抗干扰意义不大,如果是16倍或者是8倍过采样,他写的两拍根本不能达到延时判断的效果,至少是5拍。
对于串口的采样时钟,肯定不可能是波特率的原频率或者是波特率2倍频,一般是8倍或者16倍,甚至更高,所以他的语句
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 &~rs232_rx1 & ~rs232_rx0;
当一个下降沿到来时,低电平最早被寄存到rs232_rx0里,然后下一个时钟被寄存器到rs232_rx1 里,但前面的rs232_rx3 和rs232_rx2还是高电平状态,所以这个assign的结果是1,代表产生下降沿,特权为何想判断rs232_rx1 和rs232_rx0同时为0呢? 如我前面所说,采样时钟一般是8倍或者是16倍,这么快的时钟,面对对面uart起始位的低电平持续时间,即使是rs232_rx3 为0 了,rs232_rx0还是为0的,特权只是想看看这个低电平是不是瞬间干扰,于是用两拍为低来判断下降沿,不过真的意义不大,uart如果因为干扰电平误触发了,这两拍0也察觉不出来

上一篇:请教个方案
下一篇:ISE 如何实现8倍频

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top