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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2557|回复: 4

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

[复制链接]
发表于 2021-4-8 08:51:34 | 显示全部楼层 |阅读模式
3资产
代码如下:
`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] 行不行啊

最佳答案

查看完整内容

你的理解是对的,数据左移的话,应该是与[0]进行异或。
发表于 2021-4-8 08:51:35 | 显示全部楼层
你的理解是对的,数据左移的话,应该是与[0]进行异或。
 楼主| 发表于 2021-4-9 15:01:11 | 显示全部楼层


kk2009 发表于 2021-4-9 03:45
你的理解是对的,数据左移的话,应该是与[0]进行异或。


多谢大佬
 楼主| 发表于 2021-4-9 15:02:00 | 显示全部楼层


kk2009 发表于 2021-4-9 03:45
你的理解是对的,数据左移的话,应该是与[0]进行异或。


大佬能指点下,数字设计类的要学什么么
发表于 2021-4-9 22:23:47 | 显示全部楼层


weizqsocool 发表于 2021-4-9 15:02
大佬能指点下,数字设计类的要学什么么


先学习基本语法。
然后理解语法verilog/vhdl 描述的模块,对应的综合后电路。

再学习一些算法,协议,通过硬件描述语言实现对应的算法和协议。

算法的话,可以学习学习简单的滤波算法,协议的话,从i2c, spi和uart开始。

再之后就是学习高速接口相关的设计。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 08:47 , Processed in 0.017423 second(s), 7 queries , Gzip On, Redis On.

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