对于起始位的检测采用边沿检测法,在闲暇时,它一直都是高电平,当检测到低电平后又检测到高电平,这说明起始位来了,所以,要检测到低电平而后又转为高电平,就是起始位。
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
begin_sig_1 <= 1'b1;
begin_sig_2 <= 1'b1;
end
else
begin
begin_sig_1 <= rx_pin;
begin_sig_2 <= begin_sig_1;
end
assign rx_begin = begin_sig_2 & ~begin_sig_1;
起始位的检测,使产生bps的模块开始工作,当
assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0;
为1的时候,采集一位数据,
4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
if(pbs_ctrl_sig)
begin
rx_data[i-2] <= rx_pin;
i <= i + 1'b1;
end
同样,低位在前,高位在后。
至于奇偶校验位和停止位,咱就这样对待吧,它只能有限的交错,总感觉没啥用。
4'd10:
if(pbs_ctrl_sig)
i <= i + 1'b1;
4'd11:
if(pbs_ctrl_sig)
begin
i <= 4'b0;
ctrl <= 1'b0;
end
最后,有没有发现,我们发送方式是
起始位(0)+八位数据+奇偶校验+停止位
接收方式还是
起始位(0)+八位数据+奇偶校验+停止位
先发送给PC机的,PC机就先发送给下位机,也就是先进来的现出去。这个就是FIFO。做项目的时候总是用到这玩意。