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

Subversion Repositories reed_solomon_coder

[/] [reed_solomon_coder/] [trunk/] [RS_encoder.v] - Rev 9

Compare with Previous | Blame | View Log

`timescale 1 ns / 1 ps
///////////////////////////////////////////////////////////////////////////////////
// Company: University of Hamburg, University of Kiel, Germany
// Engineer: Bibin John, Cagil Gümüs, Andreas Bahr
// 
// Create Date:    14:29:45 12/11/2015 
// Design Name: 
// Module Name:    RS_encoder 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: Reed Solomon encoder for 4 bit data
// n=9, k=5, 2t=4, 4bits/symbol
// primitive polynomial p(x)=x^4+x+1
// generator polynomial g(x)=x^4+13x^3+12x^2+8x+7
// Dependencies:
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
 
module reedSolomon(din, clkinp, reset, enable, valid, dout);
 
input clkinp, reset, enable;
input [19:0] din;
output valid;
output [15:0] dout;
 
//output [3:0] z0, z1, z2, z3;
 
reg [15:0] dout;
reg valid;
reg[3:0] counter;
 
//reg [3:0]datainp; //data input to RS encoder
 
wire [3:0] m0, m1, m2, m3;
//wire [3:0] z0, z1, z2, z3;
reg [3:0] q0, q1, q2, q3;
reg [3:0] fback;
 
always @(posedge clkinp or negedge reset)
begin
	if(~reset) 
	begin
		dout <= 0; 
		valid <=0;
		counter<=0;
		q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
		fback <= 0;
	end
	else
	begin
		if(enable==0)
		begin
			valid <=0;
			counter<=0;
			q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
			fback <= 0;
		end
		else
		begin if (~valid)
		   begin
			counter<=counter+1;
			case(counter)
				4'b0001 : 
					begin
						fback <= q3 ^ din[19:16];
					end
				4'b0010 : 
					begin
						q0 <= m0;
						q1 <= m1 ^ q0;
						q2 <= m2 ^ q1;
						q3 <= m3 ^ q2;
					end
				4'b0011 : 
					begin
						fback <= q3 ^ din[15:12];
					end
				4'b0100 : 
					begin
						q0 <= m0;
						q1 <= m1 ^ q0;
						q2 <= m2 ^ q1;
						q3 <= m3 ^ q2;
					end
				4'b0101 : 
					begin
						fback <= q3 ^ din[11:8];
					end
				4'b0110 : 
					begin
						q0 <= m0;
						q1 <= m1 ^ q0;
						q2 <= m2 ^ q1;
						q3 <= m3 ^ q2;
					end
				4'b0111 : 
					begin
						fback <= q3 ^ din[7:4];
					end
				4'b1000 : 
					begin
						q0 <= m0;
						q1 <= m1 ^ q0;
						q2 <= m2 ^ q1;
						q3 <= m3 ^ q2;
					end
				4'b1001 : 
					begin
						fback <= q3 ^ din[3:0];
					end
				4'b1010 : 
					begin
						q0 <= m0;
						q1 <= m1 ^ q0;
						q2 <= m2 ^ q1;
						q3 <= m3 ^ q2;
					end
				4'b1011 : 
					begin
						dout<={q3,q2,q1,q0};
						valid <= 1;
					end
				default :
					begin
						q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
						fback <= 0;
					end
			endcase
		   end
		   else
			begin
				q0 <= 0; q1 <= 0; q2 <= 0; q3 <= 0;
				fback <= 0;
			end
		end	
	end	
end
 
//coefficients for the generator polynomial
//x^4+13x^3+12x^2+8x+7
parameter [3:0] gin0=4'd7, gin1=4'd8, gin2=4'd12, gin3=4'd13; 
 
GFMULT u0(clkinp, reset, enable, fback, gin0, m0);
GFMULT u1(clkinp, reset, enable, fback, gin1, m1);
GFMULT u2(clkinp, reset, enable, fback, gin2, m2);
GFMULT u3(clkinp, reset, enable, fback, gin3, m3);
endmodule 
 
module GFMULT(clk, reset, enable, a, gin, z);
//lookup tables for  multiplication
 
//4'd7=alpha^10(x^2+x+1)
parameter [63:0] mult_gin0 ={4'd0,4'd7,4'd14,4'd9,4'd15,4'd8,4'd1,4'd6,4'd13,4'd10,4'd3,4'd4,4'd2,4'd5,4'd12,4'd11};
 //parameter [63:0] mult_gin0 ={0,7,14,9,15,8,1,6,13,10,3,4,2,5,12,11};
 
//mult_gin0[0]=4'b1111;
//4'd8=alpha^3(x^3)
parameter [63:0] mult_gin1={4'd0,4'd8,4'd3,4'd11,4'd6,4'd14,4'd5,4'd13,4'd12,4'd4,4'd15,4'd7,4'd10,4'd2,4'd9,4'd1}; 
 // parameter [63:0] mult_gin1={0,8,3,11,6,14,5,13,12,4,15,7,10,2,9,1};
 
//4'd12=alpha^6(x^3+x^2)
parameter [63:0] mult_gin2={4'd0,4'd12,4'd11,4'd7,4'd5,4'd9,4'd14,4'd2,4'd10,4'd6,4'd1,4'd13,4'd15,4'd3,4'd4,4'd8};
 // parameter [63:0] mult_gin2={0,12,11,7,5,9,14,2,10,6,1,13,15,3,4,8};
 
//4'd13=alpha^13(x^3+x^2+1)
parameter [63:0] mult_gin3= {4'd0,4'd13,4'd9,4'd4,4'd1,4'd12,4'd8,4'd5,4'd2,4'd15,4'd11,4'd6,4'd3,4'd14,4'd10,4'd7};
// parameter [63:0] mult_gin3= {0,13,9,4,1,12,8,5,2,15,11,6,3,14,10,7};
input clk, reset, enable;
input [3:0] a;
input [3:0] gin;
reg [5:0] ginp;
output [3:0] z;
reg [3:0] z;
always @(negedge clk or negedge reset)
begin
	if(~reset) 
	begin
		z <= 4'b0000; 
	end
	else
	begin 
		if(enable==0)
		begin
			z <= 4'b0000; 
		end
		else
		begin
			if (gin==4'd7)
			begin
			case(a)	
			1:begin z<=mult_gin0[59:56]; end
			2:begin z<=mult_gin0[55:52]; end
			3:begin z<=mult_gin0[51:48]; end
			4:begin z<=mult_gin0[47:44];end
			5:begin z<=mult_gin0[43:40];end
			6:begin z<=mult_gin0[39:36];end
			7:begin z<=mult_gin0[35:32];end
			8:begin z<=mult_gin0[31:28];end
			9:begin z<=mult_gin0[27:24];end
			10:begin z<=mult_gin0[23:20];end
			11:begin z<=mult_gin0[19:16];end
			12:begin z<=mult_gin0[15:12];end
			13:begin z<=mult_gin0[11:8];end
			14:begin z<=mult_gin0[7:4];end
			15:begin z<=mult_gin0[3:0];end
			default: begin z<=mult_gin0[63:60];end
			endcase	
			end
 
			else if(gin==4'd8)
			begin
			case(a)	
				1:begin z<=mult_gin1[59:56]; end
				2:begin z<=mult_gin1[55:52]; end
				3:begin z<=mult_gin1[51:48]; end
				4:begin z<=mult_gin1[47:44];end
				5:begin z<=mult_gin1[43:40];end
				6:begin z<=mult_gin1[39:36];end
				7:begin z<=mult_gin1[35:32];end
				8:begin z<=mult_gin1[31:28];end
				9:begin z<=mult_gin1[27:24];end
				10:begin z<=mult_gin1[23:20];end
				11:begin z<=mult_gin1[19:16];end
				12:begin z<=mult_gin1[15:12];end
				13:begin z<=mult_gin1[11:8];end
				14:begin z<=mult_gin1[7:4];end
				15:begin z<=mult_gin1[3:0];end
				default: begin z<=mult_gin1[63:60];end
			endcase
			end
 
			else if(gin==4'd12)
			begin
			case(a)	
				1:begin z<=mult_gin2[59:56]; end
				2:begin z<=mult_gin2[55:52]; end
				3:begin z<=mult_gin2[51:48]; end
				4:begin z<=mult_gin2[47:44];end
				5:begin z<=mult_gin2[43:40];end
				6:begin z<=mult_gin2[39:36];end
				7:begin z<=mult_gin2[35:32];end
				8:begin z<=mult_gin2[31:28];end
				9:begin z<=mult_gin2[27:24];end
				10:begin z<=mult_gin2[23:20];end
				11:begin z<=mult_gin2[19:16];end
				12:begin z<=mult_gin2[15:12];end
				13:begin z<=mult_gin2[11:8];end
				14:begin z<=mult_gin2[7:4];end
				15:begin z<=mult_gin2[3:0];end
				default: begin z<=mult_gin2[63:60];end
				endcase
			end
 
			else if(gin==4'd13)
			begin
			case(a)	
				1:begin z<=mult_gin3[59:56]; end
				2:begin z<=mult_gin3[55:52]; end
				3:begin z<=mult_gin3[51:48]; end
				4:begin z<=mult_gin3[47:44];end
				5:begin z<=mult_gin3[43:40];end
				6:begin z<=mult_gin3[39:36];end
				7:begin z<=mult_gin3[35:32];end
				8:begin z<=mult_gin3[31:28];end
				9:begin z<=mult_gin3[27:24];end
				10:begin z<=mult_gin3[23:20];end
				11:begin z<=mult_gin3[19:16];end
				12:begin z<=mult_gin3[15:12];end
				13:begin z<=mult_gin3[11:8];end
				14:begin z<=mult_gin3[7:4];end
				15:begin z<=mult_gin3[3:0];end
				default: begin z<=mult_gin3[63:60];end
				endcase
			end
			else
				begin
					z<=0;
				end 
		end
 
	end
end
 
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.