484|2

48

帖子

0

TA的资源

一粒金砂(中级)

看不懂这个汉明码 解码器代码? [复制链接]

邀请:@chenzhufly   参与回复

疑惑如红色字体注释,非常需要大家的帮助,谢谢了。

 

module Vrhamcorr64(DU, DC, NOERROR, UCERR);
  input [71:0] DU;
  output reg [71:0] DC;
  output reg NOERROR, UCERR;
  integer syndrome [0:255];
  
  reg [71:0] C [1:8];    // Constants for parity-check matrix
  integer b, e, i, col;
  reg [7:0] syn;
  reg [7:0] SYND;

initial begin
  C[1] = 72'h80000000000000007f; C[2] = 72'h400000003fffffff80;                          C应该是校验矩阵
  C[3] = 72'h20001fffc0007fff80; C[4] = 72'h100fe03fc07f807f80;
  C[5] = 72'h0871e3c3c78787878f; C[6] = 72'h04b66cccd9999999b3;
  C[7] = 72'h02dab5556aaaaaaad5; C[8] = 72'hffffffffffffffffff;
  for (i=0; i<=255; i=i+1) syndrome[i] = -1; // Initialize syndrome array to invalid       syndrome是一个变量么?比如说和输入A,B差不多,但是syndrome有syndrome[i],syndrome[syn],syndrome[SYND],一般来说变量位数是固定的,不懂为什么syndrome有3种?=-1也不是很理解。
  for (col=0; col<=71; col=col+1) begin // Populate valid syndromes                       不是很懂initial语句,定义常数矩阵如上面那样列出来应该可以了吧,而且涉及的变量也很多,不知道这两个for语句是拿来干嘛的?
    for (e=1; e<=8; e=e+1) syn[8-e] = C[e][col];                                                         没见过变量后面跟两个[],不知道是什么东东?                            
    syndrome[syn] = col;                                                                                             syndrome[syn]和syndrome[syn]有什么关系么,下面的语句好像没用到syndrome[syn]?
 
end
end

always @ (DU) begin
  DC = DU;
  for (b=0; b<=7; b=b+1) SYND[b] = ^(C[8-b] & DU);  // Calculate received syndrome                             应该是输出码字*校验矩阵,然后异或,得出8个等于0的等式
    NOERROR = 1'b1; UCERR = 1'b0;         // Default values, no errors
    if (SYND[7:0]==8'b0) ;                                                     // No errors
    else if (syndrome[SYND]<0) begin NOERROR = 1'b0; UCERR = 1'b1; end         // Uncorrectable     对syndrome已经懵圈,二进制计算怎么会<0呢?虽然说上面那个是定义=-1。如果纠不了错,应该是出现2位以上的错,SYND[]出现了和1位出错一样的数(或者说是SYND[]还是等于0),这条语句是怎么分辨出是1位出错还是多位出错的?
    else if (SYND[0]!=1'b1) begin NOERROR = 1'b0; UCERR = 1'b1; end            // Uncorrectable          SYND[0]应该是全奇偶校验位,=1的时候只能指示每一位都可能是出错位,但不能纠错
    else begin NOERROR = 1'b0;  DC[syndrome[SYND]] = ~DU[syndrome[SYND]]; end  // Correctable剩下应该是其他1位出错的,找到出错位然后按位取反纠错。
  end
endmodule

最新回复

纠一位出错可以理解,else if (syndrome[SYND]<0) begin NOERROR = 1'b0; UCERR = 1'b1; end         // Uncorrectable你帮忙看一下这条语句是怎么分辨出是非1位出错的,因为SYND计算我觉得是不可能=-1的,说一下具体流程。   详情 回复 发表于 2023-3-22 14:24

回复

3985

帖子

0

TA的资源

版主

汉明码很久以前明白过

verlong稍微懂一点

点评

纠一位出错可以理解,else if (syndrome[SYND]<0) begin NOERROR = 1'b0; UCERR = 1'b1; end         // Uncorrectable你帮忙看一下这条语句是怎么分辨出是非1位出错的,因为SYND计算  详情 回复 发表于 2023-3-22 14:24

回复

48

帖子

0

TA的资源

一粒金砂(中级)

huo_hu 发表于 2023-3-22 13:36 汉明码很久以前明白过 verlong稍微懂一点

纠一位出错可以理解,else if (syndrome[SYND]<0) begin NOERROR = 1'b0; UCERR = 1'b1; end         // Uncorrectable你帮忙看一下这条语句是怎么分辨出是非1位出错的,因为SYND计算我觉得是不可能=-1的,说一下具体流程。


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/5 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表