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 |
|