在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1764|回复: 0

[求助] 关于uart接收模块的 奇偶校验的问题

[复制链接]
发表于 2021-4-7 22:13:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
代码如下:
`timescale 1 ns / 1 ns

module rcvr (dout,data_ready,framing_error,parity_error,rxd,clk16x,rst,rdn) ;

input rxd ;        /*数据接收端*/
input clk16x ;          /*采样时钟*/
input rst ;       /*复位信号,高电平有效*/
input rdn ;        /*数据接收使能,低电平有效*/
output [7:0] dout ;      /*数据输出*/
output data_ready ;      /*数据接收完毕标志位*/
output framing_error ;     /*帧错误标志位*/
output parity_error ;   /*校验位错误标志位*/

reg rxd1 ;
reg rxd2 ;
reg clk1x_enable ;
reg [3:0] clkdiv ;
reg [7:0] rsr ;
reg [7:0] rbr ;
reg [3:0] no_bits_rcvd ;

reg data_ready ;

reg parity ;
reg parity_error ;
reg framing_error ;

wire clk1x ;

assign dout = !rdn ? rbr : 8'bz ; /*在允许接收的情况下,输出接收到的数据,否则保持高阻态*/

/*下降沿捕获模块*/
always @(posedge clk16x or posedge rst)
begin
if (rst)
begin
rxd1 <= 1'b1 ;
rxd2 <= 1'b1 ;
end
else
begin
rxd1 <= rxd ;
rxd2 <= rxd1 ;
end
end

always @(posedge clk16x or posedge rst)
begin
if (rst)
clk1x_enable <= 1'b0;
else if (!rxd1 && rxd2) /*如果捕获到下降沿,则开始计数*/
clk1x_enable <= 1'b1 ;
else if (no_bits_rcvd == 4'b1100)
clk1x_enable <= 1'b0 ;
end

/*数据准备好标志位的控制模块*/
always @(posedge clk16x or posedge rst or negedge rdn)
begin
if (rst)
data_ready = 1'b0 ;
else if (!rdn)
data_ready = 1'b0 ;
else
if (no_bits_rcvd == 4'b1011)
data_ready = 1'b1 ;
end

/*计数模块,产生一个对clk16x进行16分频的时钟信号,用该信号的上升沿进行采样 */
always @(posedge clk16x or posedge rst)
begin
if (rst)
clkdiv = 4'b0000 ;
else if (clk1x_enable)
clkdiv = clkdiv +1 ;
end

assign clk1x = clkdiv[3] ;

/*对clk1x进行计数*/
always @(posedge clk1x or posedge rst or negedge clk1x_enable)
if (rst)
  no_bits_rcvd = 4'b0000;
else
  if (!clk1x_enable)
    no_bits_rcvd = 4'b0000 ;
  else
    no_bits_rcvd = no_bits_rcvd + 1 ;

/*采样进程*/
always @(posedge clk1x or posedge rst)
if (rst)
begin
rsr <= 8'b0 ;
rbr <= 8'b0 ;
parity <= 1'b1 ;
parity_error = 1'b0 ;
end
else
begin
if (no_bits_rcvd >= 4'b0001 && no_bits_rcvd <= 4'b1001)
    begin
      rsr[0] <= rxd2 ;
      rsr[7:1] <= rsr[6:0] ; //数据左移
      parity <= parity ^ rsr[7] ; //校验位
    end
    else if (no_bits_rcvd == 4'b1010)
    begin
      rbr <= rsr ; //输出接收到的数据
    end
    else if (!parity)
      parity_error = 1'b1 ; //判断校验位是否正确
   else if ((no_bits_rcvd == 4'b1011) && (rxd2 != 1'b1))//判断是否收到停止位,否则给出帧错误信号
      framing_error = 1'b1 ;
    else framing_error = 1'b0 ;
    end
endmodule



在最后的采样进程块内,rsr[7:1] <= rsr[6:0] ; parity <= parity ^ rsr[7] ; 是不是有问题,这样的话 parity不是连续8次和0进行异或了么? 完全没有和 数据位进行异或啊!  改成 parity <= parity ^ rsr[0] 行不行啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-6 09:58 , Processed in 0.012203 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表