blob: 0d3352993cbd67861381197aef81590025d06a45 [file] [log] [blame]
module hm_enc( input wire [3:0] in, output wire[6:0] out);
assign out[0] = in[0] ^ in[1] ^ in[3];
assign out[1] = in[0] ^ in[2] ^ in[3];
assign out[2] = in[0];
assign out[3] = in[1] ^ in[2] ^ in[3];
assign out[4] = in[1];
assign out[5] = in[2];
assign out[6] = in[3];
endmodule // hm_enc
module hm_dec (
input [6:0] recv,
output [3:0] infoword,
output [2:0] syndrome
);
wire [3:0] systematic = {recv[6], recv[5], recv[4], recv[2]};
assign syndrome = {
recv[0] ^ recv[2] ^ recv[4] ^ recv[6], // A
recv[1] ^ recv[2] ^ recv[5] ^ recv[6], // B
recv[3] ^ recv[4] ^ recv[5] ^ recv[6] // C
};
assign infoword = (syndrome == 3'b0) ? systematic :
(syndrome == 3'b110 ) ? {recv[6], recv[5], recv[4], ~recv[2]}:
(syndrome == 3'b101 ) ? {recv[6], recv[5], ~recv[4], recv[2]}:
(syndrome == 3'b011 ) ? {recv[6], ~recv[5], recv[4], recv[2]}:
(syndrome == 3'b111 ) ? {~recv[6], recv[5], recv[4], recv[2]}:
systematic; // yeah, best we'll do.
endmodule
module user_module_hamming74
(
input wire [7:0] io_in,
output wire [7:0] io_out
);
wire [6:0] encoded;
wire [3:0] decoded;
wire [2:0] syndrome;
wire [3:0] info = io_in[3:0];
wire [6:0] codeword = io_in[6:0];
wire enc_dec = io_in[7];
hm_enc encoder (.in(info), .out(encoded));
hm_dec decoder (.recv(codeword), .infoword(decoded), .syndrome(syndrome));
assign io_out[6:0] = enc_dec ? encoded : {syndrome , decoded};
endmodule // user_module_hm