邀请:@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
|