题解 | #奇偶校验#

奇偶校验

https://www.nowcoder.com/practice/67d4dd382bb44c559a1d0a023857a7a6

always@(*)和assign的区别区别

  • always@()中的表示敏感列表由所有输入信号组成,也就是说只有当输入信号发生变化时,always块内的语句才会执行。assign则是一种连续赋值语句,不需要敏感列表,只要右边的表达式发生变化,就会驱动左边的信号。
  • always@(*)块内的语句是顺序执行的,也就是说先执行的语句可能会影响后执行的语句。assign则是并行执行的,也就是说所有的赋值语句都是同时发生的,不会相互影响。
  • always@(*)块内的信号需要定义为reg类型,而assign赋值的信号需要定义为wire类型。这里的reg并不一定表示寄存器,而是一种可变的数据类型。wire则表示一种连线或者网表。

奇偶校验的原理、作用以及应用:场合

奇偶校验是一种在网络通信中检测数据传输是否准确的方法,它使用一个奇偶位来保证数据中的1的个数是偶数或奇数。奇偶校验有两种变体:偶校验和奇校验。在偶校验中,奇偶位保证数据中的1的个数是偶数,如果是奇数,就在数据末尾加上一个1的奇偶位。在奇校验中,奇偶位保证数据中的1的个数是奇数,如果是偶数,就在数据末尾加上一个1的奇偶位。

奇偶校验的作用是在数据传输过程中发现一些简单的错误,例如电气噪声导致的位翻转。当接收方收到数据时,它会检查数据中的1的个数是否符合预先约定的奇偶性,如果不符合,就说明数据有误,可以要求重传或者采取其他纠错措施。

奇偶校验的应用场合主要是一些低速或者低容错要求的通信协议,例如串行通信、RS-232、UART等。奇偶校验也可以用于RAID中作为一种冗余保护,通过在多个磁盘上写入额外的奇偶信息来恢复出错的数据。但是奇偶校验不能检测出一些复杂的错误,例如两个或多个位同时发生翻转,或者数据被篡改或丢失。因此,在一些高速或者高可靠性要求的通信协议中,通常使用更高级的错误检测和纠正方法,例如循环冗余校验(CRC)、海明码、里德-所罗门码等。

解题思路:

写出奇偶检测的结果,对比check的结果

发现,当sel为高时,check输出奇偶检测的结果,当sel为高时,check输出奇偶检测结果取反

`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire odd;
assign odd = ^bus;

reg check;
always@(*)begin
    if(sel==1'b1)
        check = odd;
    else
        check = ~odd;
end
//*************code***********//
endmodule
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire odd;
assign odd = ^bus;
assign check = sel ? odd : ~odd;
//*************code***********//
endmodule

全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务