OpenCores
URL https://opencores.org/ocsvn/reed_solomon_coder/reed_solomon_coder/trunk

Subversion Repositories reed_solomon_coder

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 9 to Rev 10
    Reverse comparison

Rev 9 → Rev 10

/reed_solomon_coder/trunk/syndromecalculator.v
0,0 → 1,184
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: University of Hamburg, University of Kiel, Germany
 
//
// 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
 

powered by: WebSVN 2.1.0

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