OpenCores
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
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.