模2除法

 这或许是一个简单的问题,但是我早就忘记咋解了。

关于一个二进制数1111000 除以1101,模2除法的商为1011,余数为111.这个结果不同于十进制除法。所以特记下。具体步骤如下:

模2除法,参考了下网络资源。最后得到的结论。不知道是正确与否。

模2除法可以用在CRC冗余校验上。K,H均为2进制数,K向左移R,然后K除以H。模2除得到的余数在放到R位中。例如:K=1111,H=1101,R=3,移位之后得1111000,最后CRC=1111111。

 

### BCH 2除法 Verilog 实现 #### 1. 基本概念 BCH码是一种线性分组纠错码,其编码过程涉及2除法运算。2除法是指在二进制域GF(2)上执行的除法操作,在此过程中不考虑借位和进位。 对于给定的数据序列D(x),通过生成多项式G(x)进行2除法计算得出余数R(x)[^1]。该余数作为冗余校验比特附加到原始数据之后形成完整的发送码字T(x)=Q(x)*G(x)+R(x)。 #### 2. Verilog实现要点 为了高效地完成这一任务,可以采用移位寄存器结构来拟长除法的过程: - 初始化时将输入消息加载至最高有效位端; - 对每一位做异或处理并右移一位直到全部处理完毕; - 最终得到的结果就是所需的CRC值; 以下是具体的Verilog代码示例以及解释说明: ```verilog module bch_encoder( input wire clk, input wire rst_n, // active low reset input wire start, // begin encoding process signal output reg ready, // indicates when encoder is done processing current data block input wire [DATA_WIDTH-1:0] message_bits, // original information bits to be encoded output reg [CHECKSUM_BITS-1:0] checksum // calculated CRC value as the parity check sequence ); parameter DATA_WIDTH = 8; // length of user-defined payload (information part) parameter GENERATOR_POLY = 8'b1_0011_1001;// example generator polynomial g(x), should match actual application requirements parameter CHECKSUM_BITS = $clog2(GENERATOR_POLY); // number of bits required for remainder based on chosen gen poly degree // Internal registers used during computation phase reg [$left(message_bits)-1+$size(checksum):0] dividend; integer i; always @(posedge clk or negedge rst_n)begin : proc_encoding if (!rst_n || !start) begin ready <= 1'b0; checksum <= 'b0; end else if(start && &dividend[$left(dividend)-(CHECKSUM_BITS-1):$left(dividend)]) begin // Perform XOR operation between MSBs and generator polynomial whenever leading bit equals one. dividend <= {dividend[$left(dividend)-1:$right(dividend)], ^&{dividend[$left(dividend):(DATA_WIDTH)]}}; else // Otherwise just shift right without changing any other values within register array. dividend <= {dividend[$left(dividend)-1:$right(dividend)], 1'b0}; // Once all iterations complete set flag indicating completion status along with final result stored inside `checksum`. if(i >= ($left(message_bits))) begin ready <= 1'b1; checksum <= dividend[$left(dividend)-1):$left(dividend)]; end end endmodule ``` 上述块定义了一个名为`bch_encoder`的功能单元,它接收待编码的消息位串,并基于指定的生成多项式计算相应的循环冗余检验(CRC)值。当接收到启动信号(`start`)后,程序会自动开始工作直至整个流程结束为止。在此期间,内部状态机不断更新临时变量`dividend`的内容以反映当前阶段下的中间产物变化情况。最终获得的校验和被保存于输出端口`checksum`之中供后续使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值