URL
https://opencores.org/ocsvn/reed_solomon_coder/reed_solomon_coder/trunk
Subversion Repositories reed_solomon_coder
[/] [reed_solomon_coder/] [trunk/] [syndromecalculator.v] - Rev 10
Compare with Previous | Blame | View Log
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: University of Hamburg, University of Kiel, Germany // Engineer: Cagil Gümüs, Andreas Bahr // // Create Date: 15:10:07 12/02/2015 // Design Name: // Module Name: syndrome_calculator // Project Name: // Target Devices: // Tool versions: // Description: It takes 36 bits input data (20 bits message + 16 bits parity ) and returns 4 bits long 4 Syndromes. // If there is no errors ( all syndromes are zero) it puts the "no_error" flag high. // Dependencies: None // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module syndromecalculator( input wire clk, input wire reset, input wire [35:0] data_in , input wire go, input wire job_done, output reg [3:0] syndrome_1 , output reg [3:0] syndrome_2 , output reg [3:0] syndrome_3 , output reg [3:0] syndrome_4 , output reg no_errors, output reg ready ); reg [3:0] state; parameter [3:0] IDLE = 4'b0000, // Idle State - Waiting for go signal CALCULATE = 4'b0001, ERRORCHECK = 4'b0111, FINISH = 4'b0011; always @(posedge clk or negedge reset) begin if(!reset) begin state <= IDLE; syndrome_1 <= 0 ; syndrome_2 <= 0 ; syndrome_3 <= 0 ; syndrome_4 <= 0 ; ready <= 0 ; end else begin case(state) IDLE: begin syndrome_1 <= 0 ; syndrome_2 <= 0 ; syndrome_3 <= 0 ; syndrome_4 <= 0 ; if(go) state <= CALCULATE; else state <= IDLE; end CALCULATE: begin syndrome_1 <= GFMult_fn(data_in[35:32],4'b0101)^GFMult_fn(data_in[31:28],4'b1011)^ GFMult_fn(data_in[27:24],4'b1100)^GFMult_fn(data_in[23:20],4'b0110)^ GFMult_fn(data_in[19:16],4'b0011)^GFMult_fn(data_in[15:12],4'b1000)^ GFMult_fn(data_in[11:8],4'b0100)^GFMult_fn(data_in[7:4],4'b0010)^ GFMult_fn(data_in[3:0],4'b0001); syndrome_2 <= GFMult_fn(data_in[35:32],4'b0010)^GFMult_fn(data_in[31:28],4'b1001)^ GFMult_fn(data_in[27:24],4'b1111)^GFMult_fn(data_in[23:20],4'b0111)^ GFMult_fn(data_in[19:16],4'b0101)^GFMult_fn(data_in[15:12],4'b1100)^ GFMult_fn(data_in[11:8],4'b0011)^GFMult_fn(data_in[7:4],4'b0100)^ GFMult_fn(data_in[3:0],4'b0001); syndrome_3 <= GFMult_fn(data_in[35:32],4'b1010)^GFMult_fn(data_in[31:28],4'b1100)^ GFMult_fn(data_in[27:24],4'b1000)^GFMult_fn(data_in[23:20],4'b0001)^ GFMult_fn(data_in[19:16],4'b1111)^GFMult_fn(data_in[15:12],4'b1010)^ GFMult_fn(data_in[11:8],4'b1100)^GFMult_fn(data_in[7:4],4'b1000)^ GFMult_fn(data_in[3:0],4'b0001); syndrome_4 <= GFMult_fn(data_in[35:32],4'b0100)^GFMult_fn(data_in[31:28],4'b1101)^ GFMult_fn(data_in[27:24],4'b1010)^GFMult_fn(data_in[23:20],4'b0110)^ GFMult_fn(data_in[19:16],4'b0010)^GFMult_fn(data_in[15:12],4'b1111)^ GFMult_fn(data_in[11:8],4'b0101)^GFMult_fn(data_in[7:4],4'b0011)^ GFMult_fn(data_in[3:0],4'b0001); state <= ERRORCHECK ; end ERRORCHECK: begin if( (syndrome_1== 0) && (syndrome_2== 0) && (syndrome_3== 0) && (syndrome_4== 0)) no_errors <= 1; else no_errors <= 0; state <= FINISH; end FINISH: begin ready <= 1 ; if(job_done) state <= IDLE; else state <= FINISH; end default: state <= IDLE; endcase end end // For implementation of the GF(2^4) Multiplier function GFMult_fn, please refer to: // Design of a Synthesisable Reed-Solomon ECC Core // David Banks // Publishing Systems and Solutions Laboratory // HP Laboratories Bristol // https://www.hpl.hp.com/techreports/2001/HPL-2001-124.html // // parameter WIDTH = 4; // parameter PRIMITIVE = 5'b10011; // function [...]GFMult_fn; // [...] // [...] // [...] // endfunction endmodule